source: ZMS/trunk/ZMSWorkflowProvider.py @ 1831

Revision 1831, 11.3 KB checked in by zmsdev, 2 months ago (diff)

ZMS2Go: prepared support for new simplified content-object model

Line 
1################################################################################
2# ZMSWorkflowProvider.py
3#
4# This program is free software; you can redistribute it and/or
5# modify it under the terms of the GNU General Public License
6# as published by the Free Software Foundation; either version 2
7# of the License, or (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17################################################################################
18
19# Imports.
20from App.special_dtml import HTMLFile
21import copy
22import time
23import urllib
24import zope.interface
25# Product Imports.
26import IZMSConfigurationProvider
27import IZMSWorkflowProvider, ZMSWorkflowActivitiesManager, ZMSWorkflowTransitionsManager
28import ZMSItem
29import _fileutil
30import _versionmanager
31
32
33"""
34################################################################################
35#
36#   XML IM/EXPORT
37#
38################################################################################
39"""
40
41"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
42ZMSWorkflowProvider.initConf:
43"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
44def initConf(self, filename, REQUEST):
45  xmlfile = open(_fileutil.getOSPath(filename),'rb')
46  importXml(self, xmlfile, REQUEST)
47  # Return filename.
48  return filename
49
50"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
51ZMSWorkflowProvider.importXml
52"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
53def importXml(self, xml, REQUEST):
54  ids = map(lambda x: self.activities[x*2], range(len(self.activities)/2))
55  for id in ids:
56    self.delItem(id,'activities')
57  ids = map(lambda x: self.transitions[x*2], range(len(self.transitions)/2))
58  for id in ids:
59    self.delItem(id,'transitions')
60  v = self.parseXmlString(xml)
61  l = v.get('activities',[])
62  for li in range(len(l)/2):
63    id = l[li*2]
64    i = l[li*2+1]
65    self.setActivity(id=None,newId=id,newName=i['name'],newIcon=i.get('icon'))
66  l = v.get('transitions',[])
67  for li in range(len(l)/2):
68    id = l[li*2]
69    i = l[li*2+1]
70    self.setTransition(id=None,newId=id,newName=i['name'],newFrom=i.get('from',[]),newTo=i.get('to',[]),newPerformer=i.get('performer',[]),newDtml=i.get('dtml',''))
71  # Roles.
72  roles = []
73  for transition in self.getTransitions():
74    roles = self.concat_list(roles,transition.get('performer',[]))
75  for newRole in self.difference_list(roles, self.userdefined_roles()):
76    REQUEST.set('newId', newRole)
77    lang = REQUEST.get('lang')
78    key = 'obj'
79    btn = self.getZMILangStr('BTN_INSERT')
80    self.manage_roleProperties(btn, key, lang, REQUEST)
81
82"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
83ZMSWorkflowProvider.exportXml
84"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
85def exportXml(self, REQUEST, RESPONSE):
86  value = {}
87  value['activities'] = []
88  for x in self.getActivityIds():
89      value['activities'].extend([x,self.getActivity(x,for_export=True)])
90  value['transitions'] = []
91  for x in self.getTransitionIds():
92      value['transitions'].extend([x,self.getTransition(x,for_export=True)])
93  export = self.getXmlHeader() + self.toXmlString(value,1)
94  content_type = 'text/xml; charset=utf-8'
95  filename = 'workflow.xml'
96  RESPONSE.setHeader('Content-Type',content_type)
97  RESPONSE.setHeader('Content-Disposition','attachment;filename="%s"'%filename)
98  return export
99
100
101################################################################################
102################################################################################
103###
104###   Class
105###
106################################################################################
107################################################################################
108class ZMSWorkflowProvider(
109        ZMSItem.ZMSItem,
110        ZMSWorkflowActivitiesManager.ZMSWorkflowActivitiesManager,
111        ZMSWorkflowTransitionsManager.ZMSWorkflowTransitionsManager):
112    zope.interface.implements(
113        IZMSConfigurationProvider.IZMSConfigurationProvider,
114        IZMSWorkflowProvider.IZMSWorkflowProvider)
115
116    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
117    Properties
118    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
119    meta_type = 'ZMSWorkflowProvider'
120    icon = "misc_/zms/ZMSWorkflowProvider.png"
121
122    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
123    Management Options
124    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
125    manage_options_default_action = '../manage_customize'
126    def manage_options(self):
127      return map( lambda x: self.operator_setitem( x, 'action', '../'+x['action']), copy.deepcopy(self.aq_parent.manage_options()))
128
129    def manage_sub_options(self):
130      return (
131        {'label': 'TAB_WORKFLOW','action': 'manage_main'},
132        )
133
134    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
135    Management Interface
136    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
137    manage = HTMLFile('dtml/ZMSWorkflowProvider/manage_main', globals())
138    manage_main = HTMLFile('dtml/ZMSWorkflowProvider/manage_main', globals()) # -"-
139
140    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
141    Management Permissions
142    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
143    __administratorPermissions__ = (
144        'manage_main',
145        'manage_changeWorkflow',
146        'manage_changeActivities',
147        'manage_changeTransitions',
148        )
149    __ac_permissions__=(
150        ('ZMS Administrator', __administratorPermissions__),
151        )
152
153
154    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
155    ZMSWorkflowProvider.__init__:
156   
157    Constructor.
158    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
159    def __init__(self, autocommit=1, nodes=['{$}'], activities=[], transitions=[]):
160      self.id = 'workflow_manager'
161      self.autocommit = autocommit
162      self.nodes = nodes
163      self.activities = []
164      self.transitions = []
165      l = activities
166      for li in range(len(l)/2):
167        id = l[li*2]
168        i = l[li*2+1]
169        self.setActivity(id=None,newId=id,newName=i['name'],newIcon=i.get('icon'))
170      l = transitions
171      for li in range(len(l)/2):
172        id = l[li*2]
173        i = l[li*2+1]
174        self.setTransition(id=None,newId=id,newName=i['name'],newFrom=i.get('from',[]),newTo=i.get('to',[]),newPerformer=i.get('performer',[]),newDtml=i.get('dtml',''))
175
176
177    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
178    ZMSWorkflowProvider.getAutocommit
179    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
180    def getAutocommit(self):
181      return self.autocommit
182
183
184    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
185    ZMSWorkflowProvider.getNodes
186    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
187    def getNodes(self):
188      return self.nodes
189
190
191    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
192    ZMSWorkflowProvider.delItem
193    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
194    def delItem(self, id, key):
195      obs = getattr(self,key,[])
196      # Update attribute.
197      if id in obs:
198        i = obs.index(id)
199        ob = obs[i+1]
200        for obj_id in [id,'%s.icon'%id]:
201          if obj_id in self.objectIds():
202            self.manage_delObjects([obj_id])
203        del obs[i]
204        del obs[i]
205      # Update attribute.
206      setattr(self,key,copy.copy(obs))
207      # Return with empty id.
208      return ''
209
210
211    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
212    ZMSWorkflowProvider.moveItem
213    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
214    def moveItem(self, id, pos, key):
215      obs = getattr(self,key,[])
216      # Move.
217      i = obs.index(id)
218      id = obs[i]
219      values = obs[i+1]
220      del obs[i]
221      del obs[i]
222      obs.insert(pos*2,values)
223      obs.insert(pos*2,id)
224      # Update attribute.
225      setattr(self,key,copy.copy(obs))
226
227
228    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
229    ZMSWorkflowProvider.doAutocommit:
230   
231    Auto-Commit ZMS-tree.
232    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
233    def doAutocommit(self, lang, REQUEST):
234      _versionmanager.doAutocommit(self,REQUEST)
235
236
237    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
238    ZMSWorkflowProvider.writeProtocol
239    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
240    def writeProtocol(self, entry):
241      if len(filter(lambda x: x.id()=='protocol.txt', self.objectValues(['File'])))==0:
242        self.manage_addFile(id='protocol.txt',file='',title='')
243      file = filter(lambda x: x.id()=='protocol.txt', self.objectValues(['File']))[0]
244      file.manage_edit(file.title,file.data+'\n'+entry)
245
246    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
247    ZMSWorkflowProvider.manage_changeWorkflow:
248   
249    Chang workflow.
250    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
251    def manage_changeWorkflow(self, lang, key='', btn='', REQUEST=None, RESPONSE=None):
252      """ ZMSWorkflowProvider.manage_changeWorkflow """
253      message = ''
254     
255      # Active.
256      # -------
257      if key == 'custom' and btn == self.getZMILangStr('BTN_SAVE'):
258        # Autocommit & Nodes.
259        old_autocommit = self.autocommit
260        new_autocommit = REQUEST.get('workflow',0) == 0
261        self.autocommit = new_autocommit
262        self.nodes = self.string_list(REQUEST.get('nodes',''))
263        if old_autocommit == 0 and new_autocommit == 1:
264          self.doAutocommit(lang,REQUEST)
265        message = self.getZMILangStr('MSG_CHANGED')
266     
267      # Export.
268      # -------
269      elif key == 'export' and btn == self.getZMILangStr('BTN_EXPORT'):
270        return exportXml(self, REQUEST, RESPONSE)
271     
272      # Import.
273      # -------
274      elif key == 'import' and btn == self.getZMILangStr('BTN_IMPORT'):
275        f = REQUEST['file']
276        if f:
277          filename = f.filename
278          importXml(self, xml=f, REQUEST=REQUEST)
279        else:
280          filename = REQUEST.get('init')
281          filename = initConf(self, filename, REQUEST)
282        message = self.getZMILangStr('MSG_IMPORTED')%('<i>%s</i>'%f.filename)
283     
284      # Return with message.
285      message = urllib.quote(message)
286      return RESPONSE.redirect('manage_main?lang=%s&manage_tabs_message=%s#_%s'%(lang,message,key))
287
288################################################################################
Note: See TracBrowser for help on using the repository browser.