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

Reply via email to