| 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.
|
|---|
| 20 | from AccessControl import ClassSecurityInfo
|
|---|
| 21 | from App.special_dtml import HTMLFile
|
|---|
| 22 | from types import StringTypes
|
|---|
| 23 | import Globals
|
|---|
| 24 | import ZPublisher.HTTPRequest
|
|---|
| 25 | import urllib
|
|---|
| 26 | import string
|
|---|
| 27 | import time
|
|---|
| 28 | # Product Imports.
|
|---|
| 29 | import zmscontainerobject
|
|---|
| 30 | import ZMSItem
|
|---|
| 31 | import ZMSGlobals
|
|---|
| 32 | import ZMSWorkflowItem
|
|---|
| 33 | import _accessmanager
|
|---|
| 34 | import _blobfields
|
|---|
| 35 | import _cachemanager
|
|---|
| 36 | import _copysupport
|
|---|
| 37 | import _deprecatedapi
|
|---|
| 38 | import _exportable
|
|---|
| 39 | import _globals
|
|---|
| 40 | import _metacmdmanager
|
|---|
| 41 | import _multilangmanager
|
|---|
| 42 | import _objattrs
|
|---|
| 43 | import _objchildren
|
|---|
| 44 | import _objinputs
|
|---|
| 45 | import _objtypes
|
|---|
| 46 | import _pathhandler
|
|---|
| 47 | import _versionmanager
|
|---|
| 48 | import _xmllib
|
|---|
| 49 | import _textformatmanager
|
|---|
| 50 | import _zcatalogmanager
|
|---|
| 51 | import _zmsattributecontainer
|
|---|
| 52 | import _zreferableitem
|
|---|
| 53 |
|
|---|
| 54 | __all__= ['ZMSObject']
|
|---|
| 55 |
|
|---|
| 56 |
|
|---|
| 57 | ################################################################################
|
|---|
| 58 | ################################################################################
|
|---|
| 59 | ###
|
|---|
| 60 | ### Abstract Class ZMSObject
|
|---|
| 61 | ###
|
|---|
| 62 | ################################################################################
|
|---|
| 63 | ################################################################################
|
|---|
| 64 | class 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.
|
|---|
| 1415 | Globals.InitializeClass(ZMSObject)
|
|---|
| 1416 |
|
|---|
| 1417 | ################################################################################ |
|---|