ProjectDjango/Project.py

changeset 169
b8f263e05c39
parent 168
c6182aab51e9
child 172
ea7980ded4f3
equal deleted inserted replaced
168:c6182aab51e9 169:b8f263e05c39
8 """ 8 """
9 9
10 import os 10 import os
11 import re 11 import re
12 import shutil 12 import shutil
13 import contextlib
13 14
14 from PyQt5.QtCore import QObject, QTimer, QUrl, QFileInfo 15 from PyQt5.QtCore import QObject, QTimer, QUrl, QFileInfo
15 from PyQt5.QtGui import QDesktopServices 16 from PyQt5.QtGui import QDesktopServices
16 from PyQt5.QtWidgets import QMenu, QInputDialog, QLineEdit, QDialog 17 from PyQt5.QtWidgets import QMenu, QInputDialog, QLineEdit, QDialog
17 from PyQt5.QtCore import QProcess as QProcessPyQt 18 from PyQt5.QtCore import QProcess as QProcessPyQt
50 @keyparam mode access mode (QIODevice.OpenMode) 51 @keyparam mode access mode (QIODevice.OpenMode)
51 """ 52 """
52 if args is None: 53 if args is None:
53 args = [] 54 args = []
54 55
55 if cmd.endswith(('gnome-terminal', 'konsole', 'xfce4-terminal', 56 if (
56 'mate-terminal')): 57 cmd.endswith(('gnome-terminal', 'konsole', 'xfce4-terminal',
57 if '-e' in args: 58 'mate-terminal')) and
58 index = args.index('-e') + 1 59 '-e' in args
59 cargs = ' '.join(args[index:]) 60 ):
60 args[index:] = [cargs] 61 index = args.index('-e') + 1
61 62 cargs = ' '.join(args[index:])
62 super(QProcess, self).start(cmd, args, mode) 63 args[index:] = [cargs]
64
65 super().start(cmd, args, mode)
63 66
64 @staticmethod 67 @staticmethod
65 def startDetached(cmd, args=None, path=''): 68 def startDetached(cmd, args=None, path=''):
66 """ 69 """
67 Public static method to start the given program (cmd) in a new process, 70 Public static method to start the given program (cmd) in a new process,
73 @return tuple of successful start and process id (boolean, integer) 76 @return tuple of successful start and process id (boolean, integer)
74 """ 77 """
75 if args is None: 78 if args is None:
76 args = [] 79 args = []
77 80
78 if cmd.endswith(('gnome-terminal', 'konsole', 'xfce4-terminal', 81 if (
79 'mate-terminal')): 82 cmd.endswith(('gnome-terminal', 'konsole', 'xfce4-terminal',
80 if '-e' in args: 83 'mate-terminal')) and
81 index = args.index('-e') + 1 84 '-e' in args
82 cargs = ' '.join(args[index:]) 85 ):
83 args[index:] = [cargs] 86 index = args.index('-e') + 1
87 cargs = ' '.join(args[index:])
88 args[index:] = [cargs]
84 89
85 return QProcessPyQt.startDetached(cmd, args, path) 90 return QProcessPyQt.startDetached(cmd, args, path)
86 91
87 92
88 class Project(QObject): 93 class Project(QObject):
101 @param iconSuffix suffix for the icons 106 @param iconSuffix suffix for the icons
102 @type str 107 @type str
103 @param parent parent 108 @param parent parent
104 @type QObject 109 @type QObject
105 """ 110 """
106 super(Project, self).__init__(parent) 111 super().__init__(parent)
107 112
108 self.__plugin = plugin 113 self.__plugin = plugin
109 self.__iconSuffix = iconSuffix 114 self.__iconSuffix = iconSuffix
110 self.__ui = parent 115 self.__ui = parent
111 116
390 395
391 def __initDatabaseSqlActions(self): 396 def __initDatabaseSqlActions(self):
392 """ 397 """
393 Private method to define the database SQL related actions. 398 Private method to define the database SQL related actions.
394 """ 399 """
395 self.databaseSqlCreateTablesAct = E5Action(
396 self.tr('Create Tables'),
397 self.tr('Create &Tables'),
398 0, 0,
399 self, 'django_database_sql_create_tables')
400 self.databaseSqlCreateTablesAct.setStatusTip(self.tr(
401 'Prints the CREATE TABLE SQL statements for one or more'
402 ' applications'))
403 self.databaseSqlCreateTablesAct.setWhatsThis(self.tr(
404 """<b>Create Tables</b>"""
405 """<p>Prints the CREATE TABLE SQL statements for one or """
406 """more applications.</p>"""
407 ))
408 self.databaseSqlCreateTablesAct.triggered.connect(
409 self.__databaseSqlCreateTables)
410 self.actions.append(self.databaseSqlCreateTablesAct)
411
412 self.databaseSqlCreateIndexesAct = E5Action(
413 self.tr('Create Indexes'),
414 self.tr('Create &Indexes'),
415 0, 0,
416 self, 'django_database_sql_create_indexes')
417 self.databaseSqlCreateIndexesAct.setStatusTip(self.tr(
418 'Prints the CREATE INDEX SQL statements for one or more'
419 ' applications'))
420 self.databaseSqlCreateIndexesAct.setWhatsThis(self.tr(
421 """<b>Create Indexes</b>"""
422 """<p>Prints the CREATE INDEX SQL statements for one or """
423 """more applications.</p>"""
424 ))
425 self.databaseSqlCreateIndexesAct.triggered.connect(
426 self.__databaseSqlCreateIndexes)
427 self.actions.append(self.databaseSqlCreateIndexesAct)
428
429 self.databaseSqlCreateEverythingAct = E5Action(
430 self.tr('Create Everything'),
431 self.tr('Create &Everything'),
432 0, 0,
433 self, 'django_database_sql_create_everything')
434 self.databaseSqlCreateEverythingAct.setStatusTip(self.tr(
435 'Prints the CREATE ... SQL statements for one or more'
436 ' applications'))
437 self.databaseSqlCreateEverythingAct.setWhatsThis(self.tr(
438 """<b>Create Everything</b>"""
439 """<p>Prints the CREATE TABLE, custom SQL and CREATE INDEX SQL """
440 """statements for one or more applications.</p>"""
441 ))
442 self.databaseSqlCreateEverythingAct.triggered.connect(
443 self.__databaseSqlCreateEverything)
444 self.actions.append(self.databaseSqlCreateEverythingAct)
445
446 self.databaseSqlCustomAct = E5Action(
447 self.tr('Custom Statements'),
448 self.tr('&Custom Statements'),
449 0, 0,
450 self, 'django_database_sql_custom')
451 self.databaseSqlCustomAct.setStatusTip(self.tr(
452 'Prints the custom table modifying SQL statements for '
453 'one or more applications'))
454 self.databaseSqlCustomAct.setWhatsThis(self.tr(
455 """<b>Custom Statements</b>"""
456 """<p>Prints the custom table modifying SQL statements """
457 """for one or more applications.</p>"""
458 ))
459 self.databaseSqlCustomAct.triggered.connect(
460 self.__databaseSqlCustom)
461 self.actions.append(self.databaseSqlCustomAct)
462
463 self.databaseSqlDropTablesAct = E5Action(
464 self.tr('Drop Tables'),
465 self.tr('&Drop Tables'),
466 0, 0,
467 self, 'django_database_sql_drop_tables')
468 self.databaseSqlDropTablesAct.setStatusTip(self.tr(
469 'Prints the DROP TABLE SQL statements for '
470 'one or more applications'))
471 self.databaseSqlDropTablesAct.setWhatsThis(self.tr(
472 """<b>Drop Tables</b>"""
473 """<p>Prints the DROP TABLE SQL statements """
474 """for one or more applications.</p>"""
475 ))
476 self.databaseSqlDropTablesAct.triggered.connect(
477 self.__databaseSqlDropTables)
478 self.actions.append(self.databaseSqlDropTablesAct)
479
480 self.databaseSqlDropIndexesAct = E5Action(
481 self.tr('Drop Indexes'),
482 self.tr('&Drop Indexes'),
483 0, 0,
484 self, 'django_database_sql_drop_indexes')
485 self.databaseSqlDropIndexesAct.setStatusTip(self.tr(
486 'Prints the DROP INDEX SQL statements for '
487 'one or more applications'))
488 self.databaseSqlDropIndexesAct.setWhatsThis(self.tr(
489 """<b>Drop Indexes</b>"""
490 """<p>Prints the DROP INDEX SQL statements """
491 """for one or more applications.</p>"""
492 ))
493 self.databaseSqlDropIndexesAct.triggered.connect(
494 self.__databaseSqlDropIndexes)
495 self.actions.append(self.databaseSqlDropIndexesAct)
496
497 self.databaseSqlFlushAct = E5Action( 400 self.databaseSqlFlushAct = E5Action(
498 self.tr('Flush Database'), 401 self.tr('Flush Database'),
499 self.tr('&Flush Database'), 402 self.tr('&Flush Database'),
500 0, 0, 403 0, 0,
501 self, 'django_database_sql_flush_database') 404 self, 'django_database_sql_flush_database')
921 @rtype QMenu 824 @rtype QMenu
922 """ 825 """
923 menu = QMenu(self.tr("Show &SQL"), self.__ui) 826 menu = QMenu(self.tr("Show &SQL"), self.__ui)
924 menu.setTearOffEnabled(True) 827 menu.setTearOffEnabled(True)
925 828
926 if self.getDjangoVersion() < (1, 9, 0):
927 menu.addAction(self.databaseSqlCreateTablesAct)
928 menu.addAction(self.databaseSqlCreateIndexesAct)
929 menu.addAction(self.databaseSqlCreateEverythingAct)
930 menu.addSeparator()
931 menu.addAction(self.databaseSqlCustomAct)
932 menu.addSeparator()
933 menu.addAction(self.databaseSqlDropTablesAct)
934 menu.addAction(self.databaseSqlDropIndexesAct)
935 menu.addSeparator()
936 menu.addAction(self.databaseSqlFlushAct) 829 menu.addAction(self.databaseSqlFlushAct)
937 menu.addAction(self.databaseSqlResetSeqAct) 830 menu.addAction(self.databaseSqlResetSeqAct)
938 menu.addSeparator() 831 menu.addSeparator()
939 menu.addAction(self.databaseSqlMigrateAct) 832 menu.addAction(self.databaseSqlMigrateAct)
940 menu.addAction(self.databaseSqlMigrateBackwardsAct) 833 menu.addAction(self.databaseSqlMigrateBackwardsAct)
979 menu.setTearOffEnabled(True) 872 menu.setTearOffEnabled(True)
980 873
981 menu.addAction(self.diffSettingsAct) 874 menu.addAction(self.diffSettingsAct)
982 menu.addSeparator() 875 menu.addSeparator()
983 menu.addAction(self.runPythonShellAct) 876 menu.addAction(self.runPythonShellAct)
984 if self.getDjangoVersion() >= (1, 9, 0): 877 menu.addSeparator()
985 menu.addSeparator() 878 menu.addAction(self.testEmailAct)
986 menu.addAction(self.testEmailAct)
987 879
988 self.__menus["tools"] = menu 880 self.__menus["tools"] = menu
989 881
990 return menu 882 return menu
991 883
1251 return [file] 1143 return [file]
1252 else: 1144 else:
1253 return [] 1145 return []
1254 1146
1255 cur_path = os.path.join(os.curdir, file) 1147 cur_path = os.path.join(os.curdir, file)
1256 if os.path.exists(cur_path): 1148 if os.path.exists(cur_path) and os.access(cur_path, os.X_OK):
1257 if os.access(cur_path, os.X_OK): 1149 paths.append(cur_path)
1258 paths.append(cur_path)
1259 1150
1260 path = os.getenv('PATH') 1151 path = os.getenv('PATH')
1261 1152
1262 # environment variable not defined 1153 # environment variable not defined
1263 if path is not None: 1154 if path is not None:
1331 for (string, one of '' or 'Python3') 1222 for (string, one of '' or 'Python3')
1332 @return path of the virtual environment (string) 1223 @return path of the virtual environment (string)
1333 """ 1224 """
1334 if not language: 1225 if not language:
1335 language = self.__e5project.getProjectLanguage() 1226 language = self.__e5project.getProjectLanguage()
1336 if language == "Python3": 1227 venvName = (
1337 venvName = self.__plugin.getPreferences( 1228 self.__plugin.getPreferences("VirtualEnvironmentNamePy3")
1338 "VirtualEnvironmentNamePy3") 1229 if language == "Python3" else
1339 else: 1230 ""
1340 venvName = "" 1231 )
1341 if venvName: 1232 if venvName:
1342 virtEnv = self.__virtualEnvManager.getVirtualenvDirectory( 1233 virtEnv = self.__virtualEnvManager.getVirtualenvDirectory(
1343 venvName) 1234 venvName)
1344 if not virtEnv: 1235 if not virtEnv:
1345 virtEnv = os.path.dirname( 1236 virtEnv = os.path.dirname(
1458 if not venvName: 1349 if not venvName:
1459 # if none configured, use the global one 1350 # if none configured, use the global one
1460 venvName = Preferences.getDebugger("Python3VirtualEnv") 1351 venvName = Preferences.getDebugger("Python3VirtualEnv")
1461 else: 1352 else:
1462 venvName = "" 1353 venvName = ""
1463 if venvName: 1354 python = (
1464 python = self.__virtualEnvManager.getVirtualenvInterpreter( 1355 self.__virtualEnvManager.getVirtualenvInterpreter(venvName)
1465 venvName) 1356 if venvName else
1466 else: 1357 ""
1467 python = "" 1358 )
1468 1359
1469 return python 1360 return python
1470 1361
1471 def __djangoInfo(self): 1362 def __djangoInfo(self):
1472 """ 1363 """
2056 args.append("--nothreading") 1947 args.append("--nothreading")
2057 addr = self.__plugin.getPreferences("ServerAddress") 1948 addr = self.__plugin.getPreferences("ServerAddress")
2058 if addr: 1949 if addr:
2059 args.append(addr) 1950 args.append(addr)
2060 1951
2061 try: 1952 with contextlib.suppress(DjangoNoSiteSelectedException):
2062 if Utilities.isWindowsPlatform(): 1953 if Utilities.isWindowsPlatform():
2063 serverProcStarted, pid = QProcess.startDetached( 1954 serverProcStarted, pid = QProcess.startDetached(
2064 args[0], args[1:], self.__sitePath()) 1955 args[0], args[1:], self.__sitePath())
2065 else: 1956 else:
2066 if self.__serverProc is not None: 1957 if self.__serverProc is not None:
2075 if not serverProcStarted: 1966 if not serverProcStarted:
2076 E5MessageBox.critical( 1967 E5MessageBox.critical(
2077 None, 1968 None,
2078 self.tr('Process Generation Error'), 1969 self.tr('Process Generation Error'),
2079 self.tr('The Django server could not be started.')) 1970 self.tr('The Django server could not be started.'))
2080 except DjangoNoSiteSelectedException:
2081 pass
2082 1971
2083 def __serverProcFinished(self): 1972 def __serverProcFinished(self):
2084 """ 1973 """
2085 Private slot connected to the finished signal. 1974 Private slot connected to the finished signal.
2086 """ 1975 """
2210 """ 2099 """
2211 if database is None: 2100 if database is None:
2212 database = self.getRecentDatabaseNames()[0] 2101 database = self.getRecentDatabaseNames()[0]
2213 2102
2214 self.__currentDatabase = database 2103 self.__currentDatabase = database
2215 if database: 2104 curDb = database if database else self.tr("<default>")
2216 curDb = database
2217 else:
2218 curDb = self.tr("<default>")
2219 self.selectDatabaseNameAct.setText( 2105 self.selectDatabaseNameAct.setText(
2220 self.tr('&Current Database ({0})').format(curDb)) 2106 self.tr('&Current Database ({0})').format(curDb))
2221 2107
2222 def currentDatabase(self): 2108 def currentDatabase(self):
2223 """ 2109 """
2302 args.append(self.__getPythonExecutable()) 2188 args.append(self.__getPythonExecutable())
2303 args.append("manage.py") 2189 args.append("manage.py")
2304 args.append("dbshell") 2190 args.append("dbshell")
2305 if self.__currentDatabase: 2191 if self.__currentDatabase:
2306 args.append("--database={0}".format(self.__currentDatabase)) 2192 args.append("--database={0}".format(self.__currentDatabase))
2307 try: 2193 with contextlib.suppress(DjangoNoSiteSelectedException):
2308 wd = self.__sitePath() 2194 wd = self.__sitePath()
2309 self.__adjustWorkingDirectory(args, wd) 2195 self.__adjustWorkingDirectory(args, wd)
2310 started, pid = QProcess.startDetached(args[0], args[1:], wd) 2196 started, pid = QProcess.startDetached(args[0], args[1:], wd)
2311 if not started: 2197 if not started:
2312 E5MessageBox.critical( 2198 E5MessageBox.critical(
2313 None, 2199 None,
2314 self.tr('Process Generation Error'), 2200 self.tr('Process Generation Error'),
2315 self.tr('The Django process could not be started.')) 2201 self.tr('The Django process could not be started.'))
2316 except DjangoNoSiteSelectedException:
2317 pass
2318 2202
2319 ####################################################################### 2203 #######################################################################
2320 ## slots below implement database functions outputting SQL statements 2204 ## slots below implement database functions outputting SQL statements
2321 ####################################################################### 2205 #######################################################################
2322 2206
2354 dia = DjangoDialog(title, fixed=True, linewrap=False, 2238 dia = DjangoDialog(title, fixed=True, linewrap=False,
2355 saveFilters=fileFilter) 2239 saveFilters=fileFilter)
2356 res = dia.startProcess(args, path, False) 2240 res = dia.startProcess(args, path, False)
2357 if res: 2241 if res:
2358 dia.exec() 2242 dia.exec()
2359
2360 def __databaseSqlCreateTables(self):
2361 """
2362 Private slot to print the CREATE TABLE SQL statements for one
2363 or more applications.
2364
2365 Note: available before Django v1.9.0
2366 """
2367 self.__sqlCommand(self.tr("Create Tables"), "sql")
2368
2369 def __databaseSqlCreateIndexes(self):
2370 """
2371 Private slot to print the CREATE INDEX SQL statements for one
2372 or more applications.
2373
2374 Note: available before Django v1.9.0
2375 """
2376 self.__sqlCommand(self.tr("Create Indexes"), "sqlindexes")
2377
2378 def __databaseSqlCreateEverything(self):
2379 """
2380 Private slot to print the CREATE TABLE, custom SQL and
2381 CREATE INDEX SQL statements for one or more applications.
2382
2383 Note: available before Django v1.9.0
2384 """
2385 self.__sqlCommand(self.tr("Create Everything"), "sqlall")
2386
2387 def __databaseSqlCustom(self):
2388 """
2389 Private slot to print the custom table modifying SQL statements
2390 for one or more applications.
2391
2392 Note: available before Django v1.9.0
2393 """
2394 self.__sqlCommand(self.tr("Custom Statements"), "sqlcustom")
2395
2396 def __databaseSqlDropTables(self):
2397 """
2398 Private slot to print the DROP TABLE SQL statements for one or
2399 more applications.
2400
2401 Note: available before Django v1.9.0
2402 """
2403 self.__sqlCommand(self.tr("Drop Tables"), "sqlclear")
2404
2405 def __databaseSqlDropIndexes(self):
2406 """
2407 Private slot to print the DROP INDEX SQL statements for one or
2408 more applications.
2409
2410 Note: available before Django v1.9.0
2411 """
2412 self.__sqlCommand(self.tr("Drop Indexes"), "sqldropindexes")
2413 2243
2414 def __databaseSqlFlushDatabase(self): 2244 def __databaseSqlFlushDatabase(self):
2415 """ 2245 """
2416 Private slot to print a list of statements to return all database 2246 Private slot to print a list of statements to return all database
2417 tables to their initial state. 2247 tables to their initial state.
2547 @param app name of an application to apply migrations for 2377 @param app name of an application to apply migrations for
2548 @type str 2378 @type str
2549 @param migration name of a migration to update to 2379 @param migration name of a migration to update to
2550 @type str 2380 @type str
2551 """ 2381 """
2552 if migration == "zero": 2382 title = (
2553 title = self.tr("Unapply Migrations") 2383 self.tr("Unapply Migrations")
2554 else: 2384 if migration == "zero" else
2555 title = self.tr("Apply Migrations") 2385 self.tr("Apply Migrations")
2386 )
2556 2387
2557 try: 2388 try:
2558 path = self.__sitePath() 2389 path = self.__sitePath()
2559 except DjangoNoSiteSelectedException: 2390 except DjangoNoSiteSelectedException:
2560 return 2391 return
2610 2441
2611 args = [] 2442 args = []
2612 args.append("manage.py") 2443 args.append("manage.py")
2613 args.append("showmigrations") 2444 args.append("showmigrations")
2614 args.append("--list") 2445 args.append("--list")
2615 if self.getDjangoVersion() >= (1, 9, 0): 2446 if self.__currentDatabase:
2616 if self.__currentDatabase: 2447 args.append("--database={0}".format(self.__currentDatabase))
2617 args.append("--database={0}".format(self.__currentDatabase))
2618 2448
2619 migrations = {} 2449 migrations = {}
2620 proc = QProcess() 2450 proc = QProcess()
2621 if path: 2451 if path:
2622 proc.setWorkingDirectory(path) 2452 proc.setWorkingDirectory(path)
2623 proc.start(self.__getPythonExecutable(), args) 2453 proc.start(self.__getPythonExecutable(), args)
2624 if proc.waitForStarted(): 2454 if proc.waitForStarted() and proc.waitForFinished():
2625 if proc.waitForFinished(): 2455 output = str(proc.readAllStandardOutput(),
2626 output = str(proc.readAllStandardOutput(), 2456 Preferences.getSystem("IOEncoding"), 'replace')
2627 Preferences.getSystem("IOEncoding"), 'replace') 2457 if output:
2628 if output: 2458 recentApp = ""
2629 recentApp = "" 2459 for line in output.splitlines():
2630 for line in output.splitlines(): 2460 if not line.startswith(" "):
2631 if not line.startswith(" "): 2461 # application name
2632 # application name 2462 recentApp = line.strip()
2633 recentApp = line.strip() 2463 migrations[recentApp] = []
2634 migrations[recentApp] = [] 2464 else:
2635 else: 2465 # migration name
2636 # migration name 2466 line = line.strip()
2637 line = line.strip() 2467 applied = line[1] != " "
2638 applied = line[1] != " " 2468 name = line[3:].strip()
2639 name = line[3:].strip() 2469 if recentApp:
2640 if recentApp: 2470 migrations[recentApp].append((applied, name))
2641 migrations[recentApp].append((applied, name))
2642 return migrations 2471 return migrations
2643 2472
2644 def __makeMigrations(self): 2473 def __makeMigrations(self):
2645 """ 2474 """
2646 Private slot to generate migrations for the Django project. 2475 Private slot to generate migrations for the Django project.
2790 args = Utilities.parseOptionString(consoleCmd) 2619 args = Utilities.parseOptionString(consoleCmd)
2791 args[0] = Utilities.getExecutablePath(args[0]) 2620 args[0] = Utilities.getExecutablePath(args[0])
2792 args.append(self.__getPythonExecutable()) 2621 args.append(self.__getPythonExecutable())
2793 args.append("manage.py") 2622 args.append("manage.py")
2794 args.append("shell") 2623 args.append("shell")
2795 if self.getDjangoVersion() < (1, 10, 0): 2624 args.append("--interface={0}".format(
2796 if (self.__plugin.getPreferences("Python3ConsoleType") == 2625 self.__plugin.getPreferences("Python3ConsoleType")))
2797 "python"): 2626 with contextlib.suppress(DjangoNoSiteSelectedException):
2798 args.append("--plain")
2799 else:
2800 args.append("--interface={0}".format(
2801 self.__plugin.getPreferences("Python3ConsoleType")))
2802 try:
2803 wd = self.__sitePath() 2627 wd = self.__sitePath()
2804 self.__adjustWorkingDirectory(args, wd) 2628 self.__adjustWorkingDirectory(args, wd)
2805 started, pid = QProcess.startDetached(args[0], args[1:], wd) 2629 started, pid = QProcess.startDetached(args[0], args[1:], wd)
2806 if not started: 2630 if not started:
2807 E5MessageBox.critical( 2631 E5MessageBox.critical(
2808 None, 2632 None,
2809 self.tr('Process Generation Error'), 2633 self.tr('Process Generation Error'),
2810 self.tr('The Django process could not be started.')) 2634 self.tr('The Django process could not be started.'))
2811 except DjangoNoSiteSelectedException:
2812 pass
2813 2635
2814 def __sendTestEmail(self): 2636 def __sendTestEmail(self):
2815 """ 2637 """
2816 Private slot to send a test email through Django. 2638 Private slot to send a test email through Django.
2817 """ 2639 """
2818 if self.getDjangoVersion() < (1, 9, 0):
2819 return
2820
2821 title = self.tr("Send Test Email") 2640 title = self.tr("Send Test Email")
2822 2641
2823 from .DjangoSendTestEmailDataDialog import ( 2642 from .DjangoSendTestEmailDataDialog import (
2824 DjangoSendTestEmailDataDialog 2643 DjangoSendTestEmailDataDialog
2825 ) 2644 )
2907 args.append("dumpdata") 2726 args.append("dumpdata")
2908 args.append("--format={0}".format(dumpFormat)) 2727 args.append("--format={0}".format(dumpFormat))
2909 args.append("--indent={0}".format(indent)) 2728 args.append("--indent={0}".format(indent))
2910 for excl in excls: 2729 for excl in excls:
2911 args.append("--exclude={0}".format(excl)) 2730 args.append("--exclude={0}".format(excl))
2912 if self.getDjangoVersion() >= (1, 9, 0): 2731 if self.__currentDatabase:
2913 if self.__currentDatabase: 2732 args.append("--database={0}".format(self.__currentDatabase))
2914 args.append("--database={0}".format(
2915 self.__currentDatabase))
2916 args += appls 2733 args += appls
2917 2734
2918 if dumpFormat == "json": 2735 if dumpFormat == "json":
2919 fileFilters = self.tr("JSON Files (*.json)") 2736 fileFilters = self.tr("JSON Files (*.json)")
2920 elif dumpFormat == "xml": 2737 elif dumpFormat == "xml":
2946 2763
2947 args = [] 2764 args = []
2948 args.append(self.__getPythonExecutable()) 2765 args.append(self.__getPythonExecutable())
2949 args.append("manage.py") 2766 args.append("manage.py")
2950 args.append("loaddata") 2767 args.append("loaddata")
2951 if self.getDjangoVersion() >= (1, 11, 0): 2768 for excl in excludes:
2952 for excl in excludes: 2769 args.append("--exclude={0}".format(excl))
2953 args.append("--exclude={0}".format(excl))
2954 if ignore: 2770 if ignore:
2955 args.append("--ignorenonexistent") 2771 args.append("--ignorenonexistent")
2956 if appLabel: 2772 if appLabel:
2957 args.append("--app={0}".format(appLabel)) 2773 args.append("--app={0}".format(appLabel))
2958 if self.__currentDatabase: 2774 if self.__currentDatabase:
3041 addr = self.__plugin.getPreferences("ServerAddress") 2857 addr = self.__plugin.getPreferences("ServerAddress")
3042 if addr: 2858 if addr:
3043 args.append("--addrport={0}".format(addr)) 2859 args.append("--addrport={0}".format(addr))
3044 args += fixtures 2860 args += fixtures
3045 2861
3046 try: 2862 with contextlib.suppress(DjangoNoSiteSelectedException):
3047 if Utilities.isWindowsPlatform(): 2863 if Utilities.isWindowsPlatform():
3048 serverProcStarted, pid = QProcess.startDetached( 2864 serverProcStarted, pid = QProcess.startDetached(
3049 args[0], args[1:], self.__sitePath()) 2865 args[0], args[1:], self.__sitePath())
3050 else: 2866 else:
3051 if self.__testServerProc is not None: 2867 if self.__testServerProc is not None:
3063 E5MessageBox.critical( 2879 E5MessageBox.critical(
3064 None, 2880 None,
3065 self.tr('Process Generation Error'), 2881 self.tr('Process Generation Error'),
3066 self.tr('The Django test server could not be' 2882 self.tr('The Django test server could not be'
3067 ' started.')) 2883 ' started.'))
3068 except DjangoNoSiteSelectedException:
3069 pass
3070 2884
3071 def __testServerProcFinished(self): 2885 def __testServerProcFinished(self):
3072 """ 2886 """
3073 Private slot connected to the finished signal of the test server. 2887 Private slot connected to the finished signal of the test server.
3074 """ 2888 """
3102 args[0] = Utilities.getExecutablePath(args[0]) 2916 args[0] = Utilities.getExecutablePath(args[0])
3103 args.append(self.__getPythonExecutable()) 2917 args.append(self.__getPythonExecutable())
3104 args.append("manage.py") 2918 args.append("manage.py")
3105 args.append("changepassword") 2919 args.append("changepassword")
3106 args.append(userName) 2920 args.append(userName)
3107 try: 2921 with contextlib.suppress(DjangoNoSiteSelectedException):
3108 wd = self.__sitePath() 2922 wd = self.__sitePath()
3109 self.__adjustWorkingDirectory(args, wd) 2923 self.__adjustWorkingDirectory(args, wd)
3110 started, pid = QProcess.startDetached( 2924 started, pid = QProcess.startDetached(
3111 args[0], args[1:], wd) 2925 args[0], args[1:], wd)
3112 if not started: 2926 if not started:
3113 E5MessageBox.critical( 2927 E5MessageBox.critical(
3114 None, 2928 None,
3115 self.tr('Process Generation Error'), 2929 self.tr('Process Generation Error'),
3116 self.tr('The Django process could not be' 2930 self.tr('The Django process could not be'
3117 ' started.')) 2931 ' started.'))
3118 except DjangoNoSiteSelectedException:
3119 pass
3120 2932
3121 def __createSuperUser(self): 2933 def __createSuperUser(self):
3122 """ 2934 """
3123 Private slot to create a super user account. 2935 Private slot to create a super user account.
3124 """ 2936 """
3128 args = Utilities.parseOptionString(consoleCmd) 2940 args = Utilities.parseOptionString(consoleCmd)
3129 args[0] = Utilities.getExecutablePath(args[0]) 2941 args[0] = Utilities.getExecutablePath(args[0])
3130 args.append(self.__getPythonExecutable()) 2942 args.append(self.__getPythonExecutable())
3131 args.append("manage.py") 2943 args.append("manage.py")
3132 args.append("createsuperuser") 2944 args.append("createsuperuser")
3133 try: 2945 with contextlib.suppress(DjangoNoSiteSelectedException):
3134 wd = self.__sitePath() 2946 wd = self.__sitePath()
3135 self.__adjustWorkingDirectory(args, wd) 2947 self.__adjustWorkingDirectory(args, wd)
3136 started, pid = QProcess.startDetached(args[0], args[1:], wd) 2948 started, pid = QProcess.startDetached(args[0], args[1:], wd)
3137 if not started: 2949 if not started:
3138 E5MessageBox.critical( 2950 E5MessageBox.critical(
3139 None, 2951 None,
3140 self.tr('Process Generation Error'), 2952 self.tr('Process Generation Error'),
3141 self.tr('The Django process could not be started.')) 2953 self.tr('The Django process could not be started.'))
3142 except DjangoNoSiteSelectedException:
3143 pass
3144 2954
3145 ################################################################## 2955 ##################################################################
3146 ## slots below implement session functions 2956 ## slots below implement session functions
3147 ################################################################## 2957 ##################################################################
3148 2958
3451 args = [] 3261 args = []
3452 args.append(self.__getPythonExecutable()) 3262 args.append(self.__getPythonExecutable())
3453 args.append("manage.py") 3263 args.append("manage.py")
3454 args.append("compilemessages") 3264 args.append("compilemessages")
3455 args.append("--locale={0}".format(locale)) 3265 args.append("--locale={0}".format(locale))
3456 if self.getDjangoVersion() >= (1, 8, 0): 3266 if self.__plugin.getPreferences("FuzzyTranslations"):
3457 if self.__plugin.getPreferences("FuzzyTranslations"): 3267 args.append("--use-fuzzy")
3458 args.append("--use-fuzzy")
3459 argsLists.append(args) 3268 argsLists.append(args)
3460 3269
3461 if len(argsLists) == 0: 3270 if len(argsLists) == 0:
3462 E5MessageBox.warning( 3271 E5MessageBox.warning(
3463 None, 3272 None,
3489 3298
3490 args = [] 3299 args = []
3491 args.append(self.__getPythonExecutable()) 3300 args.append(self.__getPythonExecutable())
3492 args.append("manage.py") 3301 args.append("manage.py")
3493 args.append("compilemessages") 3302 args.append("compilemessages")
3494 if self.getDjangoVersion() >= (1, 8, 0): 3303 if self.__plugin.getPreferences("FuzzyTranslations"):
3495 if self.__plugin.getPreferences("FuzzyTranslations"): 3304 args.append("--use-fuzzy")
3496 args.append("--use-fuzzy")
3497 3305
3498 try: 3306 try:
3499 wd = self.__sitePath() 3307 wd = self.__sitePath()
3500 except DjangoNoSiteSelectedException: 3308 except DjangoNoSiteSelectedException:
3501 E5MessageBox.warning( 3309 E5MessageBox.warning(

eric ide

mercurial