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