source: ZMS/trunk/zmslinkelement.py @ 1559

Revision 1559, 34.3 KB checked in by zmsdev, 11 months ago (diff)

added security-declarations for view-permission (2)

Line 
1################################################################################
2# zmslinkelement.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
22import Globals
23import sys
24import urllib
25# Product Imports.
26from zmscontainerobject import ZMSContainerObject
27from zmsobject import ZMSObject
28from zmsproxyobject import ZMSProxyObject
29import _globals
30import _zreferableitem
31
32
33# ------------------------------------------------------------------------------
34#  zmslinkelement.initZMSLinkElement:
35#
36#  Inits properties of ZMSLinkElement.
37# ------------------------------------------------------------------------------
38def initZMSLinkElement(oItem, REQUEST):
39  lang = REQUEST['lang']
40  ref_obj = oItem.getRefObj()
41  if ref_obj is None:
42    if len(_globals.nvl(oItem.getObjProperty('title',REQUEST),'')) == 0:
43      oItem.setObjProperty('title',oItem.getObjProperty('attr_ref',REQUEST),lang)
44
45
46# ------------------------------------------------------------------------------
47#  zmslinkelement.setZMSLinkElement:
48#
49#  Sets properties of ZMSLinkElement (from ZMSLinkContainer).
50# ------------------------------------------------------------------------------
51def setZMSLinkElement(oItem, title, url, description, REQUEST):
52  lang = REQUEST['lang']
53 
54  if title != oItem.getObjProperty('titlealt',REQUEST) or \
55     title != oItem.getObjProperty('title',REQUEST) or \
56     url != oItem.getObjProperty('attr_ref',REQUEST) or \
57     description != oItem.getObjProperty('attr_dc_description',REQUEST):
58   
59    type = 'new'
60    if _zreferableitem.isInternalLink(url):
61      type = 'replace'
62   
63    ##### Object State ####
64    oItem.setObjStateModified(REQUEST)
65   
66    ##### Set Metadata ####
67    oItem.setObjProperty('attr_dc_description',description,lang)
68   
69    ##### Set Properties ####
70    oItem.setObjProperty('titlealt',title,lang)
71    oItem.setObjProperty('title',title,lang)
72    oItem.setObjProperty('attr_ref',url,lang)
73    oItem.setObjProperty('attr_type',type,lang)
74    initZMSLinkElement(oItem,REQUEST)
75   
76    ##### VersionManager ####
77    oItem.onChangeObj(REQUEST)
78
79
80# ------------------------------------------------------------------------------
81#  zmslinkelement.addZMSLinkElement:
82#
83#  Adds ZMSLinkElement (to ZMSLinkContainer).
84# ------------------------------------------------------------------------------
85def addZMSLinkElement(self, title, url, description, REQUEST):
86  lang = REQUEST['lang']
87  type = 'new'
88  if _zreferableitem.isInternalLink(url):
89    type = 'replace'
90 
91  ##### Create ####
92  id_prefix = _globals.id_prefix(REQUEST.get('id_prefix','e'))
93  new_id = self.getNewId(id_prefix)
94  obj = ZMSLinkElement(new_id)
95  self._setObject(obj.id, obj)
96 
97  obj = getattr(self,obj.id)
98 
99  ##### Object State ####
100  obj.setObjStateNew(REQUEST)
101 
102  ##### Init Metadata (Important: DC.Coverage!) ####
103  obj.setObjProperty("attr_dc_coverage","local."+lang,lang)
104  obj.setObjProperty("attr_dc_description",description,lang)
105 
106  ##### Init Properties ####
107  obj.setObjProperty("titlealt",title,lang)
108  obj.setObjProperty("title",title,lang)
109  obj.setObjProperty("active",1,lang)
110  obj.setObjProperty("attr_ref",url,lang)
111  obj.setObjProperty("attr_type",type,lang)
112  initZMSLinkElement(obj,REQUEST)
113 
114  ##### VersionManager ####
115  obj.onChangeObj(REQUEST)
116 
117  ##### Normalize Sort-IDs ####
118  self.normalizeSortIds(id_prefix)
119 
120  return obj
121
122
123"""
124################################################################################
125# class ConstraintViolation(Exception):
126#
127# General exception class to indicate constraint violations.
128################################################################################
129"""
130class ConstraintViolation(Exception): pass
131
132
133################################################################################
134################################################################################
135###
136###  Constructor
137###
138################################################################################
139################################################################################
140manage_addZMSLinkElementForm = HTMLFile('manage_addzmslinkelementform', globals())
141def manage_addZMSLinkElement(self, lang, _sort_id, REQUEST, RESPONSE):
142  """ manage_addZMSLinkElement """
143  meta_id = 'ZMSLinkElement'
144 
145  if REQUEST['btn'] == self.getZMILangStr('BTN_INSERT'):
146   
147    ##### Create ####
148    id_prefix = _globals.id_prefix(REQUEST.get('id_prefix','e'))
149    new_id = self.getNewId(id_prefix)
150    obj = ZMSLinkElement(new_id,_sort_id+1)
151    self._setObject(obj.id, obj)
152   
153    redirect_self = bool( REQUEST.get('redirect_self',0)) or REQUEST.get('btn','') == ''
154    for attr in self.getMetaobj(meta_id)['attrs']:
155      attr_type = attr['type']
156      redirect_self = redirect_self or attr_type in self.getMetaobjIds()+['*']
157    redirect_self = redirect_self and not REQUEST.get('btn','') in  [ self.getZMILangStr('BTN_CANCEL'), self.getZMILangStr('BTN_BACK')]
158   
159    obj = getattr(self,obj.id)
160    ##### Object State ####
161    obj.setObjStateNew(REQUEST)
162    ##### Init Coverage ####
163    obj.setReqProperty('attr_dc_coverage',REQUEST)
164    ##### Init Properties ####
165    obj.manage_changeProperties(lang,REQUEST,RESPONSE)
166    initZMSLinkElement(obj,REQUEST)
167   
168    ##### VersionManager ####
169    obj.onChangeObj(REQUEST)
170   
171    # Return with message.
172    message = self.getZMILangStr('MSG_INSERTED')%obj.display_type(REQUEST)
173    if redirect_self:
174      RESPONSE.redirect('%s/%s/manage_main?lang=%s&manage_tabs_message=%s'%(self.absolute_url(),obj.id,lang,urllib.quote(message)))
175    else:
176      RESPONSE.redirect('%s/manage_main?lang=%s&manage_tabs_message=%s#_%s'%(self.absolute_url(),lang,urllib.quote(message),obj.id))
177 
178  else:
179    RESPONSE.redirect('%s/manage_main?lang=%s'%(self.absolute_url(),lang))
180
181
182################################################################################
183################################################################################
184###
185###  Class
186###
187################################################################################
188################################################################################
189class ZMSLinkElement(ZMSContainerObject):
190
191    # Create a SecurityInfo for this class. We will use this
192    # in the rest of our class definition to make security
193    # assertions.
194    security = ClassSecurityInfo()
195
196    # Properties.
197    # -----------
198    meta_type = meta_id = "ZMSLinkElement"
199
200    # Management Options.
201    # -------------------
202    manage_options = (
203    {'label': 'TAB_EDIT',    'action': 'manage_main'},
204    {'label': 'TAB_HISTORY', 'action': 'manage_UndoVersionForm'},
205    {'label': 'TAB_PREVIEW', 'action': 'preview_html'}, # empty string defaults to index_html
206    )
207
208    # Management Permissions.
209    # -----------------------
210    __authorPermissions__ = (
211        'manage','manage_main','manage_main_iframe','manage_workspace',
212        'manage_changeProperties','manage_changeTempBlobjProperty',
213        'manage_moveObjUp','manage_moveObjDown','manage_moveObjToPos',
214        'manage_cutObjects','manage_copyObjects','manage_pasteObjs',
215        'manage_ajaxDragDrop','manage_ajaxZMIActions',
216        'manage_userForm','manage_user',
217        )
218    __ac_permissions__=(
219        ('ZMS Author', __authorPermissions__),
220        )
221
222    # Management Interface.
223    # ---------------------
224    manage_main = HTMLFile('dtml/ZMSObject/manage_main', globals())
225
226
227    ############################################################################
228    #
229    #   Constructor
230    #
231    ############################################################################
232
233    # --------------------------------------------------------------------------
234    #  ZMSLinkElement.getSelf:
235    # --------------------------------------------------------------------------
236    def getSelfPROXY(self, proxy, meta_type=None):
237      return ZMSObject.getSelf( proxy, meta_type)
238
239    def getSelf(self, meta_type=None):
240      proxy = self.getProxy()
241      rtn = self.getSelfPROXY( proxy, meta_type)
242      return rtn
243
244
245    # --------------------------------------------------------------------------
246    #  ZMSLinkElement.getEmbedType:
247    # --------------------------------------------------------------------------
248    def getEmbedType(self):
249      embed_type = self.getObjAttrValue( self.getObjAttr( 'attr_type'), self.REQUEST)
250      if embed_type in [ 'embed', 'recursive', 'remote']:
251        ref_obj = self.getRefObj()
252        if ref_obj is not None and ref_obj.isAnchestor( self):
253          embed_type = 'cyclic' # Error!
254      return embed_type
255
256
257    # --------------------------------------------------------------------------
258    #  ZMSLinkElement.isEmbedded:
259    # --------------------------------------------------------------------------
260    def isEmbedded(self, REQUEST):
261      rtn = self.getEmbedType() in [ 'embed', 'recursive', 'remote']
262      return rtn
263
264
265    # --------------------------------------------------------------------------
266    #  ZMSLinkElement.isEmbeddedRecursive:
267    # --------------------------------------------------------------------------
268    def isEmbeddedRecursive(self, REQUEST):
269      rtn = self.getEmbedType() in [ 'recursive']
270      return rtn
271
272
273    ############################################################################
274    ###
275    ###   Properties
276    ###
277    ############################################################################
278
279    ############################################################################
280    #  ZMSLinkElement.manage_changeProperties:
281    #
282    #  Change Linkelement properties.
283    ############################################################################
284    def manage_changeProperties(self, lang, REQUEST, RESPONSE):
285      """ ZMSLinkElement.manage_changeProperties """
286     
287      target = REQUEST.get( 'manage_target', '%s/manage_main'%self.getParentNode().absolute_url())
288      message = ''
289      if REQUEST.get('btn','') not in  [ self.getZMILangStr('BTN_CANCEL'), self.getZMILangStr('BTN_BACK')]:
290        try:
291         
292          ##### Object State ####
293          self.setObjStateModified(REQUEST)
294         
295          ##### Properties ####
296          for key in self.getObjAttrs().keys():
297            obj_attr = self.getObjAttr(key)
298            if obj_attr['xml']:
299              self.setReqProperty(key,REQUEST)
300         
301          ##### VersionManager ####
302          self.onChangeObj(REQUEST)
303         
304          ##### Success Message ####
305          message = self.getZMILangStr('MSG_CHANGED')
306       
307        ##### Failure Message ####
308        except ConstraintViolation:
309          target = REQUEST.get( 'manage_target', '%s/manage_main'%self.absolute_url())
310          message = "[ConstraintViolation]: " + str( sys.exc_value)
311     
312      # Return with message.
313      target = self.url_append_params( target, { 'lang': lang, 'manage_tabs_message': message})
314      target = '%s#_%s'%( target, self.id)
315      return RESPONSE.redirect( target)
316
317
318    # --------------------------------------------------------------------------
319    #  ZMSLinkElement.getRef:
320    # --------------------------------------------------------------------------
321    def getRef(self):
322      coverage = self.getDCCoverage()
323      req = {'preview':'preview','lang':coverage[coverage.find('.')+1:]}
324      ref = self.getObjAttrValue( self.getObjAttr( 'attr_ref'), req)
325      return ref
326
327
328    # --------------------------------------------------------------------------
329    #  ZMSLinkElement.getRefObj:
330    # --------------------------------------------------------------------------
331    def getRefObj(self):
332      coverage = self.getDCCoverage()
333      req = {'preview':'preview','lang':coverage[coverage.find('.')+1:]}
334      ref_obj = self.getLinkObj( self.getRef(), req)
335      if ref_obj == self:
336        ref_obj = None
337      if ref_obj is not None and ref_obj.meta_type == 'ZMSLinkElement':
338        ref_obj = ref_obj.getRefObj()
339      return ref_obj
340
341
342    # --------------------------------------------------------------------------
343    #  ZMSLinkElement.getRemoteObj:
344    # --------------------------------------------------------------------------
345    def getRemoteObj(self):
346     
347      REQUEST = self.REQUEST
348      lang = REQUEST['lang']
349      #-- [ReqBuff]: Fetch buffered value from Http-Request.
350      reqBuffId = 'getRemoteObj'
351      try:
352        value = self.fetchReqBuff( reqBuffId, REQUEST)
353        return value
354      except:
355        value = None
356        ref = self.getRef()
357        try:
358          value = self.http_import( ref + '/ajaxGetNode?lang=%s'%lang)
359          value = self.xmlParse( value)
360        except:
361          _globals.writeError(self,'[getRemoteObj]: can\'t embed from remote: ref=%s'%ref)
362        #-- [ReqBuff]: Returns value and stores it in buffer of Http-Request.
363        return self.storeReqBuff( reqBuffId, value, REQUEST)
364
365
366    # --------------------------------------------------------------------------
367    #  ZMSLinkElement.isMetaType:
368    # --------------------------------------------------------------------------
369    def isMetaTypePROXY(self, proxy, meta_type, REQUEST={'preview':'preview'}):
370      if proxy != self and proxy is not None and self.isEmbeddedRecursive( self.REQUEST):
371        b = proxy.isMetaType( meta_type, REQUEST)
372      else:
373        b = False
374        if not (self.NOREF == meta_type or (type(meta_type) is list and self.NOREF in meta_type)):
375          b = b or ZMSObject.isMetaType(self,meta_type,REQUEST)
376          ref_obj = self.getRefObj()
377          if ref_obj is not None and self.isEmbedded(REQUEST):
378            if not (self.NORESOLVEREF == meta_type or (type(meta_type) is list and self.NORESOLVEREF in meta_type)):
379              b = b or ref_obj.isMetaType(meta_type,REQUEST)
380      return b
381
382    def isMetaType(self, meta_type, REQUEST={'preview':'preview'}):
383      proxy = self.getProxy()
384      rtn = self.isMetaTypePROXY( proxy, meta_type, REQUEST)
385      return rtn
386
387
388    # --------------------------------------------------------------------------
389    #  ZMSLinkElement.getLevel:
390    # --------------------------------------------------------------------------
391    def getLevelPROXY(self, proxy):
392      if proxy != self and proxy is not None and self.isEmbeddedRecursive( self.REQUEST):
393        rtn = proxy.getLevel()
394      else:
395        rtn = self.getParentNode().getLevel() + 1
396      return rtn
397
398    def getLevel(self):
399      proxy = self.getProxy()
400      rtn = self.getLevelPROXY( proxy)
401      return rtn
402
403
404    # --------------------------------------------------------------------------
405    #  ZMSLinkElement.getParentNode:
406    # --------------------------------------------------------------------------
407    def getParentNodePROXY(self, proxy):
408      if proxy != self and proxy is not None and self.isEmbeddedRecursive( self.REQUEST):
409        rtn = proxy.getParentNode()
410      else:
411        rtn = getattr( self, 'aq_parent', getattr( self, 'base', None))
412      return rtn
413
414    getParentNode__roles__ = None
415    def getParentNode(self):
416      """
417      The parent of this node.
418      All nodes except root may have a parent.
419      """
420      proxy = self.getProxy()
421      rtn = self.getParentNodePROXY( proxy)
422      return rtn
423
424
425    # --------------------------------------------------------------------------
426    #  ZMSLinkElement.getTitlealt:
427    # --------------------------------------------------------------------------
428    def getTitlealtPROXY(self, proxy, REQUEST):
429      if proxy != self and proxy is not None and self.isEmbeddedRecursive( REQUEST):
430        rtn = proxy.getTitlealt( REQUEST)
431      else:
432        rtn = self.getObjProperty('titlealt',REQUEST)
433        if len(rtn) == 0:
434          ref_obj = self.getRefObj()
435          if ref_obj is None:
436            rtn = super(ZMSLinkElement,self).getTitlealt(REQUEST)
437          else:
438            rtn = ref_obj.getTitlealt(REQUEST)
439      return rtn
440
441    def getTitlealt(self, REQUEST):
442      rtn = ''
443      if self.getEmbedType() == 'remote':
444        remote_obj = self.getRemoteObj()
445        if type( remote_obj) is list:
446          for node in self.xmlNodeSet( remote_obj, 'titlealt'):
447            rtn = node['cdata']
448      else:
449        proxy = self.getProxy()
450        rtn = self.getTitlealtPROXY( proxy, REQUEST)
451      if len(rtn) == 0:
452        rtn = self.display_type(REQUEST)
453      return rtn
454
455
456    # --------------------------------------------------------------------------
457    #  ZMSLinkElement.getTitle:
458    # --------------------------------------------------------------------------
459    def getTitlePROXY(self, proxy, REQUEST):
460      if proxy != self and proxy is not None and self.isEmbeddedRecursive( REQUEST):
461        rtn = proxy.getTitle( REQUEST)
462      else:
463        rtn = self.getObjProperty('title',REQUEST)
464        if len(rtn) == 0:
465          ref_obj = self.getRefObj()
466          if ref_obj is None:
467            rtn = super(ZMSLinkElement,self).getTitle(REQUEST)
468          else:
469            rtn = ref_obj.getTitle(REQUEST)
470      return rtn
471
472    def getTitle(self, REQUEST):
473      rtn = ''
474      if self.getEmbedType() == 'remote':
475        remote_obj = self.getRemoteObj()
476        if type( remote_obj) is list:
477          for node in self.xmlNodeSet( remote_obj, 'title'):
478            rtn = node['cdata']
479      else:
480        proxy = self.getProxy()
481        rtn = self.getTitlePROXY( proxy, REQUEST)
482      if len(rtn) == 0:
483        rtn = self.display_type(REQUEST)
484      return rtn
485
486
487    # --------------------------------------------------------------------------
488    #  ZMSLinkElement.display_icon:
489    # --------------------------------------------------------------------------
490    def display_icon(self, REQUEST, meta_type=None, key='icon'):
491      ref_obj = self.getRefObj()
492      if ref_obj is None or not self.isEmbedded(REQUEST):
493        ref_obj = self
494      if meta_type is None:
495        if self.isActive(REQUEST):
496          return ZMSObject.display_icon(ref_obj,REQUEST,key=key)
497        else:
498          return ZMSObject.display_icon(ref_obj,REQUEST,key='icon_disabled')
499      else:
500        return ZMSObject.display_icon(ref_obj,REQUEST,meta_type,key)
501
502
503    # --------------------------------------------------------------------------
504    #  ZMSLinkElement.isActive:
505    # --------------------------------------------------------------------------
506    def isActive(self, REQUEST):
507      active = super(ZMSLinkElement,self).isActive(REQUEST)
508      if self.getEmbedType() == 'remote':
509        remote_obj = self.getRemoteObj()
510        if type( remote_obj) is list:
511          rtnVal = remote_obj[1]['attrs']['active'] in ['1','True']
512      else:
513        ref_obj = self.getRefObj()
514        if ref_obj is not None:
515            active = active and ref_obj.isActive(REQUEST)
516      return active
517
518
519    # --------------------------------------------------------------------------
520    #  ZMSLinkElement.isPage
521    # --------------------------------------------------------------------------
522    def isPage(self):
523      rtnVal = False
524      if self.getEmbedType() == 'remote':
525        remote_obj = self.getRemoteObj()
526        if type( remote_obj) is list:
527          rtnVal = remote_obj[1]['attrs']['is_page'] in ['1','True']
528      else:
529        if self.isEmbedded( self.REQUEST):
530          ref_obj = self.getRefObj()
531          if ref_obj is not None:
532            rtnVal = rtnVal or ref_obj.isPage()
533      return rtnVal
534
535
536    # --------------------------------------------------------------------------
537    #  ZMSLinkElement.isPageElement
538    # --------------------------------------------------------------------------
539    def isPageElement(self):
540      rtnVal = False
541      if self.getEmbedType() == 'remote':
542        remote_obj = self.getRemoteObj()
543        if type( remote_obj) is list:
544          rtnVal = remote_obj[1]['attrs']['is_pageelement'] in ['1','True']
545      else:
546        if self.isEmbedded( self.REQUEST):
547          ref_obj = self.getRefObj()
548          if ref_obj is not None:
549            rtnVal = rtnVal or ref_obj.isPageElement()
550          else:
551            rtnVal = rtnVal or True
552        elif self.getObjProperty('align',self.REQUEST) not in ['','NONE']:
553          rtnVal = rtnVal or True
554      return rtnVal
555
556
557    # --------------------------------------------------------------------------
558    #  ZMSLinkElement.getType
559    #
560    #  Overrides getType of zmscustom.ZMSCustom.
561    # --------------------------------------------------------------------------
562    def getTypePROXY(self, proxy):
563      rtn = 'ZMSObject'
564      if proxy != self and proxy is not None and self.isEmbeddedRecursive( self.REQUEST):
565        rtn = proxy.getType()
566      else:
567        ref_obj = self.getRefObj()
568        if ref_obj is not None:
569           rtn = ref_obj.getType()
570      return rtn
571   
572    def getType(self):
573      proxy = self.getProxy()
574      rtn = self.getTypePROXY( proxy)
575      return rtn
576
577
578    # --------------------------------------------------------------------------
579    #  ZMSLinkElement.getObjProperty
580    #
581    #  Overrides getObjProperty of _objattrs.ObjAttrs.
582    # --------------------------------------------------------------------------
583    def getObjPropertyPROXY(self, proxy, key, REQUEST={}, default=None):
584      obj_attr = proxy.getObjAttr( key)
585      value = proxy.getObjAttrValue( obj_attr, REQUEST)
586      return value
587
588    def getObjProperty(self, key, REQUEST={}, default=None):
589      value = self.getObjPropertyPROXY( self, key, REQUEST, default)
590      # First exit...
591      if (value is None or len(str(value)) == 0 or (value == 0 and not type(value) is bool)) and \
592        key in self.getMetaobjAttrIds( self.meta_id):
593        value = ZMSObject.getObjProperty( self, key, REQUEST, default)
594      # Second exit...
595      if (value is None or len(str(value)) == 0 or (value == 0 and not type(value) is bool)) and \
596        key not in ['attr_ref','attr_dc_coverage','work_dt','work_uid']:
597        recursive = self.isEmbeddedRecursive( REQUEST)
598        if recursive:
599          proxy = self.getProxy()
600          if proxy != self and proxy is not None:
601            value = self.getObjPropertyPROXY( proxy, key, REQUEST, default)
602        else:
603          ref_obj = self.getRefObj()
604          if ref_obj != self and ref_obj is not None:
605            value = self.getObjPropertyPROXY( ref_obj, key, REQUEST, default)
606          # Last exit...
607          if (value is None or len(str(value)) == 0 or (value == 0 and not type(value) is bool)):
608            value = ZMSObject.getObjProperty( self, key, REQUEST, default)
609      return value
610
611
612    # --------------------------------------------------------------------------
613    #  ZMSLinkElement.getNavItems:
614    #
615    #  Overrides getNavItems of zmscontainerobject.ZMSContainerObject.
616    # --------------------------------------------------------------------------
617    def getNavItemsPROXY(self, proxy, current, REQUEST, opt={}, depth=0):
618      rtn = []
619      recursive = self.isEmbeddedRecursive( REQUEST)
620      if proxy != self and proxy is not None and recursive:
621        rtn = proxy.getNavItems( current, REQUEST, opt, depth)
622      else:
623        ref_obj = self.getRefObj()
624        if isinstance(ref_obj,ZMSContainerObject):
625          rtn = super(ZMSLinkElement,self).getNavItems( current, REQUEST, opt, depth)
626      return rtn
627
628    def getNavItems(self, current, REQUEST, opt={}, depth=0):
629      proxy = self.getProxy()
630      rtn = self.getNavItemsPROXY( proxy, current, REQUEST, opt, depth)
631      return rtn
632
633
634    # --------------------------------------------------------------------------
635    #  ZMSLinkElement.getNavElements:
636    #
637    #  Overrides getNavElements of zmscontainerobject.ZMSContainerObject.
638    # --------------------------------------------------------------------------
639    def getNavElementsPROXY(self, proxy, REQUEST, expand_tree=1, current_child=None, subElements=[]):
640      rtn = []
641      recursive = self.isEmbeddedRecursive( REQUEST)
642      if proxy != self and proxy is not None and recursive:
643        rtn = proxy.getNavElements( REQUEST, expand_tree, current_child, subElements)
644      else:
645        ref_obj = self.getRefObj()
646        if isinstance(ref_obj,ZMSContainerObject):
647          rtn = super(ZMSLinkElement,self).getNavElements( REQUEST, expand_tree, current_child, subElements)
648      return rtn
649
650    def getNavElements(self, REQUEST, expand_tree=1, current_child=None, subElements=[]):
651      proxy = self.getProxy()
652      rtn = self.getNavElementsPROXY( proxy, REQUEST, expand_tree, current_child, subElements)
653      return rtn
654
655
656    ############################################################################
657    ###
658    ###  HTML-Presentation
659    ###
660    ############################################################################
661
662    # --------------------------------------------------------------------------
663    #  ZMSLinkElement.getHref2IndexHtml:
664    # --------------------------------------------------------------------------
665    def getHref2IndexHtmlPROXY(self, proxy, REQUEST, deep=1):
666      if proxy != self and proxy is not None and self.isEmbeddedRecursive( self.REQUEST):
667        rtn = proxy.getHref2IndexHtml( REQUEST, deep)
668      else:
669        rtn = ZMSObject.getHref2IndexHtml( proxy, REQUEST, deep)
670      return rtn
671   
672    def getHref2IndexHtml(self, REQUEST, deep=1):
673      proxy = self.getProxy()
674      rtn = self.getHref2IndexHtmlPROXY( proxy, REQUEST, deep)
675      return rtn
676
677
678    # --------------------------------------------------------------------------
679    #  ZMSLinkElement._getBodyContent:
680    #
681    #  HTML presentation of link-element.
682    # --------------------------------------------------------------------------
683    def _getBodyContent(self, REQUEST):
684      rtn = ''
685      if self.getEmbedType() == 'remote':
686        ref = self.getObjProperty('attr_ref',REQUEST)
687        try:
688          rtn += self.http_import( ref+'/getBodyContent')
689        except:
690          rtn += _globals.writeError(self,'[_getBodyContent]: can\'t embed from remote: ref=%s'%ref)
691      else:
692        proxy = self.getProxy()
693        if proxy != self and proxy is not None and self.isEmbeddedRecursive( self.REQUEST):
694          rtn += proxy._getBodyContent(REQUEST)
695        elif proxy == self and proxy is not None and self.isEmbedded( REQUEST):
696          ref_obj = self.getRefObj()
697          if ref_obj is None:
698            ref = self.getObjProperty('attr_ref',REQUEST)
699            ref_obj = self.getLinkObj(ref)
700          if ref_obj is not None:
701            rtn += ref_obj._getBodyContent( REQUEST)
702        else:
703          rtn += self._getBodyContent2( REQUEST)
704      return rtn
705
706
707    # --------------------------------------------------------------------------
708    #  ZMSLinkElement.renderShort:
709    # --------------------------------------------------------------------------
710    security.declareProtected('View', 'renderShort')
711    def renderShort(self, REQUEST):
712      """
713      Renders short presentation of link-element.
714      """
715      rtn = ''
716      ref_obj = self.getRefObj()
717      ref = self.getObjProperty('attr_ref',REQUEST)
718     
719      if self.getEmbedType() == 'remote':
720        try:
721          rtn += self.http_import( ref+'/renderShort')
722        except:
723          rtn += _globals.writeError(self,'[renderShort]: can\'t embed from remote: ref=%s'%ref)
724     
725      elif self.isEmbedded(REQUEST):
726        if ref_obj is None:
727          ref_obj = self.getLinkObj(ref)
728        if ref_obj is None or ref_obj.isPage():
729          rtn += super(ZMSLinkElement,self).renderShort(REQUEST)
730        else:
731          rtn += ref_obj.renderShort(REQUEST)
732     
733      else:
734          rtn += self._getBodyContent( REQUEST)
735     
736      return rtn
737
738
739    # --------------------------------------------------------------------------
740    #  ZMSLinkElement.catalogText:
741    #
742    #  Catalog text of Link (overwrite method from ZCatalogItem).
743    # --------------------------------------------------------------------------
744    def catalogText(self, REQUEST):
745      s = ''
746      ref_obj = self.getRefObj()
747      if ref_obj is not None and self.isEmbedded(REQUEST):
748        s = ZMSObject.catalogText(ref_obj,REQUEST)
749      else:
750        s = ZMSObject.catalogText(self,REQUEST)
751      return s
752
753
754    ############################################################################
755    ###
756    ###  DOM-Methods
757    ###
758    ############################################################################
759
760    # --------------------------------------------------------------------------
761    #  ZMSLinkElement.breadcrumbs_obj_path:
762    # --------------------------------------------------------------------------
763    def breadcrumbs_obj_pathPROXY(self, proxy, portalMaster=True):
764      if proxy != self and proxy is not None and self.isEmbeddedRecursive( self.REQUEST):
765        rtn = proxy.breadcrumbs_obj_path()
766      else:
767        rtn = ZMSObject.breadcrumbs_obj_path( proxy, portalMaster)
768      return rtn
769   
770    def breadcrumbs_obj_path(self, portalMaster=True):
771      proxy = self.getProxy()
772      rtn = self.breadcrumbs_obj_pathPROXY( proxy, portalMaster)
773      return rtn
774
775
776    # --------------------------------------------------------------------------
777    #  ZMSLinkElement.getTreeNodes:
778    #
779    #  Returns an empty NodeList that contains all children of this subtree in
780    #  correct order. If none, this is a empty NodeList.
781    # --------------------------------------------------------------------------
782    def getTreeNodes(self, REQUEST={}, meta_types=None):
783      return []
784
785
786    # --------------------------------------------------------------------------
787    #  ZMSLinkElement.initProxy:
788    # --------------------------------------------------------------------------
789    def initProxy(self, base, url_base, proxy, recursive=False):
790      return ZMSProxyObject( self, base, url_base, proxy.id, proxy, recursive)
791
792
793    # --------------------------------------------------------------------------
794    #  ZMSLinkElement.__proxy__:
795    #
796    #  Returns self or referenced object (if embedded) as ZMSProxyObject
797    # --------------------------------------------------------------------------
798    def __proxy__(self):
799      rtn = self
800      req = self.REQUEST
801      if req.get( 'ZMS_PROXY', True):
802        if req.get( 'URL', '').find( '/manage') < 0 or req.get( 'ZMS_PATH_HANDLER', False):
803          if self.isEmbeddedRecursive( req):
804            ref_obj = self.getRefObj()
805            if ref_obj is not None:
806              recursive = True
807              rtn = ZMSProxyObject( self, self.aq_parent, self.absolute_url(), self.id, ref_obj, recursive)
808      return rtn
809
810
811    # --------------------------------------------------------------------------
812    #  ZMSLinkElement.getProxy:
813    #
814    #  Returns self or proxy-object from Path-Handler (if embedded) as
815    #  ZMSProxyObject.
816    # --------------------------------------------------------------------------
817    def getProxy(self):
818      rtn = self
819      req = self.REQUEST
820      if req.get( 'ZMS_PROXY', True):
821        rtn = req.get( 'ZMS_PROXY_%s'%self.id, self.__proxy__())
822      return rtn
823
824
825    # --------------------------------------------------------------------------
826    #  ZMSLinkElement.getChildNodes:
827    #
828    #  Overrides original method of zmscontainerobject.ZMSContainerObject.
829    # --------------------------------------------------------------------------
830    def getChildNodesPROXY(self, proxy, REQUEST={}, meta_types=None, reid=None):
831      rtn = []
832      if proxy != self and proxy is not None and self.isEmbeddedRecursive( REQUEST):
833        recursive = True
834        rtn = map( lambda x: self.initProxy( proxy, proxy.absolute_url()+'/'+x.id, x, recursive), proxy.getChildNodes( REQUEST, meta_types, reid))
835      elif proxy == self and proxy is not None and self.isEmbedded( REQUEST):
836        ref_obj = self.getRefObj()
837        if ref_obj is not None:
838          for ob in ref_obj.getChildNodes( REQUEST, meta_types, reid):
839            if not ob.isPage():
840              rtn.append( ob)
841      return rtn
842
843    def getChildNodes(self, REQUEST={}, meta_types=None, reid=None):
844      proxy = self.getProxy()
845      rtn = self.getChildNodesPROXY( proxy, REQUEST, meta_types, reid)
846      return rtn
847
848
849    ############################################################################
850    ###
851    ###  Printable
852    ###
853    ############################################################################
854
855    # --------------------------------------------------------------------------
856    #  ZMSLinkElement.printHtml:
857    #
858    #  Renders print presentation of a ContainerObject.
859    # --------------------------------------------------------------------------
860    def printHtmlPROXY(self, proxy, level, sectionizer, REQUEST, deep=True):
861      rtn = ''
862      recursive = self.isEmbeddedRecursive( REQUEST)
863      if proxy != self and proxy is not None and recursive:
864        rtn = proxy.printHtml( level, sectionizer, REQUEST, deep)
865      else:
866        ref_obj = self.getRefObj()
867        if ref_obj is not None:
868          rtn = ref_obj.printHtml( level, sectionizer, REQUEST, deep)
869      return rtn
870
871    def printHtml(self, level, sectionizer, REQUEST, deep=True):
872      proxy = self.getProxy()
873      rtn = self.printHtmlPROXY( proxy, level, sectionizer, REQUEST, deep)
874      return rtn
875
876
877# call this to initialize framework classes, which
878# does the right thing with the security assertions.
879Globals.InitializeClass(ZMSLinkElement)
880
881################################################################################
Note: See TracBrowser for help on using the repository browser.