From 0c789f396619588538a9b932a84f519888e9ac6f Mon Sep 17 00:00:00 2001 From: helmutm Date: Thu, 22 Mar 2007 17:01:41 +0000 Subject: [PATCH] basic versioning OK, including search, versions portlet git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1658 fd906abe-77d9-0310-91a1-e0d9ade77398 --- browser/concept_macros.pt | 8 ++++++-- browser/node_macros.pt | 2 +- browser/resource.py | 13 +++++++++++-- browser/resource_macros.pt | 2 +- query.py | 7 +++++-- search/search.pt | 10 +++++++++- versioning/browser.py | 14 ++++---------- versioning/interfaces.py | 5 +++++ versioning/util.py | 11 +++++++++-- versioning/version_macros.pt | 17 ++++++++--------- versioning/versionable.py | 12 +++++++++++- 11 files changed, 70 insertions(+), 31 deletions(-) diff --git a/browser/concept_macros.pt b/browser/concept_macros.pt index dfbf97b..74d805a 100644 --- a/browser/concept_macros.pt +++ b/browser/concept_macros.pt @@ -103,8 +103,12 @@ Type - - 1.1 + + 1.1 Type diff --git a/browser/node_macros.pt b/browser/node_macros.pt index 4a422d9..4d2b004 100644 --- a/browser/node_macros.pt +++ b/browser/node_macros.pt @@ -32,7 +32,7 @@ Edit diff --git a/browser/resource.py b/browser/resource.py index 673cca4..1ed3ad4 100644 --- a/browser/resource.py +++ b/browser/resource.py @@ -36,12 +36,14 @@ from zope.security import canAccess, canWrite from zope.security.proxy import removeSecurityProxy from cybertools.typology.interfaces import IType -from loops.interfaces import IBaseResource, IDocument, IMediaAsset, ITextDocument from loops.browser.common import EditForm, BaseView, Action from loops.browser.concept import ConceptRelationView, ConceptConfigureView from loops.browser.node import NodeView, node_macros -from loops.interfaces import ITypeConcept from loops.browser.util import html_quote +from loops.interfaces import IBaseResource, IDocument, IMediaAsset, ITextDocument +from loops.interfaces import ITypeConcept +from loops.versioning.browser import version_macros +from loops.versioning.interfaces import IVersionable renderingFactories = { 'text/plain': 'zope.source.plaintext', @@ -103,6 +105,13 @@ class ResourceView(BaseView): cont.macros.register('portlet_right', 'related', title='Related Items', subMacro=self.template.macros['related'], position=0, info=self) + if not IUnauthenticatedPrincipal.providedBy(self.request.principal): + versionable = IVersionable(self.context, None) + if versionable is not None and len(versionable.versions) > 1: + cont.macros.register('portlet_right', 'versions', + title='Version ' + versionable.versionId, + subMacro=version_macros.macros['portlet_versions'], + position=1, info=self) @Lazy def view(self): diff --git a/browser/resource_macros.pt b/browser/resource_macros.pt index 73edd6a..13bff18 100644 --- a/browser/resource_macros.pt +++ b/browser/resource_macros.pt @@ -58,7 +58,7 @@ | + tal:attributes="href string:$url/external_edit?version=this"> Open for editing diff --git a/query.py b/query.py index 95d2bd3..febd019 100644 --- a/query.py +++ b/query.py @@ -32,6 +32,7 @@ from cybertools.typology.interfaces import IType from loops.interfaces import IConcept from loops.common import AdapterBase from loops.type import TypeInterfaceSourceList +from loops.versioning.util import getVersion from loops import util from loops.util import _ @@ -101,7 +102,7 @@ class BaseQuery(object): queue.append(child) for c in concepts: result.add(c) - result.update(c.getResources()) + result.update(getVersion(r) for r in c.getResources()) return result @@ -136,7 +137,9 @@ class FullQuery(BaseQuery): result = result.intersection(rc) else: result = rc - result = set(r for r in result if r.getLoopsRoot() == self.loopsRoot) + result = set(r for r in result + if r.getLoopsRoot() == self.loopsRoot + and getVersion(r) == r) return result diff --git a/search/search.pt b/search/search.pt index 7a7de0c..6ae8da5 100644 --- a/search/search.pt +++ b/search/search.pt @@ -50,6 +50,7 @@ Title Type + V Size Modification Date @@ -60,11 +61,18 @@ description row/description"> - Type + + 1.1 + Size diff --git a/versioning/browser.py b/versioning/browser.py index 8d0bb3a..ea64db5 100644 --- a/versioning/browser.py +++ b/versioning/browser.py @@ -32,23 +32,17 @@ from loops.versioning.interfaces import IVersionable from loops.versioning.util import getVersion +version_macros = ViewPageTemplateFile('version_macros.pt') + + class ListVersions(BaseView): - template = ViewPageTemplateFile('version_macros.pt') + template = version_macros @Lazy def macro(self): return self.template.macros['versions'] - def __init__(self, context, request): - super(ListVersions, self).__init__(context, request) - cont = self.controller - if (cont is not None and not IUnauthenticatedPrincipal.providedBy( - self.request.principal)): - cont.macros.register('portlet_right', 'versions', title='Versions', - subMacro=self.template.macros['portlet_versions'], - info=self) - def versions(self): versionable = IVersionable(self.context) versions = versionable.versions diff --git a/versioning/interfaces.py b/versioning/interfaces.py index 0011c12..1241dea 100644 --- a/versioning/interfaces.py +++ b/versioning/interfaces.py @@ -43,6 +43,11 @@ class IVersionable(Interface): 'version-independent attributes and central ' 'versioning metadata') + parent = Attribute(u'The version this one was created from') + + comment = Attribute(u'Somme informative text provided when creating ' + 'this version') + # attributes taken from the master version: versions = Attribute(u'A dictionary of all versions of this object') diff --git a/versioning/util.py b/versioning/util.py index c96bb79..e6f6438 100644 --- a/versioning/util.py +++ b/versioning/util.py @@ -25,11 +25,11 @@ $Id$ from loops.versioning.interfaces import IVersionable -def getVersion(obj, request): +def getVersion(obj, request=None): """ Check if another version should be used for the object provided and return it. """ - versionRequest = request.form.get('version') + versionRequest = request and request.get('version') or None if versionRequest == 'this': # we really want this object, not another version return obj @@ -54,3 +54,10 @@ def getMaster(obj): return obj return versionable.master + +def cleanupVersionsOnList(lst): + result = [] + for el in lst: + result.append(el) + return result + diff --git a/versioning/version_macros.pt b/versioning/version_macros.pt index 83e9d41..5534c9b 100644 --- a/versioning/version_macros.pt +++ b/versioning/version_macros.pt @@ -3,6 +3,7 @@ ondblclick python: item.openEditWindow('resources.html')" tal:define="versions python: list(item.versions())" tal:condition="versions"> +

Title

Versions


@@ -18,7 +19,7 @@
Resource Title @@ -42,13 +43,11 @@ - + - diff --git a/versioning/versionable.py b/versioning/versionable.py index 181fa9f..c498284 100644 --- a/versioning/versionable.py +++ b/versioning/versionable.py @@ -91,6 +91,14 @@ class VersionableResource(object): """ The adapted master... """ return IVersionable(self.master) + @Lazy + def parent(self): + return self.getVersioningAttribute('parent', None) + + @Lazy + def comment(self): + return self.getVersioningAttribute('comment', u'') + @property def versions(self): return self.versionableMaster.getVersioningAttribute('versions', {}) @@ -104,7 +112,7 @@ class VersionableResource(object): m = self.versionableMaster return self.versionableMaster.getVersioningAttribute('releasedVersion', None) - def createVersion(self, level=1): + def createVersion(self, level=1, comment=u''): context = self.context versionableMaster = self.versionableMaster # get the new version numbers @@ -123,6 +131,8 @@ class VersionableResource(object): versionableObj.setVersioningAttribute('versionNumbers', tuple(vn)) versionableObj.setVersioningAttribute('variantIds', self.variantIds) versionableObj.setVersioningAttribute('master', self.master) + versionableObj.setVersioningAttribute('parent', context) + versionableObj.setVersioningAttribute('comment', comment) # generate name for new object, register in parent versionId = versionableObj.versionId name = self.generateName(getName(context),