[Checkins] SVN: z3c.reference/branches/flash/ Complete redesign of
the data handling for the reference.
Juergen Kartnaller
juergen at kartnaller.at
Fri Sep 14 04:51:50 EDT 2007
Log message for revision 79624:
Complete redesign of the data handling for the reference.
Changed:
U z3c.reference/branches/flash/buildout.cfg
U z3c.reference/branches/flash/src/z3c/reference/README.txt
U z3c.reference/branches/flash/src/z3c/reference/browser/README.txt
U z3c.reference/branches/flash/src/z3c/reference/browser/configure.zcml
U z3c.reference/branches/flash/src/z3c/reference/browser/tests.py
U z3c.reference/branches/flash/src/z3c/reference/browser/views.py
U z3c.reference/branches/flash/src/z3c/reference/browser/widget.py
U z3c.reference/branches/flash/src/z3c/reference/configure.zcml
U z3c.reference/branches/flash/src/z3c/reference/demo/README.txt
U z3c.reference/branches/flash/src/z3c/reference/demo/app.py
U z3c.reference/branches/flash/src/z3c/reference/demo/browser/README.txt
U z3c.reference/branches/flash/src/z3c/reference/demo/interfaces.py
U z3c.reference/branches/flash/src/z3c/reference/demo/tests.py
U z3c.reference/branches/flash/src/z3c/reference/interfaces.py
D z3c.reference/branches/flash/src/z3c/reference/property.py
U z3c.reference/branches/flash/src/z3c/reference/reference.py
U z3c.reference/branches/flash/src/z3c/reference/schema.py
U z3c.reference/branches/flash/src/z3c/reference/tests.py
-=-
Modified: z3c.reference/branches/flash/buildout.cfg
===================================================================
--- z3c.reference/branches/flash/buildout.cfg 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/buildout.cfg 2007-09-14 08:51:49 UTC (rev 79624)
@@ -1,5 +1,5 @@
[buildout]
-develop = .
+develop = . ../../../lovely.relation
parts = test importchecker instance
find-links = https://download.zope.org/distribution
https://download.lovelysystems.com/eggs/lovely
Modified: z3c.reference/branches/flash/src/z3c/reference/README.txt
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/README.txt 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/README.txt 2007-09-14 08:51:49 UTC (rev 79624)
@@ -2,144 +2,32 @@
Refererences to Objects
=======================
-Referenced objects must be adaptable to IKeyReference.
- >>> from z3c.reference.reference import ViewReference
- >>> from zope.annotation.interfaces import IAttributeAnnotatable
- >>> from zope.app.container.contained import Contained
- >>> from zope import interface
- >>> class O(Contained):
- ... interface.implements(IAttributeAnnotatable)
- ... def __init__(self,title):
- ... if title is not None:
- ... self.title = title
+ViewReference
+-------------
- >>> o = O(u"first")
- >>> o.title
- u'first'
+A view reference is used to store information about how to show the target of
+a relation. The reference is an annotation for a data relation.
- >>> ref = ViewReference(target=o)
- >>> ref.target is o
- True
+ >>> from z3c.reference.reference import viewReferenceFactory
+ >>> from zope import component
+ >>> component.provideAdapter(viewReferenceFactory)
- If we do not define a target the view is supposed to be absolute
- url. No further checks are done.
-
- >>> ref = ViewReference(view='abc')
- >>> ref.target is None
- True
-
-
-Reference Fields
-================
-
- >>> from zope.schema.fieldproperty import FieldProperty
- >>> from z3c.reference.schema import ViewReferenceField
- >>>
- >>> class IContent(interface.Interface):
- ... ref = ViewReferenceField(title=u"Reference")
- >>> class Content(object):
- ... interface.implements(IContent)
- ... ref = FieldProperty(IContent['ref'])
-
- >>> c = Content()
- >>> c.ref is None
- True
- >>> c.ref = object()
+ >>> from lovely.relation.dataproperty import DataRelationship
+ >>> from z3c.reference.interfaces import IViewReference
+ >>> rel = DataRelationship()
+ >>> viewRef = IViewReference(rel)
+ >>> viewRef
+ <z3c.reference.reference.ViewReference object at ...>
+ >>> viewRef.view = u'@resize?w=50&h=100'
Traceback (most recent call last):
...
- SchemaNotProvided
- >>> o2 = O(u'O2 Title')
- >>> c.ref = ViewReference(o2)
- >>> c.ref.target is o2
- True
+ WrongType: (u'@resize?w=50&h=100', <type 'str'>)
+ >>> viewRef.view = '@resize?w=50&h=100'
+ >>> viewRef.view
+ '@resize?w=50&h=100'
-Image Reference Fields
-======================
-
-ImageReferenceField is a special ViewReferenceField, which constraints
-the size and the object type to IImage
-
- >>> from z3c.reference.reference import ImageReference
- >>> from z3c.reference.schema import ImageReferenceField
- >>> from zope.schema.fieldproperty import FieldProperty
-
- On Image references the size is required.
-
- >>> class IContent(interface.Interface):
- ... img = ImageReferenceField(title=u"Image",size=(10,10))
- >>> class Content(object):
- ... interface.implements(IContent)
- ... img = FieldProperty(IContent['img'])
-
- >>> c = Content()
- >>> c.img is None
- True
- >>> c.img = object()
- Traceback (most recent call last):
- ...
- SchemaNotProvided
- >>> from zope.app.file.image import Image
- >>> from zope.app.file.interfaces import IImage
- >>> img = Image()
- >>> imgRef = ImageReference(img)
- >>> imgRef
- <z3c.reference.reference.ImageReference object at ...>
-
- >>> IContent['img'].schema.providedBy(imgRef)
- True
-
- >>> c.img = imgRef
- >>> c.img.target is img
- True
-
-
-Back references
-===============
-
-We need a referenced object which can be back referenced.
-
- >>> from z3c.reference.interfaces import (IViewReference,
- ... IReferenced)
- >>> from lovely.relation.property import (FieldRelationManager,
- ... RelationPropertyOut,
- ... RelationPropertyIn)
- >>> from z3c.reference.reference import viewReferenceRelated
- >>> class OWithBackRef(Contained):
- ... interface.implements(IReferenced)
- ... viewReferences = RelationPropertyIn(viewReferenceRelated)
- ... def __init__(self,title):
- ... if title is not None:
- ... self.title = title
-
-Create an object and reference to it.
-
- >>> t = OWithBackRef(u'target')
- >>> r1 = ViewReference(target=t);
-
-Check if object has a back reference.
-
- >>> t.viewReferences
- [<z3c.reference.reference.ViewReference ...>]
- >>> t.viewReferences[0] is r1
- True
-
-Add another reference. Check length.
-
- >>> r2 = ViewReference(target=t)
- >>> len(t.viewReferences)
- 2
-
-Try to remove a backreference. Not allowed.
-
- >>> t.viewReferences = [r1]
- Traceback (most recent call last):
- ...
- ValueError: ('viewReferences', 'field is readonly')
-
-
-
ViewReferenceSettings
---------------------
@@ -153,13 +41,17 @@
this works. By default, we get the DefaultViewReferenceSetting adapter for a
referenced object:
- >>> import zope.component
+ >>> from zope import interface
>>> from z3c.reference.interfaces import IViewReferenceSettings
>>> from z3c.reference.reference import DefaultViewReferenceSettings
- >>> zope.component.provideAdapter(DefaultViewReferenceSettings,
+ >>> component.provideAdapter(DefaultViewReferenceSettings,
... (interface.Interface,))
- >>> adapter = IViewReferenceSettings(o)
+ >>> class Content(object):
+ ... interface.implements(interface.Interface)
+ ... __name__ = None
+ >>> content = Content()
+ >>> adapter = IViewReferenceSettings(content)
>>> adapter
<DefaultViewReferenceSettings None>
@@ -167,3 +59,4 @@
>>> adapter.settings
{}
+
Modified: z3c.reference/branches/flash/src/z3c/reference/browser/README.txt
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/README.txt 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/README.txt 2007-09-14 08:51:49 UTC (rev 79624)
@@ -9,25 +9,41 @@
>>> from z3c.reference.schema import ViewReferenceField
>>> from zope.publisher.interfaces.browser import IBrowserRequest
>>> from z3c.reference.interfaces import IViewReference
+ >>> from lovely.relation.dataproperty import IDataRelationship
At first we need an interface for the context our widget used for. The
`ìntro`` filed defines a settingName which is used by the widget to
get information about which edit form for the reference should
be used.
+ >>> from zope import schema
>>> class IPage(zope.interface.Interface):
... """Interface for a page."""
- ...
... intro = ViewReferenceField(title=u'Intro',
... description=u'A intro text',
... settingName=u'introRefs')
-Let's create an IPage implementation.
+We define text which can be used as an intro.
+ >>> class IText(zope.interface.Interface):
+ ... """Interface for a text object."""
+ ... pages = schema.List(title=u'Pages',
+ ... value_type=schema.Object(IPage))
+
+ >>> class Text(object):
+ ... zope.interface.implements(IText)
+
+Now we can relate the page to his intro text using a relation manager.
+
+ >>> from lovely.relation.property import FieldRelationManager
+ >>> introRelationManager = FieldRelationManager(IPage['intro'], IText['pages'])
+
+Let's create an IPage implementation. The page needs a relation manager.
+
+ >>> from lovely.relation.dataproperty import DataRelationPropertyOut
>>> class Page(object):
- ...
... zope.interface.implements(IPage)
- ...
+ ... intro = DataRelationPropertyOut(introRelationManager)
... def __init__(self, name):
... self.__name__ = name
@@ -61,8 +77,8 @@
>>> from z3c.reference.interfaces import IViewReferenceOpener
>>> from z3c.reference.browser.views import DefaultViewReferenceOpener
>>> zope.component.provideAdapter(DefaultViewReferenceOpener,
- ... (IViewReference, IBrowserRequest),
- ... IViewReferenceOpener)
+ ... (IDataRelationship, IBrowserRequest),
+ ... IViewReferenceOpener)
>>> print widget()
<a class="popupwindow" href="http://127.0.0.1/Intro/viewReferenceEditor.html?target=&settingName=introRefs&name=field.intro" id="field.intro.tag" name="field.intro" onclick="" rel="window">
@@ -79,7 +95,6 @@
...
MissingInputError: ('field.intro', u'Intro', None)
-
Before we can store a view reference, we need at least another object which
our page can reference. Let's create a simple text object::
@@ -87,7 +102,6 @@
... """Interface for a text object."""
>>> class Text(object):
- ...
... zope.interface.implements(IText)
>>> text = Text()
@@ -103,10 +117,10 @@
Let us assign the text object here, so we can look at what the widget
renders if a target is defined.
- >>> from z3c.reference.reference import ViewReference
- >>> vr = ViewReference()
- >>> vr.target = text
- >>> page.intro = vr
+ >>> vrRel = Page.intro.new(text)
+ >>> page.intro = vrRel
+ >>> page.intro == vrRel
+ True
>>> field = IPage['intro']
>>> boundField = field.bind(page)
@@ -126,16 +140,16 @@
>>> from zope.formlib import form
>>> from zope.dublincore.interfaces import IZopeDublinCore
>>> class IntroRefsEditForm(form.EditForm):
- ... form_fields = form.Fields(IZopeDublinCore,
- ... IViewReference).select('title', 'description', 'view')
+ ... form_fields = form.Fields(IZopeDublinCore).select(
+ ... 'title', 'description')
And register it ...
>>> from z3c.reference.interfaces import IViewReferenceEditor
>>> zope.component.provideAdapter(IntroRefsEditForm,
- ... (zope.interface.Interface, IBrowserRequest),
- ... IViewReferenceEditor,
- ... name=u'introRefs')
+ ... (zope.interface.Interface, IBrowserRequest),
+ ... IViewReferenceEditor,
+ ... name=u'introRefs')
We also need to register the widgets.
@@ -144,26 +158,29 @@
>>> from zope.app.form.browser.interfaces import ISimpleInputWidget
>>> from zope.app.form.browser.interfaces import ITextBrowserWidget
>>> zope.component.provideAdapter(TextWidget,
- ... (ITextLine, IBrowserRequest), ITextBrowserWidget)
+ ... (ITextLine, IBrowserRequest),
+ ... ITextBrowserWidget)
>>> zope.component.provideAdapter(TextAreaWidget,
- ... (IText, IBrowserRequest), ISimpleInputWidget)
+ ... (IText, IBrowserRequest),
+ ... ISimpleInputWidget)
>>> zope.component.provideAdapter(BytesWidget,
- ... (IBytesLine, IBrowserRequest), ISimpleInputWidget)
+ ... (IBytesLine, IBrowserRequest),
+ ... ISimpleInputWidget)
So there is no formData for now, because we have no data on the reference.
>>> print widget()
<...name="field.intro.formData"
- ...value="form.title=&form.view=&form.description="...
+ ...value="form.title=&form.description="...
Let us write some data to it.
- >>> IZopeDublinCore(vr).title = u"The DC Title"
- >>> IZopeDublinCore(vr).description = "The DC Description \xc3\xa4".decode('utf8')
+ >>> IZopeDublinCore(vrRel).title = u"The DC Title"
+ >>> IZopeDublinCore(vrRel).description = "The DC Description \xc3\xa4".decode('utf8')
>>> print widget()
<...
- value="form.title=The+DC+Title&form.view=&form.description=The+DC+Description+%C3%A4"...
+ value="form.title=The+DC+Title&form.description=The+DC+Description+%C3%A4"...
Now we can setup a test request and set the values for the widget:
@@ -175,7 +192,7 @@
>>> widget = ViewReferenceWidget(boundField, request)
>>> reference = widget._toFieldValue(form)
>>> reference
- <z3c.reference.reference.ViewReference object at ...>
+ <DataRelationship None, <Text object at ...>, []>
>>> reference.target is text
True
@@ -186,9 +203,6 @@
>>> IZopeDublinCore(reference).description
u'New Description'
- >>> reference.view
- 'resized'
-
Let's save the new reference:
>>> page.intro = reference
@@ -207,7 +221,7 @@
>>> widget = ViewReferenceWidget(boundField, request)
>>> same = widget._toFieldValue(form)
>>> same
- <z3c.reference.reference.ViewReference object at ...>
+ <DataRelationship <Page object at ...>, <Text object at ...>, ['...intro:...pages']>
And compare the reference within the same object we got:
@@ -246,3 +260,4 @@
>>> 'http://127.0.0.1/content' in rendered
True
+
Modified: z3c.reference/branches/flash/src/z3c/reference/browser/configure.zcml
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/configure.zcml 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/configure.zcml 2007-09-14 08:51:49 UTC (rev 79624)
@@ -19,44 +19,12 @@
/>
<view
- type="zope.publisher.interfaces.browser.IBrowserRequest"
- for="..interfaces.IImageReferenceField"
- provides="zope.app.form.interfaces.IInputWidget"
- factory=".widget.ImageReferenceWidget"
- permission="zope.Public"
- />
-
- <view
- for="..interfaces.IViewReference"
- name="absolute_url"
- factory=".views.ViewReferenceAbsoluteURL"
- type="zope.publisher.interfaces.http.IHTTPRequest"
- permission="zope.Public"
- allowed_interface="zope.traversing.browser.interfaces.IAbsoluteURL"
- />
- <view
- for="..interfaces.IViewReference"
+ for="lovely.relation.interfaces.IDataRelationship"
factory=".views.DefaultViewReferenceOpener"
type="zope.publisher.interfaces.http.IHTTPRequest"
permission="zope.Public"
provides="..interfaces.IViewReferenceOpener"/>
- <view
- for="..interfaces.IViewReference"
- factory=".views.ViewReferenceAbsoluteURL"
- type="zope.publisher.interfaces.http.IHTTPRequest"
- permission="zope.Public"
- provides="zope.traversing.browser.interfaces.IAbsoluteURL"
- />
-
- <browser:page
- for="..interfaces.IViewReference"
- name="absolute_url"
- class=".views.ViewReferenceAbsoluteURL"
- permission="zope.Public"
- allowed_interface="zope.traversing.browser.interfaces.IAbsoluteURL"
- />
-
<resourceLibrary name="z3c.reference.parent"
require="z3c.javascript.jquery
z3c.javascript.swfobject">
@@ -107,4 +75,4 @@
attribute="__call__"
/>
-</configure>
\ No newline at end of file
+</configure>
Modified: z3c.reference/branches/flash/src/z3c/reference/browser/tests.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/tests.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/tests.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -30,20 +30,16 @@
from zope.dublincore.annotatableadapter import ZDCAnnotatableAdapter
from zope.dublincore.interfaces import IWriteZopeDublinCore
from zope.dublincore.testing import setUpDublinCore
-from zope.app.keyreference.testing import SimpleKeyReference
from zope.traversing.testing import browserView
-from zope.traversing.browser.interfaces import IAbsoluteURL
-from z3c.reference.interfaces import IViewReference
-from zope.traversing.browser.absoluteurl import AbsoluteURL
from zope.publisher.browser import BrowserPage
-from zope.app.publisher.browser.fileresource import FileResource, File
-from zope.app.testing.ztapi import browserResource
from zope.traversing.namespace import resource, view
+from zope.traversing.testing import setUp as setUpTraversing
+from zope.app.keyreference.testing import SimpleKeyReference
+from zope.app.testing.ztapi import browserResource
+
from lovely.relation import configurator
-from views import ViewReferenceAbsoluteURL
-from zope.traversing.testing import setUp as setUpTraversing
class TestPage(BrowserPage):
@@ -56,7 +52,7 @@
pass
def setUp(test):
-
+
site = setup.placefulSetUp(True)
test.globs['site'] = site
util = configurator.SetUpO2OStringTypeRelationships(site)
@@ -67,21 +63,13 @@
zope.component.provideAdapter(resource, (None, None), ITraversable, name="resource")
zope.component.provideAdapter(view, (None,), ITraversable, name="view")
zope.component.provideAdapter(view, (None, None), ITraversable, name="view")
-
-# path = os.path.dirname(__file__)
-# path = os.path.join(path, 'resources', 'imagetool.swf')
-# toolFile = File(path, 'imagetool.swf')
-# FileResource(toolFile, None)
-# toolFileResource = Resource
browserResource('imagetool.swf', Resource)
-
+
component.provideAdapter(SimpleKeyReference)
component.provideAdapter(ZDCAnnotatableAdapter,
provides=IWriteZopeDublinCore)
intids = IntIds()
component.provideUtility(intids, IIntIds)
- browserView(IViewReference, '', ViewReferenceAbsoluteURL,
- providing=IAbsoluteURL)
browserView(None,'index.html',TestPage)
Modified: z3c.reference/branches/flash/src/z3c/reference/browser/views.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/views.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/views.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -31,73 +31,13 @@
from zope.app.keyreference.interfaces import NotYet
from zc import resourcelibrary
+from lovely.relation.dataproperty import DataRelationship
+
from z3c.reference import interfaces
-from z3c.reference.reference import ViewReference
noImage = '/@@/z3c.reference.resources/noimage.jpg'
-class ViewReferenceAbsoluteURL(AbsoluteURL):
-
- """adapts a view reference to IAbsoluteURL
-
- >>> from z3c.reference.reference import ViewReference
- >>> from zope.publisher.browser import TestRequest
- >>> ref = ViewReference(view='http://www.zope.org/')
- >>> request = TestRequest()
- >>> view = ViewReferenceAbsoluteURL(ref, request)
- >>> view
- <z3c.reference.browser.views.ViewReferenceAbsoluteURL ...>
- >>> view()
- 'http://www.zope.org/'
-
- >>> ref = ViewReference(target=site)
- >>> view = ViewReferenceAbsoluteURL(ref, request)
- >>> view()
- 'http://127.0.0.1'
-
- >>> ref = ViewReference(target=site, view='index.html?x=1&y=2')
- >>> view = ViewReferenceAbsoluteURL(ref,request)
- >>> view()
- 'http://127.0.0.1/index.html?x=1&y=2'
- """
-
- def __init__(self, context, request):
- self.context = context.target
- self.view = context.view
- self.request = request
-
- def __str__(self):
- if self.context is not None:
- if self.context.__name__ or IContainmentRoot.providedBy(
- self.context):
- view = component.getMultiAdapter((self.context, self.request),
- IAbsoluteURL)
- try:
- url = view()
- except TypeError:
- return noImage
- if self.view is not None:
- url = '%s/%s' % (url, self.view.encode('utf8'))
- return url
- else:
- # the target ist lost TODO:
- return noImage
- elif self.view is not None:
- return self.view.encode('utf8')
-
- raise TypeError("Can't get absolute url of reference,"
- "because there is no target or view "
- "specified.")
- __call__=__str__
- def breadcrumbs(self):
- if self.context is not None:
- view = component.getMultiAdapter((self.context, self.request),
- IAbsoluteURL)
- return view.breadcrumbs()
- raise TypeError("Can't get breadcrumbs of external reference")
-
-
class ViewReferenceEditor(object):
"""View reference editor offering search and edit form setup.
The following objects are used:
@@ -125,7 +65,6 @@
class ViewReferenceEditorSearchDispatcher(object):
-
"""Return the IViewReferenceEditorSearch form for given setting
name"""
@@ -154,6 +93,7 @@
(target, request),
interfaces.IViewReferenceEditor, name=settingName)
+
def getOpenerView(ref, request, settingName):
def _adapter(o, name=u''):
@@ -162,11 +102,11 @@
interfaces.IViewReferenceOpener, name=name)
view = None
if ref is None:
- ref = ViewReference()
+ # we provide a default relationship instance
+ ref = DataRelationship(None, None)
target = None
else:
target = ref.target
-
if target is not None:
view = _adapter(target, settingName)
if view is None:
@@ -177,9 +117,8 @@
view = _adapter(ref)
return view
-class DefaultViewReferenceOpener(object):
-
+class DefaultViewReferenceOpener(object):
interface.implements(interfaces.IViewReferenceOpener)
__call__ = ViewPageTemplateFile('opener.pt')
@@ -202,7 +141,6 @@
return u'Undefined'
-
class ViewReferenceEditorDispatcher(object):
"""Return the edit IViewReferenceEditor for the target context
@@ -232,3 +170,4 @@
view = getEditorView(obj, self.request, self.settingNameStr)
return view()
return u''
+
Modified: z3c.reference/branches/flash/src/z3c/reference/browser/widget.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/widget.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/widget.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -20,10 +20,15 @@
from xml.dom.minidom import parse, parseString
import zope.component
+
+from zope.formlib import form
+from zope.security.proxy import removeSecurityProxy
+from zope.event import notify
from zope.traversing.browser import absoluteURL
from zope.traversing.interfaces import TraversalError
from zope.cachedescriptors.property import Lazy
from zope.publisher.browser import TestRequest
+
from zope.app.intid.interfaces import IIntIds
from zope.app.form.browser.widget import SimpleInputWidget
from zope.app.form.browser.textwidgets import TextWidget
@@ -31,30 +36,17 @@
from zope.app.form.browser.widget import renderElement
from zope.app.form.browser.textwidgets import BytesWidget
from zope.app.pagetemplate import ViewPageTemplateFile
-from zope.event import notify
-from zope.lifecycleevent import ObjectCreatedEvent
+
from zc import resourcelibrary
+
from z3c.reference import interfaces
-from z3c.reference.reference import ViewReference,ImageReference
+
+from lovely.relation.dataproperty import DataRelationship
+
from views import getEditorView, getOpenerView
from serialize import serializeForm
-from zope.formlib import form
-from zope.security.proxy import removeSecurityProxy
-untitled = u'No Link defined'
-undefined = u'Undefined'
-emptyViewReference = None
-emptyImageReference = ImageReference(
- view='/@@/z3c.reference.resources/noimage.jpg')
-
-def getText(nodelist):
- rc = ""
- for node in nodelist:
- if node.nodeType == node.TEXT_NODE:
- rc = rc + node.data
- return rc
-
class ViewReferenceWidget(TextWidget):
"""renders an "a" tag with the title and href attributes."""
@@ -66,7 +58,7 @@
extra = u'rel="window"'
refTag = u'a'
refTagOnClick=""
- _emptyReference = emptyViewReference
+ _emptyReference = None
referenceExplorerViewName = 'viewReferenceEditor.html'
def __init__(self, *args):
@@ -75,7 +67,7 @@
@property
def referenceEditorURL(self):
- """Returns the refrence explorer url."""
+ """Returns the reference explorer url."""
return absoluteURL(self.context.context, self.request) + '/%s?%s' % (
self.referenceExplorerViewName,
urllib.urlencode({'settingName' : self.context.settingName,
@@ -142,9 +134,7 @@
else:
return u''
-
def __call__(self):
-
resourcelibrary.need('z3c.reference.parent')
if self._renderedValueSet():
ref = self._data
@@ -158,8 +148,6 @@
openerView = getOpenerView(ref, self.request,
self.context.settingName)
contents = openerView()
- if ref is None:
- ref = ViewReference()
targetName = self.name + '.target'
formDataName = self.name + '.formData'
@@ -190,7 +178,7 @@
contents=contents,
style=self.style,
extra=self.extra)
- return self.template(linkTag=linkTag, intidInput=intidInput,
+ return self.template(linkTag=linkTag, intidInput=intidInput,
formDataInput=formDataInput, refIdInput=refIdInput)
def _getFormValue(self):
@@ -213,18 +201,13 @@
if input == self._missing:
return self.context.missing_value
-
+ intIds = zope.component.getUtility(IIntIds)
# XXX this does not work with lists
refId = self.request.form.get(self.refIdName)
- intIds = zope.component.getUtility(IIntIds)
+ ref = None
if refId:
ref = intIds.getObject(int(refId))
- else:
- ref = ViewReference()
- ref.__parent__ = removeSecurityProxy(self.context.context)
- #notify(ObjectCreatedEvent(ref))
-
# form field ids
formDataName = self.name + '.formData'
targetName = self.name + '.target'
@@ -237,7 +220,10 @@
obj = intIds.queryObject(int(intid))
if obj is None:
return self.context.missing_value
- ref.target = obj
+ if ref is None:
+ ref = DataRelationship(obj)
+ else:
+ ref.target = obj
# apply the form data
formData = self.request.get(formDataName)
@@ -257,12 +243,14 @@
view.update()
return ref
+
class ApplyForm(form.EditForm):
def __init__(self, context, request, form_fields):
self.form_fields = form_fields
super(ApplyForm, self).__init__(context, request)
+
class ObjectReferenceWidget(ViewReferenceWidget):
@Lazy
@@ -273,81 +261,6 @@
name
-class ImageReferenceWidget(ViewReferenceWidget):
-
- """renders an "a" tag with the title and href attributes
-
- if no target
-
- >>> from zope.publisher.browser import TestRequest
- >>> from z3c.reference.schema import ImageReferenceField
- >>> from zope.app.folder import Folder
- >>> f = Folder()
- >>> site['folder'] = f
- >>> field = ImageReferenceField(title=(u'Title of Field'),
- ... __name__='ref',size=(10,10))
- >>> request = TestRequest()
- >>> w = ImageReferenceWidget(field,request)
- >>> print w()
- <input .../><img ...height="10" id="field.ref.tag" .../>
-
- """
-
-
-
- refTag = u'img'
- _emptyReference = emptyImageReference
- extra = u''
-
-
- def __call__(self):
- hidden = super(ViewReferenceWidget,self).__call__()
- if self._renderedValueSet():
- ref = self._data
- else:
- ref = self.context.default
- if not ref:
- try:
- ref = self.context.get(self.context.context)
- except:
- ref = None
- if ref is None:
- ref = self._emptyReference
- url = absoluteURL(ref, self.request)
- else:
- # return uid instead of absoluteURL cuz of umlaut problems
- url = str(absoluteURL(ref.target,self.request)) + '/' + ref.view
- if ref.target is not None:
- title = getattr(ref.target,'title',None) or \
- ref.target.__name__
- else:
- title = untitled
- width,height = self.context.size
- kwords = dict(src=url,
- name=self.name,
- id=self.name + '.tag',
- title=title,
- alt=title,
- width=width,
- height=height,
- onclick=self.refTagOnClick,
- style=self.style,
- extra=self.extra)
- tag = renderElement(self.refTag,**kwords)
- return hidden + tag
-
-
- def _toFormValue(self, value):
- if value == self.context.missing_value:
- return self._missing
- try:
- # return uid instead of absoluteURL cuz of umlaut problems
- url = str(absoluteURL(value.target,self.request)) + '/' + value.view
- except TypeError:
- return self._missing
- return url
-
-
class CropImageWidget(BytesWidget):
"""widget for cropping images"""
@@ -355,19 +268,17 @@
keepAspect = False
cropWidth = 50
cropHeight = 50
-
+
def url(self):
return absoluteURL(self.context.context, self.request)
-
+
def inputField(self):
return super(CropImageWidget, self).__call__()
def escapedName(self):
return self.name.replace('.', r'\.')
-
+
def __call__(self, *args, **kw):
resourcelibrary.need('z3c.javascript.swfobject')
return self.template(*args, **kw)
-
-
Modified: z3c.reference/branches/flash/src/z3c/reference/configure.zcml
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/configure.zcml 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/configure.zcml 2007-09-14 08:51:49 UTC (rev 79624)
@@ -3,13 +3,20 @@
i18n_domain="z3c.reference"
>
- <class class="z3c.reference.reference.ViewReference">
- <allow interface=".interfaces.IViewReference"/>
+ <class class=".reference.ViewReference">
+ <require
+ permission="zope.View"
+ interface=".interfaces.IViewReference"
+ />
+ <require
+ permission="zope.ManageContent"
+ set_schema=".interfaces.IViewReference"
+ />
</class>
- <class class="z3c.reference.reference.ImageReference">
- <allow interface=".interfaces.IImageReference"/>
- </class>
+ <adapter
+ factory=".reference.viewReferenceFactory"
+ trusted="True"/>
<adapter
for="zope.interface.Interface"
@@ -18,4 +25,4 @@
<include package=".browser"/>
-</configure>
\ No newline at end of file
+</configure>
Modified: z3c.reference/branches/flash/src/z3c/reference/demo/README.txt
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/demo/README.txt 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/demo/README.txt 2007-09-14 08:51:49 UTC (rev 79624)
@@ -6,15 +6,14 @@
>>> from z3c.reference.demo.app import (DemoFolder,
... DemoImage)
- >>> from z3c.reference.reference import ViewReference
Let's create some DemoFolders and let them reference themselves.
>>> f1 = DemoFolder()
>>> f2 = DemoFolder()
>>> f3 = DemoFolder()
- >>> r1 = ViewReference(target=f2)
- >>> r2 = ViewReference(target=f3)
+ >>> r1 = DemoFolder.assets.new(f2)
+ >>> r2 = DemoFolder.assets.new(f3)
>>> f1.assets = [r1, r2]
Check reference target and parent.
@@ -23,62 +22,88 @@
2
>>> f1.assets[0].target is f2
True
- >>> f2.viewReferences[0].__parent__ is f1
+ >>> from lovely.relation.property import PropertyRelationManager
+ >>> manager = PropertyRelationManager(f2, 'viewReferences')
+ >>> refs = list(manager.getRelations('folder.assets'))
+ >>> refs[0].source is f1
True
Add another reference to demo folder 3.
- >>> r3 = ViewReference(target=f3)
+ >>> r3 = DemoFolder.assets.new(f3)
>>> f2.assets = [r3]
-Check size of backreferences and on valid parents.
+Check size of backreferences and on valid sources.
- >>> len(f3.viewReferences)
+ >>> manager = PropertyRelationManager(f3, 'viewReferences')
+ >>> refs = list(manager.getRelations('folder.assets'))
+ >>> len(refs)
2
- >>> f3.viewReferences[0].__parent__ is f1
+ >>> refs[0].source is f1
True
- >>> f3.viewReferences[1].__parent__ is f2
+ >>> refs[1].source is f2
True
Now we create a DemoImage and reference a DemoFolder with it.
>>> i1 = DemoImage()
- >>> r4 = ViewReference(target=i1)
+ >>> r4 = DemoFolder.assets.new(i1)
>>> f3.assets = [r4]
Check reference target and parent.
>>> f3.assets[0].target is i1
True
- >>> i1.viewReferences[0].__parent__ is f3
+ >>> manager = PropertyRelationManager(i1, 'viewReferences')
+ >>> refs = list(manager.getRelations('folder.assets'))
+ >>> refs[0].source is f3
True
Add another reference to i1.
- >>> r5 = ViewReference(target=i1)
+ >>> r5 = DemoFolder.assets.new(i1)
>>> f2.assets = [r5]
>>> f2.assets[0].target is i1
True
- >>> i1.viewReferences[1].__parent__ is f2
+ >>> manager = PropertyRelationManager(i1, 'viewReferences')
+ >>> refs = list(manager.getRelations('folder.assets'))
+ >>> refs[1].source is f2
True
- >>> len(i1.viewReferences)
+ >>> len(refs)
2
+We add i1 as previewImage to f2.
+
+ >>> rr = DemoFolder.previewImage.new(i1)
+ >>> f2.previewImage = rr
+ >>> refs = list(manager.getRelations('folder.assets'))
+ >>> len(refs)
+ 2
+
+Now we have a backref from 'folder.previewImage'.
+
+ >>> refs = list(manager.getRelations('folder.previewImage'))
+ >>> len(refs)
+ 1
+ >>> refs = list(manager.getAllRelations())
+ >>> len(refs)
+ 3
+
Sets the previewImage for f1.
>>> i2 = DemoImage()
- >>> r6 = ViewReference(target=i2)
+ >>> r6 = DemoFolder.previewImage.new(i2)
>>> f1.previewImage = r6
Check reference target and parent
>>> f1.previewImage.target is i2
True
- >>> i2.viewReferences[0].__parent__ is f1
+ >>> manager = PropertyRelationManager(i2, 'viewReferences')
+ >>> refs = list(manager.getRelations('folder.previewImage'))
+ >>> refs[0].source is f1
True
Settings
========
-
-
Modified: z3c.reference/branches/flash/src/z3c/reference/demo/app.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/demo/app.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/demo/app.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -17,39 +17,50 @@
__docformat__ = 'restructuredtext'
from zope import interface
+
from zope.schema.fieldproperty import FieldProperty
from zope.location.interfaces import ILocation
+
from zope.app.folder.folder import Folder
from zope.app.file.image import Image
+from z3c.reference.demo.interfaces import (IDemoFolder,
+ IDemoImage)
+from z3c.reference.interfaces import IReferenced
+
+from lovely.relation.dataproperty import DataRelationPropertyOut
from lovely.relation.property import (FieldRelationManager,
- RelationPropertyOut,
RelationPropertyIn)
-from z3c.reference.demo.interfaces import (IDemoFolder,
- IDemoImage)
-from z3c.reference.interfaces import (IViewReference,
- IReferenced)
-from z3c.reference.reference import viewReferenceRelated
-from z3c.reference.property import ViewReferenceProperty
+previewRelation = FieldRelationManager(IDemoFolder['previewImage'],
+ IReferenced['viewReferences'],
+ )
+assetsRelation = FieldRelationManager(IDemoFolder['assets'],
+ IReferenced['viewReferences'],
+ )
+
+
class DemoFolder(Folder):
"""Demo folder implementation."""
-
interface.implements(IDemoFolder, IReferenced)
- previewImage = ViewReferenceProperty(IDemoFolder['previewImage'])
- assets = ViewReferenceProperty(IDemoFolder['assets'])
-
- viewReferences = RelationPropertyIn(viewReferenceRelated)
+ previewImage = DataRelationPropertyOut(previewRelation,
+ relType='folder.previewImage',
+ )
+ assets = DataRelationPropertyOut(assetsRelation,
+ relType='folder.assets',
+ )
+ viewReferences = RelationPropertyIn(assetsRelation)
+
class DemoImage(Image):
"""Demo image implementation."""
-
interface.implements(IDemoImage, IReferenced, ILocation)
__name__ = __parent__ = None
- viewReferences = RelationPropertyIn(viewReferenceRelated)
+ viewReferences = RelationPropertyIn(previewRelation)
+
Modified: z3c.reference/branches/flash/src/z3c/reference/demo/browser/README.txt
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/demo/browser/README.txt 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/demo/browser/README.txt 2007-09-14 08:51:49 UTC (rev 79624)
@@ -9,5 +9,4 @@
>>> browser.open('http://localhost/manage')
>>> browser.url
'http://localhost/@@contents.html'
-
Modified: z3c.reference/branches/flash/src/z3c/reference/demo/interfaces.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/demo/interfaces.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/demo/interfaces.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -39,26 +39,9 @@
settingName=u''),
required=False,
default=[])
-
+
class IDemoImage(IImage):
""" demo image"""
-# view code example
-
-# field.settings
-# component.queryMultiAdapter((context.target, self.request),
-# IViewReferenceSettings, name=field.settings)
-
-# definition of settings
-
-#def demoImageSettings(image):
-
-
-# return dict(ratio = (16,9))
-
-
-#def demoFolderPreviewSettings(context):
-
-
Modified: z3c.reference/branches/flash/src/z3c/reference/demo/tests.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/demo/tests.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/demo/tests.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -46,12 +46,12 @@
def test_suite():
return unittest.TestSuite(
- (
- DocFileSuite('README.txt',
- setUp=setUp,tearDown=tearDown,
- optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
- ),
- ))
+ (DocFileSuite('README.txt',
+ setUp=setUp,tearDown=tearDown,
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+ ),
+ )
+ )
if __name__ == '__main__':
unittest.main(defaultTest='test_suite')
Modified: z3c.reference/branches/flash/src/z3c/reference/interfaces.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/interfaces.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/interfaces.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -106,4 +106,3 @@
"""Marker interface for view reference opener views. The one that
are displayed in the parent window"""
-
Deleted: z3c.reference/branches/flash/src/z3c/reference/property.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/property.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/property.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -1,62 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-$Id: schema.py 79462 2007-09-04 16:14:53Z rogerineichen $
-"""
-__docformat__ = 'restructuredtext'
-
-import types
-
-_marker = object()
-
-
-class ViewReferenceProperty(object):
- """A property that takes care of setting __parent__ for all reference
- objects when being set on the content object.
- """
-
- def __init__(self, field, name=None):
- if name is None:
- name = field.__name__
-
- self.__field = field
- self.__name = name
-
- def __get__(self, inst, klass):
- if inst is None:
- return self
-
- value = inst.__dict__.get(self.__name, _marker)
- if value is _marker:
- field = self.__field.bind(inst)
- value = getattr(field, 'default', _marker)
- if value is _marker:
- raise AttributeError(self.__name)
-
- return value
-
- def __set__(self, inst, value):
- field = self.__field.bind(inst)
- field.validate(value)
- if field.readonly and inst.__dict__.has_key(self.__name):
- raise ValueError(self.__name, 'field is readonly')
- if type(value) in (types.ListType, types.TupleType):
- for ref in value:
- ref.__parent__ = inst
- else:
- value.__parent__ = inst
- inst.__dict__[self.__name] = value
-
- def __getattr__(self, name):
- return getattr(self.__field, name)
Modified: z3c.reference/branches/flash/src/z3c/reference/reference.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/reference.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/reference.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -18,69 +18,34 @@
import persistent
-import zope.interface
-import zope.component
-from zope.dublincore.property import DCProperty
+from zope import interface
+from zope import component
+
+from zope.annotation.factory import factory
from zope.schema.fieldproperty import FieldProperty
-from zope.annotation.interfaces import IAttributeAnnotatable
-from lovely.relation.property import (FieldRelationManager,
- RelationPropertyOut)
+
from z3c.reference import interfaces
+from lovely.relation.interfaces import IDataRelationship
-viewReferenceRelated = FieldRelationManager(
- interfaces.IViewReference['target'],
- interfaces.IReferenced['viewReferences'])
-
class ViewReference(persistent.Persistent):
+ interface.implements(interfaces.IViewReference)
+ component.adapts(IDataRelationship)
- zope.interface.implements(interfaces.IViewReference, IAttributeAnnotatable)
-
view = FieldProperty(interfaces.IViewReference['view'])
- target = RelationPropertyOut(viewReferenceRelated)
- title = DCProperty('title')
- description = DCProperty('description')
-
- def __init__(self,target=None,view=None):
- if target is not None:
- self.target = target
- if view is not None:
- self.view = view
+viewReferenceFactory = factory(ViewReference)
- def __eq__(self,other):
- if not other:
- return False
- if interfaces.IViewReference.providedBy(other):
- return (self.view == other.view) and \
- (self.target is other.target)
- return False
- def __ne__(self,other):
- if not other:
- return True
- if interfaces.IViewReference.providedBy(other):
- return (self.view != other.view) or \
- (self.target != other.target)
- return True
-
-
-class ImageReference(ViewReference):
- zope.interface.implements(interfaces.IImageReference)
-
-
class DefaultViewReferenceSettings(object):
"""Default view reference settings adapter."""
+ interface.implements(interfaces.IViewReferenceSettings)
- zope.interface.implements(interfaces.IViewReferenceSettings)
-
def __init__(self, context):
self.context = context
- @property
- def settings(self):
- return {}
+ settings = {}
def __repr__(self):
return '<%s %r>' % (self.__class__.__name__, self.context.__name__)
Modified: z3c.reference/branches/flash/src/z3c/reference/schema.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/schema.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/schema.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -16,36 +16,44 @@
"""
__docformat__ = 'restructuredtext'
+import types
+
from zope import schema,interface
+
+from lovely.relation.interfaces import IDataRelationship
+
from z3c.reference import interfaces
-import types
class ViewReferenceField(schema.Object):
interface.implements(interfaces.IViewReferenceField)
def __init__(self, **kw):
- settingName = kw.pop('settingName', u'')
- self.settingName = settingName
- super(ViewReferenceField,self).__init__(interfaces.IViewReference,
- **kw)
+ self.settingName = kw.pop('settingName', u'')
+ super(ViewReferenceField,self).__init__(
+ interfaces.IViewReference, **kw)
+ def _validate(self, value):
+ if not IDataRelationship.providedBy(value):
+ raise SchemaNotProvided('IDataRelationship')
+
class ImageReferenceField(schema.Object):
interface.implements(interfaces.IImageReferenceField)
+
size = schema.fieldproperty.FieldProperty(
- interfaces.IImageReferenceField['size'])
-
- def __init__(self,**kw):
+ interfaces.IImageReferenceField['size'])
+
+ def __init__(self, **kw):
self.size = kw.pop('size',None)
- super(ImageReferenceField,self).__init__(interfaces.IImageReference,
- **kw)
+ super(ImageReferenceField,self).__init__(
+ interfaces.IImageReference, **kw)
class ObjectReferenceField(ViewReferenceField):
interface.implements(interfaces.IObjectReferenceField)
- def __init__(self,refSchema,**kw):
+ def __init__(self, refSchema, **kw):
self.refSchema = refSchema
super(ObjectReferenceField,self).__init__(**kw)
Modified: z3c.reference/branches/flash/src/z3c/reference/tests.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/tests.py 2007-09-14 08:46:41 UTC (rev 79623)
+++ z3c.reference/branches/flash/src/z3c/reference/tests.py 2007-09-14 08:51:49 UTC (rev 79624)
@@ -45,7 +45,6 @@
def test_suite():
-
return unittest.TestSuite(
(
DocFileSuite('README.txt',
More information about the Checkins
mailing list