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>