source: ZMS/trunk/_zreferableitem.py @ 1856

Revision 1856, 28.0 KB checked in by zmsdev, 6 weeks ago (diff)

Ticket#40 (uni-bern): applied fix for link-correction (4)

Line 
1################################################################################
2# _zreferableitem.py
3#
4# This program is free software; you can redistribute it and/or
5# modify it under the terms of the GNU General Public License
6# as published by the Free Software Foundation; either version 2
7# of the License, or (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17################################################################################
18
19# Imports.
20from App.special_dtml import HTMLFile
21import copy
22import operator
23import time
24import urllib
25# Product Imports.
26import _globals
27import _objattrs
28
29# ------------------------------------------------------------------------------
30#  _zreferableitem.getMedlineLink:
31# ------------------------------------------------------------------------------
32def getMedlineLink(url):
33  try:
34    http_prefix = 'http://'
35    if url.find(http_prefix) == 0:
36      url = url[len(http_prefix):]
37    url = 'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids=%i&dopt=Abstract'%int(url)
38  except:
39    pass
40  return url
41
42# ------------------------------------------------------------------------------
43#  _zreferableitem.isMailLink:
44# ------------------------------------------------------------------------------
45def isMailLink(url):
46  rtn = type(url) is str and url.lower().find('mailto:') == 0
47  return rtn
48
49# ------------------------------------------------------------------------------
50#  _zreferableitem.isInternalLink:
51# ------------------------------------------------------------------------------
52def isInternalLink(url):
53  rtn = type(url) is str and url.startswith('{$') and url.endswith('}')
54  return rtn
55
56# ------------------------------------------------------------------------------
57#  _zreferableitem.absolute_home:
58# ------------------------------------------------------------------------------
59def absolute_home(ob):
60  path = list( ob.getHome().getPhysicalPath())[1:]
61  rtn = '/'.join( path)
62  return rtn
63
64
65################################################################################
66################################################################################
67###
68###   class ZReferableItem
69###
70################################################################################
71################################################################################
72class ZReferableItem:
73
74  # Management Permissions.
75  # -----------------------
76  __authorPermissions__ = (
77                'manage_RefForm', 'manage_browse_iframe',
78                )
79  __ac_permissions__=(
80                ('ZMS Author', __authorPermissions__),
81                )
82
83  # Management Interface.
84  # ---------------------
85  manage_RefForm = HTMLFile('dtml/ZMSLinkElement/manage_refform', globals())
86  manage_browse_iframe = HTMLFile('dtml/ZMSLinkElement/manage_browse_iframe', globals())
87
88
89  # ----------------------------------------------------------------------------
90  #  ZReferableItem.getRelativeUrl:
91  # ----------------------------------------------------------------------------
92  def getRelativeUrl(self, path, url, sep='/'):
93    ref = '.'
94    SERVER_URL = self.REQUEST['SERVER_URL']
95    currntPath = path
96    if currntPath.startswith(SERVER_URL):
97      currntPath = currntPath[len(SERVER_URL)+1:]
98    elif currntPath.startswith(sep):
99      currntPath = currntPath[1:]
100    targetPath = url;
101    if targetPath.startswith(SERVER_URL):
102      targetPath = targetPath[len(SERVER_URL)+1:]
103    elif targetPath.startswith(sep):
104      targetPath = targetPath[1:]
105    currntElmnts = currntPath.split(sep)
106    targetElmnts = targetPath.split(sep)
107    i = 0
108    while i < len( currntElmnts) and \
109          i < len( targetElmnts) and \
110          currntElmnts[ i] == targetElmnts[ i]:
111      i = i + 1
112    currntElmnts = currntElmnts[ i:]
113    targetElmnts = targetElmnts[ i:]
114    for currntElmnt in currntElmnts:
115      ref = ref + sep + '..'
116    for targetElmnt in targetElmnts:
117      ref = ref + sep + targetElmnt
118    return ref
119
120
121  # ----------------------------------------------------------------------------
122  #  ZReferableItem.getRelObjPath:
123  # ----------------------------------------------------------------------------
124  def getRelObjPath(self, ob):
125    ref = '.'
126    currntElmnts = self.getVersionContainer().getPhysicalPath()
127    targetElmnts = ob.getSelf( ).getPhysicalPath()
128    i = 0
129    while i < min(len( currntElmnts),len( targetElmnts)) and \
130          currntElmnts[ i] == targetElmnts[ i]:
131      i = i + 1
132    currntElmnts = currntElmnts[ i:]
133    targetElmnts = targetElmnts[ i:]
134    ref += ''.join(map(lambda x: '/..',currntElmnts))
135    ref += ''.join(map(lambda x: '/'+x,targetElmnts))
136    return ref
137
138
139  # ----------------------------------------------------------------------------
140  #  ZReferableItem.getRefObjPath:
141  # ----------------------------------------------------------------------------
142  def getRefObjPath(self, ob, anchor=''):
143    ref = ''
144    if ob is not None:
145      path = ob.relative_obj_path()
146      clientIds = absolute_home(ob).split('/')
147      thisIds = absolute_home(self).split('/')
148      if clientIds[-1] != thisIds[-1]:
149        if len(clientIds) <= len(thisIds):
150          path = clientIds[-1] + '@' + path
151        else:
152          while len(clientIds) > 0 and \
153                len(thisIds) > 0 and \
154                clientIds[0] == thisIds[0]:
155            del thisIds[0]
156            del clientIds[0]
157          s = ''
158          for clientId in clientIds:
159            if len(s) > 0: s = s + '/'
160            s += clientId
161          path = s + '@' + path
162      ref = '{$' + path + anchor + '}'
163    return ref
164
165
166  """
167  ##############################################################################
168  ### 
169  ###  Links FROM other objects.
170  ###
171  ##############################################################################
172  """
173
174  # ----------------------------------------------------------------------------
175  #  ZReferableItem.getRefByObjs:
176  #
177  #  Returns references BY other objects.
178  # ----------------------------------------------------------------------------
179  def getRefByObjs(self, REQUEST={}):
180    ref_by = []
181    key = 'ref_by'
182    if key in self.__dict__.keys():
183      ref_by = getattr(self,key,[])
184      ref_by = list(set(ref_by))
185    return ref_by
186
187
188  # ----------------------------------------------------------------------------
189  #  ZReferableItem.delRefByObjs:
190  #
191  #  Deletes references BY other objects.
192  # ----------------------------------------------------------------------------
193  def delRefByObjs(self, ids=[]):
194    key = 'ref_by'
195    v = getattr(self,key,[])
196    ref_by = []
197    for i in v:
198      l = i
199      l = l[2:-1]
200      l = l.split('/')
201      b = len(filter(lambda x: x in l, ids)) > 0
202      if not b:
203        ref_by.append(i)
204    if len(ref_by) < len(v):
205      setattr(self,'ref_by',ref_by)
206
207
208  # ----------------------------------------------------------------------------
209  #  ZReferableItem.synchronizeRefByObjs:
210  #
211  #  Synchronizes references BY other objects.
212  # ----------------------------------------------------------------------------
213  def synchronizeRefByObjs(self, strict=1):
214    key = 'ref_by'
215    v = getattr(self,key,[])
216    ref_by = []
217    for i in v:
218      ob = self.getLinkObj(i)
219      if ob is not None and ob.meta_type.startswith('ZMS'):
220        has_ref = False
221        for key in ob.getObjAttrs().keys():
222          obj_attr = ob.getObjAttr( key)
223          if obj_attr['datatype_key'] in _globals.DT_STRINGS:
224            for lang in self.getLangIds():
225              req = {'lang':lang,'preview':'preview'}
226              obj_vers = ob.getObjVersion(req)
227              value = ob._getObjAttrValue(obj_attr,obj_vers,lang)
228              svalue = ob.str_item(value)
229              lvalue = []
230              for exp in ['"(.*?)/%s"','{\$%s}','{\$(.*?)/%s}']:
231                lvalue.extend( ob.re_search( exp%self.id, svalue))
232              if len(lvalue) > 0 and obj_attr['datatype_key'] == _globals.DT_URL:
233                has_ref = True
234                new_value = ob.getRefObjPath(self)
235                if value != new_value:
236                  _objattrs.setobjattr(self, obj_vers, obj_attr, new_value, lang)
237        if has_ref:
238          ob_path = self.getRefObjPath(ob)
239          if not ob_path in ref_by:
240            ref_by.append(ob_path)
241    ref_by = list(set(ref_by))
242    ref_by.sort()
243    if ref_by != v:
244      setattr(self,key,ref_by)
245
246
247  # ----------------------------------------------------------------------------
248  #  ZReferableItem.clearRegisteredRefObjs:
249  #
250  #  Clears registered referencing objects.
251  # ----------------------------------------------------------------------------
252  def clearRegisteredRefObjs(self, REQUEST):
253    ref_by = []
254    setattr(self,'ref_by',ref_by)
255
256   
257  # ----------------------------------------------------------------------------
258  #  ZReferableItem.registerRefObj:
259  #
260  #  Registers referencing object.
261  # ----------------------------------------------------------------------------
262  def registerRefObj(self, ob, REQUEST):
263    ref = self.getRefObjPath(ob)
264    _globals.writeLog( self, "[registerRefObj]: %s(%s) - add %s"%(ob.id,ob.meta_type,ref))
265    ref_by = self.getRefByObjs(REQUEST)
266    if not ref in ref_by:
267      ref_by.append(ref)
268    ##### Set Attribute ####
269    setattr(self,'ref_by',ref_by)
270
271
272  # ----------------------------------------------------------------------------
273  #  ZReferableItem.unregisterRefObj:
274  #
275  #  Unregisters referencing object.
276  # ----------------------------------------------------------------------------
277  def unregisterRefObj(self, ob, REQUEST):
278    _globals.writeLog( self, "[unregisterRefObj]: %s(%s)"%(ob.id,ob.meta_type))
279    ref_by = self.getRefByObjs(REQUEST)
280    ref_by = filter( lambda x: x[2:-1].split('/')[-1]!=ob.id,ref_by)
281    ##### Set Attribute ####
282    setattr(self,'ref_by',ref_by)
283
284
285  # ----------------------------------------------------------------------------
286  #  ZReferableItem.refreshRefObj:
287  #
288  #  Refreshs referencing object.
289  # ----------------------------------------------------------------------------
290  def refreshRefObj(self, ob, REQUEST):
291    _globals.writeLog( self, "[refreshRefObj]: %s(%s) -> %s(%s)"%(self.id,self.meta_type,ob.id,ob.meta_type))
292    self.unregisterRefObj(ob,REQUEST)
293    self.registerRefObj(ob,REQUEST)
294
295   
296  """
297  ##############################################################################
298  ### 
299  ###  References TO other objects.
300  ###
301  ##############################################################################
302  """
303
304  # ----------------------------------------------------------------------------
305  #  ZReferableItem.getRefToObjs:
306  #
307  #  Returns list of references TO other objects.
308  # ----------------------------------------------------------------------------
309  def getRefToObjs(self, REQUEST):
310    ref_to =  []
311    for key in self.getObjAttrs().keys():
312      obj_attr = self.getObjAttr(key)
313      datatype = obj_attr['datatype_key']
314      if datatype == _globals.DT_URL:
315        ref = self.getObjProperty(key,REQUEST)
316        if not ref in ref_to:
317          ref_to.append(ref)
318    return ref_to
319
320
321  # ----------------------------------------------------------------------------
322  #  ZReferableItem.synchronizeRefToObjs:
323  #
324  #  Synchronizes references TO other objects.
325  # ----------------------------------------------------------------------------
326  def synchronizeRefToObjs(self):
327    _globals.writeLog( self, '[synchronizeRefToObjs]')
328    for key in self.getObjAttrs().keys():
329      obj_attr = self.getObjAttr(key)
330      datatype = obj_attr['datatype_key']
331      if datatype == _globals.DT_URL:
332        for lang in self.getLangIds():
333          req = { 'lang':lang, 'preview':'preview'}
334          ref = self.getObjProperty(key,req)
335          ref_obj = self.getLinkObj(ref)
336          if ref_obj is not None:
337            ref_obj.refreshRefObj(self,req)
338
339
340  # ----------------------------------------------------------------------------
341  #  ZReferableItem.refreshRefToObj:
342  #
343  #  Refreshs reference TO given destination.
344  # ----------------------------------------------------------------------------
345  def refreshRefToObj(self, dest_obj, REQUEST):
346    _globals.writeLog( self, '[refreshRefToObj]: %s -> dest_obj=%s(%s)'%(self.id,dest_obj.absolute_url(),dest_obj.meta_type))
347    ref_to =  []
348    for key in self.getObjAttrs().keys():
349      obj_attr = self.getObjAttr(key)
350      datatype = obj_attr['datatype_key']
351      if datatype == _globals.DT_URL:
352        ref = self.getObjProperty(key,REQUEST)
353        ref_obj = self.getLinkObj(ref)
354        if ref_obj is not None:
355          if dest_obj.id == ref_obj.id:
356            ##### Set Property ####
357            dest_obj_path = self.getRefObjPath(dest_obj)
358            self.setObjProperty(key,dest_obj_path,REQUEST['lang'],1)
359
360
361  """
362  ##############################################################################
363  ### 
364  ###  Process Events
365  ###
366  ##############################################################################
367  """
368
369  # ----------------------------------------------------------------------------
370  #  ZReferableItem.onMoveRefObj:
371  #
372  #  This method is executed after an object has been moved.
373  # ----------------------------------------------------------------------------
374  def onMoveRefObj(self, REQUEST, deep=0):
375    _globals.writeLog( self, "[onMoveRefObj]")
376   
377    ##### Update references TO other objects ####
378    for ref in self.getRefToObjs(REQUEST):
379      ob = self.getLinkObj(ref)
380      if ob is not None:
381        ob.refreshRefObj(self,REQUEST)
382   
383    ##### Update references FROM other objects ####
384    for ref in self.getRefByObjs(REQUEST):
385      ob = self.getLinkObj(ref)
386      if ob is not None:
387        ob.refreshRefToObj(self,REQUEST)
388
389
390  # ----------------------------------------------------------------------------
391  #  ZReferableItem.onCopyRefObj:
392  #
393  #  This method is executed after an object has been copied.
394  # ----------------------------------------------------------------------------
395  def onCopyRefObj(self, REQUEST, deep=0):
396    _globals.writeLog( self, "[onCopyRefObj]")
397   
398    ##### Register copy in references TO other objects ####
399    for ref in self.getRefToObjs(REQUEST):
400      ob = self.getLinkObj(ref)
401      if ob is not None:
402        ob.registerRefObj(self,REQUEST)
403   
404    ##### Clear references FROM other objects ####
405    self.clearRegisteredRefObjs(REQUEST)
406
407
408  """
409  ##############################################################################
410  ### 
411  ###  Resolve Links
412  ###
413  ##############################################################################
414  """
415
416  # ----------------------------------------------------------------------------
417  #  ZReferableItem.validateLinkObj:
418  #
419  #  Validates internal links.
420  # ----------------------------------------------------------------------------
421  def validateLinkObj(self, url):
422    if url.startswith('{$') and not url.startswith('{$__'):
423      ref_obj = self.getLinkObj(url)
424      ref_anchor = ''
425      if url.find('#') > 0:
426        ref_anchor = url[url.find('#'):-1]
427      if ref_obj is not None:
428        # Repair link.
429        url = self.getRefObjPath( ref_obj, ref_anchor)
430      else:
431        # Broken link.
432        url = '{$__' + url[2:-1] + '__}'
433    return url
434
435
436  # ----------------------------------------------------------------------------
437  #  ZReferableItem.getLinkObj:
438  #
439  #  Resolves internal/external links and returns Object.
440  # ----------------------------------------------------------------------------
441  def getLinkObj(self, url, REQUEST={}):
442    ob = None
443    if isInternalLink(url):
444      if not url.startswith('{$__'):
445        docElmnt = None
446        path = url[2:-1]
447        i = path.find('#')
448        if i > 0:
449          path = path[:i]
450        i = path.find('@')
451        if i > 0:
452          clientIds = path[:i].split('/')
453          path = path[i+1:]
454          thisHome = self.getHome()
455          clientHome = None
456          if thisHome.aq_parent.id == clientIds[-1]:
457            clientHome = thisHome
458            for j in range(len(clientIds)):
459              if clientHome.aq_parent.id == clientIds[-(j+1)]:
460                clientHome = clientHome.aq_parent
461          elif hasattr(thisHome,clientIds[0]):
462            clientHome = thisHome
463            for j in range(len(clientIds)):
464              clientHome = getattr(clientHome,clientIds[j],None)
465          if clientHome is not None:
466            obs = clientHome.objectValues(['ZMS'])
467            if obs:
468              docElmnt = obs[0]
469        else:
470          docElmnt = self.getDocumentElement()
471        if docElmnt is not None:
472          ob = docElmnt.findObjId(path,REQUEST)
473    return ob
474
475
476  # ----------------------------------------------------------------------------
477  #  ZReferableItem.getLinkUrl:
478  #
479  #  Resolves internal/external links and returns URL.
480  # ----------------------------------------------------------------------------
481  def getLinkUrl( self, url, REQUEST=None):
482    REQUEST = _globals.nvl( REQUEST, self.REQUEST)
483    if isInternalLink(url):
484      ref_anchor = ''
485      if url.find('#') > 0:
486        ref_anchor = url[url.find('#'):-1]
487      ob = self.getLinkObj(url,REQUEST)
488      if ob is None:
489        index_html = './index_%s.html?op=not_found&url=%s'%(REQUEST.get('lang',self.getPrimaryLanguage()),url)
490      else:
491        index_html = ob.getObjProperty('getHref2IndexHtml',REQUEST)
492        if index_html == '':
493          index_html = ob.getHref2IndexHtml(REQUEST)
494      return index_html + ref_anchor
495    elif isMailLink (url):
496      prefix = 'mailto:'
497      return prefix + self.encrypt_ordtype(url[len(prefix):])
498    return url
499
500
501  # ----------------------------------------------------------------------------
502  #  ZReferableItem.getLinkHtml:
503  #
504  #  Resolves internal/external links and returns Html.
505  # ----------------------------------------------------------------------------
506  def getLinkHtml( self, url, html='<a href="%s">&raquo;</a>', REQUEST=None):
507    REQUEST = _globals.nvl( REQUEST, self.REQUEST)
508    s = ''
509    ob = self
510    while ob is not None:
511      if html in ob.getMetaobjIds( sort=0):
512        metaObj = ob.getMetaobj( html)
513        metaObjAttr = ob.getMetaobjAttr( metaObj['id'], 'getLinkHtml')
514        if type(metaObjAttr) is dict:
515          REQUEST.set( 'ref_id', url)
516          return self.dt_html( metaObjAttr['custom'], REQUEST)
517      ob = self.getPortalMaster()
518    ob = self.getLinkObj(url,REQUEST)
519    if ob is not None:
520      if ob.isActive(REQUEST) and \
521         ob.isVisible(REQUEST):
522        url = ob.getHref2IndexHtml(REQUEST)
523        s = html%url
524    return s
525
526
527  # ----------------------------------------------------------------------------
528  #  ZReferableItem.synchronizeRefs:
529  # 
530  #  @param
531  #  @return
532  # ----------------------------------------------------------------------------
533  def synchronizeRefs( self, ob_id=None, clients=False, unify_ids=False):
534    _globals.writeBlock(self,'[synchronizeRefs]')
535   
536    # Extend object-tree.
537    def extendObjectTree(home, home_path):
538      message = ''
539      if home not in homes:
540        homes.append( home)
541        home_ob = self
542        for home_id in home_path:
543          if home_ob is not None:
544            home_ob = getattr( home_ob, home_id, None)
545        if home_ob is not None:
546          t1 = time.time()
547          map( lambda x: operator.setitem(obs, x.base_url(), x), _globals.objectTree( home_ob))
548          message += '[INFO] Load object-tree for '+home+' (in '+str(int((time.time()-t1)*100.0)/100.0)+' secs.)<br/>'
549        else:
550          message += '[ERROR] Can\'t load object-tree for '+home+': not found!<br/>'
551        _globals.writeBlock(self,'[synchronizeRefs]: '+message)
552      return message
553   
554    # Handle internal references.
555    def handleInternalRefs(k,v):
556      message = ''
557      sp = '{$'
558      l = v.split(sp)
559      if len(l) > 1:
560        m = [l[0]]
561        for i in l[1:]:
562          ref = i[:i.find('}')]
563          if ref.startswith('__') and ref.endswith('__'):
564            ref = ref[2:-2]
565          if len( ref.split('@')) == 1:
566            home_path = [ob.getHome().id]
567            home = home_path[-1]
568          else:
569            home_path = ref.split('@')[0].split('/')
570            home = home_path[-1]
571          id = ref.split('@')[-1].split('/')[-1]
572          if len( id) == 0:
573            id = 'content'
574         
575          # Extend object-tree.
576          message += extendObjectTree(home, home_path)
577         
578          f = filter( lambda x: x.find('/%s/content'%home) >= 0 and x.endswith('/%s'%id), obs.keys())
579          if len( f) == 0:
580            ref = '__%s__'%ref
581          else:
582            if len( f) > 1:
583              if ref.find('@') > 0:
584                ref = ref[ ref.find('@')+1:]
585              g = filter( lambda x: x.find('/%s/content'%home) >= 0 and x.endswith('/%s'%ref), obs.keys())
586              if len( g) == 1:
587                f = g
588              else:
589                message += '[WARNING] %s: Ambigous reference ref=%s in f=%s'%(ob.absolute_url(),ref,str(f))
590            else:
591              target = obs[f[0]]
592              ref = ob.getRefObjPath( target)[2:-1]
593              if ob.version_live_id == obj_vers.id:
594                target_ref = target.getRefObjPath( ob)
595                target_ref_by = getattr( target, 'ref_by', [])
596                if target_ref not in target_ref_by:
597                  setattr( target, 'ref_by', target_ref_by + [ target_ref])
598          if ref.startswith('__') and ref.endswith('__'):
599            message += '<a href="%s/manage_main" target="_blank">%s(%s)%s=%s</a><br/>'%(ob.absolute_url(),ob.absolute_url(),ob.meta_type,k,ref)
600          m.append(ref+i[i.find('}'):])
601        v = sp.join(m)
602      return v, message
603   
604    # Handle relative references.
605    def handleRelativeRefs(k,v):
606      message = ''
607      for sp in ['href="./','src="./']:
608        l = v.split(sp)
609        if len(l) > 1:
610          m = [l[0]]
611          for i in l[1:]:
612            if i.find('"') > 0:
613              ref = i[:i.find('"')]
614              if ref.endswith('/'):
615                ref = ref[:-1]
616              decl_id = ref.split('/')[-1]
617              if getattr(ob.getHome(),decl_id,None) is None: # must not exist as Zope resource
618                filtered_did = filter(lambda x: x['decl_id']==decl_id,did)
619                if len(filtered_did) == 1: # simplest case: decl_id is unique!
620                  found = filtered_did[0]
621                  req = REQUEST={'lang':found['lang']}
622                  target_url = found['abs_url']
623                  target_ref = obs[target_url].getDeclUrl(REQUEST=req)
624                  ob_ref = ob.getSelf(ob.PAGES).getDeclUrl(REQUEST=req)
625                  ref = self.getRelativeUrl(ob_ref,target_ref)
626                  i = ref + i[i.find('"'):]
627            m.append(i)
628          v = sp.join(m)
629      return v, message
630   
631    # Initialize.
632    message = ''
633    t0 = time.time()
634    obs = {}
635    clients = clients or (not self.getPortalMaster() and not self.getPortalClients())
636   
637    # Initialize object-tree.
638    map( lambda x: operator.setitem(obs, x.base_url(), x), _globals.objectTree( self, clients))
639    homes = obs.keys()
640    homes = map( lambda x: x[:x.find('/content')], homes)
641    homes = map( lambda x: x[x.rfind('/')+1:], homes)
642    homes = dict.fromkeys(homes).keys()
643    message += 'Load object-tree ['+str(len(obs.keys()))+ '] for '+str(homes)+' (in '+str(int((time.time()-t0)*100.0)/100.0)+' secs.)<br/>'
644    _globals.writeBlock(self,'[synchronizeRefs]: '+message)
645   
646    abs_urls = obs.keys()
647    abs_urls.sort()
648   
649    did = []
650    if self.getConfProperty('ZMS.pathhandler',0) != 0:
651      for x in obs.keys():
652        ob = obs[x]
653        for lang in self.getLangIds():
654          did.append({'decl_id':ob.getDeclId(REQUEST={'lang':lang}),'lang':lang,'abs_url':x})
655   
656    # Unify object-ids.
657    if unify_ids:
658      did = {}
659      map( lambda x: operator.setitem( did, x.id, did.get(x.id,0)+1), obs.values())
660      for id in filter( lambda x: did.get(x) > 1 and x[-1] in ['0','1','2','3','4','5','6','7','8','9'], did.keys()):
661        prefix = None
662        keys = map( lambda x: (x.find('/content'),x), filter( lambda x: x.endswith('/'+id), obs.keys()))
663        keys.sort()
664        keys = map( lambda x: x[1], keys)
665        for key in keys:
666          ob = obs[key]
667          if prefix is None:
668            prefix = _globals.id_prefix( id)
669            message += '[INFO] %s: Keep unique object-id \'%s\'<br/>'%(key,id)
670          else:
671            new_id = self.getNewId(prefix)
672            try:
673              ob.getParentNode().manage_renameObject( id=id, new_id=new_id)
674              obs[ ob.base_url()] = ob
675              message += '[INFO] %s: Rename to unique object-id \'%s\'<br/>'%(key,new_id)
676            except:
677              message += _globals.writeError( ob, '%s: Can\'t rename to unique object-id \'%s\'<br/>'%(key,new_id))
678   
679    # Clear 'ref_by' (reference-by) attributes.
680    for x in filter( lambda x: hasattr( obs[x], 'ref_by'), abs_urls):
681      if clients or True:
682        try:
683          setattr( obs[x], 'ref_by', [])
684        except: pass
685      else:
686        try:
687          ref_by = getattr( obs[x], 'ref_by')
688          ref_by = filter( lambda x: x.find('@')<0, ref_by)
689          setattr( obs[x], 'ref_by', ref_by)
690        except: pass
691   
692    langs = self.getLangIds()
693    for abs_url in abs_urls:
694      ob = obs[ abs_url]
695     
696      # Process recordset.
697      if ob.meta_id!='ZMSLinkElement' and ob.getType()=='ZMSRecordSet':
698        key = ob.getMetaobjAttrIds(ob.meta_id)[0]
699        obj_attr = ob.getObjAttr(key)
700        for lang in langs:
701          for obj_vers in ob.getObjVersions():
702            v = _objattrs.getobjattr(ob,obj_vers,obj_attr,lang)
703            c = 0
704            for r in v:
705              for k in r.keys():
706                v = r[k]
707                o = v
708                if type(v) is str:
709                  v, m = handleInternalRefs('%s.%s[%i]'%(key,k,c),v)
710                  message += m
711                  v, m = handleRelativeRefs('%s.%s[%i]'%(key,k,c),v)
712                  message += m
713                  if v != o:
714                    r[k] = v
715              c += 1
716     
717      # Process object.
718      else:
719        for key in ob.getObjAttrs().keys():
720          obj_attr = ob.getObjAttr(key)
721          datatype = obj_attr['datatype_key']
722          if datatype in _globals.DT_STRINGS:
723            for lang in langs:
724              for obj_vers in ob.getObjVersions():
725                v = _objattrs.getobjattr(ob,obj_vers,obj_attr,lang)
726                o = v
727                if type(v) is str:
728                  v, m = handleInternalRefs(key,v)
729                  message += m
730                  v, m = handleRelativeRefs(key,v)
731                  message += m
732                  if v != o:
733                    _objattrs.setobjattr(ob,obj_vers,obj_attr,v,lang)
734   
735    message += ' (in '+str(int((time.time()-t0)*100.0)/100.0)+' secs.)'
736    _globals.writeBlock(self,'[synchronizeRefs]: '+message)
737   
738    # Return with desired object.
739    if ob_id is not None:
740      if type( ob_id) is str:
741        home = ob_id.split('@')[0]
742        id = ob_id.split('@')[1]
743        f = filter( lambda x: x.find('/%s/content'%home) > 0 and x.endswith('/%s'%id), abs_urls)
744        if len( f) > 0:
745          return obs[f[0]]
746      return None
747   
748    # Return with message.
749    else:
750      return message
751
752################################################################################
Note: See TracBrowser for help on using the repository browser.