source: ZMS/trunk/zmsobject.py @ 1874

Revision 1874, 58.0 KB checked in by zmsdev, 2 weeks ago (diff)

added support for repetitive meta-objects

Line 
1################################################################################
2# zmsobject.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 ZPublisher.HTTPRequest
25import urllib
26import string
27import time
28# Product Imports.
29import zmscontainerobject
30import ZMSItem
31import ZMSGlobals
32import ZMSWorkflowItem
33import _accessmanager
34import _blobfields
35import _cachemanager
36import _copysupport
37import _deprecatedapi
38import _exportable
39import _globals
40import _metacmdmanager
41import _multilangmanager
42import _objattrs
43import _objchildren
44import _objinputs
45import _objtypes
46import _pathhandler
47import _versionmanager
48import _xmllib
49import _textformatmanager
50import _zcatalogmanager
51import _zmsattributecontainer
52import _zreferableitem
53
54__all__= ['ZMSObject']
55
56
57################################################################################
58################################################################################
59###
60###   Abstract Class ZMSObject
61###
62################################################################################
63################################################################################
64class ZMSObject(ZMSItem.ZMSItem,
65        _accessmanager.AccessableObject,        # Access manager.
66        _versionmanager.VersionItem,            # Version Item.
67        ZMSWorkflowItem.ZMSWorkflowItem,
68        _copysupport.CopySupport,               # Copy Support (Paste Objects).
69        _cachemanager.CacheableObject,          # Cacheable object.
70        _deprecatedapi.DeprecatedAPI,           # Deprecated API.
71        _metacmdmanager.MetacmdObject,          # Meta-Commands.
72        _multilangmanager.MultiLanguageObject,  # Multi-Language.
73        _exportable.Exportable,                 # XML Export.
74        _objattrs.ObjAttrs,                     # Object-Attributes.
75        _objchildren.ObjChildren,               # Object-Children.
76        _objinputs.ObjInputs,                   # Object-Inputs.
77        _objtypes.ObjTypes,                     # Object-Types.
78        _pathhandler.PathHandler,               # Path-Handler.
79        _textformatmanager.TextFormatObject,    # Text-Formats.
80        _zcatalogmanager.ZCatalogItem,          # ZCatalog Item.
81        ZMSGlobals.ZMSGlobals,                  # ZMS Global Functions and Definitions.
82        _zreferableitem.ZReferableItem          # ZReferable Item.
83        ):
84
85    # Documentation string.
86    __doc__ = """ZMS product module."""
87    # Version string.
88    __version__ = '0.1'
89
90    # Create a SecurityInfo for this class. We will use this
91    # in the rest of our class definition to make security
92    # assertions.
93    security = ClassSecurityInfo()
94
95    # Properties.
96    # -----------
97    QUOT = chr(34)
98    MISC_ZMS = '/misc_/zms/'
99    FORM_LABEL_MANDATORY = '<sup style="color:red">*</sup>'
100    spacer_gif = '/misc_/zms/spacer.gif'
101
102    # Templates.
103    # ----------
104    f_display_icon = HTMLFile('dtml/object/f_display_icon', globals()) # ZMI Display-Icon
105    f_recordset_init = HTMLFile('dtml/object/f_recordset_init', globals()) # ZMI RecordSet::Init
106    f_recordset_grid = HTMLFile('dtml/object/f_recordset_grid', globals()) # ZMI RecordSet::Grid
107    f_recordset_nav = HTMLFile('dtml/object/f_recordset_nav', globals()) # ZMI RecordSet::Navigation
108    f_headline = HTMLFile('dtml/object/f_headline', globals()) # ZMI Headline
109    f_breadcrumbs = HTMLFile('dtml/object/f_breadcrumbs', globals()) # ZMI Breadcrumbs
110    f_css_defaults = HTMLFile('dtml/object/f_css_defaults', globals()) # CSS: Default StyleSheet (WAI)
111    f_css_printhtml = HTMLFile('dtml/object/f_css_printhtml', globals()) # CSS: Fixed PrintHTML StyleSheet
112    f_submitInputFields = HTMLFile('dtml/object/f_submitinputfields', globals())
113    f_submitBtn = HTMLFile('dtml/object/f_submitbtn', globals())
114    zmi_form_section_begin = HTMLFile('dtml/object/zmi_form_section_begin', globals())
115    zmi_form_section_end = HTMLFile('dtml/object/zmi_form_section_end', globals())
116    f_collectionBtn = HTMLFile('dtml/object/f_collectionbtn', globals())
117    f_languages = HTMLFile('dtml/object/f_languages', globals())
118    f_frame = HTMLFile('dtml/object/f_frame', globals())
119    f_frame_top = HTMLFile('dtml/object/f_frame_top', globals())
120    f_frame_bottom = HTMLFile('dtml/object/f_frame_bottom', globals())
121    f_xstandard_browseImages = HTMLFile('dtml/object/f_xstandard_browseimages', globals())
122    f_xstandard_browseFiles = HTMLFile('dtml/object/f_xstandard_browsefiles', globals())
123    preview_html = HTMLFile('dtml/object/preview', globals())
124    preview_top_html = HTMLFile('dtml/object/preview_top', globals())
125    f_api_html = HTMLFile('dtml/object/f_api', globals())
126    f_api_top_html = HTMLFile('dtml/object/f_api_top', globals())
127    obj_input_js = HTMLFile('dtml/ZMSObject/input_js', globals())
128    obj_input_fields = HTMLFile('dtml/ZMSObject/input_fields', globals())
129    active_input_fields = '' # Deprecated
130    version_input_fields = '' # Deprecated
131
132
133    ############################################################################
134    #  ZMSObject.__init__:
135    #
136    #  Constructor (initialise a new instance of ZMSObject).
137    ############################################################################
138    def __init__(self, id='', sort_id=0):
139      """ ZMSObject.__init__ """
140      self.id = id
141      self.sort_id = _globals.format_sort_id(sort_id)
142      self.ref_by = []
143
144
145    # --------------------------------------------------------------------------
146    #  ZMSObject.title:
147    # --------------------------------------------------------------------------
148    def title(self, REQUEST={}):
149      try:
150        return self.getObjProperty('title', REQUEST)
151      except:
152        return 'ZMS'
153
154
155    # --------------------------------------------------------------------------
156    #  ZMSObject.__proxy__:
157    # --------------------------------------------------------------------------
158    def __proxy__(self):
159      return self
160
161
162    # --------------------------------------------------------------------------
163    #  ZMSObject.get_conf_blob:
164    # --------------------------------------------------------------------------
165    security.declarePublic('get_conf_blob')
166    def get_conf_blob(self, path, REQUEST, RESPONSE):
167      """ ZMS.get_conf_blob """
168      v = self.getConfProperties()
169      try:
170        for id in path.split('/'):
171          if type(v) is dict:
172            v = v[id]
173          elif type(v) is list:
174            if id.find( ':int') > 0:
175              v = v[ int( id[:id.find( ':int')])]
176            elif id in v:
177              v = v[ v.index(id)+1]
178            else:
179              l = filter(lambda x: x.get('id',None)==id, v)
180              if len( l) > 0:
181                v = l[ 0]
182        RESPONSE.setHeader( 'Cache-Control', 'public, max-age=3600')
183        RESPONSE.setHeader( 'Content-Type', v.getContentType())
184        RESPONSE.setHeader( 'Content-Disposition', 'inline;filename="%s"'%v.getFilename())
185        v = v.getData()
186      except:
187        masterId = self.getConfProperty('Portal.Master','')
188        if len(masterId) > 0:
189          masterHome = getattr(self.getHome(),masterId)
190          masterDocElmnt = masterHome.content
191          v = masterDocElmnt.get_conf_blob(path, REQUEST, RESPONSE)
192        else:
193          _globals.writeError(self,"[get_conf_blob]: path=%s"%str(path))
194      return v
195
196
197    # --------------------------------------------------------------------------
198    #  ZMSObject.isMetaType:
199    # --------------------------------------------------------------------------
200    def isMetaType(self, meta_type, REQUEST={}):
201      if meta_type is None:
202        return True
203      if type(meta_type) is not list:
204        meta_type = [meta_type]
205      b = self.meta_type in meta_type or self.meta_id in meta_type
206      if not b and self.PAGES in meta_type:
207        b = b or self.isPage()
208      elif not b and self.PAGEELEMENTS in meta_type:
209        b = b or self.isPageElement()
210      return b
211
212
213    # --------------------------------------------------------------------------
214    #  ZMSObject.isPageContainer:
215    # --------------------------------------------------------------------------
216    def isPageContainer(self):
217      metaobj_manager = getattr(self,'metaobj_manager',None)
218      if metaobj_manager is not None:
219        return metaobj_manager.__is_page_container__( self.meta_id)
220      return False
221
222
223    # --------------------------------------------------------------------------
224    #  ZMSObject.isPage:
225    # --------------------------------------------------------------------------
226    def isPage(self):
227      return self.getType() in [ 'ZMSDocument', 'ZMSReference'] \
228        and not self.meta_id in [ 'ZMSNote', 'ZMSTeaserContainer']
229
230
231    # --------------------------------------------------------------------------
232    #  ZMSObject.isPageElement:
233    # --------------------------------------------------------------------------
234    def isPageElement(self):
235      return self.getType() in [ 'ZMSObject', 'ZMSRecordSet'] \
236        and not self.meta_id in [ 'ZMSNote', 'ZMSTeaserContainer']
237
238
239    # --------------------------------------------------------------------------
240    #  ZMSObject.getTitle
241    # --------------------------------------------------------------------------
242    def getTitle( self, REQUEST):
243      s = self.getObjProperty('title',REQUEST)
244      if len(s) == 0:
245        if self.isPage():
246          metaObjAttrs = self.getMetaobj( self.meta_id).get( 'attrs', [])
247          offs = 1
248          c = 0
249          for metaObjAttr in metaObjAttrs:
250            if metaObjAttr[ 'type'] in [ 'constant', 'method', 'py', 'string', 'select']:
251              if c == offs:
252                v = self.getObjProperty( metaObjAttr[ 'id'], REQUEST)
253                if type(v) in StringTypes:
254                  s = v
255                  break
256              c = c + 1
257      if len(s) == 0:
258        s = self.display_type(REQUEST)
259      if self.isPage():
260        sec_no = self.getSecNo()
261        if len(sec_no) > 0:
262          s = sec_no + ' ' + s
263      return s
264
265
266    # --------------------------------------------------------------------------
267    #  ZMSObject.getTitlealt
268    # --------------------------------------------------------------------------
269    def getTitlealt( self, REQUEST):
270      s = self.getObjProperty('titlealt',REQUEST)
271      if len(s) == 0:
272        s = self.display_type(REQUEST)
273      if len(s) == 0:
274        if self.isPage():
275          metaObjAttrs = self.getMetaobj( self.meta_id).get( 'attrs', [])
276          offs = 0
277          c = 0
278          for metaObjAttr in metaObjAttrs:
279            if metaObjAttr[ 'type'] in [ 'constant', 'method', 'py', 'string', 'select']:
280              if c == offs:
281                v = self.getObjProperty( metaObjAttr[ 'id'], REQUEST)
282                if type(v) in StringTypes:
283                  s = v
284                  break
285              c = c + 1
286      if self.isPage():
287        sec_no = self.getSecNo()
288        if len(sec_no) > 0:
289          s = sec_no + ' ' + s
290      return s
291
292
293    # --------------------------------------------------------------------------
294    #  ZMSObject.getType
295    #
296    #  Returns type of object. Valid types are:
297    #  <li>ZMSDocument: Page</li>
298    #  <li>ZMSObject: Page-Element</li>
299    #  <li>ZMSTeaserElement: Teaser-Element</li>
300    #  <li>ZMSRecordSet</li>
301    #  <li>ZMSResource</li>
302    #  <li>ZMSReference</li>
303    #  <li>ZMSLibrary</li>
304    #  <li>ZMSPackage</li>
305    #  <li>ZMSModule</li>
306    # --------------------------------------------------------------------------
307    def getType(self):
308      metaObj = self.getMetaobj(self.meta_id)
309      return metaObj.get('type','ZMSDocument')
310
311
312    # --------------------------------------------------------------------------
313    #  ZMSObject.isResource
314    # --------------------------------------------------------------------------
315    def isResource(self, REQUEST):
316      return self.getObjProperty('attr_dc_type',REQUEST) == 'Resource' or \
317        self.id in REQUEST.get( 'ZMS_IDS_RESOURCE', [])
318
319
320    # --------------------------------------------------------------------------
321    #  ZMSObject.isTranslated
322    #
323    #  Returns True if current object is translated to given language.
324    # --------------------------------------------------------------------------
325    def isTranslated(self, lang, REQUEST):
326      REQUEST = _globals.nvl(REQUEST,self.REQUEST)
327      rtnVal = False
328      req = {'lang':lang,'preview':REQUEST.get('preview','')}
329      value = self.getObjProperty('change_uid',req)
330      rtnVal = value is not None and len(value) > 0
331      return rtnVal
332
333
334    # --------------------------------------------------------------------------
335    #  ZMSObject.isModifiedInParentLanguage
336    #
337    #  Returns True if current object is modified in parent language.
338    # --------------------------------------------------------------------------
339    def isModifiedInParentLanguage(self, lang, REQUEST):
340      rtnVal = False
341      parent = self.getParentLanguage(lang)
342      if parent is not None:
343        req = {'lang':lang, 'preview':REQUEST.get('preview','') }
344        change_dt_lang = self.getObjProperty('change_dt',req)
345        req = {'lang':parent, 'preview':REQUEST.get('preview','') }
346        change_dt_parent = self.getObjProperty('change_dt',req)
347        try:
348          rtnVal = _globals.compareDate(change_dt_lang, change_dt_parent) > 0
349        except:
350          _globals.writeError(self,"[isModifiedInParentLanguage]: Unexpected exception: change_dt_lang=%s, change_dt_parent=%s!"%(str(change_dt_lang),str(change_dt_parent)))
351      return rtnVal
352
353
354    # --------------------------------------------------------------------------
355    #  ZMSObject.isVisible:
356    #
357    #  Returns 1 if current object is visible.
358    # --------------------------------------------------------------------------
359    def isVisible(self, REQUEST):
360      REQUEST = _globals.nvl(REQUEST,self.REQUEST)
361      lang = REQUEST.get('lang',self.getPrimaryLanguage())
362      visible = True
363      visible = visible and self.isTranslated(lang,REQUEST) # Object is translated.
364      visible = visible and self.isCommitted(REQUEST) # Object has been committed.
365      visible = visible and self.isActive(REQUEST) # Object is active.
366      return visible
367
368
369    # --------------------------------------------------------------------------
370    #  ZMSObject.get_size
371    #
372    #  @param REQUEST
373    # --------------------------------------------------------------------------
374    def get_size(self, REQUEST={}):
375      size = 0
376      keys = self.getObjAttrs().keys()
377      if self.getType()=='ZMSRecordSet':
378        keys = [self.getMetaobjAttrIds(self.meta_id)[0]]
379      for key in keys:
380        objAttr = self.getObjAttr(key)
381        value = self.getObjAttrValue( objAttr, REQUEST)
382        size = size + _globals.get_size(value)
383      return size
384
385
386    # --------------------------------------------------------------------------
387    #  ZMSObject.getDCCoverage
388    #
389    #  Returns "Dublin Core: Coverage".
390    #
391    #  @param REQUEST
392    # --------------------------------------------------------------------------
393    def getDCCoverage(self, REQUEST={}):
394      key_coverage = 'attr_dc_coverage'
395      obj_vers = self.getObjVersion(REQUEST)
396      coverage = getattr( obj_vers, key_coverage, '') # Take a performant shortcut to get object-property.
397      coverages = [ '', 'obligation', None]
398      if coverage in coverages:
399        coverage = 'global.' + self.getPrimaryLanguage()
400      return coverage
401
402
403    # --------------------------------------------------------------------------
404    #  ZMSObject.getDCType
405    #
406    #  Returns "Dublin Core: Type".
407    #
408    #  @param REQUEST
409    # --------------------------------------------------------------------------
410    def getDCType(self, REQUEST):
411      return self.getObjProperty('attr_dc_type',REQUEST)
412
413
414    # --------------------------------------------------------------------------
415    #  ZMSObject.getDCDescription
416    #
417    #  Returns "Dublin Core: Description".
418    #
419    #  @param REQUEST
420    # --------------------------------------------------------------------------
421    def getDCDescription(self, REQUEST):
422      return self.getObjProperty('attr_dc_description',REQUEST)
423
424
425    # --------------------------------------------------------------------------
426    #  ZMSObject.getSelf:
427    # --------------------------------------------------------------------------
428    def getSelf(self, meta_type=None):
429      ob = self
430      if meta_type is not None and not ob.isMetaType( meta_type):
431        parent = ob.getParentNode()
432        if parent is not None:
433          ob = parent.getSelf(meta_type)
434      return ob
435
436
437    # --------------------------------------------------------------------------
438    #  ZMSObject.icon:
439    # --------------------------------------------------------------------------
440    def icon(self):
441      try:
442        icon = self.display_icon( self.REQUEST)
443        if icon.find( '://') > 0:
444          icon = icon[ icon.find( '://')+3:]
445          icon = icon[ icon.find( '/'):]
446          BASEPATH1 = self.REQUEST.get('BASEPATH1','?')
447          if icon.startswith( BASEPATH1):
448            icon = icon[ len( BASEPATH1):]
449        if icon.startswith( '/'):
450          icon = icon[1:]
451        return icon
452      except:
453        _globals.writeError( self, '[icon]: An unexpected error occured!')
454
455
456    # --------------------------------------------------------------------------
457    #  ZMSObject.display_icon:
458    #
459    #  @param REQUEST
460    # --------------------------------------------------------------------------
461    def display_icon(self, REQUEST, meta_type=None, key='icon'):
462      obj_type = meta_type
463      if obj_type is None:
464        if not self.isActive(REQUEST):
465          key = 'icon_disabled'
466        obj_type = self.meta_id
467      if obj_type in self.getMetaobjIds( sort=0):
468        if key in self.getMetaobjAttrIds( obj_type):
469          metaObjAttr = self.getMetaobjAttr( obj_type, key)
470          if metaObjAttr is not None and metaObjAttr['type'] == 'method':
471            value = _globals.dt_html(self,metaObjAttr.get('custom',''),REQUEST)
472          elif metaObjAttr is not None and metaObjAttr['type'] == 'py':
473            value = metaObjAttr['py'](zmscontext=self)
474          else:
475            value = metaObjAttr.get( 'custom', None)
476          if value is not None and type(value) is not str:
477            return value.absolute_url()
478        metaObj = self.getMetaobj( obj_type)
479        if metaObj:
480          if metaObj[ 'type'] == 'ZMSResource':
481            return '%sico_class.gif'%self.MISC_ZMS
482          elif metaObj[ 'type'] == 'ZMSLibrary':
483            return '%sico_library.gif'%self.MISC_ZMS
484          elif metaObj[ 'type'] == 'ZMSPackage':
485            return '%sico_package.gif'%self.MISC_ZMS
486          elif metaObj[ 'type'] == 'ZMSRecordSet':
487            return '%sico_sqldb.gif'%self.MISC_ZMS
488          elif metaObj[ 'type'] == 'ZMSReference':
489            return '%sico_linkcontainer.gif'%self.MISC_ZMS
490          return '%sico_document.gif'%self.MISC_ZMS
491      return '/p_/broken'
492
493
494    # --------------------------------------------------------------------------
495    #  ZMSObject.display_type:
496    #
497    #  @param REQUEST
498    # --------------------------------------------------------------------------
499    def display_type(self, REQUEST={}, meta_type=None):
500      obj_type = _globals.nvl( meta_type, self.meta_id)
501      metaObj = self.getMetaobj( obj_type)
502      if type( metaObj) is dict and metaObj.has_key( 'name'):
503        obj_type = metaObj[ 'name']
504      lang_key = 'TYPE_%s'%obj_type.upper()
505      lang_str = self.getZMILangStr( lang_key)
506      if lang_key == lang_str:
507        return obj_type
508      else:
509        return lang_str
510
511
512    # --------------------------------------------------------------------------
513    #  ZMSObject.breadcrumbs_obj_path:
514    # --------------------------------------------------------------------------
515    def breadcrumbs_obj_path(self, portalMaster=True):
516      REQUEST = self.REQUEST
517      # Handle This.
518      rtn = []
519      obj = self
520      for lvl in range(self.getLevel()+1):
521        if obj is not None:
522          obj_item = [obj]
523          obj_item.extend(rtn)
524          rtn = obj_item
525          obj = obj.getParentNode()
526      # Handle Portal Master.
527      if portalMaster and self.getConfProperty('Portal.Master',''):
528        try:
529          thisHome = self.getHome()
530          masterHome = getattr(thisHome,self.getConfProperty('Portal.Master',''))
531          masterDocElmnt = masterHome.content
532          obj_item = masterDocElmnt.breadcrumbs_obj_path()
533          obj_item.extend(rtn)
534          rtn = obj_item
535        except:
536          _globals.writeError( self, '[breadcrumbs_obj_path]: An unexpected error occured while handling portal master!')
537      return rtn
538
539
540    # --------------------------------------------------------------------------
541    #  ZMSObject.relative_obj_path:
542    # --------------------------------------------------------------------------
543    def relative_obj_path(self):
544      return self.absolute_url()[len(self.getDocumentElement().absolute_url())+1:]
545
546
547    ############################################################################
548    #  ZMSObject.manage_changeProperties:
549    #
550    #  Change properties.
551    ############################################################################
552    def manage_changeProperties(self, lang, REQUEST, RESPONSE=None):
553      """ ZMSObject.manage_changeProperties """
554     
555      message = ''
556      messagekey = 'manage_tabs_message'
557      t0 = time.time()
558     
559      redirect_self = False
560      redirect_self = redirect_self or REQUEST.get('btn','') == ''
561      redirect_self = redirect_self or self.isPage()
562      for attr in self.getMetaobj(self.meta_id)['attrs']:
563        attr_type = attr['type']
564        redirect_self = redirect_self or attr_type in self.getMetaobjIds()+['*']
565      redirect_self = redirect_self and (self.isPageContainer() or not REQUEST.get('btn','') in [ self.getZMILangStr('BTN_CANCEL'), self.getZMILangStr('BTN_BACK')])
566     
567      if REQUEST.get('btn','') not in [ self.getZMILangStr('BTN_CANCEL'), self.getZMILangStr('BTN_BACK')]:
568        try:
569         
570          ##### Object State #####
571          self.setObjStateModified(REQUEST)
572         
573          ##### Resources #####
574          if 'resources' in self.getMetaobjAttrIds( self.meta_id):
575            resources = self.getObjProperty( 'resources', REQUEST)
576            l = map( lambda x: 0, range( len( resources)))
577            for key in self.getObjAttrs().keys():
578              obj_attr = self.getObjAttr( key)
579              el_name = self.getObjAttrName( obj_attr, lang)
580              if REQUEST.has_key( el_name) and REQUEST.has_key( 'resource_%s'%el_name):
581                el_value = REQUEST.get( el_name)
582                if el_value is not None:
583                  for i in range( len( resources)):
584                    v = resources[ i]
585                    if el_value.find( '/'+v.getFilename()) > 0:
586                      l[ i] = l[ i] + 1
587            c = 0
588            for i in range( len( resources)):
589              v = resources[ c]
590              if l[ i] == 0:
591                del resources[ c]
592              else:
593                src_old = '%s/@%i/%s'%(self.id,i,v.getFilename())
594                src_new = '%s/@%i/%s'%(self.id,c,v.getFilename())
595                for key in self.getObjAttrs().keys():
596                  obj_attr = self.getObjAttr( key)
597                  el_name = self.getObjAttrName( obj_attr, lang)
598                  if REQUEST.has_key( el_name) and REQUEST.has_key( 'resource_%s'%el_name):
599                    el_value = REQUEST.get( el_name)
600                    if el_value is not None:
601                      el_value = el_value.replace( src_old, src_new)
602                      REQUEST.set( el_name, el_value)
603                c = c + 1
604            for key in self.getObjAttrs().keys():
605              obj_attr = self.getObjAttr( key)
606              el_name = self.getObjAttrName( obj_attr, lang)
607              if REQUEST.has_key( el_name) and REQUEST.has_key( 'resource_%s'%el_name):
608                v = REQUEST.get( 'resource_%s'%el_name)
609                if isinstance(v,ZPublisher.HTTPRequest.FileUpload):
610                  if len(getattr(v,'filename',''))>0:
611                    v = _blobfields.createBlobField(self,_globals.DT_FILE,v)
612                    resources.append( v)
613                    el_value = REQUEST.get( el_name)
614                    if el_value is not None:
615                      src_new = '%s/@%i/%s'%(self.absolute_url(),len(resources)-1,v.getFilename())
616                      if v.getContentType().find( 'image/') == 0:
617                        el_value = el_value + '<img src="%s" alt="" border="0" align="absmiddle"/>'%src_new
618                      else:
619                        el_value = el_value + '<a href="%s" target="_blank">%s</a>'%(src_new,v.getFilename())
620                      REQUEST.set( el_name, el_value)
621                      redirect_self = True
622            self.setObjProperty( 'resources', resources, lang)
623         
624          ##### Properties #####
625          keys = self.getObjAttrs().keys()
626          for key in keys:
627            if key != 'resources':
628              self.setReqProperty(key,REQUEST)
629         
630          ##### Resource-Objects #####
631          metaObjIds = self.getMetaobjIds(sort=0)
632          keys = self.getMetaobjAttrIds(self.meta_id)
633          for key in keys:
634            objAttr = self.getMetaobjAttr(self.meta_id,key)
635            if objAttr['type'] in metaObjIds and \
636               self.getMetaobj(objAttr['type'])['type'] == 'ZMSResource':
637              for ob in self.getObjChildren(key,REQUEST):
638                REQUEST.set('objAttrNamePrefix',ob.id+'_')
639                ob.manage_changeProperties( lang, REQUEST)
640                REQUEST.set('objAttrNamePrefix','')
641         
642          ##### VersionManager ####
643          self.onChangeObj(REQUEST)
644         
645          ##### Message ####
646          message = self.getZMILangStr('MSG_CHANGED')
647       
648        except:
649          message = _globals.writeError(self,"[manage_changeProperties]")
650          messagekey = 'manage_tabs_error_message'
651       
652        message += ' (in '+str(int((time.time()-t0)*100.0)/100.0)+' secs.)'
653     
654      # Return with message.
655      target_ob = self.getParentNode()
656      if redirect_self or target_ob is None:
657        target_ob = self
658      target = REQUEST.get( 'manage_target', '%s/manage_main'%target_ob.absolute_url())
659      target = self.url_append_params( target, { 'lang': lang, 'preview': 'preview',  messagekey: message})
660      target = '%s#_%s'%( target, self.id)
661      if RESPONSE is not None:
662        return RESPONSE.redirect( target)
663
664
665    ############################################################################
666    ###
667    ###  Common Functions
668    ###
669    ############################################################################
670
671    # --------------------------------------------------------------------------
672    #  ZMSObject.findObjId:
673    #
674    #  Find object by ids given in object path.
675    # --------------------------------------------------------------------------
676    def findObjId(self, relative_obj_path, REQUEST):
677      _globals.writeLog( self, '[findObjId]: relative_obj_path=%s'%relative_obj_path)
678      docElmnt = self.getDocumentElement()
679      ob = docElmnt
680      if len(relative_obj_path) > 0:
681        ids = relative_obj_path.split( '/')
682        for id in ids:
683          ob = getattr(ob,id,None)
684          if ob is None:
685            if self.getConfProperty('ZMS.InternalLinks.autocorrection',0)==1:
686              ob_id = self.getHome().id+'@'+relative_obj_path.split('/')[-1]
687              _globals.writeBlock(self,'[findObjId]: ob_id='+ob_id)
688              ob = self.synchronizeRefs( ob_id)
689            break
690      return ob
691
692
693    # --------------------------------------------------------------------------
694    #  ZMSObject.getDeclId:
695    #
696    #  Returns declarative id.
697    # --------------------------------------------------------------------------
698    def getDeclId(self, REQUEST={}):
699      declId = ''
700      try:
701        if self.getConfProperty( 'ZMS.pathhandler', 0) != 0:
702          obj_attrs_keys = self.getObjAttrs().keys()
703          for key in [ 'attr_dc_identifier_doi', 'attr_dc_identifier_url_node']:
704            if key in obj_attrs_keys:
705              declId = self.getObjProperty( key, REQUEST)
706              if len( declId) > 0:
707                break
708          if len(declId) == 0:
709            declId = self.getTitlealt( REQUEST)
710          mapping = self.dict_list(self.getConfProperty('ZMS.pathhandler.id_quote.mapping',' _-_/_'))
711          declId = _globals.id_quote( declId, mapping)
712      except:
713        _globals.writeError(self,'[getDeclId]: can\'t get declarative id')
714      if len( declId) == 0:
715        declId = self.id
716      return declId
717
718
719    # --------------------------------------------------------------------------
720    #  ZMSObject.aq_absolute_url:
721    #
722    #  Object is called in a different context and we want to use acquisition.
723    # --------------------------------------------------------------------------
724    def aq_absolute_url(self, relative=0):
725      abs_url = self.absolute_url( relative)
726      i = abs_url.find('/content')
727      if i > 0:
728        home_id = abs_url[:i]
729        home_id = home_id[home_id.rfind('/')+1:]
730        home_abs_url = self.getHome().absolute_url()
731        if home_id in home_abs_url.split('/'):
732          abs_url = home_abs_url + abs_url[i:]
733      return abs_url
734
735
736    # --------------------------------------------------------------------------
737    #  ZMSObject.getDeclUrl:
738    #
739    #  Returns declarative url.
740    # --------------------------------------------------------------------------
741    def getDeclUrl(self, REQUEST={}):
742      if self.getConfProperty('ZMS.pathhandler',0) == 0 or REQUEST.get('preview','')=='preview':
743        url = self.aq_absolute_url()
744      else:
745        ob = self.getDocumentElement()
746        url = ob.aq_absolute_url()
747        for id in self.aq_absolute_url()[len(url):].split('/'):
748          if len(id) > 0:
749            ob = getattr(ob,id,None)
750            if ob is None: break
751            url += '/' + ob.getDeclId(REQUEST)
752      return url
753
754
755    # --------------------------------------------------------------------------
756    #  ZMSObject.getPageExt:
757    #
758    #  Get page-extension.
759    # --------------------------------------------------------------------------
760    def getPageExt(self, REQUEST):
761      pageexts = ['.html']
762      if 'attr_pageext' in self.getObjAttrs().keys():
763        obj_attr = self.getObjAttr('attr_pageext')
764        if obj_attr.has_key('keys') and len(obj_attr.get('keys')) > 0:
765          pageexts = obj_attr.get('keys')
766      pageext = self.getObjProperty('attr_pageext',REQUEST)
767      if pageext == '' or pageext is None:
768        pageext = pageexts[0]
769      return pageext
770
771
772    # --------------------------------------------------------------------------
773    #  ZMSObject.getHref2Html:
774    #  ZMSObject.getHref2IndexHtml:
775    #  ZMSObject.getHref2PrintHtml:
776    #  ZMSObject.getHref2SitemapHtml:
777    #
778    #  "Sans-Document"-Navigation: reference to first page that contains visible
779    #  page-elements.
780    # --------------------------------------------------------------------------
781    def getHref2Html(self, fct, pageext, REQUEST):
782      if not self.isPage():
783        parent = self.getParentNode()
784        pageext = parent.getPageExt(REQUEST)
785        href = parent.getHref2Html( fct, pageext, REQUEST)
786        href += '#' + self.id
787      else:
788        href = self.getDeclUrl(REQUEST)+'/'
789        # Assemble href.
790        if REQUEST.get('ZMS_INDEX_HTML',0)==1 or fct != 'index' or len(self.getLangIds())>1:
791          href += '%s_%s%s'%(fct,REQUEST['lang'],pageext)
792        if REQUEST.get('preview','')=='preview': href=self.url_append_params(href,{'preview':'preview'})
793      if (REQUEST.get('ZMS_PATHCROPPING',False) or self.getConfProperty('ZMS.pathcropping',0)==1) and REQUEST.get('export_format','') == '':
794        base = REQUEST.get('BASE0','')
795        if href.find( base) == 0:
796          href = href[len(base):]
797      return href
798     
799    #++
800    def getHref2SitemapHtml(self, REQUEST):
801      if not REQUEST.has_key('lang'): REQUEST.set('lang',self.getLanguage(REQUEST))
802      href = 'sitemap_%s%s'%(REQUEST['lang'],self.getPageExt(REQUEST))
803      if REQUEST.get('preview','')=='preview': href = self.url_append_params(href,{'preview':'preview'})
804      return href
805     
806    #++
807    def getHref2PrintHtml(self, REQUEST):
808      if not REQUEST.has_key('lang'):
809        REQUEST.set('lang',self.getLanguage(REQUEST))
810      href = 'index_print_%s%s'%(REQUEST['lang'],self.getPageExt(REQUEST))
811      qs = REQUEST.get('QUERY_STRING','')
812      if len(qs)>0:
813        href += '?' + qs
814      if REQUEST.get('preview','')=='preview':
815        href = self.url_append_params(href,{'preview':'preview'})
816      return href
817   
818    #++
819    def getHref2IndexHtml(self, REQUEST, deep=1):
820      if not REQUEST.has_key('lang'):
821        try: REQUEST.set('lang',self.getLanguage(REQUEST))
822        except: REQUEST['lang'] = self.getPrimaryLanguage()
823     
824      #-- [ReqBuff]: Fetch buffered value from Http-Request.
825      try:
826        reqBuffId = 'getHref2IndexHtml_%i'%deep
827        value = self.fetchReqBuff(reqBuffId,REQUEST)
828        return value
829      except:
830       
831        #-- Get value.
832        ob = self
833        fct = REQUEST.get('ZMS_SKIN','index')
834        if fct == 'index' and 'index_html' in self.objectIds():
835          value = self.absolute_url()
836          if REQUEST.get('lang','') != '':
837            value = self.url_append_params(value,{'lang':REQUEST['lang']})
838          if REQUEST.get('preview','') != '':
839            value = self.url_append_params(value,{'preview':REQUEST['preview']})
840        else:
841          if deep:
842            ob = _globals.getPageWithElements( self, REQUEST)
843          value = ob.getHref2Html( fct, ob.getPageExt(REQUEST), REQUEST)
844       
845        #-- [ReqBuff]: Returns value and stores it in buffer of Http-Request.
846        return self.storeReqBuff(reqBuffId,value,REQUEST)
847
848
849    ############################################################################
850    ### 
851    ###  Object-actions of management interface
852    ###
853    ############################################################################
854
855    # --------------------------------------------------------------------------
856    #  ZMSObject.getMetaobjZMI:
857    #
858    #  Returns ZMI from method 'manage_main' for meta-object specified by given Id.
859    # --------------------------------------------------------------------------
860    def getMetaobjZMI(self, id, REQUEST):
861      metaObj = self.getMetaobj(id)
862      for metaObjAttr in metaObj['attrs']:
863        if metaObjAttr['id']=='manage_main':
864          value = metaObjAttr['custom']
865          fmName = REQUEST.get('fmName','form0')
866          REQUEST.set('fmName',fmName)
867          html = []
868          if REQUEST.get('ZMS_INSERT',None) is not None:
869            fmAction = '%s/manage_addZMSCustom'%REQUEST['URL1'][len(REQUEST['BASE0']):]
870            html.append('<form name="%s" action="%s" method="post" enctype="multipart/form-data">\n'%(fmName,fmAction))
871            html.append('<input type="hidden" name="meta_id" value="%s">\n'%id)
872            html.append('<input type="hidden" name="id" value="%s">\n'%REQUEST.get('id','e'))
873            html.append('<input type="hidden" name="_sort_id:int" value="%i">\n'%REQUEST.get('_sort_id'))
874            html.append('<input type="hidden" name="ZMS_INSERT" value="%s">\n'%REQUEST.get('ZMS_INSERT'))
875          else:
876            fmAction = 'manage_changeProperties'
877            html.append('<form name="%s" action="%s" method="post" enctype="multipart/form-data">\n'%(fmName,fmAction))
878          REQUEST.set('ZMS_ACTION',fmAction)
879          try:
880            value = _globals.dt_html(self,value,REQUEST)
881          except:
882            value = _globals.writeError(self,'[getMetaobjZMI]')
883          html.append(self.f_submitInputFields(self,REQUEST))
884          html.append(value)
885          html.append('</form>\n')
886          return ''.join(html)
887      return None
888
889
890    ############################################################################
891    ###
892    ###  DOM-Methods
893    ###
894    ############################################################################
895
896    # --------------------------------------------------------------------------
897    #  ZMSObject.getLevel:
898    #
899    #  The hierarchical level of this node.
900    # --------------------------------------------------------------------------
901    def getLevel(self):
902      docElmnt = self.getDocumentElement()
903      docPath = docElmnt.getPhysicalPath()
904      path = self.getPhysicalPath()
905      return len(path)-len(docPath)
906
907
908    # --------------------------------------------------------------------------
909    #  ZMSObject.isAnchestor:
910    #
911    #  True if self is anchestor of given object.
912    # --------------------------------------------------------------------------
913    def isAnchestor(self, ob):
914      if ob is not None:
915        path = '/'.join(self.getPhysicalPath())
916        obPath = '/'.join(ob.getPhysicalPath())
917        return obPath.startswith(path)
918      return False
919
920
921    # --------------------------------------------------------------------------
922    #  ZMSObject.getParentByDepth:
923    #
924    #  The parent of this node by depth.
925    # --------------------------------------------------------------------------
926    def getParentByDepth(self, deep):
927      rtn = self
928      for i in range(deep):
929        rtn = rtn.getParentNode()
930      return rtn
931
932
933    # --------------------------------------------------------------------------
934    #  ZMSObject.getParentByLevel:
935    #
936    #  The parent of this node by level.
937    # --------------------------------------------------------------------------
938    def getParentByLevel(self, level):
939      rtn = self
940      while rtn.getLevel() > level:
941        rtn = rtn.getParentNode()
942      return rtn
943
944
945    # --------------------------------------------------------------------------
946    #  ZMSObject.getParentNode:
947    # --------------------------------------------------------------------------
948    security.declarePublic('getParentNode')
949    def getParentNode(self):
950      """
951      The parent of this node.
952      All nodes except root may have a parent.
953      """
954      rtn = getattr(self, 'aq_parent', None)
955      # Handle ZMSProxyObjects.
956      if hasattr( rtn, 'is_blob') or hasattr( rtn, 'base'):
957        rtn = getattr( self, self.absolute_url().split( '/')[-2], None)
958      return rtn
959
960
961    # --------------------------------------------------------------------------
962    #  ZMSObject.getTreeNodes:
963    # --------------------------------------------------------------------------
964    def getTreeNodes(self, REQUEST={}, meta_types=None):
965      """
966      Returns a NodeList that contains all children of this subtree in correct order.
967      If none, this is a empty NodeList.
968      """
969      rtn = []
970      for ob in self.getChildNodes(REQUEST):
971        if ob.isMetaType(meta_types): rtn.append(ob)
972        rtn.extend(ob.getTreeNodes(REQUEST,meta_types))
973      return rtn
974
975
976    # --------------------------------------------------------------------------
977    #  ZMSObject.ajaxGetNode:
978    # --------------------------------------------------------------------------
979    security.declareProtected('View', 'ajaxGetNode')
980    def ajaxGetNode(self, lang, xml_header=True, meta_types=None, REQUEST=None):
981      """ ZMSObject.ajaxGetNode """
982     
983      #-- Build xml.
984      xml = ''
985      if xml_header:
986        RESPONSE = REQUEST.RESPONSE
987        content_type = 'text/xml; charset=utf-8'
988        filename = 'ajaxGetChildNodes.xml'
989        RESPONSE.setHeader('Content-Type',content_type)
990        RESPONSE.setHeader('Content-Disposition','inline;filename="%s"'%filename)
991        RESPONSE.setHeader('Cache-Control', 'no-cache')
992        RESPONSE.setHeader('Pragma', 'no-cache')
993        self.f_standard_html_request( self, REQUEST)
994        xml += self.getXmlHeader()
995      users = None
996      if REQUEST.form.get('get_users'):
997        users = self.getUsers(REQUEST)
998      perms = None
999      if REQUEST.form.get('get_permissions'):
1000        perms = []
1001        perms_optpl = [
1002          ['ZMS Administrator',self.getLangStr('ROLE_ZMSADMINISTRATOR',lang)],
1003          ['ZMS Editor',self.getLangStr('ROLE_ZMSEDITOR',lang)],
1004          ['ZMS Author',self.getLangStr('ROLE_ZMSAUTHOR',lang)],
1005          ['ZMS UserAdministrator',self.getLangStr('ROLE_ZMSUSERADMINISTRATOR',lang)],
1006          ['ZMS Subscriber',self.getLangStr('ROLE_ZMSSUBSCRIBER',lang)],
1007          ]
1008        auth_user = REQUEST['AUTHENTICATED_USER']
1009        for perm in perms_optpl:
1010          if auth_user.has_permission(perm[0],self):
1011            perms.append(perm[1])
1012      restricted = None
1013      if REQUEST.form.get('get_restricted'):
1014        restricted = self.hasRestrictedAccess()
1015      xml += "<page"
1016      xml += " absolute_url=\"%s\""%str(self.absolute_url())
1017      xml += " access=\"%s\""%str(int(self.hasAccess(REQUEST)))
1018      xml += " active=\"%s\""%str(int(self.isActive(REQUEST)))
1019      xml += " display_icon=\"%s\""%str(self.display_icon(REQUEST))
1020      xml += " display_type=\"%s\""%str(self.display_type(REQUEST))
1021      xml += " id=\"%s_%s\""%(self.getHome().id,self.id)
1022      xml += " index_html=\"%s\""%_globals.html_quote(self.getHref2IndexHtml(REQUEST,deep=0))
1023      xml += " is_page=\"%s\""%str(int(self.isPage()))
1024      xml += " is_pageelement=\"%s\""%str(int(self.isPageElement()))
1025      xml += " meta_id=\"%s\""%(self.meta_id)
1026      xml += " title=\"%s\""%_globals.html_quote(self.getTitle(REQUEST))
1027      xml += " titlealt=\"%s\""%_globals.html_quote(self.getTitlealt(REQUEST))
1028      if self.isPage() and REQUEST.form.get('has_children', 1):
1029        xml += " has_children=\"%s\""%str(int(len(self.getChildNodes(REQUEST,meta_types))>0))
1030      if perms is not None:
1031        xml += " permissions=\"%s\""%str(','.join(perms))
1032      if restricted is not None:
1033        xml += " restricted=\"%s\""%str(restricted)
1034      xml += ">"
1035      if users:
1036        xml += "<users>%s</users>"%self.toXmlString(users)
1037      if REQUEST.form.get('get_attrs', 1):
1038        obj_attrs = self.getObjAttrs()
1039        for key in filter(lambda x: x not in ['title','titlealt','created_dt','created_uid','change_uid','attr_dc_coverage','attr_cacheable'],obj_attrs.keys()):
1040          obj_attr = obj_attrs[ key]
1041          if obj_attr['datatype_key'] in _globals.DT_TEXTS or \
1042             obj_attr['datatype_key'] in _globals.DT_NUMBERS or \
1043             obj_attr['datatype_key'] in _globals.DT_DATETIMES:
1044            v = self.getObjProperty(key,REQUEST)
1045            if v:
1046              xml += "<%s>%s</%s>"%(key,self.toXmlString(v),key)
1047          elif obj_attr['datatype_key'] in _globals.DT_BLOBS:
1048            v = self.getObjProperty(key,REQUEST)
1049            if v:
1050              xml += "<%s>"%key
1051              xml += "<href>%s</href>"%_globals.html_quote(v.getHref(REQUEST))
1052              xml += "<filename>%s</filename>"%_globals.html_quote(v.getFilename())
1053              xml += "<content_type>%s</content_type>"%_globals.html_quote(v.getContentType())
1054              xml += "<size>%s</size>"%self.getDataSizeStr(v.get_size())
1055              xml += "<icon>%s</icon>"%self.getMimeTypeIconSrc(v.getContentType())
1056              xml += "</%s>"%key
1057      xml += "</page>"
1058      return xml
1059
1060
1061    # --------------------------------------------------------------------------
1062    #  ZMSObject.ajaxGetParentNodes:
1063    # --------------------------------------------------------------------------
1064    security.declareProtected('View', 'ajaxGetParentNodes')
1065    def ajaxGetParentNodes(self, lang, xml_header=True, meta_types=None, REQUEST=None):
1066      """ ZMSObject.ajaxGetParentNodes """
1067      #-- Build xml.
1068      xml = ''
1069      if xml_header:
1070        RESPONSE = REQUEST.RESPONSE
1071        content_type = 'text/xml; charset=utf-8'
1072        filename = 'ajaxGetChildNodes.xml'
1073        RESPONSE.setHeader('Content-Type',content_type)
1074        RESPONSE.setHeader('Content-Disposition','inline;filename="%s"'%filename)
1075        RESPONSE.setHeader('Cache-Control', 'no-cache')
1076        RESPONSE.setHeader('Pragma', 'no-cache')
1077        self.f_standard_html_request( self, REQUEST)
1078        xml += self.getXmlHeader()
1079     
1080      xml += "<pages"
1081      for key in REQUEST.form.keys():
1082        if key.find('get_') < 0 and key not in ['lang','preview','http_referer','meta_types']:
1083          xml += " %s=\"%s\""%(key,str(REQUEST.form.get(key)))
1084      xml += " level=\"%i\""%self.getLevel()
1085      xml += ">\n"
1086     
1087      ob = self
1088      obs = []
1089      while ob is not None:
1090        obs.insert(0,ob)
1091        ob = ob.getParentNode()
1092     
1093      REQUEST.form['get_attrs'] = REQUEST.form.get('get_attrs', 0)
1094      for ob in obs:
1095        xml += ob.ajaxGetNode( lang=lang, xml_header=False, meta_types=meta_types, REQUEST=REQUEST)
1096     
1097      xml += "</pages>"
1098     
1099      return xml
1100
1101
1102    # --------------------------------------------------------------------------
1103    #  ZMSObject.ajaxGetChildNodes:
1104    # --------------------------------------------------------------------------
1105    security.declareProtected('View', 'ajaxGetChildNodes')
1106    def ajaxGetChildNodes(self, lang, xml_header=True, meta_types=None, REQUEST=None):
1107      """ ZMSObject.ajaxGetChildNodes """
1108     
1109      #-- Build xml.
1110      xml = ''
1111      if xml_header:
1112        RESPONSE = REQUEST.RESPONSE
1113        content_type = 'text/xml; charset=utf-8'
1114        filename = 'ajaxGetChildNodes.xml'
1115        RESPONSE.setHeader('Content-Type',content_type)
1116        RESPONSE.setHeader('Content-Disposition','inline;filename="%s"'%filename)
1117        RESPONSE.setHeader('Cache-Control', 'no-cache')
1118        RESPONSE.setHeader('Pragma', 'no-cache')
1119        self.f_standard_html_request( self, REQUEST)
1120        xml += self.getXmlHeader()
1121     
1122      xml += "<pages"
1123      for key in REQUEST.form.keys():
1124        if key.find('get_') < 0 and key not in ['lang','preview','http_referer','meta_types']:
1125          xml += " %s=\"%s\""%(key,str(REQUEST.form.get(key)))
1126      xml += " level=\"%i\""%self.getLevel()
1127      xml += ">\n"
1128     
1129      if type(meta_types) is list:
1130        new_meta_types = []
1131        for meta_type in meta_types:
1132          try:
1133            new_meta_types.append( int( meta_type))
1134          except:
1135            new_meta_types.append( meta_type)
1136        meta_types = new_meta_types
1137      if REQUEST.form.get('http_referer'):
1138        REQUEST.set('URL',REQUEST.form.get('http_referer'))
1139      obs = []
1140      # Add child-nodes.
1141      obs.extend( self.getChildNodes(REQUEST,meta_types))
1142      # Add trashcan.
1143      if ( self.meta_type == 'ZMS') and \
1144         ( ( type( meta_types) is list and 'ZMSTrashcan' in meta_types) or \
1145           ( type( meta_types) is string and 'ZMSTrashcan' == meta_types)):
1146        obs.append( self.getTrashcan())
1147      if self.meta_type == 'ZMS':
1148        obs.extend( self.getPortalClients())
1149     
1150      for ob in obs:
1151        xml += ob.ajaxGetNode( lang=lang, xml_header=False, meta_types=meta_types, REQUEST=REQUEST)
1152     
1153      xml += "</pages>"
1154     
1155      return xml
1156
1157
1158    # --------------------------------------------------------------------------
1159    #  ZMSObject.getChildNodes:
1160    #
1161    #  Returns a NodeList that contains all children of this node,
1162    #  if none, this is a empty NodeList.
1163    # --------------------------------------------------------------------------
1164    def getChildNodes(self, REQUEST={}, meta_types=None, reid=None):
1165      return []
1166
1167
1168    ############################################################################
1169    ###
1170    ###  Sort-Order
1171    ###
1172    ############################################################################
1173
1174    # --------------------------------------------------------------------------
1175    #  ZMSObject.setSortId:
1176    #
1177    #  Sets Sort-ID (integer).
1178    # --------------------------------------------------------------------------
1179    def setSortId(self, sort_id):
1180      setattr( self, 'sort_id', _globals.format_sort_id(sort_id))
1181
1182
1183    # --------------------------------------------------------------------------
1184    #  ZMSObject.getSortId:
1185    #
1186    #  Returns Sort-ID (integer).
1187    # --------------------------------------------------------------------------
1188    def getSortId(self, REQUEST=None):
1189      try:
1190        sort_id = getattr( self, 'sort_id')
1191        rtnVal = string.atoi(sort_id[len(_globals.id_prefix(sort_id)):])
1192      except:
1193        rtnVal = 0
1194      return rtnVal
1195
1196
1197    ############################################################################
1198    # ZMSObject.manage_moveObjUp:
1199    #
1200    # Moves an object up in sort order.
1201    ############################################################################
1202    def manage_moveObjUp(self, lang, REQUEST, RESPONSE):
1203      """ ZMSObject.manage_moveObjUp """
1204      parent = self.getParentNode()
1205      sort_id = self.getSortId()
1206      self.setSortId(sort_id - 15)
1207      parent.normalizeSortIds(_globals.id_prefix(self.id))
1208      # Return with message.
1209      message = self.getZMILangStr('MSG_MOVEDOBJUP')%("<i>%s</i>"%self.display_type(REQUEST))
1210      RESPONSE.redirect('%s/manage_main?lang=%s&manage_tabs_message=%s#_%s'%(parent.absolute_url(),lang,urllib.quote(message),self.id))
1211
1212
1213    ############################################################################
1214    # ZMSObject.manage_moveObjDown:
1215    #
1216    # Moves an object down in sort order.
1217    ############################################################################
1218    def manage_moveObjDown(self, lang, REQUEST, RESPONSE):
1219      """ ZMSObject.manage_moveObjDown """
1220      parent = self.getParentNode()
1221      sort_id = self.getSortId()
1222      self.setSortId(sort_id + 15)
1223      parent.normalizeSortIds(_globals.id_prefix(self.id))
1224      # Return with message.
1225      message = self.getZMILangStr('MSG_MOVEDOBJDOWN')%("<i>%s</i>"%self.display_type(REQUEST))
1226      RESPONSE.redirect('%s/manage_main?lang=%s&manage_tabs_message=%s#_%s'%(parent.absolute_url(),lang,urllib.quote(message),self.id))
1227
1228
1229    ############################################################################
1230    # ZMSObject.manage_moveObjToPos:
1231    #
1232    # Moves an object to specified position in sort order.
1233    ############################################################################
1234    def manage_moveObjToPos(self, lang, pos, fmt=None, REQUEST=None, RESPONSE=None):
1235      """ ZMSObject.manage_moveObjToPos """
1236      parent = self.getParentNode()
1237      sibling_sort_ids = map(lambda x: x.sort_id,parent.getChildNodes(REQUEST))
1238      sibling_sort_ids.remove(self.sort_id)
1239      pos = pos - 1
1240      if pos < len(sibling_sort_ids):
1241        new_sort_id = int(sibling_sort_ids[pos][1:])-1
1242      else:
1243        new_sort_id = int(sibling_sort_ids[-1][1:])+1
1244      self.setSortId(new_sort_id)
1245      parent.normalizeSortIds(_globals.id_prefix(self.id))
1246      # Return with message.
1247      message = self.getZMILangStr('MSG_MOVEDOBJTOPOS')%(("<i>%s</i>"%self.display_type(REQUEST)),(pos+1))
1248      if fmt == 'json':
1249        return self.str_json(message)
1250      else:
1251        RESPONSE.redirect('%s/manage_main?lang=%s&manage_tabs_message=%s#_%s'%(parent.absolute_url(),lang,urllib.quote(message),self.id))
1252
1253
1254    # --------------------------------------------------------------------------
1255    #  ZMSObject.getBodyContent:
1256    # --------------------------------------------------------------------------
1257    def _getBodyContent2(self, REQUEST):
1258      l = []
1259      v = self.metaobj_manager.renderTemplate( self)
1260      if self.getType()=='ZMSTeaserElement':
1261        l.append('<div ')
1262        l.append(' class="%s"'%self.getType())
1263        if REQUEST.has_key('bgcolor_text'):
1264          l.append(' style="background-color:%s"'%self.get_colormap().get(REQUEST.get('bgcolor_text'),'transparent'))
1265        l.append('>\n')
1266        l.append(v)
1267        l.append('</div>\n')
1268      else:
1269        l.append(v)
1270      return ''.join(l)
1271
1272    def _getBodyContent(self, REQUEST):
1273      html = self._getBodyContent2( REQUEST)
1274      if _globals.isPreviewRequest(REQUEST) and \
1275         self.getConfProperty('ZMS.preview.contentEditable',1)==1 and \
1276         not self.isPage():
1277        ids = ['contentEditable',self.id,REQUEST.get('lang')]
1278        css = ['contentEditable']
1279        html = '<div class="%s" id="%s">%s</div>'%(' '.join(css),'_'.join(ids),html)
1280      return html
1281
1282    security.declareProtected('View', 'getBodyContent')
1283    def getBodyContent(self, REQUEST, forced=False):
1284      """
1285      HTML presentation in body-content.
1286      """
1287      html = ''
1288      if forced or self.isVisible( REQUEST):
1289        html = self._getBodyContent( REQUEST)
1290        # Custom hook.
1291        try:
1292          name = 'getCustomBodyContent'
1293          if hasattr(self,name):
1294            html = getattr(self,name)(context=self,html=html,REQUEST=REQUEST)
1295        except:
1296          _globals.writeError( self, '[getBodyContent]: can\'t %s'%name)
1297      return html
1298
1299
1300    # --------------------------------------------------------------------------
1301    #  ZMSObject.renderShort:
1302    # --------------------------------------------------------------------------
1303    security.declareProtected('View', 'renderShort')
1304    def renderShort(self, REQUEST):
1305      """
1306      Renders short presentation of object.
1307      """
1308      html = ''
1309      try:
1310        if self.getType() in [ 'ZMSDocument', 'ZMSResource', 'ZMSReference']:
1311          html = self.getTitlealt(REQUEST)
1312          html = '<div class="contentEditable form-label" id="contentEditable_%s_%s">%s</div>'%(self.id,REQUEST['lang'],html)
1313        elif 'renderShort' in self.getMetaobjAttrIds(self.meta_id):
1314          html = self.attr('renderShort')
1315        else:
1316          html = self._getBodyContent(REQUEST)
1317        html = '<div class="zmiRenderShort">%s</div><!-- .zmiRenderShort -->'%html
1318        # Process html <form>-tags.
1319        html = _globals.form_quote(html,REQUEST)
1320      except:
1321        html = _globals.writeError(self,"[renderShort]")
1322        html = '<br/>'.join(html.split('\n'))
1323      # Return <html>.
1324      return html
1325
1326
1327    ############################################################################
1328    ###
1329    ###  Printable
1330    ###
1331    ############################################################################
1332
1333    # --------------------------------------------------------------------------
1334    #  ZMSObject.printHtml:
1335    #
1336    #  Renders print presentation.
1337    # --------------------------------------------------------------------------
1338    def printHtml(self, level, sectionizer, REQUEST, deep=True):
1339      html = ''
1340     
1341      # Title.
1342      sectionizer.processLevel( level)
1343      title = self.getTitle( REQUEST)
1344      title = '%s %s'%(str(sectionizer),title)
1345      REQUEST.set( 'ZMS_SECTIONIZED_TITLE', '<h%i>%s</h%i>'%( level, title, level))
1346     
1347      # bodyContent
1348      html += self._getBodyContent(REQUEST)
1349     
1350      # Container-Objects.
1351      if deep:
1352        for ob in self.filteredChildNodes(REQUEST,self.PAGES):
1353          html += ob.printHtml( level+1, sectionizer, REQUEST, deep)
1354     
1355      # Return <html>.
1356      return html
1357
1358
1359    ############################################################################
1360    ###
1361    ###  XML-Builder
1362    ###
1363    ############################################################################
1364
1365    ############################################################################
1366    # ZMSObject.xmlOnStartElement(self, dTagName, dAttrs, oCurrNodes, oRoot):
1367    # ZMSObject.xmlOnCharacterData(self, data, bInCData):
1368    # ZMSObject.xmlOnEndElement(self):
1369    # ZMSObject.xmlOnUnknownStartTag(self, sTagName, dTagAttrs)
1370    # ZMSObject.xmlOnUnknownEndTag(self, sTagName)
1371    # ZMSObject.xmlGetTagName(self):
1372    # ZMSObject.xmlGetParent(self):
1373    #
1374    # handler for XML-Builder (_builder.py)
1375    ############################################################################
1376    def xmlOnStartElement(self, sTagName, dTagAttrs, oParentNode, oRoot):
1377        _globals.writeLog( self, "[xmlOnStartElement]: sTagName=%s"%sTagName)
1378       
1379        self.dTagStack    = _globals.MyStack()
1380        self.dValueStack  = _globals.MyStack()
1381       
1382        # WORKAROUND! The member variable "aq_parent" does not contain the right
1383        # parent object at this stage of the creation process (it will later
1384        # on!). Therefore, we introduce a special attribute containing the
1385        # parent object, which will be used by xmlGetParent() (see below).
1386        self.oParent = oParentNode
1387
1388
1389    def xmlOnEndElement(self):
1390        self.initObjChildren( self.REQUEST)
1391
1392
1393    def xmlOnCharacterData(self, sData, bInCData):
1394        return _xmllib.xmlOnCharacterData(self,sData,bInCData)
1395
1396
1397    def xmlOnUnknownStartTag(self, sTagName, dTagAttrs):
1398        return _xmllib.xmlOnUnknownStartTag(self,sTagName,dTagAttrs)
1399
1400
1401    def xmlOnUnknownEndTag(self, sTagName):
1402        return _xmllib.xmlOnUnknownEndTag(self,sTagName)
1403
1404
1405    def xmlGetParent(self):
1406        return self.oParent
1407
1408
1409    def xmlGetTagName(self):
1410        return self.meta_id
1411
1412
1413# call this to initialize framework classes, which
1414# does the right thing with the security assertions.
1415Globals.InitializeClass(ZMSObject)
1416
1417################################################################################
Note: See TracBrowser for help on using the repository browser.