Author: jmorliaguet Date: Fri Mar 24 11:33:42 2006 New Revision: 2712 Modified: cpsskins/branches/jmo-perspectives/profiles/default/perspectives.xml cpsskins/branches/jmo-perspectives/setup/README.txt cpsskins/branches/jmo-perspectives/setup/configure.zcml cpsskins/branches/jmo-perspectives/setup/registration.py cpsskins/branches/jmo-perspectives/ui/panels/settings_section.pt cpsskins/branches/jmo-perspectives/ui/screens/sitemanager/configure.zcml cpsskins/branches/jmo-perspectives/ui/screens/sitemanager/views.py Log:
- fixes / test updates - new settings can now be added without restarting the server - added a 'refreshSettings' page to refresh all settings TTW Modified: cpsskins/branches/jmo-perspectives/profiles/default/perspectives.xml ============================================================================== --- cpsskins/branches/jmo-perspectives/profiles/default/perspectives.xml (original) +++ cpsskins/branches/jmo-perspectives/profiles/default/perspectives.xml Fri Mar 24 11:33:42 2006 @@ -1,4 +1,9 @@ <?xml version="1.0" encoding="utf-8" ?> -<setting name="perspective.global" title="Global perspective"> - <perspective name="perspective.global" title="Global perspective" /> -</setting> +<settings> + <setting name="perspective.global" title="Global perspective"> + <perspective name="perspective.global" title="Global perspective" /> + </setting> + <setting name="perspective.global2" title="Global perspective 2"> + <perspective name="perspective.global" title="Global perspective 2" /> + </setting> +</settings> Modified: cpsskins/branches/jmo-perspectives/setup/README.txt ============================================================================== --- cpsskins/branches/jmo-perspectives/setup/README.txt (original) +++ cpsskins/branches/jmo-perspectives/setup/README.txt Fri Mar 24 11:33:42 2006 @@ -242,8 +242,7 @@ >>> from cpsskins.setup.registration import register, loadSettings >>> register('cpsskins.setup.test', 'resource4.xml') - >>> event = object() - >>> loadSettings(event) + >>> loadSettings() >>> pprint(resources.list(type=IDummyResource)) [<Dummy resource: resource1>, @@ -260,7 +259,6 @@ File-system resources can be reloaded: >>> from cpsskins.setup.registration import reloadSetting - >>> reloadSetting(u'test.setting4') Resources created through-the-web cannot be reloaded: @@ -270,4 +268,10 @@ ... TypeError: The setting is not a file-system setting. +File-system resources can also be refreshed: + + >>> from cpsskins.setup.registration import refreshSettings + >>> refreshSettings() +In that case the file's modification date is compared with the date when the +settings where last loaded. Modified: cpsskins/branches/jmo-perspectives/setup/configure.zcml ============================================================================== --- cpsskins/branches/jmo-perspectives/setup/configure.zcml (original) +++ cpsskins/branches/jmo-perspectives/setup/configure.zcml Fri Mar 24 11:33:42 2006 @@ -22,13 +22,13 @@ <!-- register global application settings --> <subscriber - handler=".registration.loadSettings" + handler=".registration.loadSettingsEvent" for="zope.app.appsetup.IDatabaseOpenedEvent" /> <!-- refresh settings in dev mode --> <subscriber - handler=".registration.refreshSettings" + handler=".registration.refreshSettingsEvent" for="cpsskins.browser.rendering.interfaces.IViewNodeEvent" zcml:condition="have devmode" /> Modified: cpsskins/branches/jmo-perspectives/setup/registration.py ============================================================================== --- cpsskins/branches/jmo-perspectives/setup/registration.py (original) +++ cpsskins/branches/jmo-perspectives/setup/registration.py Fri Mar 24 11:33:42 2006 @@ -25,7 +25,7 @@ from xml.dom.minidom import parse from xml.parsers.expat import ExpatError -from zope.component import getUtility, createObject +from zope.component import getUtility, queryUtility, createObject from cpsskins.io.interfaces import IDataImporter from cpsskins.setup.interfaces import IResourceManager @@ -47,7 +47,7 @@ # Events ####################################################################### -def loadSettings(event): +def loadSettings(): """Load all registered settings. """ resources = getUtility(IResourceManager) @@ -55,39 +55,62 @@ for file in files: filename = file['filename'] dom = parse(filename) - for setting in dom.getElementsByTagName('setting'): - name = setting.getAttribute('name') - title = setting.getAttribute('title') - - resource = setting.getElementsByTagName('*') - if not resource: - logger.debug("no resource found for %s" % name) + for setting_def in dom.getElementsByTagName('setting'): + name = setting_def.getAttribute('name') + title = setting_def.getAttribute('title') + resource = _loadResourceFromXML(setting_def, name, title) + if resource is None: continue - resource = resource[0] - - # create the resource - resource_object = createObject(resource.tagName) - - # load the data - IDataImporter(resource_object).load(resource.toxml()) - - # register the resource - resources.register(name=name, title=title, resource=resource_object, + resources.register(name=name, title=title, resource=resource, filename=filename) file['refresh_date'] = time.time() logger.debug("loaded settings in %s", filename) -def refreshSettings(event): +def _loadResourceFromXML(setting_def=None, name=u'', title=u'', filename=u''): + resources = getUtility(IResourceManager) + + resource_defs = setting_def.getElementsByTagName('*') + if not resource_defs: + logger.debug("no resource found for %s" % name) + return None + + resource_def = resource_defs[0] + + setting = queryUtility(ISetting, name, None) + if setting is None: + # create the resource + resource = createObject(resource_def.tagName) + resources.register(name=name, title=title, + resource=resource, filename=filename) + logger.debug("new setting added: '%s'", name) + else: + resource = IResource(setting).getResource() + setting.title = title + logger.debug("reloaded setting %s in %s", name, filename) + + # load the data + IDataImporter(resource).load(resource_def.toxml()) + return resource + + +def refreshSettings(): """Refresh all settings that have been modified on the filesystem. """ for file in files: - refresh_date = file['refresh_date'] + refresh_date = file.get('refresh_date', 0) filename = file['filename'] if refresh_date > os.path.getmtime(filename): continue _reload(filename=filename) + file['refresh_date'] = time.time() + +def refreshSettingsEvent(event): + refreshSettings() + +def loadSettingsEvent(event): + loadSettings() ####################################################################### # Reloading settings @@ -102,9 +125,9 @@ if not filename: raise TypeError("The setting is not a file-system setting.") - _reload(name=name, filename=filename) + _reload(setting_name=name, filename=filename) -def _reload(name=u'', filename=None): +def _reload(setting_name=u'', filename=u''): """Reload the settings in a file """ try: @@ -113,22 +136,13 @@ logger.warning("could not parse %s - not reloading", filename) return - for setting_node in dom.getElementsByTagName('setting'): - setting_name = setting_node.getAttribute('name') - if name and setting_name != name: + for setting_def in dom.getElementsByTagName('setting'): + name = setting_def.getAttribute('name') + title = setting_def.getAttribute('title') + if setting_name and name != setting_name: continue - resource = setting_node.getElementsByTagName('*') - if not resource: - break - resource = resource[0] - - setting = getUtility(ISetting, setting_name) - resource_object = IResource(setting).getResource() - IDataImporter(resource_object).load(resource.toxml()) - - if name: - logger.debug("reloaded setting %s in %s", name, filename) + _loadResourceFromXML(setting_def, name, title, filename) if not name: - logger.debug("reloaded settings in %s", filename) + logger.debug("reloaded all settings in %s", filename) Modified: cpsskins/branches/jmo-perspectives/ui/panels/settings_section.pt ============================================================================== --- cpsskins/branches/jmo-perspectives/ui/panels/settings_section.pt (original) +++ cpsskins/branches/jmo-perspectives/ui/panels/settings_section.pt Fri Mar 24 11:33:42 2006 @@ -18,6 +18,9 @@ tal:condition="readonly">[reload]</a> </tal:block> </li> + <li> + <a tal:attributes="href string:@@refreshSettings">[refresh]</a> + </li> </ul> </div> <div tal:condition="not:section"> Modified: cpsskins/branches/jmo-perspectives/ui/screens/sitemanager/configure.zcml ============================================================================== --- cpsskins/branches/jmo-perspectives/ui/screens/sitemanager/configure.zcml (original) +++ cpsskins/branches/jmo-perspectives/ui/screens/sitemanager/configure.zcml Fri Mar 24 11:33:42 2006 @@ -52,6 +52,11 @@ attribute="reloadSetting" /> + <page + name="refreshSettings" + attribute="refreshSettings" + /> + </pages> </configure> Modified: cpsskins/branches/jmo-perspectives/ui/screens/sitemanager/views.py ============================================================================== --- cpsskins/branches/jmo-perspectives/ui/screens/sitemanager/views.py (original) +++ cpsskins/branches/jmo-perspectives/ui/screens/sitemanager/views.py Fri Mar 24 11:33:42 2006 @@ -27,7 +27,7 @@ from cpsskins.setup.interfaces import ISetting, IGlobalSetting from cpsskins.setup.interfaces import IResourceType, IResourceManager, IResource from cpsskins.io.interfaces import IDataExporter -from cpsskins.setup.registration import reloadSetting +from cpsskins.setup.registration import reloadSetting, refreshSettings setting_xml = """<?xml version="1.0"?> <setting name="%(name)s" title="%(title)s"> @@ -109,3 +109,8 @@ """Reload the setting from the file-system """ reloadSetting(name) + + def refreshSettings(self): + """Refresh all settings stored on the file-system + """ + refreshSettings() -- http://lists.nuxeo.com/mailman/listinfo/z3lab-checkins