1
2
3
4
5
6
7
8
9
10
11 __doc__="""PrimaryPathObjectManager
12
13 $Id: RelationshipBase.py,v 1.26 2003/10/03 16:16:01 edahl Exp $"""
14
15 __version__ = "$Revision: 1.26 $"[11:-2]
16
17 import logging
18 log = logging.getLogger("zen.PrimaryPathObjectManager")
19
20
21 from RelCopySupport import RelCopyContainer
22 from Acquisition import Implicit, aq_base
23 from OFS.ObjectManager import ObjectManager
24 from AccessControl.Role import RoleManager
25 import App.Undo
26
27 from ZItem import ZItem
28
29
30
31 from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2
32
33 _MARKER = object()
34
36
38 """
39 Return the primary path of this object by following __primary_parent__
40 """
41 ppath = []
42 obj = aq_base(self)
43 while True:
44 ppath.append(obj.id)
45 parent = getattr(obj, "__primary_parent__", None)
46 if parent is None: break
47 obj = parent
48 ppath.reverse()
49 basepath = getattr(obj, "zPrimaryBasePath", [])
50 for i in range(len(basepath)-1,-1,-1): ppath.insert(0,basepath[i])
51 try:
52 idx = ppath.index(fromNode)
53 ppath = ppath[idx+1:]
54 except ValueError: pass
55 return tuple(ppath)
56
57
59 """Return the primary path in the form /zport/dmd/xyz"""
60 pid = "/".join(self.getPrimaryPath(fromNode))
61 if fromNode: pid = "/" + pid
62 return pid
63
64
66 """Return the primary path as an absolute url"""
67 objaq = self.primaryAq()
68 if full: return objaq.absolute_url()
69 return objaq.absolute_url_path()
70
72 """Return self with is acquisition path set to primary path"""
73 parent = getattr(self, "__primary_parent__", _MARKER)
74 if parent is _MARKER:
75 base = self.getPhysicalRoot().zport
76 return aq_base(self).__of__(base)
77 if parent is None:
78 raise KeyError(self.id)
79 return aq_base(self).__of__(parent.primaryAq())
80
82 """Return our parent object by our primary path"""
83 return self.__primary_parent__.primaryAq()
84
85
86 -class PrimaryPathObjectManager(
87 RelCopyContainer,
88 ObjectManager,
89 PrimaryPathManager,
90 App.Undo.UndoSupport,
91 ):
92 """
93 PrimaryPathObjectManager with basic Zope persistent classes.
94 """
95 manage_options = (ObjectManager.manage_options +
96 RoleManager.manage_options +
97 ZItem.manage_options)
98
99 - def _setObject(self, id, obj, roles=None, user=None, set_owner=1):
100 """Track __primary_parent__ when we are set into an object"""
101 obj.__primary_parent__ = aq_base(self)
102 return ObjectManager._setObject(self, id, obj, roles, user, set_owner)
103
104
105 - def _delObject(self, id, dp=1, suppress_events=False):
106 """When deleted clear __primary_parent__."""
107 obj = self._getOb(id, None)
108 if obj is None:
109
110
111
112
113
114
115
116 log.warning(
117 "Tried to delete object id '%s' but didn't find it on %s",
118 id, self.getPrimaryId())
119 return
120 ObjectManager._delObject(self, id, dp, suppress_events)
121 obj.__primary_parent__ = None
122
123
125 """
126 BTreeFolder2 PrimaryPathObjectManager.
127 """
128 - def _setObject(self, id, obj, roles=None, user=None, set_owner=1):
129 """Track __primary_parent__ when we are set into an object"""
130 obj.__primary_parent__ = aq_base(self)
131 return ObjectManager._setObject(self, id, obj, roles, user, set_owner)
132
133
134 - def _delObject(self, id, dp=1, suppress_events=False):
135 """When deleted clear __primary_parent__."""
136 obj = self._getOb(id)
137 ObjectManager._delObject(self, id, dp, suppress_events)
138 obj.__primary_parent__ = None
139