def set(self, instance, value, **kwargs): #set the existing images self._setCustomImages(instance, value, **kwargs) default = int(instance.REQUEST.get('defaultImage', 0)) customImageCount = int(instance.REQUEST.get('customImageCount', 0)) if default >= customImageCount: newDefault = default - customImageCount for index,fileObj in enumerate(value): try: fileObj.seek(0) except: continue data = fileObj.read() if not data: continue id=instance.generateUniqueId('Image') new_id = instance.invokeFactory('Image', id=id) obj = getattr(instance, new_id) if not obj: raise "File could not be created" filename = fileObj.filename obj.unmarkCreationFlag() obj.setImage(fileObj) obj.setTitle(filename) obj.reindexObject() if index == newDefault: ObjectField.set(self, instance, new_id, **kwargs)
def set(self, instance, value, **kwargs): if type(value) != type({}) and hasattr(value, 'keys'): new_value = {} new_value.update(value) value = new_value ObjectField.set(self, instance, value, **kwargs)
def _setCustomImages(self, instance, value, **kwargs): """ """ customImageCount = int(instance.REQUEST.get('customImageCount', 0)) default = int(instance.REQUEST.get('defaultImage', 0)) for i in range(customImageCount): func = instance.REQUEST.get('%s_%s_delete'%(self.getName(), i)) id = instance.REQUEST.get('%s_%s_id'%(self.getName(), i)) imageObj = instance.get(id) if func=='delete': #delete the image object obj_parent = imageObj.aq_inner.aq_parent obj_parent.manage_delObjects([imageObj.getId()]) instance.plone_utils.addPortalMessage(_(u'Deleted custom image.')) elif func=='nochange': pass else: # #overwrite with new image if exists newImageObj = instance.REQUEST.get('%s_%s_image'% (self.getName(), i)) if not newImageObj: continue mt_tool = getToolByName(instance,'mimetypes_registry') mimetype = str(mt_tool.classify(newImageObj.read(1024))) newImageObj.seek(0) data = newImageObj.read() imageObj.setImage(newImageObj) newFileName = newImageObj.filename imageObj.setTitle(newFileName) if default == i : id = instance.REQUEST.get('%s_%s_id'%(self.getName(), i)) ObjectField.set(self, instance, id, **kwargs)
def get(self, instance, **kwargs): """ Return DataGridField value Value is a list object of rows. If parameter mimetype == 'text/plain' is passed, a string containing all cell values concatenated together is returned. This is for site indexing services (DataGridField.searchable = true). """ if('mimetype' in kwargs and kwargs['mimetype'] == 'text/plain'): # Data is returned for text indexing # Concatenate all cell values buffer = StringIO.StringIO() value = ObjectField.get(self, instance, **kwargs) or () value = self.resetFixedRows(instance, value) for row in value: for col in self.getColumnIds(): buffer.write(row.get(col, '')) # separate the last word of a cell # and the first of the next cell buffer.write(' ') return encode(buffer.getvalue(), instance, **kwargs) else: # Return list containing all encoded rows value = ObjectField.get(self, instance, **kwargs) or () value = self.resetFixedRows(instance, value) data = [encode(v, instance, **kwargs) for v in value] return tuple(data)
def set(self, instance, value, **kwargs): """ Check if value is an actual date/time value. If not, attempt to convert it to one; otherwise, set to None. Assign all properties passed as kwargs to object. """ if not value: value = None ObjectField.set(self, instance, value, **kwargs)
def set(self, instance, value, **kwargs): """If value is not defined or equal to 0, set field to false; otherwise, set to true.""" if value in ['0', 'False', None, False, 0, 'No']: value = False else: value = True ObjectField.set(self, instance, value, **kwargs)
def set(self, instance, value, **kwargs): __traceback_info__ = value, type(value) if isinstance(value, basestring): value = value.split('\n') value = [decode(v.strip(), instance, **kwargs) for v in value if v and v.strip()] if config.ZOPE_LINES_IS_TUPLE_TYPE: value = tuple(value) ObjectField.set(self, instance, value, **kwargs)
def set(self, instance, value, **kwargs): """Mutator. ``value`` is a list of UIDs or one UID string to which I will add a reference to. None and [] are equal. Keyword arguments may be passed directly to addReference(), thereby creating properties on the reference objects. """ tool = getToolByName(instance, "reference_catalog") backtargetUIDs = [ref.sourceUID for ref in tool.getBackReferences(instance, self.relationship)] targetUIDs = [ref.targetUID for ref in tool.getReferences(instance, self.relationship)] if not self.multiValued and value and type(value) not in (type(()),type([])): value = (value,) if not value: value = () uids=[] for v in value: if type(v) in (type(''),type(u'')): uids.append(v) else: uids.append(v.UID()) toobj = lambda uid: tool.lookupObject(uid) add = [toobj(v) for v in uids if v and v not in targetUIDs + backtargetUIDs] sub = [toobj(t) for t in targetUIDs if t not in uids] backsub = [toobj(t) for t in backtargetUIDs if t not in uids] toreindex = [] addRef_kw = kwargs.copy() addRef_kw.setdefault('referenceClass', self.referenceClass) if addRef_kw.has_key('schema'): del addRef_kw['schema'] for obj in add: __traceback_info__ = (instance, obj.UID(), value, targetUIDs) if addRef_kw.get('isBackReference', None): src,tgt = obj, instance.UID() else: tgt,src = obj, instance.UID() tool.addReference(src, tgt, self.relationship, **addRef_kw) for obj in sub: tool.deleteReference(instance.UID(), obj, self.relationship) for obj in backsub: tool.deleteReference(obj, instance.UID(), self.relationship) if self.callStorageOnSet: ObjectField.set(self, instance, self.getRaw(instance), **kwargs) for obj in sub + backsub + add: obj.reindexObject()
def set_likert(self, instance, value, **kwargs): if type(value) in (str, unicode): value = [v.strip() for v in value.split(',')] elif type(value) in (tuple, list, set): newval = {} for i in range(0, len(value)): newval[str(i + 1)] = value[i] value = newval ObjectField.set(self, instance, value, **kwargs)
def set(self, instance, value, **kwargs): if type(value) in StringTypes: try: value = eval(value) # more checks to add? except: # what to catch here? pass value = self._to_dict(value) value = self._decode_strings(value, instance, **kwargs) ObjectField.set(self, instance, value, **kwargs)
def set(self, instance, value, **kwargs): if type(value) in StringTypes: try: value = eval(value) # more checks to add? except: # what to chatch here? pass value = self._to_dict(value) value = self._decode_strings(value, instance, **kwargs) ObjectField.set(self, instance, value, **kwargs)
def set(self, instance, value, **kwargs): __traceback_info__ = value, type(value) if isinstance(value, basestring): value = value.split('\n') value = [ decode(v.strip(), instance, **kwargs) for v in value if v and v.strip() ] if config.ZOPE_LINES_IS_TUPLE_TYPE: value = tuple(value) ObjectField.set(self, instance, value, **kwargs)
def set(self, instance, value, **kwargs): """Mutator. ``value`` is a list of UIDs or one UID string to which I will add a reference to. None and [] are equal. Keyword arguments may be passed directly to addReference(), thereby creating properties on the reference objects. """ tool = getToolByName(instance, REFERENCE_CATALOG) targetUIDs = [ref.sourceUID for ref in tool.getBackReferences(instance, self.relationship)] if not self.multiValued and value \ and type(value) not in (type(()), type([])): value = (value,) if not value: value = () # convertobjects to uids if necessary uids = [] for v in value: if type(v) in (type(''), type(u'')): uids.append(v) else: uids.append(v.UID()) 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) if uid: # throws IndexError if uid is invalid tool.addReference(tool.lookupObject(uid), instance.UID(), self.relationship, **addRef_kw) for uid in sub: tool.deleteReference(tool.lookupObject(uid), instance.UID(), self.relationship) if self.callStorageOnSet: #if this option is set the reference fields's values get written #to the storage even if the reference field never use the storage #e.g. if i want to store the reference UIDs into an SQL field ObjectField.set(self, instance, self.getRaw(instance), **kwargs)
def get(self, instance, **kwargs): value = ObjectField.get(self, instance, **kwargs) if getattr(self, 'raw', False): return value if value in [None, ""]: return value request = getattr(instance, "REQUEST", None) provider = self.key_provider(instance, request) #need to show the value instead of "msg_decrypt_filler" but just readonly #if not provider.canDecrypt(self): # return self.msg_decrypt_filler key = provider.getKey(self) if not key: return self.msg_cannot_crypt value = encryption.decrypt_value(key, value) # Decryption with the current key failed if value is None: return self.msg_bad_key return encode(value, instance, **kwargs)
def getRaw(self, instance, **kwargs): """Returns raw field value (possible wrapped in BaseUnit) """ value = ObjectField.get(self, instance, **kwargs) # getattr(instance, "Remarks") returns a BaseUnit if callable(value): value = value() return value
def validate_required(self, instance, value, errors): try: float(value.latitude) float(value.longitude) except (ValueError, TypeError): result = False else: result = True return ObjectField.validate_required(self, instance, result, errors)
def getAccessor(self, instance): ''' hook to post-generate the accessors for the subfields its a little bit hacky, because we need a special ClassGen here ''' if not getattr(self, 'already_bootstrapped', False): fields = self.getFields() ClassGen.generateMethods(instance.__class__, self.Schema()) self.already_bootstrapped = True return ObjectField.getAccessor(self, instance)
def set(self, instance, value, **kwargs): # Value is a list of tuple (<Answer:string>, <Checked:boolean>) if type(value) not in (ListType, TupleType): raise ValueError, "Value must be a list" for item in value: if not item or \ type(item) not in (ListType, TupleType) or \ len(item) != 2 or \ type(item[0]) not in (StringType, UnicodeType) or \ type(item[1]) not in (BooleanType,): raise ValueError, "list must contain tuple (<Answer:string>, <Checked:boolean>)" # Decode answer which is a string decoded_value = tuple([(decode(x[0].strip(), instance, **kwargs), x[1]) for x in value]) ObjectField.set(self, instance, decoded_value, **kwargs)
def set(self, instance, value, **kwargs): """Adds the value to the existing text stored in the field, along with a small divider showing username and date of this entry. """ if not value: return value = value.strip() date = DateTime().rfc822() user = getSecurityManager().getUser() username = user.getUserName() divider = "=== {} ({})".format(date, username) existing_remarks = instance.getRawRemarks() remarks = '\n'.join([divider, value, existing_remarks]) ObjectField.set(self, instance, remarks) # reindex the object after save to update all catalog metadata instance.reindexObject() # notify object edited event event.notify(ObjectEditedEvent(instance))
def set(self, instance, value, **kwargs): """ Check if value is an actual date/time value. If not, attempt to convert it to one; otherwise, set to None. Assign all properties passed as kwargs to object. """ if not value: value = None if type(value) in StringTypes: value = DateTimeFrom(value) if value and type(value) != DateTimeType: raise ValueError("Argument to MxDateTimeField must be either " "a string or a MxDateTime object, but " "got: %s" % repr(value)) ObjectField.set(self, instance, value, **kwargs)
def set(self, instance, value, **kwargs): """Adds the value to the existing text stored in the field, along with a small divider showing username and date of this entry. """ if not value: return if isinstance(value, RemarksHistory): # Override the whole history here history = value elif isinstance(value, (list, tuple)): # This is a list, convert to RemarksHistory remarks = map(lambda item: RemarksHistoryRecord(item), value) history = RemarksHistory(remarks) elif isinstance(value, RemarksHistoryRecord): # This is a record, append to the history history = self.get_history(instance) history.insert(0, value) elif isinstance(value, six.string_types): # Create a new history record record = self.to_history_record(value) # Append the new record to the history history = self.get_history(instance) history.insert(0, record) else: raise ValueError("Type not supported: {}".format(type(value))) # Store the data ObjectField.set(self, instance, history) # N.B. ensure updated catalog metadata for the snapshot instance.reindexObject() # notify object edited event event.notify(ObjectEditedEvent(instance)) # notify new remarks for e.g. later email notification etc. event.notify(RemarksAddedEvent(instance, history))
def get(self, instance, **kwargs): """ Return LikertField Data Result is a tuple of responses """ value = ObjectField.get(self, instance, **kwargs) if not value: return tuple() else: return value
def get(self, instance, **kwargs): """ Return LikertField Data Result is a tuple of responses """ value = ObjectField.get(self, instance, **kwargs) if value is None: return tuple([None] * len(questions)) else: return value
def get(self, instance, **kwargs): try: value = ObjectField.get(self, instance, **kwargs) or () data = [encode(v, instance, **kwargs) for v in value] except Exception: value = () data = [encode(v, instance, **kwargs) for v in value] if config.ZOPE_LINES_IS_TUPLE_TYPE: return tuple(data) else: return data
def set(self, instance, value, **kwargs): """Adds the value to the existing text stored in the field, along with a small divider showing username and date of this entry. """ if not value: return value = value.strip() date = DateTime().rfc822() user = getSecurityManager().getUser() username = user.getUserName() divider = "=== {} ({})".format(date, username) existing_remarks = instance.getRawRemarks() remarks = '\n'.join([divider, value, existing_remarks]) return ObjectField.set(self, instance, remarks)
def set(self, instance, value, **kwargs): """ If passed-in value is a string, split at line breaks and remove leading and trailing white space before storing in object with rest of properties. When 'storeCompletePath' is set the field will store all parent path segements. """ __traceback_info__ = value, type(value) if type(value) in STRING_TYPES: value = value.split('\n') value = [decode(v.strip(), instance, **kwargs) for v in value if v and v.strip()] # Expand tree if self.storeCompletePath: pathDict = dict([(item, True) for item in value]) for val in value: pathSections = val.split('/') currentPath = '' for path in pathSections: currentPath = "/".join([currentPath, path]) pathDict[currentPath] = True value = [item[1:] for item in pathDict.keys() if item[1:]] # Strip of leading . if self.storeOnlyLeaves: result = set() for v in value: if '/' in v: v = v.split('/')[-1] result.add(v) value = list(result) if config.ZOPE_LINES_IS_TUPLE_TYPE: value = tuple(value) ObjectField.set(self, instance, value, **kwargs)
def get(self, instance, **kwargs): """ Getter which returns value as sorted list of tuples. """ value = ObjectField.get(self, instance, **kwargs) or () data = [encode(v, instance, **kwargs) for v in value] adict = {} for record in data: try: value, key = json.loads(record) except ValueError: key = record value = None adict[key] = value return sortedDictValues(adict)
def getDefault(self, instance): default = ObjectField.getDefault(self, instance) if default: return default group = self.widget.getGroupId(instance) if not self.prefill_member: return default member = instance.portal_membership.getAuthenticatedMember() if not member: return default if self.limitToOwnGroups and group and group not in member.getGroups(): return default default = member.getId() return default
def get(self, instance, **kwargs): # Get the Expression expr = ObjectField.get(self, instance, **kwargs) # use a custom context if it has been passed in context = kwargs.get('expression_context') if context is None: context = getExprContext(instance, instance) # Expression's __call__ returns a context dictionary if the # expression's text is an empty string. We return None instead. if expr.text.strip(): # Return the evaluated expression value = expr(context) return encode(value, instance, **kwargs) else: return None
def getRaw(self, instance, **kwargs): value = deepcopy(ObjectField.get(self, instance, **kwargs) or []) safe_value = [] for query in value: safe_query = {} for k, v in query.items(): if type(v) is list: safe_v = [] for i in v: safe_v.append(safe_unicode(i)) safe_query[k] = safe_v elif type(v) is str: safe_query[k] = safe_unicode(v) else: safe_query[k] = v safe_value.append(safe_query) return safe_value
def get(self, instance, **kwargs): # Get Expressions exprs = ObjectField.get(self, instance, **kwargs) # use a custom context if it has been passed in context = kwargs.get('expression_context') if context is None: context = getExprContext(instance, instance) # Return evaluated expressions, and check for empty expr texts. value = [] for expr in exprs: if expr.text.strip(): line = expr(context) value.append(encode(line, instance, **kwargs)) else: value.append(None) return value
def set(self, instance, value, **kwargs): res = ObjectField.set(self, instance, value, **kwargs) if value is None: return res if isinstance(value, basestring): users = [value] elif type(value) in (types.ListType, types.TupleType): users = list(value) else: raise ValueError, 'only strings and lists/tuples allowed, but you provided the value %s' % value if self.localrole: localrole = self.localrole if isinstance(localrole, basestring): localrole = [localrole] setLocalRoles(instance, users, localrole, cumulative=self.cumulative) return res
def getDefault(self, instance): default = ObjectField.getDefault(self, instance) if default: return default # The field should not know about it's widget. from this point of view # this field sucks if hasattr(self.widget, 'getGroupId'): group = self.widget.getGroupId(instance) else: group = None if not self.prefill_member: return default member = instance.portal_membership.getAuthenticatedMember() if not member: return default if self.limitToOwnGroups and group and group not in member.getGroups(): return default default = member.getId() return default
def __init__(self, name=None, schema=None, **kwargs): ObjectField.__init__(self, name, **kwargs) if not schema: schema = self.schema.copy() self.setSchema(schema)
def set(self, instance, value, **kwargs): value = self._decode_strings(value, instance, **kwargs) value = FormattableName(value) ObjectField.set(self, instance, value, **kwargs)
def getRaw(self, instance, **kwargs): return ObjectField.get(self, instance, **kwargs) or ()
def validate_required(self, instance, value, errors): value = value or [] value = [d for d in value if d.get('orderindex_', '1').isdigit()] return ObjectField.validate_required(self, instance, value, errors)
def set(self, instance, value, **kwargs): """ Set the LikertField data """ if type(value) in (str, str): value = [v.strip() for v in value.split(',')] ObjectField.set(self, instance, value, **kwargs)
def set(self, instance, value, **kwargs): """Mutator. ``value`` is a list of UIDs or one UID string to which I will add a reference to. None and [] are equal. Keyword arguments may be passed directly to addReference(), thereby creating properties on the reference objects. """ tool = getToolByName(instance, "reference_catalog") backtargetUIDs = [ ref.sourceUID for ref in tool.getBackReferences(instance, self.relationship) ] targetUIDs = [ ref.targetUID for ref in tool.getReferences(instance, self.relationship) ] if not self.multiValued and value and type(value) not in (type( ()), type([])): value = (value, ) if not value: value = () uids = [] for v in value: if type(v) in (type(''), type(u'')): uids.append(v) else: uids.append(v.UID()) toobj = lambda uid: tool.lookupObject(uid) add = [ toobj(v) for v in uids if v and v not in targetUIDs + backtargetUIDs ] sub = [toobj(t) for t in targetUIDs if t not in uids] backsub = [toobj(t) for t in backtargetUIDs if t not in uids] toreindex = [] addRef_kw = kwargs.copy() addRef_kw.setdefault('referenceClass', self.referenceClass) if addRef_kw.has_key('schema'): del addRef_kw['schema'] for obj in add: __traceback_info__ = (instance, obj.UID(), value, targetUIDs) if addRef_kw.get('isBackReference', None): src, tgt = obj, instance.UID() else: tgt, src = obj, instance.UID() tool.addReference(src, tgt, self.relationship, **addRef_kw) for obj in sub: tool.deleteReference(instance.UID(), obj, self.relationship) for obj in backsub: tool.deleteReference(obj, instance.UID(), self.relationship) if self.callStorageOnSet: ObjectField.set(self, instance, self.getRaw(instance), **kwargs) for obj in sub + backsub + add: obj.reindexObject()
def set(self, instance, value, **kwargs): """ The passed in object should be a records object, or a sequence of dictionaries """ # Help to localize problems in Zope trace back __traceback_info__ = value, type(value) # we sanitize the values cleaned = [] doSort = False logging.debug("Setting DGF value to " + str(value)) if value == ({},): # With some Plone versions, it looks like that AT init # causes DGF to get one empty dictionary as the base value # and later, it will be appended as a cleaned row below if # we don't filter out it here. value = [] if isinstance(value, basestring): # replace () by [] value = value.strip() if value.startswith('('): value = "[%s]" % value[1:-1] # if simple quotes are used as separators, replace them by '"' if value.replace(' ', '')[2] == "'": value = value.replace("'", '"') value = json.loads(value) else: # Passed in value is a HTML form data # from DataGridWidget. Value is Python array, # each item being a dictionary with column_name : value mappins # + orderinder which is used in JS reordering for row in value: order = row.get('orderindex_', None) empty = True if order != "template_row_marker": # don't process hidden template row as # input data val = {} for col in self.getColumnIds(): row_value = row.get(col, '') # LinesColumn provides list, not string. if isinstance(row_value, basestring): val[col] = row_value.strip() else: val[col] = [value.strip() for value in row_value] if val[col]: empty = False if order is not None: try: order = int(order) doSort = True except ValueError: pass # create sortable tuples if (not self.allow_empty_rows) and empty: logger.debug("Filtered out an empty row") else: logger.debug("Appending cleaned row:" + str(val)) cleaned.append((order, val.copy())) if doSort: cleaned.sort() # remove order keys when sorting is complete value = tuple([x for (throwaway, x) in cleaned]) # fill in data ObjectField.set(self, instance, value, **kwargs)
def getRaw(self, instance, **kwargs): return deepcopy(ObjectField.get(self, instance, **kwargs) or [])
def get(self, instance, **kwargs): value = ObjectField.get(self, instance, **kwargs) return self._encode_strings(value, instance, **kwargs)
def get(self, instance, **kwargs): value = ObjectField.get(self, instance, **kwargs) or {} encoded_value = tuple([(encode(x[0], instance, **kwargs), x[1]) for x in value]) return encoded_value
def __init__(self, name=None, **kwargs): """ Create DataGridField instance """ # call super constructor ObjectField.__init__(self, name, **kwargs)
image = brain.getObject() field = image.Schema().get('image') value = field.getRaw(image) try: size = value.getSize() except AttributeError: print "Skipping %s" % image.absolute_url() continue if size[0] > max_size[0] or size[1] > max_size[1]: factor = min( float(max_size[0]) / float(value.width), float(max_size[1]) / float(value.height)) w = int(factor * value.width) h = int(factor * value.height) fvalue, format = field.scale(value.data, w, h) data = fvalue.read() if len(value.data) > len(data) + margin: print image.getId(), value.getSize(), len(value.data), len(data) ObjectField.set(field, image, data) obj_writes += 1 if obj_writes >= commit_at: print "committing" commit() obj_writes = 0 files_scaled += 1 saved += len(value.data) - len(data) commit() print "***********" print "Files scaled: %s, Bytes saved: %s" % (files_scaled, saved)