Changeset 1374
- Timestamp:
- 08/29/08 19:07:53 (3 months ago)
- Files:
-
- pleiades.workspace/trunk/pleiades/workspace/browser/kml.py (modified) (2 diffs)
- pleiades.workspace/trunk/pleiades/workspace/browser/workspace.css (modified) (1 diff)
- pleiades.workspace/trunk/pleiades/workspace/browser/workspace.pt (modified) (2 diffs)
- pleiades.workspace/trunk/pleiades/workspace/browser/workspace.py (modified) (2 diffs)
- pleiades.workspace/trunk/pleiades/workspace/config.py (modified) (1 diff)
- pleiades.workspace/trunk/pleiades/workspace/content/configure.zcml (modified) (2 diffs)
- pleiades.workspace/trunk/pleiades/workspace/content/workspace.py (modified) (4 diffs)
- pleiades.workspace/trunk/pleiades/workspace/interfaces.py (modified) (1 diff)
- pleiades.workspace/trunk/pleiades/workspace/profiles/default/types.xml (modified) (1 diff)
- pleiades.workspace/trunk/pleiades/workspace/profiles/default/types/Workspace.xml (modified) (1 diff)
- pleiades.workspace/trunk/pleiades/workspace/tests/base.py (modified) (1 diff)
- pleiades.workspace/trunk/pleiades/workspace/tests/factory.txt (modified) (2 diffs)
- pleiades.workspace/trunk/pleiades/workspace/tests/kml-import.txt (modified) (1 diff)
- pleiades.workspace/trunk/pleiades/workspace/tests/test_doctest.py (modified) (2 diffs)
- pleiades.workspace/trunk/pleiades/workspace/tests/workspaces.txt (modified) (1 diff)
- pleiades.workspace/trunk/pleiades/workspace/tests/xml-import.txt (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
pleiades.workspace/trunk/pleiades/workspace/browser/kml.py
r1373 r1374 18 18 portal = getToolByName(self.context, 'portal_url').getPortalObject() 19 19 ptool = getToolByName(self.context, 'plone_utils') 20 wtool = getToolByName(self.context, 'portal_workflow') 20 21 21 22 places = portal['places'] … … 60 61 self.context.attach(f) 61 62 self.context.attach(p) 62 63 63 64 except: 64 65 savepoint.rollback() pleiades.workspace/trunk/pleiades/workspace/browser/workspace.css
r1287 r1374 1 /* Styles specific to the optilux.cinemacontent views. 2 3 This is explicitly included from various page templates, since it only 4 pertains to a handful of them. If we wanted something more sitewide, 5 we could have used the portal_css registry instead. 6 */ 7 8 .film-banner { 9 float: left; 10 margin: 1em 1em 0 0; 1 table { 2 text-align: left; 3 border-spacing: 1em; 11 4 } 12 5 13 .promotion-banner {14 float: right;15 margin: 1em 1em 0 0;16 }17 18 .highlighted-films {19 float: right;20 margin: 0 0 0 1em;21 }22 23 .highlighted-films a {24 display: block;25 }26 27 /* Make some fields render inline so that they get a label on the same line */28 #parent-fieldname-phone,29 #parent-fieldname-startDate,30 #parent-fieldname-endDate,31 #parent-fieldname-effectiveDate,32 #parent-fieldname-expirationDate {33 display: inline;34 }pleiades.workspace/trunk/pleiades/workspace/browser/workspace.pt
r1287 r1374 7 7 i18n:domain="pleiades.workspace"> 8 8 <body> 9 10 <metal:css fill-slot="css_slot"> 11 <style 12 type="text/css" media="all" 13 tal:content="string: @import url(${context/++resource++pleiades-workspace.css});" 14 > 15 </style> 16 </metal:css> 9 17 10 18 <metal:main fill-slot="main"> … … 34 42 <div tal:condition="text" metal:use-macro="python:context.widget('text', mode='view')" /> 35 43 36 <tal:areas condition="view/have_cinema_folders"> 37 <h2 i18n:translate="title_cinemafolder_subareas">Areas</h2> 38 <dl> 39 <tal:block repeat="area view/cinema_folders"> 40 <dt> 41 <a tal:attributes="href area/url" 42 tal:content="area/title" /> 43 </dt> 44 <dd tal:content="area/description" /> 45 </tal:block> 46 </dl> 47 </tal:areas> 44 <tal:collections> 45 <h2 i18n:translate="title_workspace_collections">Data Dashboard</h2> 46 <table class="workspace-dashboard"> 47 <tr> 48 <th>Type</th> 49 <th>Drafting</th> 50 <th>Pending</th> 51 <th>Published</th> 52 <th>All</th> 53 </tr> 54 <tr tal:repeat="tname python:['locations', 'names', 'features', 'places']"> 55 <tal:row tal:define="row python:view.collections_data[tname]"> 56 <th tal:content="python:tname.capitalize()">NAME</th> 57 <td tal:repeat="data python:[row[state] for state in ('drafting', 'pending', 'published', 'all')]"> 58 <a tal:attributes="href data/url"><span tal:replace="data/count">COUNT</span></a>, <a tal:attributes="href string:${data/url}/@@kml-document">[KML]</a> 59 </td> 60 </tal:row> 61 </tr> 62 <tr tal:define="row python:view.collections_data['all']"> 63 <th>All</th> 64 <td tal:repeat="data python:[row[state] for state in ('drafting', 'pending', 'published')]"> 65 <a tal:attributes="href data/url"><span tal:replace="data/count">COUNT</span></a> 66 <a tal:attributes="href string:${data/url}/@@kml-document">[KML]</a> 67 </td> 68 </tr> 69 </table> 70 </tal:collections> 48 71 49 <tal:cinemas condition="view/have_cinemas">50 <h2 i18n:translate="title_cinemafolder_subareas">Cinemas</h2>51 <dl>52 <tal:block repeat="cinema view/cinemas">53 <dt>54 <a tal:attributes="href cinema/url"55 tal:content="cinema/title" />56 </dt>57 <dd tal:content="cinema/address" />58 </tal:block>59 </dl>60 </tal:cinemas>61 62 72 <div metal:use-macro="context/document_relateditems/macros/relatedItems"> 63 73 show related items if they exist pleiades.workspace/trunk/pleiades/workspace/browser/workspace.py
r1287 r1374 3 3 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile 4 4 from Products.CMFCore.utils import getToolByName 5 from pleiades.workspace.interfaces import IWorkspace 5 from pleiades.workspace.interfaces import IWorkspace, IWorkspaceCollection 6 6 from plone.memoize.instance import memoize 7 7 … … 12 12 13 13 __call__ = ViewPageTemplateFile('workspace.pt') 14 14 15 @memoize 16 def collections_data(self): 17 data = {} 18 for name in ['locations', 'names', 'features', 'places']: 19 row = {} 20 for state in ['drafting', 'pending', 'published']: 21 collection = self.context[name][state] 22 url = collection.absolute_url() 23 brains = collection.queryCatalog() 24 row[state] = dict(count=len(brains), url=url) 25 26 # Now the column of all states 27 collection = self.context[name] 28 url = collection.absolute_url() 29 brains = collection.queryCatalog() 30 row['all'] = dict(count=len(brains), url=url) 31 data[name] = row 32 33 # final row 34 row = {} 35 for state in ['drafting', 'pending', 'published']: 36 collection = self.context[state] 37 url = collection.absolute_url() 38 brains = collection.queryCatalog() 39 row[state] = dict(count=len(brains), url=url) 40 data['all'] = row 41 42 return data 43 15 44 # Methods called from the associated template 16 45 pleiades.workspace/trunk/pleiades/workspace/config.py
r1368 r1374 17 17 ADD_PERMISSIONS = { 18 18 "Workspace" : "Pleiades: Add Workspace", 19 "Workspace Collection" : "Add portal content", 19 20 "Workspace Folder" : "Add portal content" 20 21 } pleiades.workspace/trunk/pleiades/workspace/content/configure.zcml
r1327 r1374 16 16 </class> 17 17 18 <class class=".workspace.WorkspaceCollection"> 19 <require 20 permission="zope2.View" 21 interface="..interfaces.IWorkspaceCollection" 22 /> 23 <require 24 permission="cmf.ModifyPortalContent" 25 set_schema="..interfaces.IWorkspaceCollection" 26 /> 27 </class> 28 18 29 <class class=".folder.WorkspaceFolder"> 19 30 <require … … 27 38 </class> 28 39 40 <subscriber handler=".workspace.add_workspace_collections"/> 41 29 42 </configure> pleiades.workspace/trunk/pleiades/workspace/content/workspace.py
r1373 r1374 13 13 from Products.Archetypes.interfaces import IObjectInitializedEvent 14 14 15 from Products.ATContentTypes.content import folder 15 from Products.ATContentTypes.content import folder, topic 16 16 from Products.ATContentTypes.content.schemata import finalizeATCTSchema 17 17 … … 22 22 from Products.PleiadesEntity.content.LocationContainer import LocationContainer 23 23 24 from pleiades.workspace.interfaces import IResource, IWorkspace 24 from pleiades.workspace.interfaces import IResource, IWorkspace, IWorkspaceCollection 25 25 from pleiades.workspace.event import ResourceModifiedEvent 26 27 28 class WorkspaceCollection(topic.ATTopic): 29 """Specialized topic. 30 """ 31 implements(IWorkspaceCollection) 32 portal_type = "Workspace Collection" 33 26 34 27 35 # This is the Archetypes schema, defining fields and widgets. We extend … … 86 94 text = atapi.ATFieldProperty('text') 87 95 88 def initTopic(self, oid, type):89 topic = self[oid]90 c = topic.addCriterion('pleiades_wsuids', 'ATSimpleStringCriterion')91 c.setValue(self.UID())92 c = topic.addCriterion('Type', 'ATPortalTypeCriterion')93 c.setValue(type)94 95 def initializeArchetype(self, **kwargs):96 tid = self.invokeFactory('Topic', id='locations', title='Locations')97 self.initTopic(tid, 'Location')98 tid = self.invokeFactory('Topic', id='names', title='Names')99 self.initTopic(tid, 'Name')100 tid = self.invokeFactory('Topic', id='features', title='Features')101 self.initTopic(tid, 'Feature')102 tid = self.invokeFactory('Topic', id='places', title='Places')103 self.initTopic(tid, 'Place')104 105 96 def attach(self, ob): 106 97 IResource(ob).wsuids = [self.UID()] … … 114 105 # This line tells Archetypes about the content type 115 106 atapi.registerType(Workspace, PROJECTNAME) 107 atapi.registerType(WorkspaceCollection, PROJECTNAME) 116 108 109 110 def initTypeTopic(topic, type, uid, acquire=True): 111 topic.setAcquireCriteria(acquire) 112 c = topic.addCriterion('pleiades_wsuids', 'ATSimpleStringCriterion') 113 c.setValue(uid) 114 c = topic.addCriterion('Type', 'ATPortalTypeCriterion') 115 c.setValue(type) 116 117 def initStateTopic(topic, state, uid, acquire=True): 118 topic.setAcquireCriteria(acquire) 119 c = topic.addCriterion('pleiades_wsuids', 'ATSimpleStringCriterion') 120 c.setValue(uid) 121 c = topic.addCriterion('review_state', 'ATSimpleStringCriterion') 122 c.setValue(state) 123 124 @adapter(IWorkspace, IObjectInitializedEvent) 125 def add_workspace_collections(ob, event): 126 types = [('locations', 'Location'), 127 ('names', 'Name'), 128 ('features', 'Feature'), 129 ('places', 'Place')] 130 states = ['drafting', 'pending', 'published'] 131 for name, tname in types: 132 tid = ob.invokeFactory( 133 'Workspace Collection', id=name, title=name.capitalize() 134 ) 135 topic = ob[tid] 136 initTypeTopic(topic, tname, ob.UID()) 137 for s in states: 138 sid = topic.invokeFactory( 139 'Workspace Collection', id=s, title=s.capitalize() 140 ) 141 subtopic = topic[sid] 142 initStateTopic(subtopic, sid, ob.UID(), True) 143 for s in states: 144 sid = ob.invokeFactory( 145 'Workspace Collection', id=s, title=s.capitalize() 146 ) 147 topic = ob[sid] 148 initStateTopic(topic, s, ob.UID()) 149 for name, tname in types: 150 tid = topic.invokeFactory( 151 'Workspace Collection', id=name, title=name.capitalize() 152 ) 153 subtopic = topic[tid] 154 initTypeTopic(subtopic, tname, ob.UID(), True) pleiades.workspace/trunk/pleiades/workspace/interfaces.py
r1373 r1374 11 11 12 12 13 class IWorkspaceCollection(Interface): 14 15 contains('pleiades.workspace.interfaces.IWorkspaceCollection') 16 17 13 18 class IWorkspace(Interface): 14 19 """A container 15 20 """ 16 contains('Products.PleiadesEntity.content.interfaces.ILocationContainer', 17 'Products.PleiadesEntity.content.interfaces.IPlaceContainer', 21 contains('pleiades.workspace.interfaces.IWorkspaceCollection', 18 22 'Products.ATContentTypes.interfaces.IATFolder' 19 23 ) pleiades.workspace/trunk/pleiades/workspace/profiles/default/types.xml
r1327 r1374 14 14 15 15 <object 16 name="Workspace Collection" 17 meta_type="Factory-based Type Information with dynamic views" 18 /> 19 20 <object 16 21 name="Workspace Folder" 17 22 meta_type="Factory-based Type Information with dynamic views" pleiades.workspace/trunk/pleiades/workspace/profiles/default/types/Workspace.xml
r1355 r1374 44 44 <property name="filter_content_types">True</property> 45 45 <property name="allowed_content_types"> 46 <element value="Place Container" />47 <element value="Location Container" />48 46 <element value="Folder" /> 49 47 <element value="Topic" /> 48 <element value="Workspace Collection" /> 50 49 </property> 51 50 pleiades.workspace/trunk/pleiades/workspace/tests/base.py
r1359 r1374 21 21 # This includes the other products below as well. 22 22 23 #fiveconfigure.debug_mode = True24 #import pleiades.workspace25 #zcml.load_config('configure.zcml', pleiades.workspace)26 #fiveconfigure.debug_mode = False23 fiveconfigure.debug_mode = True 24 import pleiades.workspace 25 zcml.load_config('configure.zcml', pleiades.workspace) 26 fiveconfigure.debug_mode = False 27 27 28 28 # We need to tell the testing framework that these products pleiades.workspace/trunk/pleiades/workspace/tests/factory.txt
r1359 r1374 19 19 >>> wsid = folder.invokeFactory('Workspace', id='test-ws', title='Testing') 20 20 >>> ws = folder[wsid] 21 >>> from zope.event import notify 22 >>> from Products.Archetypes.event import ObjectInitializedEvent 23 >>> notify(ObjectInitializedEvent(ws)) 21 24 >>> 'places' in ws.objectIds() 22 25 True … … 27 30 >>> 'names' in ws.objectIds() 28 31 True 32 >>> 'drafting' in ws.objectIds() 33 True 34 >>> 'drafting' in ws['places'].objectIds() 35 True pleiades.workspace/trunk/pleiades/workspace/tests/kml-import.txt
r1359 r1374 13 13 >>> wsid = folder.invokeFactory('Workspace', id='test-ws', title='Testing') 14 14 >>> ws = folder[wsid] 15 >>> from zope.event import notify 16 >>> from Products.Archetypes.event import ObjectInitializedEvent 17 >>> notify(ObjectInitializedEvent(ws)) 15 18 >>> 'places' in ws.objectIds() 16 19 True pleiades.workspace/trunk/pleiades/workspace/tests/test_doctest.py
r1355 r1374 2 2 import doctest 3 3 from zope.testing import doctestunit 4 from zope.component import testing,eventtesting4 import zope.component.eventtesting 5 5 from Testing import ZopeTestCase as ztc 6 6 from pleiades.workspace.tests import base … … 30 30 package='pleiades.workspace.tests', 31 31 test_class=base.WorkspaceFunctionalTestCase, 32 optionflags=doctest.REPORT_ONLY_FIRST_FAILURE | doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS), 32 optionflags=optionflags 33 ), 33 34 ztc.ZopeDocFileSuite( 34 35 'xml-import.txt', 35 36 package='pleiades.workspace.tests', 36 37 test_class=base.WorkspaceFunctionalTestCase, 37 optionflags=doctest.REPORT_ONLY_FIRST_FAILURE | doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS), 38 optionflags=optionflags 39 ), 38 40 ]) 39 41 pleiades.workspace/trunk/pleiades/workspace/tests/workspaces.txt
r1373 r1374 17 17 >>> wsid = spaces.invokeFactory('Workspace', id='test-ws', title='Testing') 18 18 >>> ws = spaces[wsid] 19 >>> from zope.event import notify 20 >>> from Products.Archetypes.event import ObjectInitializedEvent 21 >>> notify(ObjectInitializedEvent(ws)) 19 22 20 23 Create some test entities pleiades.workspace/trunk/pleiades/workspace/tests/xml-import.txt
r1359 r1374 13 13 >>> wsid = folder.invokeFactory('Workspace', id='test-ws', title='Testing') 14 14 >>> ws = folder[wsid] 15 >>> from zope.event import notify 16 >>> from Products.Archetypes.event import ObjectInitializedEvent 17 >>> notify(ObjectInitializedEvent(ws)) 15 18 >>> 'places' in ws.objectIds() 16 19 True
