Author: jmorliaguet Date: Sat Jul 1 15:24:22 2006 New Revision: 3579 Modified: cpsskins/branches/paris-sprint-2006/configure.zcml cpsskins/branches/paris-sprint-2006/doc/portlets.txt cpsskins/branches/paris-sprint-2006/elements/interfaces.py cpsskins/branches/paris-sprint-2006/elements/slot.py cpsskins/branches/paris-sprint-2006/locations/README.txt cpsskins/branches/paris-sprint-2006/locations/sources.py cpsskins/branches/paris-sprint-2006/perspectives/configure.zcml cpsskins/branches/paris-sprint-2006/perspectives/interfaces.py cpsskins/branches/paris-sprint-2006/perspectives/perspective.py cpsskins/branches/paris-sprint-2006/setup/README.txt cpsskins/branches/paris-sprint-2006/setup/adapters.py cpsskins/branches/paris-sprint-2006/setup/interfaces.py cpsskins/branches/paris-sprint-2006/setup/utils.py cpsskins/branches/paris-sprint-2006/storage/relations.py cpsskins/branches/paris-sprint-2006/tests/test_storages.py cpsskins/branches/paris-sprint-2006/thememanager.py cpsskins/branches/paris-sprint-2006/ui/screens/common/authoring.css cpsskins/branches/paris-sprint-2006/ui/screens/common/configure.zcml cpsskins/branches/paris-sprint-2006/ui/screens/common/perspective_selector.pt cpsskins/branches/paris-sprint-2006/ui/screens/common/views.py cpsskins/branches/paris-sprint-2006/ui/screens/pagedesigner/layout/layout_mode.css cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/configure.zcml cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/negotiation_section.pt cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/presets_section.pt cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/site_manager.css cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/views.py
Log: - saving work - added a UI for creating presets - cosmetic Modified: cpsskins/branches/paris-sprint-2006/configure.zcml ============================================================================== --- cpsskins/branches/paris-sprint-2006/configure.zcml (original) +++ cpsskins/branches/paris-sprint-2006/configure.zcml Sat Jul 1 15:24:22 2006 @@ -97,6 +97,8 @@ <include package=".setup" /> + <include package=".perspectives" /> + <include package=".storage" /> <include package=".lib" /> Modified: cpsskins/branches/paris-sprint-2006/doc/portlets.txt ============================================================================== --- cpsskins/branches/paris-sprint-2006/doc/portlets.txt (original) +++ cpsskins/branches/paris-sprint-2006/doc/portlets.txt Sat Jul 1 15:24:22 2006 @@ -421,7 +421,7 @@ Finally we clear the storage: - >>> relations.clear() + >>> relations.purge() 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 Sat Jul 1 15:24:22 2006 @@ -37,9 +37,6 @@ class INode(IElement): """A generic tree node""" - def getSiblings(self): - """Return the list of siblings""" - class IInnerNode(INode, IOrderedContainer): """An inner node has children""" @@ -183,6 +180,9 @@ """Return true if the page is the default one. """ + def getSiblings(): + """Return the list of siblings""" + def name(): """Return the page's name (used when registering the page as a utility.) @@ -226,6 +226,9 @@ """Set the theme as the default theme. """ + def getSiblings(): + """Return the list of siblings""" + def name(): """Return the theme's name (used when registering the theme as a utility.) Modified: cpsskins/branches/paris-sprint-2006/elements/slot.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/elements/slot.py (original) +++ cpsskins/branches/paris-sprint-2006/elements/slot.py Sat Jul 1 15:24:22 2006 @@ -114,8 +114,8 @@ tmutil = getThemeManager(context) perspectives = [(_(u'Do not use perspectives'), u''), (_(u'Always use the current perspective'), u'.')] - for name, title in tmutil.listPerspectives(): - perspectives.append((_(title), name)) + for name in tmutil.listPerspectives(): + perspectives.append((name, name)) return SimpleVocabulary.fromItems(perspectives) Modified: cpsskins/branches/paris-sprint-2006/locations/README.txt ============================================================================== --- cpsskins/branches/paris-sprint-2006/locations/README.txt (original) +++ cpsskins/branches/paris-sprint-2006/locations/README.txt Sat Jul 1 15:24:22 2006 @@ -318,9 +318,9 @@ to obtain all the paths we use: >>> locations.getAllPaths() # doctest: +NORMALIZE_WHITESPACE - [(u'', u'f1'), (u'', u'f1', u'f6'), (u'', u'f1', u'f2'), - (u'', u'f1', u'f3'), (u'', u'f1', u'f4'), - (u'', u'f1', u'f5')] + [(u'', u'f1', u'f2', u''), (u'', u'f1', u'f3', u''), + (u'', u'f1', u'f6', u''), (u'', u'f1', u''), (u'', u'f1', u'f4', u''), + (u'', u'f1', u'f5', u'')] view names ........... Modified: cpsskins/branches/paris-sprint-2006/locations/sources.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/locations/sources.py (original) +++ cpsskins/branches/paris-sprint-2006/locations/sources.py Sat Jul 1 15:24:22 2006 @@ -73,7 +73,7 @@ elif root == u'perspectives': for perspective in tmutil.listPerspectives(): - choices[perspective.name] = perspective.title + choices[perspective.name] = perspective.name elif root == u'engines': # FIXME Modified: cpsskins/branches/paris-sprint-2006/perspectives/configure.zcml ============================================================================== --- cpsskins/branches/paris-sprint-2006/perspectives/configure.zcml (original) +++ cpsskins/branches/paris-sprint-2006/perspectives/configure.zcml Sat Jul 1 15:24:22 2006 @@ -6,7 +6,7 @@ i18n_domain="cpsskins" > - <class class=".Perspective"> + <class class=".perspective.Perspective"> <require permission="zope.View" Modified: cpsskins/branches/paris-sprint-2006/perspectives/interfaces.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/perspectives/interfaces.py (original) +++ cpsskins/branches/paris-sprint-2006/perspectives/interfaces.py Sat Jul 1 15:24:22 2006 @@ -17,21 +17,20 @@ """ __docformat__ = "reStructuredText" -from zope.schema import DottedName, TextLine +from zope.schema import TextLine from cpsskins.elements.interfaces import IElement class IPerspective(IElement): """A perspective.""" - name = DottedName( + name = TextLine( title=u"Name", ) - title = TextLine( - title=u"Title", - ) - - def __str__(self): + def __str__(): """Return the name of the perspective""" + def __eq__(other): + """Return True if this is the same as another perspective""" + Modified: cpsskins/branches/paris-sprint-2006/perspectives/perspective.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/perspectives/perspective.py (original) +++ cpsskins/branches/paris-sprint-2006/perspectives/perspective.py Sat Jul 1 15:24:22 2006 @@ -31,12 +31,15 @@ >>> perspective <Perspective: 'cpsskins.perspective'> + >>> from zope.interface.verify import verifyClass + >>> verifyClass(IPerspective, Perspective) + True + """ implements(IPerspective) - def __init__(self, name=u'', title=u''): + def __init__(self, name=u''): self.name = name - self.title = title def __repr__(self): return "<Perspective: '%s'>" % str(self) Modified: cpsskins/branches/paris-sprint-2006/setup/README.txt ============================================================================== --- cpsskins/branches/paris-sprint-2006/setup/README.txt (original) +++ cpsskins/branches/paris-sprint-2006/setup/README.txt Sat Jul 1 15:24:22 2006 @@ -410,6 +410,27 @@ cpsskins://format-style:... +Factory name +------------ + +The factory name can by obtained from the resource: + + >>> IType(resource).factoryname + u'cpsskins.format.style' + +or from the resource's URI: + + >>> from cpsskins.setup.utils import getFactoryNameFromURI + >>> getFactoryNameFromURI(u'cpsskins://format-style:12345') + u'cpsskins.format.style' + +or from the resource's type name: + + >>> from cpsskins.setup.utils import getFactoryNameFromTypeName + >>> getFactoryNameFromTypeName(u'format-style') + u'cpsskins.format.style' + + Export of resources =================== Modified: cpsskins/branches/paris-sprint-2006/setup/adapters.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/setup/adapters.py (original) +++ cpsskins/branches/paris-sprint-2006/setup/adapters.py Sat Jul 1 15:24:22 2006 @@ -97,6 +97,10 @@ def getContentName(self): return getTypeName(self.getContentType()) + def getFactoryName(self): + return u'.'.join(uniq([u'cpsskins', self.elementname, self.resourcename, + self.contentname])) + def getType(self): return uniq([self.getElementType(), self.getResourceType(), self.getContentType()]) @@ -111,5 +115,7 @@ contentname = property(getContentName) + factoryname = property(getFactoryName) + name = __str__ Modified: cpsskins/branches/paris-sprint-2006/setup/interfaces.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/setup/interfaces.py (original) +++ cpsskins/branches/paris-sprint-2006/setup/interfaces.py Sat Jul 1 15:24:22 2006 @@ -57,8 +57,10 @@ """ """ def getType(): - """Return the element's complete type as a tuple - """ + """Return the element's complete type as a tuple""" + + def getFactoryName(): + """Return the name of the factory registered for the element""" def __str__(): """Return the element's complete type name 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 Sat Jul 1 15:24:22 2006 @@ -71,3 +71,15 @@ return location.split('@')[0] raise ValueError("Unknown URI scheme in '%s'" % uri) + +def getFactoryNameFromTypeName(type_name): + """Return the name of the factory from the type name + """ + return u'cpsskins.' + type_name.replace('-', '.') + +def getFactoryNameFromURI(uri): + """Return the name of the factory from the URI. + """ + type_name = getTypeNameFromURI(uri) + return getFactoryNameFromTypeName(type_name) + 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 Sat Jul 1 15:24:22 2006 @@ -61,12 +61,6 @@ def search(predicate, first, second, third): """ """ - def list(): - """ """ - - def clear(): - """ """ - def getFirsts(): """ """ @@ -232,11 +226,11 @@ >>> print [repr(storage[r]) for r in res] ["<Monadic relation: 'ebony is black'>", "<Monadic relation: 'snow is white'>"] - Finally, we clear the storage: + Finally, we purge the storage: >>> list(storage.keys()) [u'some_black', u'some_white'] - >>> storage.clear() + >>> storage.purge() >>> list(storage.keys()) [] @@ -422,7 +416,7 @@ return [r for r in self if unicode(self.get(r)) in predicate] - def clear(self): + def purge(self): """Remove all relations from the storage. """ for k in list(self.keys()): Modified: cpsskins/branches/paris-sprint-2006/tests/test_storages.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/tests/test_storages.py (original) +++ cpsskins/branches/paris-sprint-2006/tests/test_storages.py Sat Jul 1 15:24:22 2006 @@ -241,7 +241,7 @@ self.assertEqual(result, []) def tearDown(self): - self.storage.clear() + self.storage.purge() def test_suite(): return unittest.TestSuite(( Modified: cpsskins/branches/paris-sprint-2006/thememanager.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/thememanager.py (original) +++ cpsskins/branches/paris-sprint-2006/thememanager.py Sat Jul 1 15:24:22 2006 @@ -333,10 +333,9 @@ resources.list(type=IPerspective, context=self)] def addPerspective(self, name, title): - perspective = Perspective(name=name, title=title) + perspective = Perspective(name) resources = getUtility(IResourceManager) - resources.register(name=name, title=title, resource=perspective, - context=self) + resources.register(name=name, resource=perspective, context=self) ################################################################### # Locations Modified: cpsskins/branches/paris-sprint-2006/ui/screens/common/authoring.css ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/common/authoring.css (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/common/authoring.css Sat Jul 1 15:24:22 2006 @@ -390,6 +390,8 @@ .locationChooser { padding: 0.3em 0.6em; background-color: #eee; + border-bottom: 1px solid #999; + margin-bottom: 10px; } .locationChooser button { Modified: cpsskins/branches/paris-sprint-2006/ui/screens/common/configure.zcml ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/common/configure.zcml (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/common/configure.zcml Sat Jul 1 15:24:22 2006 @@ -194,6 +194,11 @@ /> <page + name="addPerspective" + attribute="addPerspective" + /> + + <page name="setPerspective" attribute="setPerspective" /> Modified: cpsskins/branches/paris-sprint-2006/ui/screens/common/perspective_selector.pt ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/common/perspective_selector.pt (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/common/perspective_selector.pt Sat Jul 1 15:24:22 2006 @@ -6,11 +6,13 @@ current context/@@negotiation/getPerspective"> <select name="perspective"> <option value="_" i18n:translate="">(no perspective)</option> - <option tal:repeat="perspective perspectives" - tal:content="perspective/title" - tal:attributes="value perspective/name; - selected python:perspective.name == current - and 'selected' or nothing" /> + <tal:block repeat="perspective perspectives"> + <option tal:define="name perspective" + tal:content="name" + tal:attributes="value name; + selected python: name == current and 'selected' + or nothing" /> + </tal:block> </select> <button type="submit">OK</button> </form> Modified: cpsskins/branches/paris-sprint-2006/ui/screens/common/views.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/common/views.py (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/common/views.py Sat Jul 1 15:24:22 2006 @@ -226,6 +226,11 @@ session_info = self.getSessionInfo() return session_info.get('selection', {}) + def addPerspective(self, name=u''): + """Create and add a perspective + """ + self.tmutil.addPerspective(name=name, title=name) + def setPerspective(self, perspective=u''): """Set the perspective """ @@ -363,18 +368,20 @@ request = self.request dest_element = self.tmutil.getElementById(id) if IInnerNode.providedBy(dest_element): - container = removeSecurityProxy(dest_element) + container = dest_element else: container = getParent(dest_element) order = self.getElementOrder(id) + container = removeSecurityProxy(container) + content = createObject(type_name) notify(ObjectCreatedEvent(content)) adding = getMultiAdapter((container, request), INodeAdding) - added = adding.add(content) added_id = added.identifier + self.setElementOrder(added_id, int(order)) return str(added_id) Modified: cpsskins/branches/paris-sprint-2006/ui/screens/pagedesigner/layout/layout_mode.css ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/pagedesigner/layout/layout_mode.css (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/pagedesigner/layout/layout_mode.css Sat Jul 1 15:24:22 2006 @@ -52,6 +52,8 @@ padding-left: 4px; margin-top: 5px; margin-bottom: 5px; + font-size: 0.9em; + font-style: italic; } .pageBlockAddButton img { Modified: cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/configure.zcml ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/configure.zcml (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/configure.zcml Sat Jul 1 15:24:22 2006 @@ -33,6 +33,11 @@ /> <page + name="addPreset" + attribute="addPreset" + /> + + <page name="removePreset" attribute="removePreset" /> Modified: cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/negotiation_section.pt ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/negotiation_section.pt (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/negotiation_section.pt Sat Jul 1 15:24:22 2006 @@ -7,13 +7,11 @@ <form action="@@submitLocation" method="post"> - <table style="width: 100%;" class="items"> + <table style="width: 100%, border-bottom: 1px solid #ccc" class="items"> <tr> <th style="width: 30%">path</th> <th style="width: 30%">scope</th> - <th style="width: 30%">data</th> - <th></th> - <th></th> + <th style="width: 40%">data</th> </tr> <tr tal:repeat="path infos"> <tal:block define="location python:infos[path]; @@ -29,45 +27,36 @@ <tal:block condition="edit"> <tal:block define="widgets nocall:context/@@getLocationWidgets" repeat="widget python: widgets(location_path, section)"> - <td tal:content="structure widget" /> + <td style="padding-top: 5px; padding-bottom: 5px; background-color: #efc" tal:content="structure widget" /> </tal:block> </tal:block> - <td> - <a class="button" - tal:attributes="href string:@@submitLocation?root=$section&location_path=$location_path&action=delete"> - delete - </a> - </td> </tal:block> </tr> </table> - <table style="width: 100%; border-top: 1px solid #ccc"> - <tr> - <td tal:condition="not:edited"> - <a class="button" i18n:translate="" tal:condition="not:add" - tal:attributes="href string:javascript:CPSSkins.getModelById('negotiation-section').setData({'form': {'section': '$section', 'add': true }})">add a location »</a> - </td> - <td tal:condition="add"> - <input type="hidden" name="root" tal:attributes="value section" /> - <input type="hidden" name="action" value="add" /> - <input type="text" name="location_path" value="/" /> - <input style="background-color: #ccf" - class="submit" type="submit" value="add" /> - <a class="button" i18n:translate="" - tal:attributes="href string:javascript:CPSSkins.getModelById('negotiation-section').setData({'form': {'section': '$section'}})">cancel</a> - </td> - <td tal:condition="edited"> - <input type="hidden" name="action" value="edit" /> - <input type="hidden" name="root" tal:attributes="value section" /> - <input type="hidden" name="location_path" tal:attributes="value edited" /> - <input style="background-color: #ccf" class="submit" - type="submit" value="save" /> - <a class="button" i18n:translate="" - tal:attributes="href string:javascript:CPSSkins.getModelById('negotiation-section').setData({'form': {'section': '$section'}})">cancel</a> - </td> - </tr> - </table> + <div style="margin-top: 10px" tal:condition="not:edited"> + <input type="hidden" name="root" tal:attributes="value section" /> + <input type="hidden" name="action" value="add" /> + <input type="text" name="location_path" value="/" /> + <input class="submit default" type="submit" value="add" /> + </div> + + <div style="margin-top: 10px; float: right" tal:condition="edited"> + <a class="button" + tal:attributes="href string:@@submitLocation?root=$section&location_path=$edited&action=delete"> + delete + </a> + </div> + + <div tal:condition="edited" style="margin-top: 10px"> + <input type="hidden" name="action" value="edit" /> + <input type="hidden" name="root" tal:attributes="value section" /> + <input type="hidden" name="location_path" tal:attributes="value edited" /> + <input class="submit default" type="submit" value="save" /> + <a class="button" i18n:translate="" + tal:attributes="href string:javascript:CPSSkins.getModelById('negotiation-section').setData({'form': {'section': '$section'}})">cancel</a> + </div> + </form> </div> Modified: cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/presets_section.pt ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/presets_section.pt (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/presets_section.pt Sat Jul 1 15:24:22 2006 @@ -1,6 +1,6 @@ <div class="sections" i18n:domain="cpsskins" tal:define="section request/form/section|nothing"> - <ul style="height: 120px; overflow: auto;" class="items" + <ul style="height: 120px; overflow-y: scroll;" class="items" tal:define="preset_info context/@@getPresetsInfo; infos preset_info/?section|nothing"> <li tal:repeat="info infos"> @@ -15,8 +15,14 @@ tal:condition="not:readonly">[edit]</a> </tal:block> </li> - <li tal:condition="not:infos"><em>no presets</em></li> + <li tal:condition="not:section"><em>Select a section</em></li> + <li tal:condition="python: section and not infos"><em>no presets</em></li> </ul> - <div tal:condition="not:section"> - </div> + + <form action="@@addPreset" method="post"> + <input type="hidden" name="type_name" tal:attributes="value section" /> + <input type="text" name="name" value="" /> + <input class="submit default" type="submit" value="add" /> + </form> + </div> Modified: cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/site_manager.css ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/site_manager.css (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/site_manager.css Sat Jul 1 15:24:22 2006 @@ -134,14 +134,26 @@ padding: 0 } + +select { + border: 1px solid #999; +} + +select, option, input { + font-size: 0.8em; +} + a.button, input.submit, button.submit { border: none; - padding: 0; background-color: #fff; color: #009; - margin: 0; + margin: 0 0.5em; + font-size: 1em; } -select { - border: none; +input.default, button.default { + border-bottom: 1px dotted #99f; + color: #009; + cursor: pointer; } + Modified: cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/views.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/views.py (original) +++ cpsskins/branches/paris-sprint-2006/ui/screens/sitemanager/views.py Sat Jul 1 15:24:22 2006 @@ -17,7 +17,7 @@ """ __docformat__ = "reStructuredText" -from zope.component import getUtility +from zope.component import getUtility, createObject from zope.formlib import form from cpsskins import minjson as json @@ -29,6 +29,7 @@ from cpsskins.setup.io import importSite, exportSite from cpsskins.setup.registration import refreshPresets from cpsskins.setup.snapshot import Snapshot +from cpsskins.setup.utils import getFactoryNameFromTypeName from cpsskins.utils import getThemeManager class SiteDesignerView: @@ -66,6 +67,18 @@ }) return info + def addPreset(self, name=u'', type_name=u''): + if not type_name: + raise ValueError("Must specify a type name.") + factory_name = getFactoryNameFromTypeName(type_name) + # FIXME: not very generic + if type_name == u'perspective': + resource = createObject(factory_name, name=name) + else: + resource = createObject(factory_name) + resources = getUtility(IResourceManager) + resources.register(name=name, resource=resource, context=self.context) + def removePreset(self, uri=u''): if not uri: raise KeyError("Must specify a preset's URI.") -- http://lists.nuxeo.com/mailman/listinfo/z3lab-checkins