--- a/ProjectDjango/Project.py Tue Dec 20 11:20:24 2016 +0100 +++ b/ProjectDjango/Project.py Tue Dec 20 12:26:33 2016 +0100 @@ -481,6 +481,40 @@ self.databaseSqlResetSeqAct.triggered.connect( self.__databaseSqlResetSequences) self.actions.append(self.databaseSqlResetSeqAct) + + self.databaseSqlMigrateAct = E5Action( + self.tr('Apply Migration'), + self.tr('&Apply Migration'), + 0, 0, + self, 'django_database_sql_apply_migration') + self.databaseSqlMigrateAct.setStatusTip(self.tr( + 'Prints the SQL statements to apply a migration of an' + ' application')) + self.databaseSqlMigrateAct.setWhatsThis(self.tr( + """<b>Apply Migration</b>""" + """<p>Prints the SQL statements to apply a migration of an""" + """ application.</p>""" + )) + self.databaseSqlMigrateAct.triggered.connect( + self.__databaseSqlMigrate) + self.actions.append(self.databaseSqlMigrateAct) + + self.databaseSqlMigrateBackwardsAct = E5Action( + self.tr('Unapply Migration'), + self.tr('&Unapply Migration'), + 0, 0, + self, 'django_database_sql_unapply_migration') + self.databaseSqlMigrateBackwardsAct.setStatusTip(self.tr( + 'Prints the SQL statements to unapply a migration of an' + ' application')) + self.databaseSqlMigrateBackwardsAct.setWhatsThis(self.tr( + """<b>Unapply Migration</b>""" + """<p>Prints the SQL statements to unapply a migration of an""" + """ application.</p>""" + )) + self.databaseSqlMigrateBackwardsAct.triggered.connect( + lambda: self.__databaseSqlMigrate(backwards=True)) + self.actions.append(self.databaseSqlMigrateBackwardsAct) def __initToolsActions(self): """ @@ -746,7 +780,6 @@ self.makeMigrationsAct.triggered.connect(self.__makeMigrations) self.actions.append(self.makeMigrationsAct) - # TODO: squashmigrations self.squashMigrationsAct = E5Action( self.tr('Squash Migrations'), self.tr('S&quash Migrations'), @@ -761,8 +794,6 @@ )) self.squashMigrationsAct.triggered.connect(self.__squashMigrations) self.actions.append(self.squashMigrationsAct) - - # TODO: sqlmigrate def initMenu(self): """ @@ -852,6 +883,9 @@ menu.addSeparator() menu.addAction(self.databaseSqlFlushAct) menu.addAction(self.databaseSqlResetSeqAct) + menu.addSeparator() + menu.addAction(self.databaseSqlMigrateAct) + menu.addAction(self.databaseSqlMigrateBackwardsAct) self.__menus["sql"] = menu @@ -2147,6 +2181,54 @@ """ self.__sqlCommand(self.tr("Reset Sequences"), "sqlsequencereset") + def __databaseSqlMigrate(self, backwards=False): + """ + Private slot to print the SQL statements for a migration of an + application. + + @param backwards flag indicating to generate the SQL code to unapply + a migration + @type bool + """ + try: + path = self.__sitePath() + except DjangoNoSiteSelectedException: + return + + migrations = self.__getMigrations() + if not migrations: + E5MessageBox.information( + None, + self.tr("SQL Migrate"), + self.tr("""No migrations available.""")) + return + + title = self.tr("SQL Migrate") + + from .DjangoMigrationSelectionDialog import \ + DjangoMigrationSelectionDialog + dlg = DjangoMigrationSelectionDialog(migrations, + migrationRequired=True) + if dlg.exec_() == QDialog.Accepted: + app, migration = dlg.getData() + + args = [] + args.append(self.__getPythonExecutable()) + args.append("manage.py") + args.append("sqlmigrate") + if backwards: + args.append("--backwards") + args.append(app) + args.append(migration) + + fileFilter = self.tr("SQL Files (*.sql)") + + dia = DjangoDialog(title, fixed=True, linewrap=False, + saveFilters=fileFilter) + res = dia.startProcess(args, path, False) + if res: + dia.exec_() + ################################################################## ## slots below implement migration related functions ##################################################################