PluginProjectDjango.py

branch
eric7
changeset 172
ea7980ded4f3
parent 169
b8f263e05c39
child 175
30cb5e553e7e
equal deleted inserted replaced
171:af99f0984f20 172:ea7980ded4f3
9 9
10 import os 10 import os
11 import glob 11 import glob
12 import fnmatch 12 import fnmatch
13 13
14 from PyQt5.QtCore import QCoreApplication, QObject, QTranslator 14 from PyQt6.QtCore import QCoreApplication, QObject, QTranslator
15 15
16 from E5Gui.E5Application import e5App 16 from EricWidgets.EricApplication import ericApp
17 17
18 import Preferences 18 import Preferences
19 19
20 from Globals import isWindowsPlatform, isMacPlatform 20 from Globals import isWindowsPlatform, isMacPlatform
21 21
24 # Start-of-Header 24 # Start-of-Header
25 name = "Django Project Plugin" 25 name = "Django Project Plugin"
26 author = "Detlev Offenbach <detlev@die-offenbachs.de>" 26 author = "Detlev Offenbach <detlev@die-offenbachs.de>"
27 autoactivate = True 27 autoactivate = True
28 deactivateable = True 28 deactivateable = True
29 version = "6.2.0" 29 version = "1.0.0"
30 className = "ProjectDjangoPlugin" 30 className = "ProjectDjangoPlugin"
31 packageName = "ProjectDjango" 31 packageName = "ProjectDjango"
32 shortDescription = "Project support for Django projects." 32 shortDescription = "Project support for Django projects."
33 longDescription = ( 33 longDescription = (
34 """This plugin implements project support for Django projects.""" 34 """This plugin implements project support for Django projects."""
44 44
45 def apiFiles(language): 45 def apiFiles(language):
46 """ 46 """
47 Module function to return the API files made available by this plugin. 47 Module function to return the API files made available by this plugin.
48 48
49 @param language language to get APIs for (string) 49 @param language language to get APIs for
50 @return list of API filenames (list of string) 50 @type str
51 @return list of API filenames
52 @rtype list of str
51 """ 53 """
52 if language in ["Python3"]: 54 if language in ["Python3"]:
53 apisDir = os.path.join(os.path.dirname(__file__), 55 apisDir = os.path.join(os.path.dirname(__file__),
54 "ProjectDjango", "APIs") 56 "ProjectDjango", "APIs")
55 apis = glob.glob(os.path.join(apisDir, '*.api')) 57 apis = glob.glob(os.path.join(apisDir, '*.api'))
61 def createDjangoPage(configDlg): 63 def createDjangoPage(configDlg):
62 """ 64 """
63 Module function to create the Django configuration page. 65 Module function to create the Django configuration page.
64 66
65 @param configDlg reference to the configuration dialog 67 @param configDlg reference to the configuration dialog
68 @type ConfigurationWidget
66 @return reference to the configuration page 69 @return reference to the configuration page
70 @rtype DjangoPage
67 """ 71 """
68 global djangoPluginObject 72 global djangoPluginObject
69 from ProjectDjango.ConfigurationPage.DjangoPage import DjangoPage 73 from ProjectDjango.ConfigurationPage.DjangoPage import DjangoPage
70 page = DjangoPage(djangoPluginObject) 74 page = DjangoPage(djangoPluginObject)
71 return page 75 return page
74 def getConfigData(): 78 def getConfigData():
75 """ 79 """
76 Module function returning data as required by the configuration dialog. 80 Module function returning data as required by the configuration dialog.
77 81
78 @return dictionary containing the relevant data 82 @return dictionary containing the relevant data
79 """ 83 @rtype dict
80 try: 84 """
81 usesDarkPalette = e5App().usesDarkPalette() 85 usesDarkPalette = ericApp().usesDarkPalette()
82 except AttributeError:
83 from PyQt5.QtGui import QPalette
84 palette = e5App().palette()
85 lightness = palette.color(QPalette.Window).lightness()
86 usesDarkPalette = lightness <= 128
87 iconSuffix = "dark" if usesDarkPalette else "light" 86 iconSuffix = "dark" if usesDarkPalette else "light"
88 87
89 return { 88 return {
90 "djangoPage": [ 89 "djangoPage": [
91 QCoreApplication.translate("ProjectDjangoPlugin", "Django"), 90 QCoreApplication.translate("ProjectDjangoPlugin", "Django"),
117 116
118 def __init__(self, ui): 117 def __init__(self, ui):
119 """ 118 """
120 Constructor 119 Constructor
121 120
122 @param ui reference to the user interface object (UI.UserInterface) 121 @param ui reference to the user interface object
122 @type UserInterface
123 """ 123 """
124 QObject.__init__(self, ui) 124 QObject.__init__(self, ui)
125 self.__ui = ui 125 self.__ui = ui
126 self.__initialize() 126 self.__initialize()
127 127
128 self.__defaults = { 128 self.__defaults = {
129 "VirtualEnvironmentNamePy3": "", 129 "VirtualEnvironmentNamePy3": "",
130
131 # these are obsolete and kept for use with eric <18.07
132 "VirtualEnvironmentPy3": "",
133 130
134 "Python3ConsoleType": "ipython", 131 "Python3ConsoleType": "ipython",
135 132
136 "ServerAddress": "", 133 "ServerAddress": "",
137 134
172 169
173 self.__mainMenu = None 170 self.__mainMenu = None
174 self.__mainAct = None 171 self.__mainAct = None
175 self.__separatorAct = None 172 self.__separatorAct = None
176 173
177 self.__e5project = e5App().getObject("Project") 174 self.__ericProject = ericApp().getObject("Project")
178 175
179 self.__supportedVariants = [] 176 self.__supportedVariants = []
180 177
181 def activate(self): 178 def activate(self):
182 """ 179 """
183 Public method to activate this plugin. 180 Public method to activate this plugin.
184 181
185 @return tuple of None and activation status (boolean) 182 @return tuple of None and activation status
183 @rtype bool
186 """ 184 """
187 global djangoPluginObject 185 global djangoPluginObject
188 djangoPluginObject = self 186 djangoPluginObject = self
189 187
190 try: 188 usesDarkPalette = ericApp().usesDarkPalette()
191 usesDarkPalette = e5App().usesDarkPalette()
192 except AttributeError:
193 from PyQt5.QtGui import QPalette
194 palette = e5App().palette()
195 lightness = palette.color(QPalette.Window).lightness()
196 usesDarkPalette = lightness <= 128
197 iconSuffix = "dark" if usesDarkPalette else "light" 189 iconSuffix = "dark" if usesDarkPalette else "light"
198 190
199 self.__object = Project(self, iconSuffix, self.__ui) 191 self.__object = Project(self, iconSuffix, self.__ui)
200 self.__object.initActions() 192 self.__object.initActions()
201 e5App().registerPluginObject("ProjectDjango", self.__object) 193 ericApp().registerPluginObject("ProjectDjango", self.__object)
202 194
203 self.__mainMenu = self.__object.initMenu() 195 self.__mainMenu = self.__object.initMenu()
204 196
205 self.__supportedVariants = self.__object.supportedPythonVariants() 197 self.__supportedVariants = self.__object.supportedPythonVariants()
206 198
207 if self.__supportedVariants: 199 if self.__supportedVariants:
208 self.__e5project.registerProjectType( 200 self.__ericProject.registerProjectType(
209 "Django", self.tr("Django"), 201 "Django", self.tr("Django"),
210 self.fileTypesCallback, 202 self.fileTypesCallback,
211 lexerAssociationCallback=self.lexerAssociationCallback, 203 lexerAssociationCallback=self.lexerAssociationCallback,
212 binaryTranslationsCallback=self.binaryTranslationsCallback, 204 binaryTranslationsCallback=self.binaryTranslationsCallback,
213 progLanguages=self.__supportedVariants[:]) 205 progLanguages=self.__supportedVariants[:])
220 "Django", 212 "Django",
221 SourcesBrowserFlag | FormsBrowserFlag | 213 SourcesBrowserFlag | FormsBrowserFlag |
222 TranslationsBrowserFlag | OthersBrowserFlag, 214 TranslationsBrowserFlag | OthersBrowserFlag,
223 ) 215 )
224 216
225 if self.__e5project.isOpen(): 217 if self.__ericProject.isOpen():
226 self.__projectOpened() 218 self.__projectOpened()
227 self.__object.projectOpenedHooks() 219 self.__object.projectOpenedHooks()
228 220
229 e5App().getObject("Project").projectOpened.connect( 221 ericApp().getObject("Project").projectOpened.connect(
230 self.__projectOpened) 222 self.__projectOpened)
231 e5App().getObject("Project").projectClosed.connect( 223 ericApp().getObject("Project").projectClosed.connect(
232 self.__projectClosed) 224 self.__projectClosed)
233 e5App().getObject("Project").newProject.connect( 225 ericApp().getObject("Project").newProject.connect(
234 self.__projectOpened) 226 self.__projectOpened)
235 227
236 e5App().getObject("Project").projectOpenedHooks.connect( 228 ericApp().getObject("Project").projectOpenedHooks.connect(
237 self.__object.projectOpenedHooks) 229 self.__object.projectOpenedHooks)
238 e5App().getObject("Project").projectClosedHooks.connect( 230 ericApp().getObject("Project").projectClosedHooks.connect(
239 self.__object.projectClosedHooks) 231 self.__object.projectClosedHooks)
240 e5App().getObject("Project").newProjectHooks.connect( 232 ericApp().getObject("Project").newProjectHooks.connect(
241 self.__object.projectOpenedHooks) 233 self.__object.projectOpenedHooks)
242 234
243 e5App().getObject("Project").projectAboutToBeCreated.connect( 235 ericApp().getObject("Project").projectAboutToBeCreated.connect(
244 self.__object.startProjectOrApplication) 236 self.__object.startProjectOrApplication)
245 e5App().getObject("Project").newProject.connect( 237 ericApp().getObject("Project").newProject.connect(
246 self.__object.newProjectCreated) 238 self.__object.newProjectCreated)
247 239
248 return None, True 240 return None, True
249 241
250 def deactivate(self): 242 def deactivate(self):
251 """ 243 """
252 Public method to deactivate this plugin. 244 Public method to deactivate this plugin.
253 """ 245 """
254 e5App().unregisterPluginObject("ProjectDjango") 246 ericApp().unregisterPluginObject("ProjectDjango")
255 247
256 e5App().getObject("Project").projectOpened.disconnect( 248 ericApp().getObject("Project").projectOpened.disconnect(
257 self.__projectOpened) 249 self.__projectOpened)
258 e5App().getObject("Project").projectClosed.disconnect( 250 ericApp().getObject("Project").projectClosed.disconnect(
259 self.__projectClosed) 251 self.__projectClosed)
260 e5App().getObject("Project").newProject.disconnect( 252 ericApp().getObject("Project").newProject.disconnect(
261 self.__projectOpened) 253 self.__projectOpened)
262 254
263 e5App().getObject("Project").projectOpenedHooks.disconnect( 255 ericApp().getObject("Project").projectOpenedHooks.disconnect(
264 self.__object.projectOpenedHooks) 256 self.__object.projectOpenedHooks)
265 e5App().getObject("Project").projectClosedHooks.disconnect( 257 ericApp().getObject("Project").projectClosedHooks.disconnect(
266 self.__object.projectClosedHooks) 258 self.__object.projectClosedHooks)
267 e5App().getObject("Project").newProjectHooks.disconnect( 259 ericApp().getObject("Project").newProjectHooks.disconnect(
268 self.__object.projectOpenedHooks) 260 self.__object.projectOpenedHooks)
269 261
270 e5App().getObject("Project").projectAboutToBeCreated.disconnect( 262 ericApp().getObject("Project").projectAboutToBeCreated.disconnect(
271 self.__object.startProjectOrApplication) 263 self.__object.startProjectOrApplication)
272 e5App().getObject("Project").newProject.disconnect( 264 ericApp().getObject("Project").newProject.disconnect(
273 self.__object.newProjectCreated) 265 self.__object.newProjectCreated)
274 266
275 self.__e5project.unregisterProjectType("Django") 267 self.__ericProject.unregisterProjectType("Django")
276 268
277 self.__object.projectClosedHooks() 269 self.__object.projectClosedHooks()
278 self.__projectClosed() 270 self.__projectClosed()
279 271
280 self.__initialize() 272 self.__initialize()
291 translation = "django_{0}".format(loc) 283 translation = "django_{0}".format(loc)
292 translator = QTranslator(None) 284 translator = QTranslator(None)
293 loaded = translator.load(translation, locale_dir) 285 loaded = translator.load(translation, locale_dir)
294 if loaded: 286 if loaded:
295 self.__translator = translator 287 self.__translator = translator
296 e5App().installTranslator(self.__translator) 288 ericApp().installTranslator(self.__translator)
297 else: 289 else:
298 print("Warning: translation file '{0}' could not be" 290 print("Warning: translation file '{0}' could not be"
299 " loaded.".format(translation)) 291 " loaded.".format(translation))
300 print("Using default.") 292 print("Using default.")
301 293
302 def __projectOpened(self): 294 def __projectOpened(self):
303 """ 295 """
304 Private slot to handle the projectOpened signal. 296 Private slot to handle the projectOpened signal.
305 """ 297 """
306 if self.__e5project.getProjectType() == "Django": 298 if self.__ericProject.getProjectType() == "Django":
307 projectToolsMenu = self.__ui.getMenu("project_tools") 299 projectToolsMenu = self.__ui.getMenu("project_tools")
308 if projectToolsMenu is not None: 300 insertBeforeAct = projectToolsMenu.actions()[0]
309 insertBeforeAct = projectToolsMenu.actions()[0] 301 self.__mainAct = projectToolsMenu.insertMenu(
310 self.__mainAct = projectToolsMenu.insertMenu( 302 insertBeforeAct, self.__mainMenu)
311 insertBeforeAct, self.__mainMenu) 303 self.__separatorAct = projectToolsMenu.insertSeparator(
312 self.__separatorAct = projectToolsMenu.insertSeparator( 304 insertBeforeAct)
313 insertBeforeAct)
314 else:
315 projectAct = self.__ui.getMenuBarAction("project")
316 actions = self.__ui.menuBar().actions()
317 insertBeforeAct = actions[actions.index(projectAct) + 1]
318 self.__mainAct = self.__ui.menuBar().insertMenu(
319 insertBeforeAct, self.__mainMenu)
320 305
321 def __projectClosed(self): 306 def __projectClosed(self):
322 """ 307 """
323 Private slot to handle the projectClosed signal. 308 Private slot to handle the projectClosed signal.
324 """ 309 """
325 if self.__mainAct is not None: 310 if self.__mainAct is not None:
326 projectToolsMenu = self.__ui.getMenu("project_tools") 311 projectToolsMenu = self.__ui.getMenu("project_tools")
327 if projectToolsMenu is not None: 312 projectToolsMenu.removeAction(self.__separatorAct)
328 projectToolsMenu.removeAction(self.__separatorAct) 313 projectToolsMenu.removeAction(self.__mainAct)
329 projectToolsMenu.removeAction(self.__mainAct) 314 self.__mainAct = None
330 self.__mainAct = None 315 self.__separatorAct = None
331 self.__separatorAct = None
332 else:
333 self.__ui.menuBar().removeAction(self.__mainAct)
334 self.__mainAct = None
335 self.__object.projectClosed() 316 self.__object.projectClosed()
336 317
337 def fileTypesCallback(self): 318 def fileTypesCallback(self):
338 """ 319 """
339 Public method get the filetype associations of the Django project type. 320 Public method get the filetype associations of the Django project type.
340 321
341 @return dictionary with file type associations 322 @return dictionary with file type associations
323 @rtype dict
342 """ 324 """
343 fileTypes = ( 325 fileTypes = (
344 { 326 {
345 "*.html": "FORMS", 327 "*.html": "FORMS",
346 "*.htm": "FORMS", 328 "*.htm": "FORMS",
348 "*.pot": "TRANSLATIONS", 330 "*.pot": "TRANSLATIONS",
349 "*.po": "TRANSLATIONS", 331 "*.po": "TRANSLATIONS",
350 "*.mo": "TRANSLATIONS", 332 "*.mo": "TRANSLATIONS",
351 "*.py": "SOURCES", 333 "*.py": "SOURCES",
352 } 334 }
353 if self.__e5project.getProjectType() == "Django" else 335 if self.__ericProject.getProjectType() == "Django" else
354 {} 336 {}
355 ) 337 )
356 return fileTypes 338 return fileTypes
357 339
358 def lexerAssociationCallback(self, filename): 340 def lexerAssociationCallback(self, filename):
359 """ 341 """
360 Public method to get the lexer association of the Django project type 342 Public method to get the lexer association of the Django project type
361 for a file. 343 for a file.
362 344
363 @param filename name of the file (string) 345 @param filename name of the file
364 @return name of the lexer (string) (Pygments lexers are prefixed with 346 @type str
347 @return name of the lexer (Pygments lexers are prefixed with
365 'Pygments|') 348 'Pygments|')
349 @rtype str
366 """ 350 """
367 for pattern, language in self.lexerAssociations.items(): 351 for pattern, language in self.lexerAssociations.items():
368 if fnmatch.fnmatch(filename, pattern): 352 if fnmatch.fnmatch(filename, pattern):
369 return language 353 return language
370 354
373 def binaryTranslationsCallback(self, filename): 357 def binaryTranslationsCallback(self, filename):
374 """ 358 """
375 Public method to determine the filename of a compiled translation file 359 Public method to determine the filename of a compiled translation file
376 given the translation source file. 360 given the translation source file.
377 361
378 @param filename name of the translation source file (string) 362 @param filename name of the translation source file
379 @return name of the binary translation file (string) 363 @type str
364 @return name of the binary translation file
365 @rtype str
380 """ 366 """
381 if filename.endswith(".po"): 367 if filename.endswith(".po"):
382 filename = filename.replace(".po", ".mo") 368 filename = filename.replace(".po", ".mo")
383 return filename 369 return filename
384 370
385 def getPreferences(self, key): 371 def getPreferences(self, key):
386 """ 372 """
387 Public method to retrieve the various settings. 373 Public method to retrieve the various settings.
388 374
389 @param key the key of the value to get 375 @param key the key of the value to get
390 @return the requested setting 376 @type str
377 @return value of the requested setting
378 @rtype Any
391 """ 379 """
392 if key in ["RecentNumberApps", "RecentNumberTestData"]: 380 if key in ["RecentNumberApps", "RecentNumberTestData"]:
393 return int(Preferences.Prefs.settings.value( 381 return int(Preferences.Prefs.settings.value(
394 self.PreferencesKey + "/" + key, self.__defaults[key])) 382 self.PreferencesKey + "/" + key, self.__defaults[key]))
395 elif key in ["UseIPv6", "UseThreading", 383 elif key in ["UseIPv6", "UseThreading",
403 391
404 def setPreferences(self, key, value): 392 def setPreferences(self, key, value):
405 """ 393 """
406 Public method to store the various settings. 394 Public method to store the various settings.
407 395
408 @param key the key of the setting to be set (string) 396 @param key the key of the setting to be set
409 @param value the value to be set 397 @type str
398 @param value value to be set
399 @type Any
410 """ 400 """
411 Preferences.Prefs.settings.setValue( 401 Preferences.Prefs.settings.setValue(
412 self.PreferencesKey + "/" + key, value) 402 self.PreferencesKey + "/" + key, value)
413 403
414 if key in ["VirtualEnvironmentPy3", "VirtualEnvironmentNamePy3"]: 404 if key in ["VirtualEnvironmentNamePy3"]:
415 self.__reregisterProjectType() 405 self.__reregisterProjectType()
416 elif key == "TranslationsEditor" and self.__object: 406 elif key == "TranslationsEditor" and self.__object:
417 self.__object.registerOpenHook() 407 self.__object.registerOpenHook()
418 408
419 def __reregisterProjectType(self): 409 def __reregisterProjectType(self):
421 Private method to re-register the project type. 411 Private method to re-register the project type.
422 """ 412 """
423 supportedVariants = self.__object.supportedPythonVariants() 413 supportedVariants = self.__object.supportedPythonVariants()
424 if supportedVariants != self.__supportedVariants: 414 if supportedVariants != self.__supportedVariants:
425 # step 1: unregister 415 # step 1: unregister
426 self.__e5project.unregisterProjectType("Django") 416 self.__ericProject.unregisterProjectType("Django")
427 417
428 # step 2: register again with new language settings 418 # step 2: register again with new language settings
429 self.__supportedVariants = supportedVariants 419 self.__supportedVariants = supportedVariants
430 if self.__supportedVariants: 420 if self.__supportedVariants:
431 self.__e5project.registerProjectType( 421 self.__ericProject.registerProjectType(
432 "Django", self.tr("Django"), 422 "Django", self.tr("Django"),
433 self.fileTypesCallback, 423 self.fileTypesCallback,
434 lexerAssociationCallback=self.lexerAssociationCallback, 424 lexerAssociationCallback=self.lexerAssociationCallback,
435 binaryTranslationsCallback=self.binaryTranslationsCallback, 425 binaryTranslationsCallback=self.binaryTranslationsCallback,
436 progLanguages=self.__supportedVariants[:]) 426 progLanguages=self.__supportedVariants[:])

eric ide

mercurial