def set_image(self, image, contentType=None, filename=None): if image and not INamedBlobImage.providedBy(image): if hasattr(image, 'data'): data = image.data elif hasattr(image, 'read'): data = image.read() else: data = image if hasattr(image, 'filename') and not filename: filename = unicode(image.filename) elif hasattr(image, 'name') and not filename: filename = image.name.split('/').pop() if hasattr(image, 'contentType') and not contentType: contentType = image.contentType elif hasattr(image, 'encoding') and not contentType: contentType = image.encoding image = NamedBlobImage(data, contentType, unicode(filename)) if not image and IGraphicallyCustomized.providedBy(self.context): noLongerProvides(self.context, IGraphicallyCustomized) del IAnnotations(self.context)[self._annotation] if image and not IGraphicallyCustomized.providedBy(self.context): alsoProvides(self.context, IGraphicallyCustomized) if image: IAnnotations( self.context)[self._annotation] = PersistentDict() IAnnotations( self.context).get( self._annotation)['original'] = image
def applyChanges(self, data): context = aq_inner(self.context) editor_data = self.panel_editor[context.UID()] storage = IContentWidgets(context) record = storage.read_widget(editor_data["widget_id"]) if record: item_order = record.get("item_order") if item_order: widget_content = record else: widget_content = editor_data["widget_content"] if not widget_content: widget_content = dict() for key, value in data.items(): entry_key = self.prettify_key(key) if INamedBlobImage.providedBy(value): image_uid = self._process_image_asset(entry_key, value) widget_content[entry_key] = image_uid elif IRichTextValue.providedBy(value): # Handle rich text value that is not serializable text_value = value.output widget_content[entry_key] = text_value else: widget_content[entry_key] = value storage.store_widget(editor_data['widget_id'], record, self.request) next_url = '{url}/@@panel-edit?section={section}&panel={panel}'.format( url=context.absolute_url(), section=editor_data["content_section"], panel=editor_data["content_section_panel"]) return self.request.response.redirect(next_url)
def test_blob_newsitem_content_is_migrated(self): from plone.app.contenttypes.migration.migration import \ BlobNewsItemMigrator from plone.app.textfield.interfaces import IRichTextValue from plone.namedfile.interfaces import INamedBlobImage # create a BlobATNewsItem at_newsitem = self.createATCTBlobNewsItem('newsitem') at_newsitem.setText('Tütensuppe') at_newsitem.setContentType('chemical/x-gaussian-checkpoint') at_newsitem.setImageCaption('Daniel Düsentrieb') test_image_data = self.get_test_image_data() at_newsitem.setImage(test_image_data, filename='testimage.png') # migrate applyProfile(self.portal, 'plone.app.contenttypes:default') migrator = self.get_migrator(at_newsitem, BlobNewsItemMigrator) migrator.migrate() dx_newsitem = self.portal['newsitem'] # assertions self.assertTrue(INamedBlobImage.providedBy(dx_newsitem.image)) self.assertEqual(dx_newsitem.image.filename, 'testimage.png') self.assertEqual(dx_newsitem.image.contentType, 'image/png') self.assertEqual(dx_newsitem.image.data, test_image_data) self.assertEqual(dx_newsitem.image_caption, u'Daniel Düsentrieb') self.assertTrue(IRichTextValue(dx_newsitem.text)) self.assertEqual(dx_newsitem.text.raw, u'Tütensuppe') self.assertEqual(dx_newsitem.text.mimeType, 'chemical/x-gaussian-checkpoint')
def applyChanges(self, data): context = aq_inner(self.context) editor_data = self.panel_editor[context.UID()] storage = IContentWidgets(context) widget_content = dict() for key, value in data.items(): entry_key = self.prettify_key(key) # Additional schemata are posted as 'ISchemaInterface.field_name' # and need to be resolved to their original key field_key = key.split('.')[-1] # Handle image like content if INamedBlobImage.providedBy(value): image_uid = self._process_image_asset(entry_key, value) widget_content[entry_key] = image_uid else: if value is NOT_CHANGED: # Keep existing value for fields signaling as not updated stored_content = editor_data.get('widget_content') if widget_content: value = stored_content.get(field_key, None) if entry_key.endswith('_related'): # Handle asset relation choice widget_content[entry_key] = self._process_relations(value) source_entry_key = key.replace('_related', '') source_value = data.get(source_entry_key, None) if not source_value: # Actual image uploads take preference. Only if no image has # been uploaded write relation choice to image field. widget_content[source_entry_key] = value.UID() widget_content[entry_key] = value storage.store_widget(editor_data['widget_id'], widget_content, self.request) next_url = '{0}/@@panel-page'.format(context.absolute_url()) return self.request.response.redirect(next_url)
def test_newsitem_content_is_migrated(self): from Products.ATContentTypes.content.newsitem import ATNewsItem from plone.app.contenttypes.migration.migration import NewsItemMigrator from plone.app.textfield.interfaces import IRichTextValue from plone.namedfile.interfaces import INamedBlobImage # create an ATNewsItem at_newsitem = self.createATCTobject(ATNewsItem, 'newsitem') at_newsitem.setText('Tütensuppe') at_newsitem.setContentType('chemical/x-gaussian-checkpoint') at_newsitem.setImageCaption('Daniel Düsentrieb') test_image_data = self.get_test_image_data() image_field = at_newsitem.getField('image') image_field.set(at_newsitem, test_image_data) image_field.setFilename(at_newsitem, 'testimage.png') # migrate migrator = self.get_migrator(at_newsitem, NewsItemMigrator) migrator.migrate() # assertions new_newsitem = self.portal['newsitem'] self.assertTrue(INamedBlobImage.providedBy(new_newsitem.image)) self.assertEqual(new_newsitem.image.filename, 'testimage.png') self.assertEqual(new_newsitem.image.contentType, 'image/png') self.assertEqual(new_newsitem.image.data, test_image_data) self.assertEqual(new_newsitem.image_caption, u'Daniel Düsentrieb') self.assertTrue(IRichTextValue(new_newsitem.text)) self.assertEqual(new_newsitem.text.raw, u'Tütensuppe') self.assertEqual(new_newsitem.text.mimeType, 'chemical/x-gaussian-checkpoint') self.assertEqual(new_newsitem.text.outputMimeType, 'text/x-html-safe')
def ensure_image_size(value): if INamedBlobImage.providedBy(value): img_size = value.getImageSize() if img_size < IMAGE_MIN_SIZE: msg = "Image “{}” is too small. ".format(value.filename) msg += "The minimum size is {} (width) x {} (height) pixels. ".format( *IMAGE_MIN_SIZE) msg += "Your image has a size of {} x {}.".format(*img_size) raise Invalid(msg) return True
def applyChanges(self, data): context = aq_inner(self.context) editor_data = self.panel_editor[context.UID()] storage = IContentWidgets(context) record = storage.read_widget(editor_data["widget_id"]) item_order = record["item_order"] if item_order: widget_content = record["items"] else: widget_content = editor_data["widget_content"] if not widget_content: widget_content = dict() widget_item = dict() widget_item_node = editor_data["widget_node"] for key, value in data.items(): entry_key = self.prettify_key(key) # Additional schemata are posted as 'ISchemaInterface.field_name' # and need to be resolved to their original key field_key = key.split('.')[-1] if INamedBlobImage.providedBy(value): image_uid = self._process_image_asset(entry_key, value) widget_item[entry_key] = image_uid elif IRichTextValue.providedBy(value): # Handle rich text value that is not serializable text_value = value widget_item[entry_key] = text_value else: if value is NOT_CHANGED: # Keep existing value for fields signaling as not updated value = widget_content[widget_item_node][field_key] # continue if entry_key.endswith('_related'): # Handle asset relation choice widget_item[entry_key] = self._process_relations(value) source_entry_key = key.replace('_related', '') source_value = data.get(source_entry_key, None) if not source_value: # Actual image uploads take preference. Only if no image has # been uploaded write relation choice to image field. widget_item[source_entry_key] = value.UID() widget_item[entry_key] = value if widget_item_node in item_order: widget_content[widget_item_node] = widget_item else: widget_content.update({widget_item_node: widget_item}) item_order.append(widget_item_node) record["item_order"] = item_order record["items"] = widget_content storage.store_widget(editor_data['widget_id'], record, self.request) next_url = '{url}/@@panel-edit?section={section}&panel={panel}'.format( url=context.absolute_url(), section=editor_data["content_section"], panel=editor_data["content_section_panel"]) return self.request.response.redirect(next_url)
def test_namedblobimage_setting(self): data = 'datattatatata' filename = FILENAME_TESTSTRING + u".jpeg" content_type = 'image/jpeg' fileSetter = self.getFileSetter(ISchemaWithNamedBlobImage) fileSetter.set(data, filename.encode('utf-8'), content_type) field = fileSetter.context.field self.assertTrue(INamedBlobImage.providedBy(field)) self.assertEqual(field.filename, filename) self.assertEqual(field.contentType, content_type) self.assertEqual(field.data, data)
def test_blob_image_content_is_migrated(self): from plone.app.contenttypes.migration.migration import\ BlobImageMigrator from plone.namedfile.interfaces import INamedBlobImage self.portal.invokeFactory('Image', 'image') at_image = self.portal['image'] test_image_data = self.get_test_image_data() at_image.setImage(test_image_data, filename='testimage.png') applyProfile(self.portal, 'plone.app.contenttypes:default') migrator = self.get_migrator(at_image, BlobImageMigrator) migrator.migrate() dx_image = self.portal['image'] self.assertTrue(INamedBlobImage.providedBy(dx_image.image)) self.assertEqual(dx_image.image.filename, 'testimage.png') self.assertEqual(dx_image.image.contentType, 'image/png') self.assertEqual(dx_image.image.data, test_image_data)
def test_image_content_is_migrated(self): from plone.app.contenttypes.migration.migration import ImageMigrator from plone.namedfile.interfaces import INamedBlobImage from Products.ATContentTypes.content.image import ATImage at_image = self.createATCTobject(ATImage, 'image') test_image_data = self.get_test_image_data() field = at_image.getField('image') field.set(at_image, test_image_data) field.setFilename(at_image, 'testimage.png') applyProfile(self.portal, 'plone.app.contenttypes:default') migrator = self.get_migrator(at_image, ImageMigrator) migrator.migrate() dx_image = self.portal['image'] self.assertTrue(INamedBlobImage.providedBy(dx_image.image)) self.assertEqual(dx_image.image.filename, 'testimage.png') self.assertEqual(dx_image.image.contentType, 'image/png') self.assertEqual(dx_image.image.data, test_image_data)
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 is_image_small(self, context, fname="image", usecase="module"): image = getattr(context, fname, None) if image and INamedBlobImage.providedBy(image): x, y = image.getImageSize() if x < 1000 or y < 430: return True
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 testInterface(self): self.failUnless(INamedBlobImage.implementedBy(NamedBlobImage)) self.failUnless(verifyClass(INamedBlobImage, NamedBlobImage)) self.failUnless(INamedBlobFile.implementedBy(NamedBlobImage)) self.failUnless(INamedBlobImage.implementedBy(NamedBlobImage)) self.failUnless(verifyClass(INamedBlobFile, NamedBlobImage))
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 testInterface(self): self.assertTrue(INamedBlobImage.implementedBy(NamedBlobImage)) self.assertTrue(verifyClass(INamedBlobImage, NamedBlobImage)) self.assertTrue(INamedBlobFile.implementedBy(NamedBlobImage)) self.assertTrue(INamedBlobImage.implementedBy(NamedBlobImage)) self.assertTrue(verifyClass(INamedBlobFile, NamedBlobImage))