Annotation of kupu/plone/ReftextField.py, revision 1.1.1.1
1.1 dwinter 1: from AccessControl import ClassSecurityInfo
2: from Products.CMFCore.utils import getToolByName
3: from Products.Archetypes.public import *
4: from Products.Archetypes.config import REFERENCE_CATALOG
5: from Products.Archetypes.Field import TextField
6: from Products.Archetypes.ReferenceEngine import Reference
7: from ZPublisher.HTTPRequest import FileUpload
8: import re
9:
10: # UID_PATTERN matches a UID in an anchor or image tag.
11: UID_PATTERN = re.compile(r'''<(?:a\b[^>]+href|img\b[^>]+src)="resolveuid/(?P<uid>[^">/]+)''', re.I)
12:
13: class ReftextField(TextField):
14: __implements__ = TextField.__implements__
15:
16: _properties = TextField._properties.copy()
17: _properties.update({
18: 'widget': RichWidget,
19: 'default_content_type' : 'text/html',
20: 'default_output_type' : 'text/x-html-captioned',
21: 'allowable_content_types' : ('text/html',),
22: 'relationship' : None, # defaults to field name
23: 'referenceClass' : Reference,
24: })
25:
26: security = ClassSecurityInfo()
27:
28: security.declarePrivate('set')
29: def set(self, instance, value, **kwargs):
30: """ Assign input value to object. If mimetype is not specified,
31: pass to processing method without one and add mimetype
32: returned to kwargs. Assign kwargs to instance.
33: """
34: if value is None:
35: # nothing to do
36: return
37:
38: TextField.set(self, instance, value, **kwargs)
39:
40: if not isinstance(value, basestring):
41: value.seek(0);
42: value = value.read()
43:
44: uids = UID_PATTERN.findall(value) # XXX: build list of uids from the value here
45: uids = dict.fromkeys(uids).keys() # Remove duplicate uids.
46:
47: tool = getToolByName(instance, REFERENCE_CATALOG)
48:
49: relationship = self.relationship
50: if relationship is None:
51: relationship = self.__name__
52:
53: targetUIDs = [ref.targetUID for ref in
54: tool.getReferences(instance, relationship)]
55:
56: add = [v for v in uids if v and v not in targetUIDs]
57: sub = [t for t in targetUIDs if t not in uids]
58:
59: # tweak keyword arguments for addReference
60: addRef_kw = kwargs.copy()
61: addRef_kw.setdefault('referenceClass', self.referenceClass)
62: if addRef_kw.has_key('schema'): del addRef_kw['schema']
63:
64: for uid in add:
65: __traceback_info__ = (instance, uid, value, targetUIDs)
66: try:
67: # throws ReferenceError if uid is invalid
68: tool.addReference(instance, uid, relationship, **addRef_kw)
69: except ReferenceError:
70: pass
71: for uid in sub:
72: tool.deleteReference(instance, uid, relationship)
73:
74: # print "Result was:",[ref.targetUID for ref in
75: # tool.getReferences(instance, relationship)]
76: # print "Objects:",[ref.getTargetObject() for ref in
77: # tool.getReferences(instance, relationship)]
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>