extend setup: additional types, remove image
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1634 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
a45f2311f0
commit
3e62f36022
6 changed files with 49 additions and 52 deletions
|
@ -215,7 +215,7 @@ class ConceptManager(BTreeContainer):
|
|||
|
||||
def getDefaultPredicate(self):
|
||||
if self.defaultPredicate is None:
|
||||
self.defaultPredicate = self['standard']
|
||||
self.defaultPredicate = self.get('standard')
|
||||
return self.defaultPredicate
|
||||
|
||||
def getPredicateType(self):
|
||||
|
|
21
helpers.txt
21
helpers.txt
|
@ -236,7 +236,8 @@ get a type manager from all loops objects, always with the same context:
|
|||
|
||||
>>> types = typeManager.types
|
||||
>>> sorted(t.token for t in types)
|
||||
['.loops/concepts/file', '.loops/concepts/image', '.loops/concepts/predicate',
|
||||
['.loops/concepts/domain', '.loops/concepts/file',
|
||||
'.loops/concepts/predicate', '.loops/concepts/query',
|
||||
'.loops/concepts/textdocument', '.loops/concepts/topic',
|
||||
'.loops/concepts/type']
|
||||
|
||||
|
@ -248,11 +249,11 @@ condition:
|
|||
|
||||
>>> types = typeManager.listTypes(include=('concept',))
|
||||
>>> sorted(t.token for t in types)
|
||||
['.loops/concepts/predicate', '.loops/concepts/topic', '.loops/concepts/type']
|
||||
['.loops/concepts/domain', '.loops/concepts/predicate',
|
||||
'.loops/concepts/query', '.loops/concepts/topic', '.loops/concepts/type']
|
||||
>>> types = typeManager.listTypes(exclude=('concept',))
|
||||
>>> sorted(t.token for t in types)
|
||||
['.loops/concepts/file', '.loops/concepts/image',
|
||||
'.loops/concepts/textdocument']
|
||||
['.loops/concepts/file', '.loops/concepts/textdocument']
|
||||
|
||||
|
||||
Type-based interfaces and adapters
|
||||
|
@ -313,14 +314,12 @@ Concepts as queries
|
|||
-------------------
|
||||
|
||||
We first have to set up the query type, i.e. a type concept associated
|
||||
with the IQueryConcept interface:
|
||||
with the IQueryConcept interface. The query type concept itself has already
|
||||
been provided by the setup, but we have to register a corresponding adapter.
|
||||
|
||||
>>> from loops.query import IQueryConcept, QueryConcept
|
||||
>>> component.provideAdapter(QueryConcept, (IConcept,), IQueryConcept)
|
||||
|
||||
>>> query = concepts['query'] = Concept(u'Query')
|
||||
>>> query.conceptType = typeObject
|
||||
>>> ITypeConcept(query).typeInterface = IQueryConcept
|
||||
>>> from loops.query import QueryConcept
|
||||
>>> component.provideAdapter(QueryConcept)
|
||||
>>> query = concepts['query']
|
||||
|
||||
Next we need a concept of this type:
|
||||
|
||||
|
|
|
@ -34,8 +34,9 @@ ZCML setup):
|
|||
|
||||
Let's look what setup has provided us with:
|
||||
|
||||
>>> list(concepts)
|
||||
[u'file', u'hasType', u'image', u'predicate', u'standard', u'textdocument', u'type']
|
||||
>>> sorted(concepts)
|
||||
[u'domain', u'file', u'hasType', u'note', u'predicate', u'query',
|
||||
u'standard', u'textdocument', u'type']
|
||||
|
||||
|
||||
loops Traversal
|
||||
|
@ -54,14 +55,14 @@ returns a REST view of the object.
|
|||
>>> component.provideAdapter(ConceptView)
|
||||
|
||||
Navigation typically starts at a start object, which by default ist the
|
||||
top-level type concept:
|
||||
domain type concept (or the top-level type concept, if there is no domain type):
|
||||
|
||||
>>> request = TestRequest()
|
||||
>>> obj = LoopsTraverser(loopsRoot, request).publishTraverse(request, 'startObject')
|
||||
>>> obj
|
||||
<loops.rest.common.ConceptView object at ...>
|
||||
>>> obj.context.title
|
||||
u'Type'
|
||||
u'Domain'
|
||||
|
||||
The traversal adapter returns a view that when called renders the
|
||||
representation of its context object:
|
||||
|
|
|
@ -37,9 +37,9 @@ ZCML setup):
|
|||
>>> typeConcept = concepts['type']
|
||||
|
||||
>>> from loops.concept import Concept
|
||||
>>> query = concepts['query'] = Concept(u'Query')
|
||||
>>> topic = concepts['topic'] = Concept(u'Topic')
|
||||
>>> for c in (query, topic): c.conceptType = typeConcept
|
||||
>>> for c in (topic,): c.conceptType = typeConcept
|
||||
>>> query = concepts['query']
|
||||
|
||||
In addition we create a concept that holds the search page and a node
|
||||
(page) that links to this concept:
|
||||
|
@ -84,7 +84,7 @@ zcml in real life:
|
|||
|
||||
>>> t = searchView.conceptTypesForSearch()
|
||||
>>> len(t)
|
||||
3
|
||||
4
|
||||
>>> t.getTermByToken('loops:concept:*').title
|
||||
'Any Concept'
|
||||
|
||||
|
|
17
setup.py
17
setup.py
|
@ -28,8 +28,10 @@ from zope import component
|
|||
from zope.component import adapts
|
||||
from zope.interface import implements, Interface
|
||||
|
||||
from loops.interfaces import ILoops, ITypeConcept, IFile, IImage, ITextDocument
|
||||
from loops.interfaces import ILoops, ITypeConcept
|
||||
from loops.interfaces import IFile, IImage, ITextDocument, INote
|
||||
from loops.concept import ConceptManager, Concept
|
||||
from loops.query import IQueryConcept
|
||||
from loops.resource import ResourceManager
|
||||
from loops.view import ViewManager, Node
|
||||
|
||||
|
@ -73,16 +75,21 @@ class SetupManager(object):
|
|||
hasType = self.addObject(conceptManager, Concept, 'hasType', title=u'has Type')
|
||||
predicate = self.addObject(conceptManager, Concept, 'predicate', title=u'Predicate')
|
||||
standard = self.addObject(conceptManager, Concept, 'standard', title=u'subobject')
|
||||
domain = self.addObject(conceptManager, Concept, 'domain', title=u'Domain')
|
||||
query = self.addObject(conceptManager, Concept, 'query', title=u'Query')
|
||||
file = self.addObject(conceptManager, Concept, 'file', title=u'File')
|
||||
image = self.addObject(conceptManager, Concept, 'image', title=u'Image')
|
||||
#image = self.addObject(conceptManager, Concept, 'image', title=u'Image')
|
||||
textdocument = self.addObject(conceptManager, Concept,
|
||||
'textdocument', title=u'Text Document')
|
||||
for c in (typeConcept, file, image, textdocument, predicate):
|
||||
'textdocument', title=u'Text')
|
||||
note = self.addObject(conceptManager, Concept, 'note', title=u'Note')
|
||||
for c in (typeConcept, domain, query, file, textdocument, predicate):
|
||||
c.conceptType = typeConcept
|
||||
ITypeConcept(typeConcept).typeInterface = ITypeConcept
|
||||
ITypeConcept(query).typeInterface = IQueryConcept
|
||||
ITypeConcept(file).typeInterface = IFile
|
||||
ITypeConcept(image).typeInterface = IImage
|
||||
#ITypeConcept(image).typeInterface = IImage
|
||||
ITypeConcept(textdocument).typeInterface = ITextDocument
|
||||
ITypeConcept(note).typeInterface = INote
|
||||
hasType.conceptType = predicate
|
||||
standard.conceptType = predicate
|
||||
|
||||
|
|
|
@ -36,25 +36,26 @@ ZCML setup):
|
|||
|
||||
Let's look what setup has provided us with:
|
||||
|
||||
>>> list(concepts)
|
||||
[u'file', u'hasType', u'image', u'predicate', u'standard', u'textdocument', u'type']
|
||||
>>> sorted(concepts)
|
||||
[u'domain', u'file', u'hasType', u'note', u'predicate', u'query',
|
||||
u'standard', u'textdocument', u'type']
|
||||
|
||||
Now let's add a few more concepts:
|
||||
|
||||
>>> topic = concepts[u'topic'] = Concept(u'Topic')
|
||||
>>> intIds.register(topic)
|
||||
7
|
||||
8
|
||||
>>> zope = concepts[u'zope'] = Concept(u'Zope')
|
||||
>>> zope.conceptType = topic
|
||||
>>> intIds.register(zope)
|
||||
8
|
||||
9
|
||||
>>> zope3 = concepts[u'zope3'] = Concept(u'Zope 3')
|
||||
>>> zope3.conceptType = topic
|
||||
>>> intIds.register(zope3)
|
||||
9
|
||||
10
|
||||
|
||||
Navigation typically starts at a start object, which by default ist the
|
||||
top-level type concept:
|
||||
domain concept (if present, otherwise the top-level type concept):
|
||||
|
||||
>>> from loops.xmlrpc.common import LoopsMethods
|
||||
>>> xrf = LoopsMethods(loopsRoot, TestRequest())
|
||||
|
@ -62,27 +63,16 @@ top-level type concept:
|
|||
>>> sorted(startObj.keys())
|
||||
['children', 'id', 'name', 'parents', 'title', 'type']
|
||||
>>> startObj['id'], startObj['name'], startObj['title'], startObj['type']
|
||||
('0', u'type', u'Type', '0')
|
||||
|
||||
If we provide a concept named "domain" this will be used as starting point:
|
||||
|
||||
>>> from loops.concept import Concept
|
||||
>>> domain = concepts[u'domain'] = Concept(u'Domain')
|
||||
>>> domain.conceptType = concepts.getTypeConcept()
|
||||
>>> startObj = xrf.getStartObject()
|
||||
>>> sorted(startObj.keys())
|
||||
['children', 'id', 'name', 'parents', 'title', 'type']
|
||||
>>> startObj['id'], startObj['name'], startObj['title'], startObj['type']
|
||||
('10', u'domain', u'Domain', '0')
|
||||
('1', u'domain', u'Domain', '0')
|
||||
|
||||
There are a few standard objects we can retrieve directly:
|
||||
|
||||
>>> defaultPred = xrf.getDefaultPredicate()
|
||||
>>> defaultPred['id'], defaultPred['name']
|
||||
('6', u'standard')
|
||||
('7', u'standard')
|
||||
>>> typePred = xrf.getTypePredicate()
|
||||
>>> typePred['id'], typePred['name']
|
||||
('5', u'hasType')
|
||||
('6', u'hasType')
|
||||
>>> typeConcept = xrf.getTypeConcept()
|
||||
>>> typeConcept['id'], typeConcept['name']
|
||||
('0', u'type')
|
||||
|
@ -90,7 +80,7 @@ There are a few standard objects we can retrieve directly:
|
|||
In addition we can get a list of all types and all predicates available:
|
||||
|
||||
>>> sorted(t['name'] for t in xrf.getConceptTypes())
|
||||
[u'domain', u'file', u'image', u'predicate', u'textdocument', u'type']
|
||||
[u'domain', u'file', u'predicate', u'query', u'textdocument', u'type']
|
||||
>>> sorted(t['name'] for t in xrf.getPredicates())
|
||||
[u'hasType', u'standard']
|
||||
|
||||
|
@ -98,10 +88,10 @@ We can also retrieve a certain object by its id or its name:
|
|||
|
||||
>>> obj2 = xrf.getObjectById('2')
|
||||
>>> obj2['id'], obj2['name']
|
||||
('2', u'image')
|
||||
('2', u'query')
|
||||
>>> textdoc = xrf.getObjectByName(u'textdocument')
|
||||
>>> textdoc['id'], textdoc['name']
|
||||
('3', u'textdocument')
|
||||
('4', u'textdocument')
|
||||
|
||||
All methods that retrieve one object also returns its children and parents:
|
||||
|
||||
|
@ -111,7 +101,7 @@ All methods that retrieve one object also returns its children and parents:
|
|||
>>> ch[0]['name']
|
||||
u'hasType'
|
||||
>>> sorted(c['name'] for c in ch[0]['objects'])
|
||||
[u'domain', u'file', u'image', u'predicate', u'textdocument', u'type']
|
||||
[u'domain', u'file', u'predicate', u'query', u'textdocument', u'type']
|
||||
|
||||
>>> pa = defaultPred['parents']
|
||||
>>> len(pa)
|
||||
|
@ -129,7 +119,7 @@ We can also retrieve children and parents explicitely:
|
|||
>>> ch[0]['name']
|
||||
u'hasType'
|
||||
>>> sorted(c['name'] for c in ch[0]['objects'])
|
||||
[u'domain', u'file', u'image', u'predicate', u'textdocument', u'type']
|
||||
[u'domain', u'file', u'predicate', u'query', u'textdocument', u'type']
|
||||
|
||||
>>> pa = xrf.getParents('6')
|
||||
>>> len(pa)
|
||||
|
@ -152,7 +142,7 @@ Updating the concept map
|
|||
|
||||
>>> topicId = xrf.getObjectByName('topic')['id']
|
||||
>>> xrf.createConcept(topicId, u'zope2', u'Zope 2')
|
||||
{'title': u'Zope 2', 'type': '7', 'id': '12', 'name': u'zope2'}
|
||||
{'title': u'Zope 2', 'type': '8', 'id': '12', 'name': u'zope2'}
|
||||
|
||||
|
||||
Fin de partie
|
||||
|
|
Loading…
Add table
Reference in a new issue