From 072318ea0627a01f822c7b581683b8fe85082ccd Mon Sep 17 00:00:00 2001 From: helmutm Date: Mon, 13 Mar 2006 14:15:26 +0000 Subject: [PATCH] use typology for type-related stuff on concepts and resources git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1124 fd906abe-77d9-0310-91a1-e0d9ade77398 --- README.txt | 25 +++++---- browser/common.py | 13 +++-- browser/concept.py | 104 +++++++---------------------------- browser/concept_resources.pt | 3 - browser/configure.zcml | 4 -- browser/node.py | 31 ++++++----- browser/relation_macros.pt | 4 -- browser/target_macros.pt | 1 - concept.py | 24 +------- configure.zcml | 4 +- helpers.txt | 27 ++++----- resource.py | 16 ------ type.py | 48 +++++++++------- 13 files changed, 105 insertions(+), 199 deletions(-) diff --git a/README.txt b/README.txt index b10d998..4c1f43c 100755 --- a/README.txt +++ b/README.txt @@ -108,7 +108,14 @@ a special predicate 'hasType'. >>> cc1.getConceptType().title u'Topic' -We get a list of types using the ConceptTypeSourceList: +We get a list of types using the ConceptTypeSourceList. +In order for the type machinery to work we first have to provide a +type manager. + + >>> from cybertools.typology.interfaces import ITypeManager + >>> from loops.interfaces import ILoopsObject + >>> from loops.type import LoopsTypeManager + >>> ztapi.provideAdapter(ILoopsObject, ITypeManager, LoopsTypeManager) >>> from loops.concept import ConceptTypeSourceList >>> types = ConceptTypeSourceList(cc1) @@ -167,10 +174,11 @@ underlying context object: >>> sorted(c.title for c in cc1.getChildren()) [u'loops for Zope 3'] -We can also create a new concept and assign it: +We can also create a new concept and assign it. >>> params = {'action': 'create', 'create.name': 'cc4', - ... 'create.title': u'New concept'} + ... 'create.title': u'New concept', + ... 'create.type': '.loops/concepts/topic'} >>> view = ConceptConfigureView(cc1, TestRequest(**params)) >>> view.update() True @@ -178,7 +186,7 @@ We can also create a new concept and assign it: [u'New concept', u'loops for Zope 3'] The concept configuration view provides methods for displaying concept -types and predicates: +types and predicates. >>> from zope.publisher.interfaces.browser import IBrowserRequest >>> from loops.browser.common import LoopsTerms @@ -206,9 +214,6 @@ Index attributes adapter >>> idx.title() u'cc2 Zope 3' - >>> idx.type() - 'loops:concept:unknown' - Resources and what they have to do with Concepts ================================================ @@ -307,9 +312,6 @@ Index attributes adapter >>> idx.title() u'doc1 Zope Info' - >>> idx.type() - 'loops:resource:Document' - Views/Nodes: Menus, Menu Items, Listings, Pages, etc ==================================================== @@ -463,7 +465,8 @@ to the node's target: associate an existing one or create a new one. ... 'create.type': 'loops.resource.MediaAsset',} >>> view = ConfigureView(m111, TestRequest(form = form)) >>> sorted((t.token, t.title) for t in view.targetTypes()) - [('loops.concept.Concept', u'Concept'), + [('.loops/concepts/topic', u'Topic'), ('.loops/concepts/type', u'Type'), + ('.loops/concepts/unknown', u'Unknown Type'), ('loops.resource.Document', u'Document'), ('loops.resource.MediaAsset', u'Media Asset')] >>> view.update() diff --git a/browser/common.py b/browser/common.py index 5aecfe3..b91f6ea 100644 --- a/browser/common.py +++ b/browser/common.py @@ -29,6 +29,7 @@ from zope.cachedescriptors.property import Lazy from zope.interface import implements from zope.security.proxy import removeSecurityProxy +from cybertools.typology.interfaces import IType from loops import util from loops.target import getTargetTypes @@ -69,14 +70,16 @@ class BaseView(object): @Lazy def typeTitle(self): - voc = util.KeywordVocabulary(getTargetTypes()) - token = '.'.join((self.context.__module__, - self.context.__class__.__name__)) - term = voc.getTermByToken(token) - return term.title + type = IType(self.context) + return type is not None and type.title or None @Lazy def typeUrl(self): + type = IType(self.context) + if type is not None: + provider = type.typeProvider + if provider is not None: + return zapi.absoluteURL(provider, self.request) return None def viewIterator(self, objs): diff --git a/browser/concept.py b/browser/concept.py index 05dce0a..c05e64d 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -38,9 +38,9 @@ from zope.publisher.interfaces.browser import IBrowserRequest from zope import schema from zope.schema.interfaces import IIterableSource from zope.security.proxy import removeSecurityProxy +from cybertools.typology.interfaces import ITypeManager from loops.interfaces import IConcept from loops.concept import Concept, ConceptTypeSourceList, PredicateSourceList -from loops.resource import getResourceTypes, getResourceTypesForSearch from loops.target import getTargetTypes from loops.browser.common import BaseView, LoopsTerms from loops import util @@ -64,7 +64,7 @@ class ConceptView(BaseView): def resources(self): for r in self.context.getResourceRelations(): - yield ConceptResourceRelationView(r, self.request, contextIsSecond=True) + yield ConceptRelationView(r, self.request, contextIsSecond=True) class ConceptConfigureView(ConceptView): @@ -121,18 +121,14 @@ class ConceptConfigureView(ConceptView): if not name: raise(BadRequest, 'Empty name.') title = request.get('create.title', u'') - conceptType = request.get('create.type') - if conceptType and conceptType.startswith('loops.resource.'): - factory = resolve(conceptType) - concept = factory(title) - container = self.loopsRoot.getResourceManager() - else: - concept = Concept(title) - container = self.loopsRoot.getConceptManager() + token = self.request.get('create.type') + type = ITypeManager(self.context).getType(token) + factory = type.factory + container = type.defaultContainer + concept = factory(title) container[name] = concept - if conceptType: - ctype = self.loopsRoot.loopsTraverse(conceptType) - concept.conceptType = ctype + if IConcept.providedBy(concept): + concept.conceptType = type.typeProvider notify(ObjectCreatedEvent(removeSecurityProxy(concept))) assignAs = self.request.get('assignAs', 'child') predicate = request.get('create.predicate') or None @@ -176,44 +172,28 @@ class ConceptConfigureView(ConceptView): result = [r for r in result if r.conceptType is None] return self.viewIterator(result) - @Lazy - def typeTitle(self): - return self.context.conceptType.title - - @Lazy - def typeUrl(self): - return zapi.absoluteURL(self.context.conceptType, self.request) - def viewIterator(self, objs): request = self.request for o in objs: - if IConcept.providedBy(o): - yield ConceptConfigureView(o, request) - else: yield BaseView(o, request) def conceptTypes(self): - types = ConceptTypeSourceList(self.context) - terms = zapi.getMultiAdapter((types, self.request), ITerms) - for type in types: - yield terms.getTerm(type) + return util.KeywordVocabulary([(t.token, t.title) + for t in ITypeManager(self.context).listTypes(('concept',))]) def conceptTypesForSearch(self): - types = ConceptTypeSourceList(self.context) - typesItems = [(':'.join(('loops:concept', - self.getConceptTypeTokenForSearch(t))), t.title) - for t in types] - return util.KeywordVocabulary(typesItems) - - def getConceptTypeTokenForSearch(self, ct): - return ct is None and 'unknown' or zapi.getName(ct) + general = [('loops:concept:*', 'Any'),] + return util.KeywordVocabulary(general + [(t.tokenForSearch, t.title) + for t in ITypeManager(self.context).listTypes(('concept',))]) def resourceTypes(self): - return util.KeywordVocabulary(getResourceTypes()) + return util.KeywordVocabulary([(t.token, t.title) + for t in ITypeManager(self.context).listTypes(('resource',))]) def resourceTypesForSearch(self): - return util.KeywordVocabulary(getResourceTypesForSearch()) - + general = [('loops:resource:*', 'Any'),] + return util.KeywordVocabulary(general + [(t.tokenForSearch, t.title) + for t in ITypeManager(self.context).listTypes(('resource',))]) def predicates(self): preds = PredicateSourceList(self.context) @@ -222,7 +202,7 @@ class ConceptConfigureView(ConceptView): yield terms.getTerm(pred) -class ConceptRelationView(object): +class ConceptRelationView(BaseView): def __init__(self, relation, request, contextIsSecond=False): if contextIsSecond: @@ -234,35 +214,11 @@ class ConceptRelationView(object): self.predicate = relation.predicate self.request = request - @Lazy - def loopsRoot(self): - return self.context.getLoopsRoot() - - @Lazy - def url(self): - return zapi.absoluteURL(self.context, self.request) - - @Lazy - def title(self): - return self.context.title - @Lazy def token(self): return ':'.join((self.loopsRoot.getLoopsUri(self.context), self.loopsRoot.getLoopsUri(self.predicate))) - @Lazy - def conceptType(self): - return self.context.conceptType - - @Lazy - def typeTitle(self): - return self.conceptType.title - - @Lazy - def typeUrl(self): - return zapi.absoluteURL(self.conceptType, self.request) - @Lazy def predicateTitle(self): return self.predicate.title @@ -271,23 +227,3 @@ class ConceptRelationView(object): def predicateUrl(self): return zapi.absoluteURL(self.predicate, self.request) - -class ConceptResourceRelationView(ConceptRelationView): - - @Lazy - def conceptType(self): - return None - - @Lazy - def typeTitle(self): - voc = util.KeywordVocabulary(getTargetTypes()) - token = '.'.join((self.context.__module__, - self.context.__class__.__name__)) - term = voc.getTermByToken(token) - return term.title - - - @Lazy - def typeUrl(self): - return '' - diff --git a/browser/concept_resources.pt b/browser/concept_resources.pt index 9b50807..734fa2c 100644 --- a/browser/concept_resources.pt +++ b/browser/concept_resources.pt @@ -54,9 +54,6 @@
@@ -135,9 +134,6 @@ tal:attributes="value searchTerm" /> Type -