export and import of DC annotations basically working
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2479 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
8e8797a4d1
commit
fc3e3096c8
3 changed files with 51 additions and 9 deletions
42
external/README.txt
vendored
42
external/README.txt
vendored
|
@ -77,16 +77,29 @@ Working with nodes
|
||||||
Sub-elements
|
Sub-elements
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
Complex attributes or other informations related to an object may be
|
||||||
|
represented by sub-elements. The standard example for this kind of data
|
||||||
|
are the Dublin Core (DC) attributes.
|
||||||
|
|
||||||
|
By importing the annotation module the corresponding element class will be
|
||||||
|
registered.
|
||||||
|
|
||||||
>>> from loops.external import annotation
|
>>> from loops.external import annotation
|
||||||
|
|
||||||
>>> input = """concept('myquery', u'My Query', 'query', viewName='mystuff.html')[
|
>>> input = """concept('myquery', u'My Query', 'query', viewName='mystuff.html')[
|
||||||
... annotations(creators='john')]"""
|
... annotations(creators=(u'john',))]"""
|
||||||
>>> elements = reader.read(input)
|
>>> elements = reader.read(input)
|
||||||
>>> elements[0].subElements
|
>>> elements[0].subElements
|
||||||
[{'creators': 'john'}]
|
[{'creators': (u'john',)}]
|
||||||
|
|
||||||
|
Loading the element with the sub-element stores the DC attributes.
|
||||||
|
|
||||||
>>> loader.load(elements)
|
>>> loader.load(elements)
|
||||||
[('creators', 'john')]
|
>>> from zope.dublincore.interfaces import IZopeDublinCore
|
||||||
|
>>> dc = IZopeDublinCore(concepts['myquery'])
|
||||||
|
>>> dc.creators
|
||||||
|
(u'john',)
|
||||||
|
|
||||||
|
|
||||||
Exporting loops Objects
|
Exporting loops Objects
|
||||||
=======================
|
=======================
|
||||||
|
@ -120,20 +133,41 @@ Writing object information to the external storage
|
||||||
node('home', u'Home', '', u'menu', body=u'Welcome')
|
node('home', u'Home', '', u'menu', body=u'Welcome')
|
||||||
node('myquery', u'My Query', 'home', u'page', target=u'concepts/myquery')...
|
node('myquery', u'My Query', 'home', u'page', target=u'concepts/myquery')...
|
||||||
|
|
||||||
Writing subElements
|
Writing sub-elements
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|
Let's first set up a sequence with one element containing
|
||||||
|
two sub-elements.
|
||||||
|
|
||||||
>>> input = """concept('myquery', u'My Query', 'query', viewName='mystuff.html')[
|
>>> input = """concept('myquery', u'My Query', 'query', viewName='mystuff.html')[
|
||||||
... annotations(creators='john'),
|
... annotations(creators='john'),
|
||||||
... annotations(modified='2007-08-12')]"""
|
... annotations(modified='2007-08-12')]"""
|
||||||
>>> elements = reader.read(input)
|
>>> elements = reader.read(input)
|
||||||
>>> output = StringIO()
|
>>> output = StringIO()
|
||||||
>>> writer.write(elements, output)
|
>>> writer.write(elements, output)
|
||||||
|
|
||||||
|
Writing this sequence reproduces the import format.
|
||||||
|
|
||||||
>>> print output.getvalue()
|
>>> print output.getvalue()
|
||||||
concept('myquery', u'My Query', 'query', viewName='mystuff.html')[
|
concept('myquery', u'My Query', 'query', viewName='mystuff.html')[
|
||||||
annotations(creators='john'),
|
annotations(creators='john'),
|
||||||
annotations(modified='2007-08-12')]...
|
annotations(modified='2007-08-12')]...
|
||||||
|
|
||||||
|
DC annotations will be exported automaticall after registering the
|
||||||
|
corresponding extractor adapter.
|
||||||
|
|
||||||
|
>>> from loops.external.annotation import AnnotationsExtractor
|
||||||
|
>>> component.provideAdapter(AnnotationsExtractor)
|
||||||
|
|
||||||
|
>>> output = StringIO()
|
||||||
|
>>> extractor = Extractor(loopsRoot, os.path.join(dataDirectory, 'export'))
|
||||||
|
>>> PyWriter().write(extractor.extract(), output)
|
||||||
|
|
||||||
|
>>> print output.getvalue()
|
||||||
|
type(u'customer', u'Customer', options=u'', typeInterface=u'', viewName=u'')...
|
||||||
|
concept(u'myquery', u'My Query', u'query', options=u'', viewName='mystuff.html')[
|
||||||
|
annotations(creators=(u'john',))]...
|
||||||
|
|
||||||
|
|
||||||
The Export/Import View
|
The Export/Import View
|
||||||
======================
|
======================
|
||||||
|
|
10
external/annotation.py
vendored
10
external/annotation.py
vendored
|
@ -22,6 +22,8 @@ Export/import of annotations.
|
||||||
$Id$
|
$Id$
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
from time import time
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
from zope.dublincore.interfaces import IZopeDublinCore
|
from zope.dublincore.interfaces import IZopeDublinCore
|
||||||
from zope.interface import implements
|
from zope.interface import implements
|
||||||
|
@ -40,7 +42,13 @@ class AnnotationsElement(Element):
|
||||||
self[k] = v
|
self[k] = v
|
||||||
|
|
||||||
def __call__(self, loader):
|
def __call__(self, loader):
|
||||||
print self.items()
|
obj = self.parent.object
|
||||||
|
dc = IZopeDublinCore(obj, None)
|
||||||
|
if dc is not None:
|
||||||
|
for k, v in self.items():
|
||||||
|
if k in ('created', 'modified'):
|
||||||
|
v = datetime(*time.strptime(u'%Y-%m-%dT%H:%M')[0:6])
|
||||||
|
setattr(dc, k, v)
|
||||||
|
|
||||||
|
|
||||||
class AnnotationsExtractor(object):
|
class AnnotationsExtractor(object):
|
||||||
|
|
8
util.py
8
util.py
|
@ -76,11 +76,11 @@ def nl2br(text):
|
||||||
else: # gracefully handle Mac line endings
|
else: # gracefully handle Mac line endings
|
||||||
return '<br />\n'.join(text.split('\r'))
|
return '<br />\n'.join(text.split('\r'))
|
||||||
|
|
||||||
def toUnicode(text, encoding='UTF-8'):
|
def toUnicode(value, encoding='UTF-8'):
|
||||||
if type(text) is not unicode:
|
if type(value) is not unicode:
|
||||||
return text.decode(encoding)
|
return value.decode(encoding)
|
||||||
else:
|
else:
|
||||||
return text
|
return value
|
||||||
|
|
||||||
|
|
||||||
def getObjectForUid(uid, intIds=None):
|
def getObjectForUid(uid, intIds=None):
|
||||||
|
|
Loading…
Add table
Reference in a new issue