source: ZMS/trunk/zmscustom.py @ 1831

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

ZMS2Go: prepared support for new simplified content-object model

Line 
1################################################################################
2# zmscustom.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 AccessControl import ClassSecurityInfo
21from App.special_dtml import HTMLFile
22from types import StringTypes
23import Globals
24import sys
25import time
26import urllib
27# Product Imports.
28from zmscontainerobject import ZMSContainerObject
29import _fileutil
30import _globals
31import _importable
32import _ziputil
33
34
35# ------------------------------------------------------------------------------
36#  zmscustom.parseXmlString
37# ------------------------------------------------------------------------------
38def parseXmlString(self, file):
39  _globals.writeBlock( self, '[parseXmlString]')
40  message = ''
41  REQUEST = self.REQUEST
42  lang = REQUEST.get( 'lang', self.getPrimaryLanguage())
43  v = self.parseXmlString(file)
44  metaObj = self.getMetaobj(self.meta_id)
45  res_id = metaObj['attrs'][0]['id']
46  res_abs = self.getObjProperty(res_id,REQUEST)
47  res_abs.extend(v)
48  self.setObjStateModified(REQUEST)
49  self.setObjProperty(res_id,res_abs,lang)
50  self.onChangeObj(REQUEST)
51  return message
52
53
54################################################################################
55################################################################################
56###
57###  Constructor
58###
59################################################################################
60################################################################################
61manage_addZMSCustomForm = HTMLFile('manage_addzmscustomform', globals())
62def manage_addZMSCustom(self, meta_id, lang, _sort_id, REQUEST, RESPONSE):
63  """ manage_addZMSCustom """
64 
65  if REQUEST['btn'] == self.getZMILangStr('BTN_INSERT'):
66   
67    ##### Create ####
68    id_prefix = _globals.id_prefix(REQUEST.get('id_prefix','e'))
69    new_id = self.getNewId(id_prefix)
70    obj = ZMSCustom(new_id,_sort_id+1,meta_id)
71    self._setObject(obj.id, obj)
72   
73    metaObj = self.getMetaobj( meta_id)
74    redirect_self = bool( REQUEST.get( 'redirect_self', 0)) or REQUEST.get( 'btn', '') == '' or metaObj['type'] == 'ZMSRecordSet'
75    for attr in metaObj['attrs']:
76      attr_type = attr['type']
77      redirect_self = redirect_self or attr_type in self.getMetaobjIds()+['*']
78    redirect_self = redirect_self and not REQUEST.get('btn','') in [ self.getZMILangStr('BTN_CANCEL'), self.getZMILangStr('BTN_BACK')]
79   
80    obj = getattr(self,obj.id)
81    ##### Object State ####
82    obj.setObjStateNew(REQUEST)
83    ##### Init Coverage ####
84    coverage = self.getDCCoverage(REQUEST)
85    if coverage.find('local.')==0:
86      obj.setObjProperty('attr_dc_coverage',coverage)
87    else:
88      obj.setObjProperty('attr_dc_coverage','global.'+lang)
89    ##### Init Properties ####
90    obj.manage_changeProperties(lang,REQUEST,RESPONSE)
91   
92    ##### Normalize Sort-IDs ####
93    self.normalizeSortIds(id_prefix)
94   
95    # Return with message.
96    message = self.getZMILangStr('MSG_INSERTED')%obj.display_type(REQUEST)
97    if redirect_self:
98      RESPONSE.redirect('%s/%s/manage_main?lang=%s&manage_tabs_message=%s'%(self.absolute_url(),obj.id,lang,urllib.quote(message)))
99    else:
100      RESPONSE.redirect('%s/manage_main?lang=%s&manage_tabs_message=%s#_%s'%(self.absolute_url(),lang,urllib.quote(message),obj.id))
101 
102  else:
103    RESPONSE.redirect('%s/manage_main?lang=%s'%(self.absolute_url(),lang))
104
105
106def containerFilter(container):
107  return container.meta_type.startswith('ZMS')
108
109
110################################################################################
111################################################################################
112###
113###  Class
114###
115################################################################################
116################################################################################
117class ZMSCustom(ZMSContainerObject):
118
119    # Create a SecurityInfo for this class. We will use this
120    # in the rest of our class definition to make security
121    # assertions.
122    security = ClassSecurityInfo()
123
124    # Properties.
125    # -----------
126    meta_type = "ZMSCustom"
127
128    # Management Options.
129    # -------------------
130    def manage_options(self):
131      pc = self.isPageContainer()
132      opts = []
133      opts.append({'label': 'TAB_EDIT',         'action': 'manage_main'})
134      if pc:
135        opts.append({'label': 'TAB_PROPERTIES', 'action': 'manage_properties'})
136      opts.append({'label': 'TAB_IMPORTEXPORT', 'action': 'manage_importexport'})
137      opts.append({'label': 'TAB_TASKS',        'action': 'manage_tasks'})
138      opts.append({'label': 'TAB_REFERENCES',   'action': 'manage_RefForm'})
139      opts.append({'label': 'TAB_HISTORY',      'action': 'manage_UndoVersionForm'})
140      if pc:
141        opts.append({'label': 'TAB_SEARCH',       'action': 'manage_search'})
142      opts.append({'label': 'TAB_PREVIEW',      'action': 'preview_html'})
143      return tuple(opts)
144
145    # Management Permissions.
146    # -----------------------
147    __authorPermissions__ = (
148        'manage','manage_main','manage_main_iframe','manage_container','manage_workspace',
149        'manage_addZMSModule',
150        'manage_properties','manage_changeProperties','manage_changeTempBlobjProperty',
151        'manage_deleteObjs','manage_undoObjs','manage_moveObjUp','manage_moveObjDown','manage_moveObjToPos',
152        'manage_cutObjects','manage_copyObjects','manage_pasteObjs',
153        'manage_ajaxDragDrop','manage_ajaxZMIActions',
154        'manage_search','manage_search_attrs','manage_tasks',
155        'manage_wfTransition', 'manage_wfTransitionFinalize',
156        'manage_userForm', 'manage_user',
157        'manage_importexport', 'manage_import', 'manage_export',
158        'GET', 'PUT',
159        )
160    __ac_permissions__=(
161        ('ZMS Author', __authorPermissions__),
162        )
163
164
165    # Templates.
166    # ----------
167    manage_main = HTMLFile('dtml/ZMSObject/manage_main', globals())
168    manage_properties = HTMLFile('dtml/ZMSObject/manage_main', globals()) # -"-
169    manage_main_iframe = HTMLFile('dtml/ZMSObject/manage_main_iframe', globals())
170    metaobj_record_select = HTMLFile('dtml/ZMSRecordSet/record_select', globals())
171    metaobj_record_update = HTMLFile('dtml/ZMSRecordSet/record_update', globals())
172    metaobj_record_insert = HTMLFile('dtml/ZMSRecordSet/record_insert', globals())
173    metaobj_record_summary = HTMLFile('dtml/ZMSRecordSet/record_summary', globals())
174    metaobj_recordset_details_grid = HTMLFile('dtml/ZMSRecordSet/details_grid', globals())
175    metaobj_recordset_details = HTMLFile('dtml/ZMSRecordSet/details', globals())
176    metaobj_recordset_main_grid = HTMLFile('dtml/ZMSRecordSet/main_grid', globals())
177    metaobj_recordset_main = HTMLFile('dtml/ZMSRecordSet/main', globals())
178    metaobj_recordset_actions = HTMLFile('dtml/ZMSRecordSet/actions', globals())
179    metaobj_recordset_input_fields = HTMLFile('dtml/ZMSRecordSet/input_fields', globals())
180    metaobj_recordset_input_js = HTMLFile('dtml/ZMSRecordSet/input_js', globals())
181
182
183    """
184    ############################################################################
185    ###
186    ###   Constructor
187    ###
188    ############################################################################
189    """
190
191    ############################################################################
192    # ZMSCustom.__init__:
193    #
194    # Constructor (initialise a new instance of ZMSCustom).
195    ############################################################################
196    def __init__(self, id='', sort_id=0, meta_id=''):
197      """ ZMSCustom.__init__ """
198      ZMSContainerObject.__init__(self,id,sort_id)
199      self.meta_id = meta_id
200
201
202    """
203    ############################################################################
204    ###
205    ###   Http
206    ###
207    ############################################################################
208    """
209
210    # --------------------------------------------------------------------------
211    #  ZMSCustom.GET:
212    #
213    #  Handle HTTP GET requests.
214    # --------------------------------------------------------------------------
215    def GET(self, REQUEST, RESPONSE):
216      """Handle HTTP GET requests."""
217      metaObjAttrs = self.getMetaobj(self.meta_id)['attrs']
218      i = 0
219      while 1:
220        if i >= len(metaObjAttrs): break
221        objAttr = self.getMetaobjAttr(self.meta_id,metaObjAttrs[i]['id'])
222        if objAttr['type'] in ['string','text']:
223          lang = self.getPrimaryLanguage()
224          REQUEST.set('lang',lang)
225          REQUEST.set('preview','preview')
226          return self.getObjProperty(objAttr['id'],REQUEST)
227        i = i + 1
228      return ''
229
230
231    # --------------------------------------------------------------------------
232    #  ZMSCustom.PUT:
233    #
234    #  Handle HTTP PUT requests.
235    # --------------------------------------------------------------------------
236    def PUT(self, REQUEST, RESPONSE):
237      """Handle HTTP PUT requests."""
238      metaObjAttrs = self.getMetaobj(self.meta_id)['attrs']
239      i = 0
240      while 1:
241        if i >= len(metaObjAttrs): break
242        objAttr = self.getMetaobjAttr(self.meta_id,metaObjAttrs[i]['id'])
243        if objAttr['type'] in ['string','text']:
244          lang = self.getPrimaryLanguage()
245          REQUEST.set('lang',lang)
246          self.setObjStateModified(REQUEST)
247          self.setObjProperty(objAttr['id'],REQUEST.get('BODY', ''),lang)
248          self.onChangeObj(REQUEST)
249          break
250        i = i + 1
251      RESPONSE.setStatus(204)
252      return RESPONSE
253
254
255    ############################################################################
256    ###
257    ###   ZMSRecordSet
258    ###
259    ############################################################################
260
261    """
262    Initialize record-set.
263    @return: list of records
264    @rtype: C{list}
265    """
266    def recordSet_Init(self, REQUEST):
267      metaObj = self.getMetaobj(self.meta_id)
268      res_id = metaObj['attrs'][0]['id']
269      res = self.getObjProperty(res_id,REQUEST)
270      REQUEST.set('res_id',res_id)
271      REQUEST.set('res_abs',res)
272      REQUEST.set('res',res)
273      return res
274
275
276    """
277    Filter record-set.
278    @return: filtered list of records
279    @rtype: C{list}
280    """
281    def recordSet_Filter(self, REQUEST):
282      metaObj = self.getMetaobj(self.meta_id)
283      res_id = REQUEST['res_id']
284      res_abs = REQUEST['res_abs']
285      res = REQUEST['res']
286      SESSION = REQUEST.SESSION
287     
288      # Filter (FK).
289      filterattr='fk_key'
290      filtervalue='fk_val'
291      sessionattr='%s_%s'%(filterattr,self.id)
292      sessionvalue='%s_%s'%(filtervalue,self.id)
293      SESSION.set(sessionattr,REQUEST.form.get(filterattr,SESSION.get(sessionattr,'')))
294      SESSION.set(sessionvalue,REQUEST.form.get(filtervalue,SESSION.get(sessionvalue,'')))
295      if REQUEST.get('btn','')==self.getZMILangStr('BTN_RESET'):
296        SESSION.set(sessionattr,'')
297        SESSION.set(sessionvalue,'')
298      if SESSION.get(sessionattr,'') != '' and \
299         SESSION.get(sessionvalue,''):
300        res = self.filter_list(res,SESSION.get(sessionattr),SESSION.get(sessionvalue),'==')
301        masterType = filter(lambda x: x['id']==SESSION.get(sessionattr),metaObj['attrs'][1:])[0]['type']
302        master = filter(lambda x: x.meta_id==masterType,self.getParentNode().objectValues(['ZMSCustom']))[0]
303        masterMetaObj = self.getMetaobj(masterType)
304        masterAttrs = masterMetaObj['attrs']
305        masterRows = master.getObjProperty(masterAttrs[0]['id'],REQUEST)
306        masterRows = self.filter_list(masterRows,masterAttrs[1]['id'],SESSION.get(sessionvalue),'==')
307        REQUEST.set('masterMetaObj',masterMetaObj)
308        REQUEST.set('masterRow',masterRows[0])
309     
310      # Filter (Custom).
311      SESSION.set('qfilters',REQUEST.form.get('qfilters',SESSION.get('qfilters',1)))
312      for i in range(SESSION['qfilters']):
313        filterattr='filterattr%i'%i
314        filtervalue='filtervalue%i'%i
315        sessionattr='%s_%s'%(filterattr,self.id)
316        sessionvalue='%s_%s'%(filtervalue,self.id)
317       
318        #-- Set filter parameters in Session
319        if REQUEST.get('action','')=='':
320          if REQUEST.get('btn','')==self.getZMILangStr('BTN_RESET'):
321            SESSION.set(sessionattr,'')
322            SESSION.set(sessionvalue,'')
323          elif REQUEST.get('btn','')==self.getZMILangStr('BTN_REFRESH'):
324            SESSION.set(sessionattr,REQUEST.form.get(filterattr,''))
325            SESSION.set(sessionvalue,REQUEST.form.get(filtervalue,''))
326       
327        #-- Apply filter parameters
328        for attr in metaObj['attrs'][1:]:
329          if attr.get('name','')!='':
330            if SESSION.get(sessionattr,'') == attr['id'] and \
331               SESSION.get(sessionvalue,'') != '':
332              attr['datatype_key'] = _globals.datatype_key(attr['type'])
333              if attr['datatype_key'] in _globals.DT_NUMBERS:
334                res = self.filter_list(res,attr['id'],self.formatObjAttrValue(attr,SESSION.get(sessionvalue,''),REQUEST['lang']))
335              else:
336                res = self.filter_list(res,attr['id'],SESSION.get(sessionvalue,''))
337     
338      REQUEST.set('res_id',res_id)
339      REQUEST.set('res_abs',res_abs)
340      REQUEST.set('res',res)
341     
342      return res
343
344
345    """
346    Sort record-set.
347    @return: sorted list of records
348    @rtype: C{list}
349    """
350    def recordSet_Sort(self, REQUEST):
351      metaObj = self.getMetaobj(self.meta_id)
352     
353      res = REQUEST['res']
354      qorder = REQUEST.get('qorder','')
355      qorderdir = REQUEST.get('qorderdir','asc')
356      for attr in metaObj['attrs'][1:]:
357        if attr['id'] == 'sort_id':
358          qorder = attr['id']
359        if qorder=='':
360          if attr.get('type','') not in [ 'constant', 'file', 'image', 'resource'] and \
361             attr.get('type','') not in self.getMetaobjIds() and \
362             attr.get('name','') != '' and \
363             attr.get('custom','') != '':
364            qorder = attr['id']
365            if attr.get('type','') in ['date','datetime','time']:
366              qorderdir = 'desc'
367      res = self.sort_list(res,qorder,qorderdir)
368     
369      REQUEST.set('res',res)
370      REQUEST.set('qorder',qorder)
371      REQUEST.set('qorderdir',qorderdir)
372     
373      return res
374
375
376    # --------------------------------------------------------------------------
377    #  ZMSCustom.recordSet_Export:
378    # --------------------------------------------------------------------------
379    security.declareProtected('View', 'recordSet_Export')
380    def recordSet_Export(self, lang, qorder, qorderdir, qindex=[], REQUEST=None, RESPONSE=None):
381      """
382      Export record-set to XML.
383      """
384      self.recordSet_Init(REQUEST)
385      self.recordSet_Filter(REQUEST)
386      self.recordSet_Sort(REQUEST)
387      res=REQUEST['res']
388      value = []
389      for i in range(len(res)):
390        if len(qindex)==0 or str(i) in qindex:
391          value.append(res[i])
392      RESPONSE.setHeader('Content-Type','text/xml; charset=utf-8')
393      RESPONSE.setHeader('Content-Disposition','attachment;filename="recordSet_Export.xml"')
394      export = self.getXmlHeader() + self.toXmlString(value,True)
395      return export
396
397
398    ############################################################################
399    #  ZMSCustom.manage_import:
400    #
401    #  Import XML-file.
402    ############################################################################
403    def manage_import(self, file, lang, REQUEST, RESPONSE):
404      """ ZMSCustom.manage_import """
405      message = ''
406     
407      if self.meta_id=='ZMSSysFolder':
408        _ziputil.importZip2Zodb( self, file)
409        # Message.
410        message += self.getZMILangStr('MSG_IMPORTED')%('<i>%s</i>'%_fileutil.extractFilename(file.filename))
411      elif self.getType()=='ZMSRecordSet':
412        message += parseXmlString( self, file)
413      # Import XML-file.
414      else:
415        message += _importable.importFile( self, file, REQUEST, _importable.importContent)
416     
417      # Return with message.
418      message = urllib.quote(message)
419      return REQUEST.RESPONSE.redirect('manage_main?lang=%s&manage_tabs_message=%s'%(lang,message))
420
421
422# call this to initialize framework classes, which
423# does the right thing with the security assertions.
424Globals.InitializeClass(ZMSCustom)
425
426################################################################################
Note: See TracBrowser for help on using the repository browser.