/
WorkArea.py
209 lines (171 loc) · 7.38 KB
/
WorkArea.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
from sets import Set
from Globals import InitializeClass
from AccessControl import ClassSecurityInfo
from Acquisition import aq_base, aq_inner, aq_parent
from Products.CMFCore.permissions import View, ModifyPortalContent
from Products.ZTM2.Topic import Topic, addTopic
from Products.ZTM2.Locator import Locator
from zope.component.factory import Factory
from zope.interface import implements
import psis
from Products.ZTM2.psis import zope_id_topicPSI, zope_path_topicPSI
from Products.CMFCore.TypesTool import FactoryTypeInformation
from Products.CMFCore.interfaces import ITypeInformation
class WorkAreaTypeInformation(FactoryTypeInformation):
""" Allows construction of plain topics. """
implements(ITypeInformation)
security = ClassSecurityInfo()
_actions = ( { 'id':'view'
, 'title':'View'
, 'action':'workarea_view'
, 'condition':''
, 'permissions':('View',)
, 'category':'object'
, 'visible':True
}
, { 'id':'edit'
, 'title':'Edit'
, 'action':'workarea_view'
, 'condition':''
, 'permissions':('Modify portal content',)
, 'category':'object'
, 'visible':True
}
, { 'id':'ztmedit'
, 'title':'Topic Edit'
, 'action':'workarea_view'
, 'condition':''
, 'permissions':('Modify topic',)
, 'category':'object'
, 'visible':False
}
, { 'id':'ztmview'
, 'title':'Topic View'
, 'action':'workarea_view'
, 'condition':''
, 'permissions':('View topic',)
, 'category':'object'
, 'visible':False
}
, { 'id':'folderContents'
, 'title':'Folder Contents'
, 'action':'history_view'
, 'condition':'python:getattr(object, "isPrincipiaFolderish", True)'
, 'permissions':('Access folder contents',)
, 'category':'object'
, 'visible': False
}
)
_aliases = { 'ztmedit':'workarea_view'
, 'ztmview':'workarea_view'
, 'view':'workarea_view'
, 'edit':'workarea_view'
, 'gethtml':'workarea_view'
, 'index.html':'workarea_view'
}
def __init__(self, id, **kw):
self._topictype = aq_base(kw['topic'])
kw['actions'] = self._actions
kw['aliases'] = self._aliases
FactoryTypeInformation.__init__(self, id, **kw)
self.product = ''
self.factory = 'ksiktforum.workarea'
self.content_meta_type = 'Topic'
self.content_icon = 'topic_icon.png'
self.immediate_view = 'workarea_view'
self.title = 'workarea'
self.description = 'Specialized topic that handles access control'
security.declarePrivate('_constructInstance')
def _constructInstance(self, container, id, *args, **kw):
topicmap = kw['topicmap'] = self.portal_topicmaps.getTopicMap()
ob = FactoryTypeInformation._constructInstance( self
, container
, id
, *args
, **kw
)
ob.addType(psis.workarea)
ob.invokeFactory(id='filer', type_name='CMF BTree Folder')
ob.invokeFactory(id='diskusjoner', type_name='CMF BTree Folder')
getattr(ob, 'filer').__parent__ = ob
getattr(ob, 'diskusjoner').__parent__ = ob
return ob
class WorkArea(Topic):
""" A workarea is a topic with specialized handling of local roles. """
isObjectManager = True
isPrincipiaFolderish = True
meta_type = 'Topic'
isWorkArea = True
security = ClassSecurityInfo()
security.declareObjectProtected(View)
def manage_afterAdd(self, container, item):
Topic.manage_afterAdd(self, container, item)
self.updateWorkArea()
def updateWorkArea(self):
""" Update the local roles. """
if hasattr(self, '_View_Permission'):
# Workaround a bug that is either in DCWorkflow, Zope or CMF, It
# doesn't remember not to acquire roles.
self._View_Permission = tuple(self._View_Permission)
newroles = {}
for userid, roles in self.__ac_local_roles__.items():
roles = list(Set(roles))
if 'Owner' in roles:
roles.remove('Owner')
if 'Workarea manager' in roles:
roles.remove('Workarea manager')
if roles:
newroles[userid] = roles
for topic in self.managers(wrap=False):
# A member may have multiple addresses
memberid = topic.id
memberroles = newroles.get(memberid, [])
if not 'Owner' in memberroles:
memberroles.append('Owner')
if not 'Workarea manager' in memberroles:
memberroles.append('Workarea manager')
newroles[memberid] = memberroles
self.__ac_local_roles__ = newroles
def managers(self, wrap=True):
""" The managers of this workarea. """
topics = self.associatedTopicsQuery( otherroletype=psis.workareamanager
, associationtype=psis.workareamembership
, roletype=psis.workarea
, topictype=psis.person
)
return set(topics)
def reindexObject(self, idxs=[]):
""" """
self.updateWorkArea()
return Topic.reindexObject(self, idxs=idxs)
def workareatopic(self):
""" The workarea itself. """
return self.aq_inner
def fixWorkArea(self):
""" """
getattr(self, 'koblinger').__parent__ = self
getattr(self, 'dokumenter').__parent__ = self
getattr(self, 'epostarkiv').__parent__ = self
getattr(self, 'kalender').__parent__ = self
def _removeAssociationRole(self, role):
#TODO: Verify that the user is allowed to see the topic.
Topic._removeAssociationRole(self, role)
self.updateWorkArea()
def _addAssociationRole(self, role):
#TODO: Verify that the user is allowed to see the topic.
Topic._addAssociationRole(self, role)
self.updateWorkArea()
def returnToWorkArea(self):
return '<a href="%s">« Tilbake til arbeidsrommet</a>'%(self.absolute_url())
security.declarePrivate('notifyWorkflowCreated')
def notifyWorkflowCreated(self):
"""
Notify the workflow that self was just created.
"""
wftool = self._getWorkflowTool()
if wftool is not None:
wftool.notifyCreated(self)
self._View_Permission = list(self._View_Permission)
InitializeClass(WorkArea)
InitializeClass(WorkAreaTypeInformation)
WorkAreaFactory = Factory(WorkArea)