def getContentType(self, object=None, field=None, fieldname=None): context = aq_base(object) if context is not None and IBaseObject.providedBy(context): # support Archetypes fields if field is not None: pass elif fieldname is not None: field = context.getField(fieldname) or getattr( context, fieldname, None) else: field = context.getPrimaryField() if field and hasattr(aq_base(field), 'getContentType'): return field.getContentType(context) elif IRichText.providedBy(field): # support plone.app.textfield RichTextValues # First try to get a stored value and check its mimetype. mimetype = None if context is not None: value = getattr(context, fieldname, None) mimetype = getattr(value, 'mimeType', None) # Fall back to the field's default mimetype if mimetype is None: mimetype = field.default_mime_type return mimetype elif context is not None and fieldname is not None and '.widgets.' in fieldname: # We don't have the field object but we can at least try # to get the mimetype from an attribute on the object fieldname = fieldname.split('.widgets.')[-1] field = getattr(context, fieldname, None) mimetype = getattr(field, 'mimeType', None) if mimetype is not None: return mimetype return 'text/html'
def get_value_from_pipeline(self, field, item): name = field.getName() # setting value from the blueprint cue value = item.get(name, _marker) if value is _marker: # Also try _datafield_FIELDNAME structure from jsonify value = item.get('_datafield_%s' % name, _marker) if value is not _marker: # Value was given in pipeline, so set it deserializer = IDeserializer(field) if IRichText.providedBy(field)\ and '_content_type_%s' % name in item: # change jsonify structure to one we understand value = { 'contenttype': item['_content_type_%s' % name], 'data': value } files = item.setdefault(self.fileskey, {}) value = deserializer( value, files, item, self.disable_constraints, logger=self.log ) return value
def __call__(self): e = {} ob = self.context title = ob.Title() if type(title) != unicode: title.decode('utf-8') e[u'title'] = title e[u'author_name'] = self._getAuthorName() try: info = IPrimaryFieldInfo(ob) except TypeError: info = None if info is None: e[u'type'] = 'link' else: field = info.field if IRichText.providedBy(field): e[u'type'] = 'rich' e[u'html'] = info.value elif INamedImageField.providedBy(field): e[u'type'] = 'photo' e[u'url'] = ob.absolute_url() image = field.get(ob) e[u'width'], e['height'] = image.getImageSize() else: e[u'type'] = 'link' return e
def append_links(self, obj, link_objs): for name, field, schemata in self._iter_fields(obj.portal_type): storage = schemata(obj) fieldvalue = getattr(storage, name) if not fieldvalue: continue if IRelation.providedBy(field): if fieldvalue.isBroken(): link = Link() link.complete_information_for_broken_relation_with_broken_relation_obj( obj, field) link_objs.append(link) elif IURI.providedBy(field): link = Link() link.complete_information_with_external_path(obj, fieldvalue) link_objs.append(link) elif IRichText.providedBy(field): content = fieldvalue.raw self._extract_and_append_link_objs(content, obj, link_objs) return link_objs
def setTextField(obj, fieldname, text): text = six.text_type(text) obj_base = aq_base(obj) if getattr(obj_base, "Schema", None): # Archetypes field = obj_base.getField(fieldname) if field is None: logger.warn("Field %s not found for %s", fieldname, obj.getId()) return field.set(obj, text) else: # Dexterity field = getField(obj_base, fieldname) if field is None: logger.warn("Field %s not found for %s", fieldname, obj.getId()) return if IRichText.providedBy(field): # Get mimetype from old value. old = field.get(obj) if old is None: text = RichTextValue(text) else: text = RichTextValue(text, old.mimeType, old.outputMimeType) if ITuple.providedBy(field) and ITextLine.providedBy(field.value_type): text = tuple(text.split("\n")) setattr(field.interface(obj), field.__name__, text)
def getContentType(self, object=None, field=None, fieldname=None): context = aq_base(object) if context is not None and IBaseObject.providedBy(context): # support Archetypes fields if field is not None: pass elif fieldname is not None: field = context.getField(fieldname) or getattr(context, fieldname, None) else: field = context.getPrimaryField() if field and hasattr(aq_base(field), 'getContentType'): return field.getContentType(context) elif IRichText.providedBy(field): # support plone.app.textfield RichTextValues # First try to get a stored value and check its mimetype. mimetype = None if context is not None: value = getattr(context, fieldname, None) mimetype = getattr(value, 'mimeType', None) # Fall back to the field's default mimetype if mimetype is None: mimetype = field.default_mime_type return mimetype elif context is not None and fieldname is not None and '.widgets.' in fieldname: # We don't have the field object but we can at least try # to get the mimetype from an attribute on the object fieldname = fieldname.split('.widgets.')[-1] field = getattr(context, fieldname, None) mimetype = getattr(field, 'mimeType', None) if mimetype is not None: return mimetype return 'text/html'
def _setTextField(self, obj, fieldname, text): obj_base = aq_base(obj) if getattr(obj_base, 'Schema', None): # Archetypes field = obj_base.getField(fieldname) if field is None: logger.warn('Field %s not found for %s', fieldname, obj.getId()) return field.set(obj, text) else: # Dexterity field = self._getField(obj_base, fieldname) if field is None: logger.warn('Field %s not found for %s', fieldname, obj.getId()) return if IRichText.providedBy(field): # Get mimetype from old value. old = field.get(obj) if old is None: text = RichTextValue(text) else: text = RichTextValue( text, old.mimeType, old.outputMimeType) field.set(obj, text)
def _getTextFields(self, obj): # Get all text fields, except ones that are handled separately. text_fields = [] if getattr(aq_base(obj), 'Schema', None): # Archetypes for field in obj.Schema().values(): if field.__name__ in CUSTOM_HANDLED_TEXT_FIELDS: continue if not ITextField.providedBy(field): continue text_fields.append(field) elif HAS_DEXTERITY: # Dexterity for schemata in iterSchemata(obj): fields = getFieldsInOrder(schemata) for name, field in fields: if name in CUSTOM_HANDLED_TEXT_FIELDS: continue if IRichText.providedBy(field): text_fields.append(field) continue # ITextLine inherits from IText. # We want to replace in texts, but not textlines. # Maybe this can be made configurable. if ITextLine.providedBy(field): continue if not IText.providedBy(field): continue text_fields.append(field) return text_fields
def is_richtext_field(self, field): """ checks if field is a rich-text field """ if _.is_string(field): field = self.get_field(field) if HAS_PLONE_APP_TEXTFIELD: return IRichText.providedBy(field) return False
def _ce_fields(self): field_dict = {} for schemata in iterSchemata(self.context): for name, field in getFieldsInOrder(schemata): if ITextLine.providedBy(field) or \ IText.providedBy(field) or \ IRichText.providedBy(field): field_dict[name] = field return field_dict
def _ce_fields(self): field_dict = {} for schemata in iterSchemata(self.context): for name, field in getFieldsInOrder(schemata): if ITextLine.providedBy(field) or \ IText.providedBy(field) or \ IRichText.providedBy(field): field_dict[name] = field return field_dict
def htmlIDs(self): ids = [] fields = self._ce_fields.items() for name, field in fields: if ITextLine.providedBy(field) or IText.providedBy(field): ids.append('form-widgets-%s' % name) elif IRichText.providedBy(field): ids.append('form.widgets.%s' % name) # Talk about uniformity ;) return ids
def htmlIDs(self): ids = [] fields = self._ce_fields.items() for name, field in fields: if ITextLine.providedBy(field) or IText.providedBy(field): ids.append('form-widgets-%s' % name) elif IRichText.providedBy(field): ids.append('form.widgets.%s' % name) # Talk about uniformity ;) return ids
def add_hashtags(obj, event): """Adds hashtags to subject field. """ pattern = re.compile(r'\B#\w{1,}(?!")\b', re.UNICODE) fields = {} for schemata in iterSchemata(obj): for name, field in schema.getFields(schemata).items(): if IRichText.providedBy(field) and field.get(obj): for tag in pattern.findall(field.get(obj).raw): fields[tag[1:]] = '' fields = fields.keys() obj.subject = fields obj.reindexObject()
def clean_field(self, organization, fieldname, field): if ITextLine.providedBy(field): setattr(organization, fieldname, "") elif ITuple.providedBy(field): setattr(organization, fieldname, []) elif IBool.providedBy(field): setattr(organization, fieldname, False) elif IRichText.providedBy(field): richvalue = RichTextValue("", 'text/html', 'text/html') setattr(organization, fieldname, richvalue) else: logger("[Error] Field '%s' type is not recognised. " %(fieldname), "Field cannot be cleaned before sync.") return organization
def fix_at_image_scales(context=None): """Run this in Plone 5.x """ catalog = api.portal.get_tool('portal_catalog') query = {} if hasattr(catalog, "getAllBrains"): results = catalog.getAllBrains() else: results = catalog.unrestrictedSearchResults(**query) log.info('Starting migration of image scales in rich text fields.') for result in results: try: obj = result.getObject() except (KeyError, AttributeError): log.warning('Not possible to fetch object from catalog result for ' 'item: {0}.'.format(result.getPath())) continue changed = False for schema in iterSchemata(obj): fields = getFieldsInOrder(schema) for name, field in fields: if not IRichText.providedBy(field): continue text = getattr(obj.aq_base, name, None) if not text: continue clean_text = image_scale_fixer(text.raw, obj) if clean_text == text.raw: continue setattr( obj, name, RichTextValue(raw=clean_text, mimeType=text.mimeType, outputMimeType=text.outputMimeType, encoding=text.encoding)) changed = True log.info(u'Text cleanup in field {0} for {1}'.format( name, '/'.join(obj.getPhysicalPath()))) if changed: obj.reindexObject(idxs=('SearchableText', )) log.info(u'Text cleanup for {0}'.format('/'.join( obj.getPhysicalPath())))
def get_dummy_dexterity_value(obj, widget, data): value = None field = widget.field if interfaces.IChoice.providedBy(field): value = get_value_for_choice(obj, field) elif interfaces.ISet.providedBy(field) and \ interfaces.IChoice.providedBy(field.value_type): value = get_value_for_choice(obj, field.value_type) elif interfaces.IBool.providedBy(field): value = random.randint(0, 1) and True or False elif interfaces.ITextLine.providedBy(field): if HAS_USERANDGROUPSELECTIONWIDGET and \ IUserAndGroupSelectionWidget.providedBy(widget): mtool = api.portal.get_tool('portal_membership') mids = mtool.listMemberIds() value = mids[random.randint(0, len(mids) - 1 or 1)] else: length = getattr(field, 'max_length', None) value = unicode(get_text_line()[:length]) elif interfaces.IText.providedBy(field): if IWysiwygWidget.providedBy(widget): value = unicode(get_rich_text(data)) else: value = unicode(get_text_paragraph()) elif HAS_PLONE_APP_TEXTFIELD and IRichText.providedBy(field): value = unicode(get_rich_text(data)) elif interfaces.IDatetime.providedBy(field): days = random.random() * 10 * (random.randint(-1, 1) or 1) value = datetime.datetime.now() + datetime.timedelta(days, 0) elif interfaces.IDate.providedBy(field): days = random.random() * 10 * (random.randint(-1, 1) or 1) value = datetime.datetime.now() + datetime.timedelta(days, 0) return value
def get_dummy_dexterity_value(obj, widget, data): value = None field = widget.field if interfaces.IChoice.providedBy(field): value = get_value_for_choice(obj, field) elif interfaces.ISet.providedBy(field) and \ interfaces.IChoice.providedBy(field.value_type): value = get_value_for_choice(obj, field.value_type) elif interfaces.IBool.providedBy(field): value = random.randint(0, 1) and True or False elif interfaces.ITextLine.providedBy(field): if HAS_USERANDGROUPSELECTIONWIDGET and \ IUserAndGroupSelectionWidget.providedBy(widget): mtool = api.portal.get_tool('portal_membership') mids = mtool.listMemberIds() value = mids[random.randint(0, len(mids)-1 or 1)] else: length = getattr(field, 'max_length', None) value = unicode(get_text_line()[:length]) elif interfaces.IText.providedBy(field): if IWysiwygWidget.providedBy(widget): value = unicode(get_rich_text(data)) else: value = unicode(get_text_paragraph()) elif HAS_PLONE_APP_TEXTFIELD and IRichText.providedBy(field): value = unicode(get_rich_text(data)) elif interfaces.IDatetime.providedBy(field): days = random.random()*10 * (random.randint(-1, 1) or 1) value = datetime.datetime.now() + datetime.timedelta(days, 0) elif interfaces.IDate.providedBy(field): days = random.random()*10 * (random.randint(-1, 1) or 1) value = datetime.datetime.now() + datetime.timedelta(days, 0) return value
def get_default_value_by_schema(self, field): type_field = " " if IRelationList.providedBy(field): type_field = [] elif "ListField" in str(field): type_field = [] self.datagrids[field.__name__] = False elif IChoice.providedBy(field): type_field = " " elif ITextLine.providedBy(field): type_field = " " elif IList.providedBy(field): type_field = [] elif IText.providedBy(field): type_field = " " elif IRichText.providedBy(field): type_field = " " else: type_field = " " return type_field
def get_fieldtype_by_schema(self, field): type_field = "" if IRelationList.providedBy(field): type_field = "relation" elif "ListField" in str(field): type_field = "datagridfield" self.datagrids[field.__name__] = False elif IChoice.providedBy(field): type_field = "choice" elif ITextLine.providedBy(field): type_field = "text" elif IList.providedBy(field): type_field = "list" elif IText.providedBy(field): type_field = "text" elif IRichText.providedBy(field): type_field = "text" else: type_field = "unknown" return type_field
def getTextFields(obj): include_textline_fields = settings().include_textline_fields include_lines_fields = settings().include_lines_fields text_fields = [] if HAS_ARCHETYPES and getattr(aq_base(obj), "Schema", None): # Archetypes for field in obj.Schema().values(): if field.__name__ in CUSTOM_HANDLED_TEXT_FIELDS: continue if include_textline_fields and IStringField.providedBy(field): text_fields.append(field) continue if ITextField.providedBy(field): text_fields.append(field) if include_lines_fields and ILinesField.providedBy(field): text_fields.append(field) elif HAS_DEXTERITY: # Dexterity for schemata in iterSchemata(obj): fields = getFieldsInOrder(schemata) for name, field in fields: if name in CUSTOM_HANDLED_TEXT_FIELDS: continue if IRichText.providedBy(field): text_fields.append(field) continue # ITextLine inherits from IText. # That we want to replace in texts, but not textlines # is by configuration. if not include_textline_fields and ITextLine.providedBy(field): continue if IText.providedBy(field): text_fields.append(field) if (include_lines_fields and ITuple.providedBy(field) and ITextLine.providedBy(field.value_type)): text_fields.append(field) return text_fields
def get_value_from_pipeline(self, field, item): name = field.getName() # setting value from the blueprint cue value = item.get(name, _marker) if value is _marker: # Also try _datafield_FIELDNAME structure from jsonify value = item.get('_datafield_%s' % name, _marker) if value is not _marker: # Value was given in pipeline, so set it deserializer = IDeserializer(field) if IRichText.providedBy(field)\ and '_content_type_%s' % name in item: # change jsonify structure to one we understand value = { 'contenttype': item['_content_type_%s' % name], 'data': value } files = item.setdefault(self.fileskey, {}) value = deserializer(value, files, item, self.disable_constraints, logger=self.log) return value
def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return utils._send_emails = False try: en_folder = self.context.restrictedTraverse('en') if 'organisations' in en_folder: org_folder = en_folder.restrictedTraverse('organisations') else: org_folder = content.create(en_folder, type='osha.hwccontent.organisationfolder', title='Organisations') if 'focalpoints' in en_folder: fop_folder = en_folder.restrictedTraverse('focalpoints') else: fop_folder = content.create(en_folder, type='osha.hwccontent.organisationfolder', title='Focalpoints') type_mapping = { u'Organisation': { 'type': 'osha.hwccontent.organisation', 'schema': dict(getFieldsInOrder(IOrganisation)), 'folder': org_folder, 'wf_actions': ('approve_phase_1',), }, u'Focalpoint': { 'type': 'osha.hwccontent.focalpoint', 'schema': dict(getFieldsInOrder(IFocalPoint)), 'folder': fop_folder, 'wf_actions': ('publish',), } } count = 0 for data in json.loads(data['json']): # Only keep the data that's in the main schema: type_info = type_mapping[data['_type']] schema = type_info['schema'] fields = {} if data['title'].startswith('MC-'): continue for name, field in schema.items(): if name in data: value = data[name] if value and INamedImageField.providedBy(field): content_type = data.get('_%s_content_type' % name, '') filename = data.get('_%s_filename' % name , None) value = NamedBlobImage(base64.b64decode(value), str(content_type), filename) elif value and IRichText.providedBy(field): content_type = data.get('_%s_content_type', None) value = RichTextValue(value, mimeType=content_type) elif name.find("email") >= 0: value = value.strip() fields[name] = value new_obj = content.create(container=type_info['folder'], type= type_info['type'], id=data['id'], **fields) for transition in type_info['wf_actions']: try: content.transition(new_obj, transition) except Exception: logger.exception('Could not execute %s transition for %s' % (transition, '/'.join(new_obj.getPhysicalPath()))) logger.info('Imported %s' % new_obj.getId()) count += 1 # Set status on this form page self.status = "%s partners imported" % count except Exception: # Enable emails again: utils._send_emails = True raise
def __getattribute__(self, name): if name.startswith('_') or name.startswith('portal_') or name.startswith('@@') or name == 'sql_id': return super(SQLDexterityItem, self).__getattribute__(name) connection = queryUtility(ISQLConnectionsUtility, name=self.portal_type, default=None) if connection == None and self.portal_type: fti = queryUtility(IDexterityFTI, name=self.portal_type, default=None) if not fti: return None updateConnectionsForFti(fti) connection = queryUtility(ISQLConnectionsUtility, name=self.portal_type, default=None) if name == 'view': #be sure session and sqlitem are up to date self._v_sql_item = None connection.session.close() if not connection: return super(SQLDexterityItem, self).__getattribute__(name) if name == 'UID' and self.sql_virtual: return self.portal_type+'-'+connection.sql_table+'-'+str(self.sql_id) if name == 'id' and 'id' not in connection.fieldnames.keys(): if not self.sql_virtual: return super(SQLDexterityItem, self).__getattribute__(name) fti = ISQLTypeSettings(getUtility(IDexterityFTI, name=self.portal_type)) nameFromTitle = INameFromTitle(self, None) if nameFromTitle is not None and nameFromTitle.title: sql_folder_id = getattr(fti, 'sql_folder_id', 'data-'+self.portal_type) title = nameFromTitle.title folder = None if IRelationValue.providedBy(sql_folder_id): folder = sql_folder_id.to_object elif sql_folder_id and sql_folder_id.startswith('/'): portal = getToolByName(getSite(), 'portal_url').getPortalObject() folder = portal.restrictedTraverse(sql_folder_id) if folder: name = INameChooser(folder).chooseName(title, self) return name # return INameChooser(getSite()).chooseName(title, self) # return getUtility(IURLNormalizer).normalize(title) return self.sql_id if name in connection.fieldnames.keys(): sql_column = connection.fieldnames[name] sql_item = self.getSQLItem() try: sql_id = getattr(sql_item, connection.sql_id_column, None) except orm_exc.DetachedInstanceError: self._v_sql_item = None sql_item = self.getSQLItem() sql_id = getattr(sql_item, connection.sql_id_column, None) fieldname = 'name' if sql_item and sql_column: while '.' in sql_column: sql_key = sql_column.split('.')[0] sql_item = getattr(sql_item, sql_key, None) if isinstance(sql_item, list): value = sql_item fieldname = sql_column.split('.')[-1] break sql_column = '.'.join(sql_column.split('.')[1:]) else: if not isinstance(sql_item, list): value = getattr(sql_item, sql_column, None) if not value and (isinstance(value, list) or hasattr(value, '_sa_instance_state')): value = '' elif (isinstance(value, list) or hasattr(value, '_sa_instance_state')): sqlftis = [a for a in getAllUtilitiesRegisteredFor(IDexterityFTI) if 'collective.behavior.sql.behavior.behaviors.ISQLContent' in a.behaviors and getattr(a, 'sql_table', None)] if name == 'subject': return tuple([getattr(a, fieldname, '') for a in value]) tableftis = [] for iface in iterSchemataForType(self.portal_type): if name in iface.names(): field = iface[name] if IRelationChoice.providedBy(field) or IRelationList.providedBy(field): if IRelationChoice.providedBy(field): allowed_types = field.source.query.get('portal_type', []) else: allowed_types = field.value_type.source.query.get('portal_type', []) tableftis = [] for sqlfti in sqlftis: adapted = ISQLTypeSettings(sqlfti, None) if isinstance(value, list): classname = value[0].__class__.__name__ else: classname = value.__class__.__name__ if adapted and getattr(adapted, 'sql_table', None) == classname: if not allowed_types or sqlfti.id in allowed_types: tableftis.append(adapted) catalog = getToolByName(getSite(), 'portal_catalog') relations = [] for tablefti in tableftis: sql_id_column = getattr(tablefti, 'sql_id_column', 'id') valueids = [] if isinstance(value, list): valueids = [getattr(a, sql_id_column, None) for a in value if getattr(a, sql_id_column, None)] else: valueids = getattr(value, sql_id_column, None) valueids = [str(a) for a in valueids] brains = catalog.unrestrictedSearchResults(portal_type=tablefti.id, sql_id=valueids) for brain in brains: relations.append(SQLRelationValue(brain.portal_type, brain.UID, self)) if IRelationChoice.providedBy(field) and relations: return relations[0] elif IRelationList.providedBy(field) and relations: return relations elif ITuple.providedBy(field): return tuple([getattr(a, fieldname, '') for a in value]) elif IList.providedBy(field): return [getattr(a, fieldname, '') for a in value] elif value and isinstance(value, list): value = getattr(value[0], fieldname, '') for iface in iterSchemataForType(self.portal_type): if name == 'subject': try: return tuple([a.decode('utf-8') for a in literal_eval(value)]) except: return tuple([a.strip() for a in value.split(',')]) if name in iface.names(): field = iface[name] if IRichText.providedBy(field): if not value: return '' if not '<p' in value or not '<br' in value: value = '<p>'+'</p><p>'.join([a for a in value.split('\n') if a.strip()])+'</p>' # try: # value = str(value) # except: # try: # value = value.decode('utf-8') # except: # try: # value = value.encode('utf-8') # except: # pass return RichTextValue(unidecode(value)) elif INamedBlobImage.providedBy(field): return NamedBlobImage(base64.b64decode(value), filename=unicode(self.portal_type+self.id+".jpg")) elif ITuple.providedBy(field): if not value: return tuple([]) try: return tuple([a.decode('utf-8') for a in literal_eval(value)]) except: return tuple([a.strip() for a in value.split(',')]) elif IList.providedBy(field): if not value: return [] try: return [a.decode('utf-8') for a in literal_eval(value)] except: return [a.strip() for a in value.split(',')] elif IDatetime.providedBy(field) and hasattr(value, 'day') and not hasattr(value, 'hour'): value = datetime.datetime.combine(value, datetime.datetime.min.time()) if name in ['expiration_date','effective_date', 'effective', 'expires'] and hasattr(value, 'day') and not hasattr(value, 'hour'): value = datetime.datetime.combine(value, datetime.datetime.min.time()) if isinstance(value, unicode) or name == 'id': try: value = str(value) except: pass return value return super(SQLDexterityItem, self).__getattribute__(name)
def __getattribute__(self, name): if name.startswith('_') or name.startswith( 'portal_') or name.startswith('@@'): return super(SQLDexterityItem, self).__getattribute__(name) if name == 'id' and not self.sql_virtual: return super(SQLDexterityItem, self).__getattribute__(name) connection = queryUtility(ISQLConnectionsUtility, name=self.portal_type, default=None) if connection == None and self.portal_type: fti = queryUtility(IDexterityFTI, name=self.portal_type, default=None) if not fti: return None updateConnectionsForFti(fti) connection = queryUtility(ISQLConnectionsUtility, name=self.portal_type, default=None) if not connection: return super(SQLDexterityItem, self).__getattribute__(name) if name == 'UID': return self.portal_type + '-' + connection.sql_table + '-' + str( self.sql_id) if name == 'id' and 'id' not in connection.fieldnames.keys(): fti = ISQLTypeSettings( getUtility(IDexterityFTI, name=self.portal_type)) nameFromTitle = INameFromTitle(self, None) if nameFromTitle is not None and nameFromTitle.title: sql_folder_id = getattr(fti, 'sql_folder_id', 'data-' + self.portal_type) title = nameFromTitle.title if IRelationValue.providedBy(name): folder = sql_folder_id.to_object if folder: return INameChooser(folder).chooseName(title, self) return INameChooser(getSite()).chooseName(title, self) if name in connection.fieldnames.keys(): sql_column = connection.fieldnames[name] sql_item = self.getSQLItem() fieldname = 'name' if sql_item and sql_column: while '.' in sql_column: sql_item = getattr(sql_item, sql_column.split('.')[0], None) if sql_item and ( (isinstance(sql_item, list) and len(sql_item) > 1) or hasattr(sql_item, '_sa_instance_state')): value = sql_item fieldname = sql_column.split('.')[-1] break sql_column = '.'.join(sql_column.split('.')[1:]) else: value = getattr(sql_item, sql_column, None) #this is a relation if value and (isinstance(value, list) or hasattr(value, '_sa_instance_state')): sqlftis = [ a for a in getAllUtilitiesRegisteredFor(IDexterityFTI) if 'collective.behavior.sql.behavior.behaviors.ISQLContent' in a.behaviors and getattr(a, 'sql_table', None) ] if name == 'subject': return tuple( [getattr(a, fieldname, '') for a in value]) tableftis = [] for iface in iterSchemataForType(self.portal_type): if name in iface.names(): field = iface[name] if IList.providedBy(field): return [ getattr(a, fieldname, '') for a in value ] # hope it has name! elif ITuple.providedBy(field): return tuple( [getattr(a, fieldname, '') for a in value]) if IRelationChoice.providedBy( field) or IRelationList.providedBy(field): if IRelationChoice.providedBy(field): allowed_types = field.source.query.get( 'portal_type', []) else: allowed_types = field.value_type.source.query.get( 'portal_type', []) tableftis = [] for sqlfti in sqlftis: adapted = ISQLTypeSettings(sqlfti, None) if isinstance(value, list): classname = value[0].__class__.__name__ else: classname = value.__class__.__name__ if adapted and getattr( adapted, 'sql_table', None) == classname: if not allowed_types or sqlfti.id in allowed_types: tableftis.append(adapted) catalog = getToolByName( getSite(), 'portal_catalog') relations = [] for tablefti in tableftis: sql_id_column = getattr( tablefti, 'sql_id_column', 'id') valueids = [] if isinstance(value, list): valueids = [ getattr(a, sql_id_column, None) for a in value if getattr(a, sql_id_column, None) ] else: valueids = getattr( value, sql_id_column, None) brains = catalog.searchResults( portal_type=tablefti.id, sql_id=valueids) for brain in brains: relations.append( SQLRelationValue( brain.portal_type, brain.sql_id)) if IRelationChoice.providedBy( field) and relations: return relations[0] elif IRelationList.providedBy( field) and relations: return relations for iface in iterSchemataForType(self.portal_type): if name == 'subject': try: return tuple([ a.decode('utf-8') for a in literal_eval(value) ]) except: return tuple([a.strip() for a in value.split(',')]) if name in iface.names(): field = iface[name] if IRichText.providedBy(field): return RichTextValue(value) if INamedBlobImage.providedBy(field): return NamedBlobImage( base64.b64decode(value), filename=unicode(self.portal_type + self.id + ".jpg")) if IList.providedBy(field): try: return [ a.decode('utf-8') for a in literal_eval(value) ] except: return [a.strip() for a in value.split(',')] if ITuple.providedBy(field): try: return tuple([ a.decode('utf-8') for a in literal_eval(value) ]) except: return tuple( [a.strip() for a in value.split(',')]) if isinstance(value, unicode) or name == 'id': try: return str(value) except: pass return value return super(SQLDexterityItem, self).__getattribute__(name)
def getEtherpadField(self): fields = schema.getFields(self.model) for name in fields: field = fields[name] if IRichText.providedBy(field): return field
def __getattribute__(self, name): if name.startswith('_') or name.startswith('portal_') or name.startswith('@@'): return super(SQLDexterityItem, self).__getattribute__(name) if name == 'id' and not self.sql_virtual: return super(SQLDexterityItem, self).__getattribute__(name) connection = queryUtility(ISQLConnectionsUtility, name=self.portal_type, default=None) if connection == None and self.portal_type: fti = queryUtility(IDexterityFTI, name=self.portal_type, default=None) if not fti: return None updateConnectionsForFti(fti) connection = queryUtility(ISQLConnectionsUtility, name=self.portal_type, default=None) if not connection: return super(SQLDexterityItem, self).__getattribute__(name) if name == 'UID': return self.portal_type+'-'+connection.sql_table+'-'+str(self.sql_id) if name == 'id' and 'id' not in connection.fieldnames.keys(): fti = ISQLTypeSettings(getUtility(IDexterityFTI, name=self.portal_type)) nameFromTitle = INameFromTitle(self, None) if nameFromTitle is not None and nameFromTitle.title: sql_folder_id = getattr(fti, 'sql_folder_id', 'data-'+self.portal_type) title = nameFromTitle.title if IRelationValue.providedBy(name): folder = sql_folder_id.to_object if folder: return INameChooser(folder).chooseName(title, self) return INameChooser(getSite()).chooseName(title, self) if name in connection.fieldnames.keys(): sql_column = connection.fieldnames[name] sql_item = self.getSQLItem() fieldname = 'name' if sql_item and sql_column: while '.' in sql_column: sql_item = getattr(sql_item, sql_column.split('.')[0], None) if sql_item and ((isinstance(sql_item, list) and len(sql_item)>1) or hasattr(sql_item, '_sa_instance_state')): value = sql_item fieldname = sql_column.split('.')[-1] break sql_column = '.'.join(sql_column.split('.')[1:]) else: value = getattr(sql_item, sql_column, None) #this is a relation if value and (isinstance(value, list) or hasattr(value, '_sa_instance_state')): sqlftis = [a for a in getAllUtilitiesRegisteredFor(IDexterityFTI) if 'collective.behavior.sql.behavior.behaviors.ISQLContent' in a.behaviors and getattr(a, 'sql_table', None)] if name == 'subject': return tuple([getattr(a, fieldname, '') for a in value]) tableftis = [] for iface in iterSchemataForType(self.portal_type): if name in iface.names(): field = iface[name] if IList.providedBy(field): return [getattr(a, fieldname, '') for a in value] # hope it has name! elif ITuple.providedBy(field): return tuple([getattr(a, fieldname, '') for a in value]) if IRelationChoice.providedBy(field) or IRelationList.providedBy(field): if IRelationChoice.providedBy(field): allowed_types = field.source.query.get('portal_type', []) else: allowed_types = field.value_type.source.query.get('portal_type', []) tableftis = [] for sqlfti in sqlftis: adapted = ISQLTypeSettings(sqlfti, None) if isinstance(value, list): classname = value[0].__class__.__name__ else: classname = value.__class__.__name__ if adapted and getattr(adapted, 'sql_table', None) == classname: if not allowed_types or sqlfti.id in allowed_types: tableftis.append(adapted) catalog = getToolByName(getSite(), 'portal_catalog') relations = [] for tablefti in tableftis: sql_id_column = getattr(tablefti, 'sql_id_column', 'id') valueids = [] if isinstance(value, list): valueids = [getattr(a, sql_id_column, None) for a in value if getattr(a, sql_id_column, None)] else: valueids = getattr(value, sql_id_column, None) brains = catalog.searchResults(portal_type=tablefti.id, sql_id=valueids) for brain in brains: relations.append(SQLRelationValue(brain.portal_type, brain.sql_id)) if IRelationChoice.providedBy(field) and relations: return relations[0] elif IRelationList.providedBy(field) and relations: return relations for iface in iterSchemataForType(self.portal_type): if name == 'subject': try: return tuple([a.decode('utf-8') for a in literal_eval(value)]) except: return tuple([a.strip() for a in value.split(',')]) if name in iface.names(): field = iface[name] if IRichText.providedBy(field): return RichTextValue(value) if INamedBlobImage.providedBy(field): return NamedBlobImage(base64.b64decode(value), filename=unicode(self.portal_type+self.id+".jpg")) if IList.providedBy(field): try: return [a.decode('utf-8') for a in literal_eval(value)] except: return [a.strip() for a in value.split(',')] if ITuple.providedBy(field): try: return tuple([a.decode('utf-8') for a in literal_eval(value)]) except: return tuple([a.strip() for a in value.split(',')]) if isinstance(value, unicode) or name == 'id': try: return str(value) except: pass return value return super(SQLDexterityItem, self).__getattribute__(name)
def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return utils._send_emails = False try: en_folder = self.context.restrictedTraverse('en') if 'organisations' in en_folder: org_folder = en_folder.restrictedTraverse('organisations') else: org_folder = content.create( en_folder, type='osha.hwccontent.organisationfolder', title='Organisations') if 'focalpoints' in en_folder: fop_folder = en_folder.restrictedTraverse('focalpoints') else: fop_folder = content.create( en_folder, type='osha.hwccontent.organisationfolder', title='Focalpoints') type_mapping = { u'Organisation': { 'type': 'osha.hwccontent.organisation', 'schema': dict(getFieldsInOrder(IOrganisation)), 'folder': org_folder, 'wf_actions': ('approve_phase_1', ), }, u'Focalpoint': { 'type': 'osha.hwccontent.focalpoint', 'schema': dict(getFieldsInOrder(IFocalPoint)), 'folder': fop_folder, 'wf_actions': ('publish', ), } } count = 0 for data in json.loads(data['json']): # Only keep the data that's in the main schema: type_info = type_mapping[data['_type']] schema = type_info['schema'] fields = {} if data['title'].startswith('MC-'): continue for name, field in schema.items(): if name in data: value = data[name] if value and INamedImageField.providedBy(field): content_type = data.get('_%s_content_type' % name, '') filename = data.get('_%s_filename' % name, None) value = NamedBlobImage(base64.b64decode(value), str(content_type), filename) elif value and IRichText.providedBy(field): content_type = data.get('_%s_content_type', None) value = RichTextValue(value, mimeType=content_type) elif name.find("email") >= 0: value = value.strip() fields[name] = value new_obj = content.create(container=type_info['folder'], type=type_info['type'], id=data['id'], **fields) for transition in type_info['wf_actions']: try: content.transition(new_obj, transition) except Exception: logger.exception( 'Could not execute %s transition for %s' % (transition, '/'.join(new_obj.getPhysicalPath()))) logger.info('Imported %s' % new_obj.getId()) count += 1 # Set status on this form page self.status = "%s partners imported" % count except Exception: # Enable emails again: utils._send_emails = True raise
def __getattribute__(self, name): if name.startswith('_') or name.startswith( 'portal_') or name.startswith('@@') or name == 'sql_id': return super(SQLDexterityItem, self).__getattribute__(name) connection = queryUtility(ISQLConnectionsUtility, name=self.portal_type, default=None) if connection == None and self.portal_type: fti = queryUtility(IDexterityFTI, name=self.portal_type, default=None) if not fti: return None updateConnectionsForFti(fti) connection = queryUtility(ISQLConnectionsUtility, name=self.portal_type, default=None) if name == 'view': #be sure session and sqlitem are up to date self._v_sql_item = None connection.session.close() if not connection: return super(SQLDexterityItem, self).__getattribute__(name) if name == 'UID' and self.sql_virtual: return self.portal_type + '-' + connection.sql_table + '-' + str( self.sql_id) if name == 'id' and 'id' not in connection.fieldnames.keys(): if not self.sql_virtual: return super(SQLDexterityItem, self).__getattribute__(name) fti = ISQLTypeSettings( getUtility(IDexterityFTI, name=self.portal_type)) nameFromTitle = INameFromTitle(self, None) if nameFromTitle is not None and nameFromTitle.title: sql_folder_id = getattr(fti, 'sql_folder_id', 'data-' + self.portal_type) title = nameFromTitle.title folder = None if IRelationValue.providedBy(sql_folder_id): folder = sql_folder_id.to_object elif sql_folder_id and sql_folder_id.startswith('/'): portal = getToolByName(getSite(), 'portal_url').getPortalObject() folder = portal.restrictedTraverse(sql_folder_id) if folder: name = INameChooser(folder).chooseName(title, self) return name # return INameChooser(getSite()).chooseName(title, self) # return getUtility(IURLNormalizer).normalize(title) return self.sql_id if name in connection.fieldnames.keys(): sql_column = connection.fieldnames[name] sql_item = self.getSQLItem() try: sql_id = getattr(sql_item, connection.sql_id_column, None) except orm_exc.DetachedInstanceError: self._v_sql_item = None sql_item = self.getSQLItem() sql_id = getattr(sql_item, connection.sql_id_column, None) fieldname = 'name' if sql_item and sql_column: while '.' in sql_column: sql_key = sql_column.split('.')[0] sql_item = getattr(sql_item, sql_key, None) if isinstance(sql_item, list): value = sql_item fieldname = sql_column.split('.')[-1] break sql_column = '.'.join(sql_column.split('.')[1:]) else: if not isinstance(sql_item, list): value = getattr(sql_item, sql_column, None) if not value and (isinstance(value, list) or hasattr(value, '_sa_instance_state')): value = '' elif (isinstance(value, list) or hasattr(value, '_sa_instance_state')): sqlftis = [ a for a in getAllUtilitiesRegisteredFor(IDexterityFTI) if 'collective.behavior.sql.behavior.behaviors.ISQLContent' in a.behaviors and getattr(a, 'sql_table', None) ] if name == 'subject': return tuple( [getattr(a, fieldname, '') for a in value]) tableftis = [] for iface in iterSchemataForType(self.portal_type): if name in iface.names(): field = iface[name] if IRelationChoice.providedBy( field) or IRelationList.providedBy(field): if IRelationChoice.providedBy(field): allowed_types = field.source.query.get( 'portal_type', []) else: allowed_types = field.value_type.source.query.get( 'portal_type', []) tableftis = [] for sqlfti in sqlftis: adapted = ISQLTypeSettings(sqlfti, None) if isinstance(value, list): classname = value[0].__class__.__name__ else: classname = value.__class__.__name__ if adapted and getattr( adapted, 'sql_table', None) == classname: if not allowed_types or sqlfti.id in allowed_types: tableftis.append(adapted) catalog = getToolByName( getSite(), 'portal_catalog') relations = [] for tablefti in tableftis: sql_id_column = getattr( tablefti, 'sql_id_column', 'id') valueids = [] if isinstance(value, list): valueids = [ getattr(a, sql_id_column, None) for a in value if getattr(a, sql_id_column, None) ] else: valueids = getattr( value, sql_id_column, None) valueids = [str(a) for a in valueids] brains = catalog.unrestrictedSearchResults( portal_type=tablefti.id, sql_id=valueids) for brain in brains: relations.append( SQLRelationValue( brain.portal_type, brain.UID, self)) if IRelationChoice.providedBy( field) and relations: return relations[0] elif IRelationList.providedBy( field) and relations: return relations elif ITuple.providedBy(field): return tuple( [getattr(a, fieldname, '') for a in value]) elif IList.providedBy(field): return [ getattr(a, fieldname, '') for a in value ] elif value and isinstance(value, list): value = getattr(value[0], fieldname, '') for iface in iterSchemataForType(self.portal_type): if name == 'subject': try: return tuple([ a.decode('utf-8') for a in literal_eval(value) ]) except: return tuple([a.strip() for a in value.split(',')]) if name in iface.names(): field = iface[name] if IRichText.providedBy(field): if not value: return '' if not '<p' in value or not '<br' in value: value = '<p>' + '</p><p>'.join([ a for a in value.split('\n') if a.strip() ]) + '</p>' # try: # value = str(value) # except: # try: # value = value.decode('utf-8') # except: # try: # value = value.encode('utf-8') # except: # pass return RichTextValue(unidecode(value)) elif INamedBlobImage.providedBy(field): return NamedBlobImage( base64.b64decode(value), filename=unicode(self.portal_type + self.id + ".jpg")) elif ITuple.providedBy(field): if not value: return tuple([]) try: return tuple([ a.decode('utf-8') for a in literal_eval(value) ]) except: return tuple( [a.strip() for a in value.split(',')]) elif IList.providedBy(field): if not value: return [] try: return [ a.decode('utf-8') for a in literal_eval(value) ] except: return [a.strip() for a in value.split(',')] elif IDatetime.providedBy(field) and hasattr( value, 'day') and not hasattr(value, 'hour'): value = datetime.datetime.combine( value, datetime.datetime.min.time()) if name in [ 'expiration_date', 'effective_date', 'effective', 'expires' ] and hasattr(value, 'day') and not hasattr(value, 'hour'): value = datetime.datetime.combine( value, datetime.datetime.min.time()) if isinstance(value, unicode) or name == 'id': try: value = str(value) except: pass return value return super(SQLDexterityItem, self).__getattribute__(name)
def getEtherpadField(self): fields = schema.getFields(self.model) for name in fields: field = fields[name] if IRichText.providedBy(field): return field
def _setXLIFF(self, data, target_language=''): """ Set the data on one object """ site = getSite() uid_catalog = getToolByName(site, 'uid_catalog') if target_language == '': target_language = data['target-language'].encode('ascii') # nothing to do if there is no target language if not target_language: return try: oid = data['oid'].encode('ascii') results = uid_catalog(UID=oid) if len(results) != 1: #raise ValueError, "Uid catalog should return exactly one #result but returned %s." % len(results) raise KeyError, "Invalid OID %s" % oid source_ob = results[0].getObject() except KeyError: # old style xliff file. Using path #print "Using path to find target object" path = data['original'].encode('utf-8') source_ob = site.restrictedTraverse(path, None) if source_ob is None: raise ValueError( "%s not found, can not add translation." % data['original'].encode('utf-8')) # If the source object is language-neutral, it must receive a language # prior to translation # XXXX What to do if the source_ob HAS a language, but it differs # from the source-language inside the data? if source_ob.Language() == '': # Get the source language from the data source_language = data.get('source-language') # No source language present in the section, use site default if not source_language: langtool = getToolByName(site, 'portal_languages') source_language = langtool.getPreferredLanguage() source_ob.setLanguage(source_language) tm = ITranslationManager(source_ob) if not tm.has_translation(target_language): tm.add_translation(target_language) self.new_translations += 1 target_ob = tm.get_translation(target_language) if IBaseObject.providedBy(target_ob): # We dont want the id to get renamed to match the title target_ob.unmarkCreationFlag() values = {} for unit in data.findAll('trans-unit'): fieldname = unit['id'].encode('utf-8') value = unit.find('target').renderContents('utf-8').strip() # Note: We don't use xliff to remove values, so no value means no # translation and no change to the original # XXX: This doesn't handle values other than strings, this may be # a problem. if not value: continue # convert HTML entities value = safe_unicode(value) value = html_parser.unescape(value) values[fieldname] = value if IDexterityContent.providedBy(target_ob): # Dexterity schema = get_dx_schema(target_ob) for name, field in schema.items(): if ILanguageIndependentField.providedBy(field): # Copy from the original: field.set(target_ob, field.get(source_ob)) pass elif name == 'header_links': value = eval(values[name]) schema[name].set(target_ob, value) elif name in values: value = values[name] if IRichText.providedBy(field): value = RichTextValue(value,'text/html', 'text/x-html-safe') schema[name].set(target_ob, value) ######### set SEO Properties #### for seo_value in values: if seo_value.startswith('qSEO_'): if target_ob.hasProperty(seo_value): target_ob.manage_changeProperties({seo_value: values[seo_value].encode('utf-8')}) else: target_ob.manage_addProperty(seo_value, values[seo_value.encode('utf-8')], 'string') else: # Archetypes target_ob.processForm(data=1, metadata=1, values=values) # Set the correct format if shasattr(source_ob, 'text_format'): target_ob.setFormat(source_ob.text_format) self.total += 1
def _setXLIFF(self, data, target_language=''): """ Set the data on one object """ site = getSite() uid_catalog = getToolByName(site, 'uid_catalog') if target_language == '': target_language = data['target-language'].encode('ascii') # nothing to do if there is no target language if not target_language: return try: oid = data['oid'].encode('ascii') results = uid_catalog(UID=oid) if len(results) != 1: #raise ValueError, "Uid catalog should return exactly one #result but returned %s." % len(results) raise KeyError, "Invalid OID %s" % oid source_ob = results[0].getObject() except KeyError: # old style xliff file. Using path #print "Using path to find target object" path = data['original'].encode('utf-8') source_ob = site.restrictedTraverse(path, None) if source_ob is None: raise ValueError( "%s not found, can not add translation." % data['original'].encode('utf-8')) # If the source object is language-neutral, it must receive a language # prior to translation # XXXX What to do if the source_ob HAS a language, but it differs # from the source-language inside the data? if source_ob.Language() == '': # Get the source language from the data source_language = data.get('source-language') # No source language present in the section, use site default if not source_language: langtool = getToolByName(site, 'portal_languages') source_language = langtool.getPreferredLanguage() source_ob.setLanguage(source_language) tm = ITranslationManager(source_ob) if not tm.has_translation(target_language): tm.add_translation(target_language) self.new_translations += 1 target_ob = tm.get_translation(target_language) if IBaseObject.providedBy(target_ob): # We dont want the id to get renamed to match the title target_ob.unmarkCreationFlag() values = {} for unit in data.findAll('trans-unit'): fieldname = unit['id'].encode('utf-8') value = unit.find('target').renderContents('utf-8').strip() # Note: We don't use xliff to remove values, so no value means no # translation and no change to the original # XXX: This doesn't handle values other than strings, this may be # a problem. if not value: continue # convert HTML entities value = safe_unicode(value) value = html_parser.unescape(value) values[fieldname] = value if IDexterityContent.providedBy(target_ob): # Dexterity schema = get_dx_schema(target_ob) for name, field in schema.items(): if ILanguageIndependentField.providedBy(field): # Copy from the original: field.set(target_ob, field.get(source_ob)) pass elif name in values: value = values[name] if IRichText.providedBy(field): value = RichTextValue(value) schema[name].set(target_ob, value) else: # Archetypes target_ob.processForm(data=1, metadata=1, values=values) # Set the correct format if shasattr(source_ob, 'text_format'): target_ob.setFormat(source_ob.text_format) self.total += 1