fix versioning bug (see BaseView.target)
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2137 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
b5a8ddc1f9
commit
43d5639b55
5 changed files with 62 additions and 32 deletions
|
@ -109,6 +109,11 @@ class BaseView(GenericView):
|
|||
except ForbiddenAttribute: # ignore when testing
|
||||
pass
|
||||
|
||||
@Lazy
|
||||
def target(self):
|
||||
# allow for having a separate object the view acts upon
|
||||
return self.context
|
||||
|
||||
def setSkin(self, skinName):
|
||||
skin = None
|
||||
if skinName and IView.providedBy(self.context):
|
||||
|
@ -279,33 +284,38 @@ class BaseView(GenericView):
|
|||
|
||||
@Lazy
|
||||
def versionId(self):
|
||||
versionable = IVersionable(self.context, None)
|
||||
#versionable = IVersionable(self.context, None)
|
||||
versionable = IVersionable(self.target, None)
|
||||
return versionable and versionable.versionId or ''
|
||||
|
||||
@Lazy
|
||||
def currentVersionId(self):
|
||||
versionable = IVersionable(self.context, None)
|
||||
#versionable = IVersionable(self.context, None)
|
||||
versionable = IVersionable(self.target, None)
|
||||
return versionable and versionable.currentVersion.versionId or ''
|
||||
|
||||
@Lazy
|
||||
def hasVersions(self):
|
||||
versionable = IVersionable(self.context, None)
|
||||
#versionable = IVersionable(self.context, None)
|
||||
versionable = IVersionable(self.target, None)
|
||||
return versionable and len(versionable.versions) > 1 or False
|
||||
|
||||
@Lazy
|
||||
def versionInfo(self):
|
||||
if not self.useVersioning:
|
||||
return None
|
||||
context = self.context
|
||||
versionable = IVersionable(context, None)
|
||||
#context = self.context
|
||||
#versionable = IVersionable(context, None)
|
||||
target = self.target
|
||||
versionable = IVersionable(target, None)
|
||||
if versionable is None:
|
||||
return ''
|
||||
versionId = versionable.versionId
|
||||
td = component.getUtility(ITranslationDomain, _._domain)
|
||||
current = ((versionable.currentVersion == context)
|
||||
current = ((versionable.currentVersion == target)
|
||||
and td.translate(_(u'current'), context=self.request)
|
||||
or u'')
|
||||
released = ((versionable.releasedVersion == context)
|
||||
released = ((versionable.releasedVersion == target)
|
||||
and td.translate(_(u'released'), context=self.request)
|
||||
or u'')
|
||||
if not current and not released:
|
||||
|
|
|
@ -53,6 +53,7 @@ from loops import util
|
|||
from loops.util import _
|
||||
from loops.browser.common import BaseView
|
||||
from loops.browser.concept import ConceptView
|
||||
from loops.versioning.util import getVersion
|
||||
|
||||
|
||||
node_macros = ViewPageTemplateFile('node_macros.pt')
|
||||
|
@ -148,25 +149,33 @@ class NodeView(BaseView):
|
|||
def targetObject(self):
|
||||
# xxx: use virtualTargetObject
|
||||
#return self.virtualTargetObject
|
||||
return self.context.target
|
||||
target = self.context.target
|
||||
if target is not None:
|
||||
target = getVersion(target, self.request)
|
||||
return target
|
||||
|
||||
@Lazy
|
||||
def target(self):
|
||||
def targetObjectView(self):
|
||||
obj = self.targetObject
|
||||
if obj is not None:
|
||||
basicView = zapi.getMultiAdapter((obj, self.request))
|
||||
basicView._viewName = self.context.viewName
|
||||
return basicView.view
|
||||
|
||||
#@Lazy
|
||||
#def target(self):
|
||||
# # obsolete and confusing - TODO: remove...
|
||||
# return self.targetObjectView
|
||||
|
||||
@Lazy
|
||||
def targetUrl(self):
|
||||
t = self.target
|
||||
t = self.targetObjectView
|
||||
if t is not None:
|
||||
return '%s/.target%s' % (self.url, t.uniqueId)
|
||||
return ''
|
||||
|
||||
def renderTarget(self):
|
||||
target = self.target
|
||||
target = self.targetObjectView
|
||||
return target is not None and target.render() or u''
|
||||
|
||||
@Lazy
|
||||
|
@ -256,6 +265,15 @@ class NodeView(BaseView):
|
|||
|
||||
# virtual target support
|
||||
|
||||
@Lazy
|
||||
def virtualTargetObject(self):
|
||||
target = self.request.annotations.get('loops.view', {}).get('target')
|
||||
if target is None:
|
||||
target = self.context.target
|
||||
if target is not None:
|
||||
target = getVersion(target, self.request)
|
||||
return target
|
||||
|
||||
def targetView(self, name='index.html', methodName='show'):
|
||||
target = self.virtualTargetObject
|
||||
if target is not None:
|
||||
|
@ -286,13 +304,6 @@ class NodeView(BaseView):
|
|||
def targetDownload(self):
|
||||
return self.targetView('download.html', 'download')
|
||||
|
||||
@Lazy
|
||||
def virtualTargetObject(self):
|
||||
target = self.request.annotations.get('loops.view', {}).get('target')
|
||||
if target is None:
|
||||
target = self.context.target
|
||||
return target
|
||||
|
||||
@Lazy
|
||||
def virtualTarget(self):
|
||||
obj = self.virtualTargetObject
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
tal:content="structure body">
|
||||
The body
|
||||
</div>
|
||||
<div tal:define="target nocall:item/target"
|
||||
<div tal:define="target nocall:item/targetObjectView"
|
||||
tal:condition="nocall:target">
|
||||
<tal:ignore condition="nothing">
|
||||
<div metal:define-macro="editicons"
|
||||
|
@ -70,7 +70,7 @@
|
|||
ondblclick python: item.openEditWindow('configure.html')">
|
||||
<span tal:content="structure body">Node Body</span>
|
||||
</div>
|
||||
<tal:concepts define="item nocall:item/target;
|
||||
<tal:concepts define="item nocall:item/targetObjectView;
|
||||
macro item/macro">
|
||||
<div metal:use-macro="macro" />
|
||||
</tal:concepts>
|
||||
|
@ -131,7 +131,7 @@
|
|||
|
||||
|
||||
<metal:resources define-macro="listresources"
|
||||
tal:define="target nocall:item/target">
|
||||
tal:define="target nocall:item/targetObjectView">
|
||||
<div class="content-1"
|
||||
tal:content="structure item/body"
|
||||
tal:attributes="ondblclick python: item.openEditWindow();
|
||||
|
@ -139,7 +139,7 @@
|
|||
Listing
|
||||
</div><br />
|
||||
<div tal:attributes="ondblclick python: target.openEditWindow('resources.html')"
|
||||
tal:define="item nocall:item/target"
|
||||
tal:define="item nocall:item/targetObjectView"
|
||||
tal:condition="nocall:target">
|
||||
<div tal:repeat="related item/resources">
|
||||
<a href="#"
|
||||
|
@ -152,7 +152,7 @@
|
|||
|
||||
|
||||
<metal:children define-macro="listchildren"
|
||||
tal:define="target nocall:item/target">
|
||||
tal:define="target nocall:item/targetObjectView">
|
||||
<div class="content-1"
|
||||
tal:content="structure item/body"
|
||||
tal:attributes="ondblclick python:
|
||||
|
@ -162,7 +162,7 @@
|
|||
Listing
|
||||
</div><br />
|
||||
<div tal:attributes="ondblclick python: target.openEditWindow('configure.html')"
|
||||
tal:define="item nocall:item/target"
|
||||
tal:define="item nocall:item/targetObjectView"
|
||||
tal:condition="nocall:target">
|
||||
<div tal:repeat="related item/children">
|
||||
<a href="#"
|
||||
|
|
21
concept.py
21
concept.py
|
@ -175,16 +175,20 @@ class Concept(Contained, Persistent):
|
|||
def getParents(self, predicates=None):
|
||||
return [r.first for r in self.getParentRelations(predicates)]
|
||||
|
||||
def assignChild(self, concept, predicate=None):
|
||||
def assignChild(self, concept, predicate=None, order=0, relevance=1.0):
|
||||
if predicate is None:
|
||||
predicate = self.getConceptManager().getDefaultPredicate()
|
||||
registry = zapi.getUtility(IRelationRegistry)
|
||||
rel = ConceptRelation(self, concept, predicate)
|
||||
registry.register(rel)
|
||||
if order != 0:
|
||||
rel.order = order
|
||||
if relevance != 1.0:
|
||||
rel.relevance = relevance
|
||||
# TODO (?): avoid duplicates
|
||||
registry.register(rel)
|
||||
|
||||
def assignParent(self, concept, predicate=None):
|
||||
concept.assignChild(self, predicate)
|
||||
def assignParent(self, concept, predicate=None, order=0, relevance=1.0):
|
||||
concept.assignChild(self, predicate, order, relevance)
|
||||
|
||||
def deassignChild(self, child, predicates=None):
|
||||
registry = zapi.getUtility(IRelationRegistry)
|
||||
|
@ -205,12 +209,17 @@ class Concept(Contained, Persistent):
|
|||
def getResources(self, predicates=None):
|
||||
return [r.second for r in self.getResourceRelations(predicates)]
|
||||
|
||||
def assignResource(self, resource, predicate=None):
|
||||
def assignResource(self, resource, predicate=None, order=0, relevance=1.0):
|
||||
if predicate is None:
|
||||
predicate = self.getConceptManager().getDefaultPredicate()
|
||||
registry = zapi.getUtility(IRelationRegistry)
|
||||
registry.register(ResourceRelation(self, resource, predicate))
|
||||
rel = ResourceRelation(self, resource, predicate)
|
||||
if order != 0:
|
||||
rel.order = order
|
||||
if relevance != 1.0:
|
||||
rel.relevance = relevance
|
||||
# TODO (?): avoid duplicates
|
||||
registry.register(rel)
|
||||
|
||||
def deassignResource(self, resource, predicates=None):
|
||||
registry = zapi.getUtility(IRelationRegistry)
|
||||
|
|
|
@ -199,9 +199,9 @@ class Resource(Image, Contained):
|
|||
obj = getMaster(self)
|
||||
return [r.first for r in obj.getConceptRelations(predicates)]
|
||||
|
||||
def assignConcept(self, concept, predicate=None):
|
||||
def assignConcept(self, concept, predicate=None, order=0, relevance=1.0):
|
||||
obj = getMaster(self)
|
||||
concept.assignResource(obj, predicate)
|
||||
concept.assignResource(obj, predicate, order, relevance)
|
||||
|
||||
def deassignConcept(self, concept, predicates=None):
|
||||
obj = getMaster(self)
|
||||
|
|
Loading…
Add table
Reference in a new issue