def set(self, instance, value, **kwargs): """ Assign input value to object. If mimetype is not specified, pass to processing method without one and add mimetype returned to kwargs. Assign kwargs to instance. """ if value is None: # nothing to do return TextField.set(self, instance, value, **kwargs) if isinstance(value, BaseUnit): # Baseunit: can occur when overriding atct text fields. value = value() if not isinstance(value, basestring): value.seek(0) value = value.read() # build list of uids from the value here uids = [m.group('uid') for m in UID_PATTERN.finditer(value)] uids = dict.fromkeys(uids).keys() # Remove duplicate uids. tool = getToolByName(instance, REFERENCE_CATALOG) relationship = self.relationship if relationship is None: relationship = self.__name__ targetUIDs = [ ref.targetUID for ref in tool.getReferences(instance, relationship) ] add = [v for v in uids if v and v not in targetUIDs] sub = [t for t in targetUIDs if t not in uids] # tweak keyword arguments for addReference addRef_kw = kwargs.copy() addRef_kw.setdefault('referenceClass', self.referenceClass) if addRef_kw.has_key('schema'): del addRef_kw['schema'] for uid in add: __traceback_info__ = (instance, uid, value, targetUIDs) try: # throws ReferenceException if uid is invalid tool.addReference(instance, uid, relationship, **addRef_kw) except ReferenceException: pass for uid in sub: tool.deleteReference(instance, uid, relationship)
def set(self, instance, value, **kwargs): """ Assign input value to object. If mimetype is not specified, pass to processing method without one and add mimetype returned to kwargs. Assign kwargs to instance. """ if value is None: # nothing to do return TextField.set(self, instance, value, **kwargs) if isinstance(value, BaseUnit): # Baseunit: can occur when overriding atct text fields. value = value() if not isinstance(value, basestring): value.seek(0); value = value.read() # build list of uids from the value here uids = [ m.group('uid') for m in UID_PATTERN.finditer(value) ] uids = dict.fromkeys(uids).keys() # Remove duplicate uids. tool = getToolByName(instance, REFERENCE_CATALOG) relationship = self.relationship if relationship is None: relationship = self.__name__ targetUIDs = [ref.targetUID for ref in tool.getReferences(instance, relationship)] add = [v for v in uids if v and v not in targetUIDs] sub = [t for t in targetUIDs if t not in uids] # tweak keyword arguments for addReference addRef_kw = kwargs.copy() addRef_kw.setdefault('referenceClass', self.referenceClass) if addRef_kw.has_key('schema'): del addRef_kw['schema'] for uid in add: __traceback_info__ = (instance, uid, value, targetUIDs) try: # throws ReferenceException if uid is invalid tool.addReference(instance, uid, relationship, **addRef_kw) except ReferenceException: pass for uid in sub: tool.deleteReference(instance, uid, relationship)
def convert(self, data, idata, filename=None, **kwargs): """convert the data, store the result in idata and return that optional argument filename may give the original file name of received data additional arguments given to engine's convert, convertTo or __call__ are passed back to the transform The object on which the translation was invoked is available as context (default: None) """ context = kwargs.get('context', None) template = context.kupu_captioned_image if context: at_tool = context.archetype_tool rc = at_tool.reference_catalog if context and at_tool: def replaceImage(match): tag = match.group('pat0') or match.group('pat1') attrs = ATTR_PATTERN.match(tag) atag = match.group('atag0') or match.group('atag1') src = attrs.group('src') subtarget = None m = SRC_TAIL.match(tag, attrs.end('src')) if m: srctail = m.group(1) else: srctail = None if src: d = attrs.groupdict() target = self.resolveuid(context, rc, src) if target: d['class'] = attrs.group('class') d['originalwidth'] = attrs.group('width') d['originalalt'] = attrs.group('alt') d['url_path'] = target.absolute_url_path() #d['caption'] = newline_to_br(html_quote(target.Description())) ##get licenseinfo here license = target.restrictedTraverse('@@copyright_byline_view').getLicenseByline() licenseinfo = '' if license[2] != 'All Rights Reserved': licenseinfo += 'Image: %s, <a href="%s" title="%s" alt="%s">%s</a>.' % (license[1], license[3],license[2],license[2],license[2]) else: licenseinfo += 'Image: %s, %s.' % (license[1], license[2]) d['caption'] = licenseinfo d['image'] = d['fullimage'] = target d['tag'] = None d['isfullsize'] = True d['width'] = target.width if srctail: if isinstance(srctail, unicode): srctail =srctail.encode('utf8') # restrictedTraverse doesn't accept unicode try: subtarget = target.restrictedTraverse(srctail) except: subtarget = getattr(target, srctail, None) if subtarget: d['image'] = subtarget if srctail.startswith('image_'): d['tag'] = target.getField('image').tag(target, scale=srctail[6:]) elif subtarget: d['tag'] = subtarget.tag() if d['tag'] is None: d['tag'] = target.tag() if d['originalwidth'] is None: #create relative url based tag url = makeUrlRelative(target.absolute_url(),context.absolute_url())[0] d['tag'] = '<img src="%s" alt="%s" height="%s" width="%s" />' % (url, d['originalalt'], target.height, target.width ) if subtarget: d['isfullsize'] = subtarget.width == target.width and subtarget.height == target.height d['width'] = subtarget.width if atag: # Must preserve original link, don't overwrite with a link to the image d['isfullsize'] = True d['tag'] = "%s%s</a>" % (atag, d['tag']) return template(**d) return match.group(0) # No change if isinstance(data, unicode): data = data.decode('utf8') html = IMAGE_PATTERN.sub(replaceImage, data) # Replace urls that use UIDs with human friendly urls. def replaceUids(match): tag = match.group('tag') uid = match.group('uid') target = self.resolveuid(context, rc, uid) if target: try: url = target.getRemoteUrl() except AttributeError: url = target.absolute_url_path() return tag + url return match.group(0) html = UID_PATTERN.sub(replaceUids, html) if isinstance(html, unicode): html = html.encode('utf8') # Indexing requires a string result. idata.setData(html) return idata # No context to use for replacements, so don't bother trying. idata.setData(data) return idata
def convert(self, data, idata, filename=None, **kwargs): """convert the data, store the result in idata and return that optional argument filename may give the original file name of received data additional arguments given to engine's convert, convertTo or __call__ are passed back to the transform The object on which the translation was invoked is available as context (default: None) """ context = kwargs.get('context', None) at_tool = None template = context.kupu_captioned_image if context is not None: at_tool = context.archetype_tool rc = at_tool.reference_catalog if context is not None and at_tool is not None: def replaceImage(match): tag = match.group('pat0') or match.group('pat1') attrs = ATTR_PATTERN.match(tag) atag = match.group('atag0') or match.group('atag1') src = attrs.group('src') subtarget = None m = SRC_TAIL.match(tag, attrs.end('src')) if m is not None: srctail = m.group(1) else: srctail = None if src is not None: d = attrs.groupdict() target = self.resolveuid(context, rc, src) if target is not None: d['class'] = attrs.group('class') d['originalwidth'] = attrs.group('width') d['originalalt'] = attrs.group('alt') d['url_path'] = target.absolute_url_path() d['caption'] = newline_to_br(html_quote(target.Description())) d['image'] = d['fullimage'] = target d['tag'] = None d['isfullsize'] = True d['width'] = target.width if srctail: if isinstance(srctail, unicode): srctail =srctail.encode('utf8') # restrictedTraverse doesn't accept unicode try: subtarget = target.restrictedTraverse(srctail) except: subtarget = getattr(target, srctail, None) if subtarget is not None: d['image'] = subtarget if srctail.startswith('image_'): d['tag'] = target.getField('image').tag(target, scale=srctail[6:]) elif subtarget: d['tag'] = subtarget.tag() if d['tag'] is None: d['tag'] = target.tag() if subtarget is not None: d['isfullsize'] = subtarget.width == target.width and subtarget.height == target.height d['width'] = subtarget.width # strings that may contain non-ascii characters need to be decoded to unicode for key in ('caption', 'tag'): if isinstance(d[key], str): d[key] = d[key].decode('utf8', 'replace') if atag is not None: # Must preserve original link, don't overwrite with a link to the image d['isfullsize'] = True d['tag'] = "%s%s</a>" % (atag, d['tag']) result = template(**d) if isinstance(result, str): result = result.decode('utf8') return result return match.group(0) # No change if isinstance(data, str): # Transform for end user output should avoid erroring # if it can, so use 'replace' on decode. data = data.decode('utf8', 'replace') html = IMAGE_PATTERN.sub(replaceImage, data) # Replace urls that use UIDs with human friendly urls. def replaceUids(match): tag = match.group('tag') uid = match.group('uid') target = self.resolveuid(context, rc, uid) if target is not None: if getattr(aq_base(target), 'getRemoteUrl', None) is not None: url = target.getRemoteUrl() else: url = target.absolute_url_path() return tag + url return match.group(0) html = UID_PATTERN.sub(replaceUids, html) if isinstance(html, unicode): html = html.encode('utf8') # Indexing requires a string result. idata.setData(html) return idata # No context to use for replacements, so don't bother trying. idata.setData(data) return idata