Author: jmorliaguet Date: Tue Jun 6 18:02:01 2006 New Revision: 3336 Modified: cpsskins/branches/paris-sprint-2006/browser/rendering/renderer.py cpsskins/branches/paris-sprint-2006/browser/rendering/viewer.py cpsskins/branches/paris-sprint-2006/elements/format.py cpsskins/branches/paris-sprint-2006/elements/interfaces.py cpsskins/branches/paris-sprint-2006/relations/relations.py cpsskins/branches/paris-sprint-2006/setup/utils.py cpsskins/branches/paris-sprint-2006/standard/filters/style/views.py cpsskins/branches/paris-sprint-2006/standard/io/preset.py cpsskins/branches/paris-sprint-2006/storage/relations.py cpsskins/branches/paris-sprint-2006/thememanager.py cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/element-editor.css cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/element_editor.pt cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/views.py
Log: - saving work: - it is now possible to use presets stored on the filesystem, instead of storing a reference to them in the ZODB (which doesn't work since the object is in RAM), we use their URI and we save it in the ZODB. Modified: cpsskins/branches/paris-sprint-2006/browser/rendering/renderer.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/browser/rendering/renderer.py (original) +++ cpsskins/branches/paris-sprint-2006/browser/rendering/renderer.py Tue Jun 6 18:02:01 2006 @@ -19,15 +19,15 @@ import logging -from zope.component import adapts, queryUtility, getMultiAdapter -from zope.component import queryMultiAdapter +from zope.component import adapts, queryUtility +from zope.component import getMultiAdapter, queryMultiAdapter from zope.interface import implements from zope.publisher.interfaces import IRequest from cpsskins import configuration from cpsskins.browser.rendering.interfaces import IRendererView, IFilterView from cpsskins.elements.interfaces import INode, IElement, ILeaf -from cpsskins.setup.interfaces import IResource, IPreset, IType +from cpsskins.setup.interfaces import IType logger = logging.getLogger("cpsskins") @@ -126,21 +126,19 @@ continue adapted = adapted[0] - # the adapted object is a preset - if IPreset.providedBy(adapted): - adapted = IResource(adapted).getResource() + # the adapted object is a URI + if isinstance(adapted, basestring): + uri = adapted + adapted = info.globals.resources.resolve(uri, self.element) # get the adapter - filter = queryMultiAdapter( - objects=(adapted,), - interface=IFilterView, - name=filter_name, - default=None) + filter = queryMultiAdapter((adapted,), IFilterView, + name=filter_name, default=None) if filter is None: logger.warning("Filter '%s' will not be applied. " - "No IFilterView adapter was found for '%s'.", - filter_name, repr(adapted)) + "No IFilterView adapter was found for '%s'.", + filter_name, repr(adapted)) continue # the filter proxy uses a page template to apply to the element Modified: cpsskins/branches/paris-sprint-2006/browser/rendering/viewer.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/browser/rendering/viewer.py (original) +++ cpsskins/branches/paris-sprint-2006/browser/rendering/viewer.py Tue Jun 6 18:02:01 2006 @@ -19,7 +19,7 @@ import logging -from zope.component import adapts, getMultiAdapter +from zope.component import adapts, getMultiAdapter, getUtility from zope.event import notify from zope.interface import implements from zope.publisher.interfaces import IRequest @@ -32,6 +32,7 @@ from cpsskins.browser.tree.interfaces import INodeTraversing from cpsskins.elements.interfaces import INode, IElement, ISlot from cpsskins.elements.interfaces import IDisplayable +from cpsskins.setup.interfaces import IType, IResourceManager from cpsskins.utils import getThemeManager logger = logging.getLogger("cpsskins") @@ -73,13 +74,15 @@ negotiation = getMultiAdapter((element, request), INegotiation, 'negotiation') perspective = negotiation.getPerspective() + resources = getUtility(IResourceManager) # update global context info variables passed as keyword parameters globals = ContextInfo(kw) globals.update({ - 'perspective': perspective, 'request': request, + 'perspective': perspective, 'relations': relations, + 'resources': resources, }) if globals.engine is None: Modified: cpsskins/branches/paris-sprint-2006/elements/format.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/elements/format.py (original) +++ cpsskins/branches/paris-sprint-2006/elements/format.py Tue Jun 6 18:02:01 2006 @@ -17,10 +17,10 @@ """ __docformat__ = "reStructuredText" +from zope.component import queryUtility, getUtility, createObject +from zope.interface import implements from zope.location.pickling import locationCopy from zope.traversing.interfaces import IPathAdapter, ITraversable -from zope.component import queryUtility, createObject -from zope.interface import implements from zope.security.proxy import removeSecurityProxy from cpsskins.elements.element import Element @@ -28,6 +28,8 @@ from cpsskins.ontology import hasFormat, IFormatPredicate from cpsskins.relations import DyadicRelation from cpsskins.setup.interfaces import IResource, IPreset, IType +from cpsskins.setup.interfaces import IResourceManager +from cpsskins.setup.utils import getTypeNameFromURI from cpsskins.utils import getThemeManager, getRelationStorage class Format(Element): @@ -112,8 +114,11 @@ formats = [] context = self.context relations = getRelationStorage(context) - predicate = self.getPredicate(name) + resources = getUtility(IResourceManager) + predicate = self.guessPredicate(name) for format in relations.getSeconds(first=context, predicate=predicate): + if isinstance(format, basestring): + format = resources.lookup(uri=format, context=context) if resolve and IPreset.providedBy(format): format = IResource(format).getResource() formats.append(format) @@ -147,11 +152,17 @@ context = self.context relations = getRelationStorage(context) - predicate = self.getPredicate(IType(format).resourcename) + if isinstance(format, basestring): + name = getTypeNameFromURI(format)[len('format-'):] + else: + name = IType(format).resourcename + + predicate = self.guessPredicate(name) old_relations = relations.search(first=context, predicate=predicate) relations.remove(old_relations) - relation = DyadicRelation(first=context, second=format, + display = removeSecurityProxy(context) + relation = DyadicRelation(first=display, second=format, predicate=predicate) relations.add(relation) @@ -161,7 +172,7 @@ new_format = locationCopy(removeSecurityProxy(format)) return self.storeFormat(new_format) - def getPredicate(self, name=u''): + def guessPredicate(self, name=u''): if not name: return hasFormat return queryUtility(IFormatPredicate, name).predicate Modified: cpsskins/branches/paris-sprint-2006/elements/interfaces.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/elements/interfaces.py (original) +++ cpsskins/branches/paris-sprint-2006/elements/interfaces.py Tue Jun 6 18:02:01 2006 @@ -94,9 +94,6 @@ types = Attribute("The format types.") - def findDisplays(): - """ """ - class IFormattable(Interface): def getFormats(name, resolve): Modified: cpsskins/branches/paris-sprint-2006/relations/relations.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/relations/relations.py (original) +++ cpsskins/branches/paris-sprint-2006/relations/relations.py Tue Jun 6 18:02:01 2006 @@ -128,7 +128,7 @@ "A monadic relation only has a first element." def __repr__(self): - predicate = str(self()).replace('_', '%s') + predicate = str(self).replace('_', '%s') return "<Monadic relation: '%s'>" % (predicate % repr(self.first)) @@ -186,7 +186,7 @@ "A dyadic relation only has a first and a second element." def __repr__(self): - predicate = str(self()).replace('_', '%s') + predicate = str(self).replace('_', '%s') return "<Dyadic relation: '%s'>" % ( predicate % (repr(self.first), repr(self.second))) @@ -255,7 +255,7 @@ "A triadic relation only has a first, second and third element." def __repr__(self): - predicate = str(self()).replace('_', '%s') + predicate = str(self).replace('_', '%s') return "<Triadic relation: '%s'>" % ( predicate % (repr(self.first), repr(self.second), repr(self.third)) ) Modified: cpsskins/branches/paris-sprint-2006/setup/utils.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/setup/utils.py (original) +++ cpsskins/branches/paris-sprint-2006/setup/utils.py Tue Jun 6 18:02:01 2006 @@ -42,9 +42,6 @@ def getContentType(name): return getType(name)[-1] -def getResourceTypeName(name): - return name.split('-')[0] - def getTypeName(type): """Return the type signature's name from the type signature. """ @@ -60,3 +57,17 @@ names.append(name[0]) return u'-'.join(names) +def getTypeNameFromURI(uri): + """Return the type name from a URI. + """ + if not uri.startswith('cpsskins://'): + raise ValueError("Unknown URI scheme in '%s'" % uri) + + location = uri[11:] + if ':' in location: + return location.split(':')[0] + + if '@' in location: + return location.split('@')[0] + + raise ValueError("Unknown URI scheme in '%s'" % uri) Modified: cpsskins/branches/paris-sprint-2006/standard/filters/style/views.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/standard/filters/style/views.py (original) +++ cpsskins/branches/paris-sprint-2006/standard/filters/style/views.py Tue Jun 6 18:02:01 2006 @@ -42,10 +42,14 @@ self.tmutil = getThemeManager(context) def getWidgetTypes(self): - display_id = self.request.form.get('display') - display = self.tmutil.getElementById(display_id) - widget = IFormattable(display).getFormat(u'widget') - return widget.types + readonly = self.request.form.get('readonly') + if readonly: + return [] + else: + display_id = self.request.form.get('display') + display = self.tmutil.getElementById(display_id) + widget = IFormattable(display).getFormat(u'widget') + return widget.types def renderWidgetPreview(self): """Render a style preview based on the specified widget. @@ -58,7 +62,6 @@ widget = getUtility(configuration.IWidget, widget_type) markup = widget.view(None, None).renderPreview() markup = utils.insertCSSClass(markup, utils.camelize(widget_type)) - markup = utils.insertCSSClass(markup, u'style' + unicode(style_id)) return markup Modified: cpsskins/branches/paris-sprint-2006/standard/io/preset.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/standard/io/preset.py (original) +++ cpsskins/branches/paris-sprint-2006/standard/io/preset.py Tue Jun 6 18:02:01 2006 @@ -21,7 +21,6 @@ from zope.interface import implements from cpsskins.setup.interfaces import IResource, IType -from cpsskins.setup.utils import getResourceTypeName from cpsskins.setup.io.interfaces import IDOMAdapter from cpsskins.setup.io.adapters import BaseDOMAdapter @@ -69,7 +68,6 @@ resource = IResource(context).getResource() importer = getMultiAdapter((resource, node), IDOMAdapter) importer.clone(self) - importer.object_type = getResourceTypeName(typename) + importer.object_type = typename.split('-')[0] importer.load() - Modified: cpsskins/branches/paris-sprint-2006/storage/relations.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/storage/relations.py (original) +++ cpsskins/branches/paris-sprint-2006/storage/relations.py Tue Jun 6 18:02:01 2006 @@ -98,6 +98,8 @@ ... self.name = name ... def __str__(self): ... return self.name + ... def __repr__(self): + ... return self.name >>> first = Relate('snow') >>> first = Relate(u'this') Modified: cpsskins/branches/paris-sprint-2006/thememanager.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/thememanager.py (original) +++ cpsskins/branches/paris-sprint-2006/thememanager.py Tue Jun 6 18:02:01 2006 @@ -270,7 +270,6 @@ if k == name: self.unregisterUtility(v, ITheme, k) del self[getName(v)] - print 'deleted' + k return raise KeyError("No such theme: %s." % name) Modified: cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/element-editor.css ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/element-editor.css (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/element-editor.css Tue Jun 6 18:02:01 2006 @@ -55,3 +55,7 @@ padding: 0.3em; font-weight: bold; } + +select.presetSelector option.readonly { + font-style: italic; +} Modified: cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/element_editor.pt ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/element_editor.pt (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/element_editor.pt Tue Jun 6 18:02:01 2006 @@ -47,10 +47,11 @@ tal:condition="python: format and edited_type in preset_info" tal:attributes="action string:${display/@@absolute_url}/@@usePreset"> Use preset: - <select name="uri"> + <select class="presetSelector" name="uri"> <option value="_">(no preset)</option> <option tal:repeat="preset preset_info/?edited_type" tal:attributes="value preset/uri; + class python: preset['readonly'] and 'readonly' or nothing; selected python: preset_uri == preset['uri']"> <tal:block content="preset/name" /> </option> @@ -60,10 +61,16 @@ </form> <div style="clear:both" /> - <tal:block condition="python: mode == 'edit'" - content="structure edited/@@edit.html" /> + <tal:block condition="python: not preset or preset.isLocal()"> + <tal:block condition="python: mode == 'edit'" + content="structure edited/@@edit.html" /> + </tal:block> - <fieldset class="panel" tal:condition="python: mode == 'preview'"> + <tal:block condition="python: preset and preset.isGlobal()"> + <em>This preset is stored on the file-system. It cannot be edited.</em> + </tal:block> + + <fieldset class="panel" tal:condition="python: mode == 'preview' or preset and preset.isGlobal()"> <legend class="panelTitle">Preview <tal:block content="preset/name" condition="preset" /> </legend> Modified: cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/views.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/views.py (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/elementeditor/views.py Tue Jun 6 18:02:01 2006 @@ -20,8 +20,8 @@ from zope.formlib import form from zope.component import getMultiAdapter, getUtility from zope.location.pickling import locationCopy -from zope.traversing.api import getParent from zope.security.proxy import removeSecurityProxy +from zope.traversing.api import getParent from cpsskins.browser.negotiation.interfaces import INegotiation from cpsskins.browser.rendering.interfaces import IViewer @@ -104,8 +104,11 @@ format = f is_preset = IPreset.providedBy(f) if is_preset: + if f.isGlobal(): f = IResource(f).getResource() + id = f.identifier or 0 + format_name = str(IType(f)) selected = tab == format_name @@ -115,9 +118,8 @@ preset = format preset_uri = uri - formats.append({'name': format_name, 'id': f.identifier or 0, - 'uri': uri, 'is_preset': is_preset, - 'selected': selected}) + formats.append({'name': format_name, 'id': id, 'uri': uri, + 'is_preset': is_preset, 'selected': selected}) viewer = getMultiAdapter((context, request), IViewer) preview = viewer() @@ -189,16 +191,7 @@ if not IFormat.providedBy(resource): raise TypeError("The resource must be a format.") - # remove the existing display <--> format relation - relations = getRelationStorage(context) - predicate = resource.predicate - old_rel = relations.search(first=context, predicate=predicate) - relations.remove(old_rel) - - # create a new display <--> preset relation - relation = DyadicRelation(first=context, second=preset, - predicate=predicate) - relations.add(relation) + IFormattable(context).setFormat(uri) def stopUsingPreset(self, uri=u''): """Stop using a preset referred to by its URI @@ -217,21 +210,11 @@ if preset is None: raise KeyError("No such preset: '%s'." % uri) - formats = getThemeManager(context).getFormatStorage() resource = IResource(preset).getResource() - # remove the old display <-> preset relation - relations = getRelationStorage(context) - predicate = resource.predicate - old_rel = relations.search(first=context, predicate=predicate) - relations.remove(old_rel) - - format = locationCopy(removeSecurityProxy(resource)) - formats.add(format) - - relation = DyadicRelation(first=context, second=format, - predicate=predicate) - relations.add(relation) + formattable = IFormattable(context) + format = formattable.cloneFormat(resource) + formattable.setFormat(format) ### Sites ######################################################### -- http://lists.nuxeo.com/mailman/listinfo/z3lab-checkins