def _create_file(self, item, files, title, description, rights): namechooser = INameChooser(self.context) content_type = item.headers.get('Content-Type') filename = safe_unicode(item.filename) data = item.read() id_name = '' title = title and title[0] or filename id_name = namechooser.chooseName(title, self.context) if content_type in IMAGE_MIMETYPES: portal_type = 'Image' wrapped_data = NamedBlobImage(data=data, filename=filename) else: portal_type = 'File' wrapped_data = NamedBlobFile(data=data, filename=filename) self.context.invokeFactory(portal_type, id=id_name, title=title, description=description[0], rights=rights[0]) newfile = self.context[id_name] if portal_type == 'File': if IATFile.providedBy(newfile): newfile.setFile(data, filename=filename) else: newfile.file = wrapped_data elif portal_type == 'Image': if IATImage.providedBy(newfile): newfile.setImage(data, filename=filename) else: newfile.image = wrapped_data newfile.reindexObject() notify(ObjectModifiedEvent(newfile)) return newfile
def testFileBlobInterfaces(self): foo = self.folder[self.folder.invokeFactory('File', 'foo')] self.assertTrue(atfile.IATFile.providedBy(foo), 'no IATFile?') self.assertTrue(atfile.IFileContent.providedBy(foo), 'no IFileContent?') self.assertTrue(IATBlobFile.providedBy(foo), 'no IATBlobFile?') if not IInterface.providedBy(Z2IATFile): # this is zope < 2.12 self.assertTrue(Z2IATFile.isImplementedBy(foo), 'no zope2 IATFile?') self.assertFalse(Z2IATImage.isImplementedBy(foo), 'zope2 IATImage?')
def test_images(self): view = api.content.get_view('view', self.task, self.request) self.assertEqual(len(view.images()), 0) api.content.create(self.task, 'Image', 'image') self.assertEqual(len(view.images()), 1) self.assertTrue(IATImage.providedBy(view.images()[0])) api.content.delete(self.task['image']) self.assertEqual(len(view.images()), 0)
def testImageBlobInterfaces(self): foo = self.folder[self.folder.invokeFactory('Image', 'foo')] self.failUnless(atimage.IATImage.providedBy(foo), 'no IATImage?') self.failUnless(atimage.IImageContent.providedBy(foo), 'no IImageContent?') self.failUnless(IATBlobImage.providedBy(foo), 'no IATBlobImage?') if not IInterface.providedBy(Z2IATFile): # this is zope < 2.12 self.failUnless(Z2IATImage.isImplementedBy(foo), 'no zope2 IATImage?') self.failIf(Z2IATFile.isImplementedBy(foo), 'zope2 IATFile?')
def upload(self, files, title='', description=''): loaded = [] namechooser = INameChooser(self.context) if not isinstance(files, list): files = [files] for item in files: if item.filename: content_type = item.headers.get('Content-Type') filename = safe_unicode(item.filename) data = item.read() id_name = '' title = title and title[0] or filename # Get a unique id here id_name = namechooser.chooseName(title, self.context) # Portal types allowed : File and Image # Since Plone 4.x both types use Blob if content_type in IMAGE_MIMETYPES: portal_type = 'ArquivoBiblioteca' wrapped_data = NamedBlobFile(data=data, filename=filename) else: portal_type = 'ArquivoBiblioteca' wrapped_data = NamedBlobFile(data=data, filename=filename) # Create content self.context.invokeFactory(portal_type, id=id_name, title=title, description=description[0]) newfile = self.context[id_name] if not newfile.Title(): newfile.setTitle(title) import transaction transaction.commit() if IBoaPratica.providedBy(self.context): newfile.setUid_pratica(self.context) # Set data if portal_type == 'ArquivoBiblioteca': if IATFile.providedBy(newfile): newfile.setFile(data, filename=filename) else: newfile.file = wrapped_data elif portal_type == 'ArquivoBiblioteca': if IATImage.providedBy(newfile): newfile.setImage(data, filename=filename) else: newfile.image = wrapped_data # Finalize content creation, reindex it newfile.reindexObject() notify(ObjectModifiedEvent(newfile)) loaded.append(newfile) if loaded: return loaded return False
def media_type(self, obj): media = '' if IATImage.providedBy(obj): media = 'image' if IVideo.providedBy(obj): media = 'video' return media
def resolveImage(context, src): """ Try to resolve an image based on its src which can be a relative URL, an absolute URL or an URL using UIDs. Image scales can be annotated through image_<scale> or using the newer plone.app.imaging mechanism. Much fun :-P """ if context is None: context = getSite() parse_result = urlparse(unquote(src)) path = str(parse_result.path) img_obj = None if path.startswith('resolveuid'): # can be resolveuid/<uid>/@@images/image/preview path_parts = path.split('/') ref_catalog = getToolByName(context, 'reference_catalog') img_obj = ref_catalog.lookupObject(path_parts[1]) else: candidates = [path, path[1:]] # with and without leading '/' # check for a possible URL redirection if src.startswith('http'): req = Request(src) try: result = urlopen(req) except HTTPError: result = None if result and result.url != src: # a redirection happened parse_result2 = urlparse(unquote(result.url)) path2 = str(parse_result2.path) candidates.extend([path2, path2[1:]]) for p in candidates: img_obj = context.restrictedTraverse(p, None) if img_obj: if img_obj.portal_type in ('Image',): # check if current image is a scale (having a parent image) if IATImage.providedBy(img_obj.aq_parent): img_obj = img_obj.aq_parent break elif isinstance(img_obj, ImageScale): img_obj = img_obj.aq_parent break elif isinstance(img_obj.aq_inner.aq_base, Image): img_obj = img_obj.aq_inner.aq_base break elif isinstance(img_obj.aq_parent, Image): break else: img_obj = None return dict(image=img_obj)
def resolveImage(context, src): """ Try to resolve an image based on its src which can be a relative URL, an absolute URL or an URL using UIDs. Image scales can be annotated through image_<scale> or using the newer plone.app.imaging mechanism. Much fun :-P """ if context is None: context = getSite() ref_catalog = getToolByName(context, 'reference_catalog') parse_result = urlparse(unquote(src)) path = str(parse_result.path) img_obj = None if path.startswith('resolveuid'): # can be resolveuid/<uid>/@@images/image/preview path_parts = path.split('/') img_obj = ref_catalog.lookupObject(path_parts[1]) else: candidates = [path, path[1:]] # with and without leading '/' # check for a possible URL redirection if src.startswith('http'): req = Request(src) try: result = urlopen(req) except HTTPError: result = None if result and result.url != src: # a redirection happened parse_result2 = urlparse(unquote(result.url)) path2 = str(parse_result2.path) candidates.extend([path2, path2[1:]]) for p in candidates: img_obj = context.restrictedTraverse(p, None) if img_obj: if img_obj.portal_type in ('Image', ): # check if current image is a scale (having a parent image) if IATImage.providedBy(img_obj.aq_parent): img_obj = img_obj.aq_parent break elif isinstance(img_obj, ImageScale): img_obj = img_obj.aq_parent break elif isinstance(img_obj.aq_inner.aq_base, Image): img_obj = img_obj.aq_inner.aq_base break elif isinstance(img_obj.aq_parent, Image): break else: img_obj = None return img_obj
def get_gallery_pictures(self): gallery = None pictures = [] num_pictures = self.data.num_pictures galleries = self.get_galleries() if galleries: gallery = random.choice(galleries).getObject() pictures = [pic for pic in gallery.contentValues() if IATImage.providedBy(pic)] if len(pictures) > num_pictures: pictures = random.sample(pictures, num_pictures) return {'gallery': gallery, 'pictures': pictures}
def upload(self, files, title='', description='', rights=''): loaded = [] namechooser = INameChooser(self.context) if not isinstance(files, list): files = [files] for item in files: if item.filename: content_type = item.headers.get('Content-Type') filename = safe_unicode(item.filename) data = item.read() id_name = '' title = title and title[0] or filename # Get a unique id here id_name = namechooser.chooseName(title, self.context) # Portal types allowed : File and Image # Since Plone 4.x both types use Blob if content_type in IMAGE_MIMETYPES: portal_type = 'Image' wrapped_data = NamedBlobImage(data=data, filename=filename) else: portal_type = 'File' wrapped_data = NamedBlobFile(data=data, filename=filename) # Create content newfile = api.content.create( container=self.context, type=portal_type, id=id_name, title=title, description=description[0], rights=rights[0] ) # Set data if portal_type == 'File': if IATFile.providedBy(newfile): newfile.setFile(data, filename=filename) else: newfile.file = wrapped_data elif portal_type == 'Image': if IATImage.providedBy(newfile): newfile.setImage(data, filename=filename) else: newfile.image = wrapped_data # Finalize content creation, reindex it newfile.reindexObject() notify(ObjectModifiedEvent(newfile)) loaded.append(newfile) if loaded: return loaded return False
def _data(self, item): item.update({'title': item['brain'].Title, 'description': item['brain'].Description, 'class': ''}) if item.has_key('show') and item['show']: item['class'] += ' hidden' if IATImage.providedBy(item['obj']): img = IImage(item['obj']) item['image'] = img.getImage(self.thumb_size) elif MEDIA and IVideoEmbed.providedBy(item['obj']): embedders = component.getAdapters((item['obj'],), IVideoEmbedder) item['embed'] = True item['url'] = item['brain'].getRemoteUrl for name, embedder in embedders: if embedder.matches(): item['code'] = embedder.getEmbedCode() item['provider'] = embedder.name elif MEDIA and IVideo.providedBy(item['obj']): view = component.queryMultiAdapter((item['obj'], self.request,), name='flowplayer') teaser = ITeaser(item['obj']) item['image'] = teaser.getTeaser(self.thumb_size) item['embed'] = False item['url'] = view is None and item['brain'].getURL() or view.href()
def image(self): if IATImage.providedBy(self.context): return self.context return self.context.getField('image')
def folderupload(self, files, title='', description=''): if not self.doc.isDocument(): return self.doc.setfile(self.doc, files[0]) docfolderId = self.doc.getId() dbfolderId = self.doc.getParentDatabase().id #TODO come configurare diverse cartelle per applicazione o plomino db (da fare sulle singole app)? target = self.context.portal_url.getPortalObject()[ATTACHMENT_FOLDER] with adopt_roles('Manager'): if not dbfolderId in target.keys(): target.invokeFactory("Folder", id=dbfolderId, title=dbfolderId) target = target[dbfolderId] if not docfolderId in target.keys(): target.invokeFactory("Folder", id=docfolderId, title=docfolderId) docFolder = target[docfolderId] for username, roles in self.doc.get_local_roles(): docFolder.manage_setLocalRoles(username, roles) if not isinstance(files, list): files = [files] #se non campo multiplo vuoto la cartella #TODO tenere allineati i files nella cartella con i nomi sul campo di plomino current_files = self.doc.getItem(self.element) cleaned_files = {} if self.multiple: for fName in current_files: if fName in docFolder.keys(): cleaned_files[fName] = current_files[fName] self.doc.setItem(self.element, cleaned_files) #se upload singolo cancello tutti i file presenti collegati al campo else: try: docFolder.manage_delObjects(current_files.keys()) except Exception as error: pass self.doc.removeItem(self.element) namechooser = INameChooser(docFolder) loaded = [] for item in files: if item.filename: content_type = item.headers.get('Content-Type') filename = safe_unicode(item.filename) data = item.read() id_name = '' title = title and title[0] or filename # Get a unique id here id_name = namechooser.chooseName(title, docFolder) # Portal types allowed : File and Image # Since Plone 4.x both types use Blob if content_type in IMAGE_MIMETYPES: portal_type = 'Image' wrapped_data = NamedBlobImage(data=data, filename=filename) else: portal_type = 'File' wrapped_data = NamedBlobFile(data=data, filename=filename) # Create content docFolder.invokeFactory(portal_type, id=id_name, title=title, description=description[0]) newfile = docFolder[id_name] # Set data if portal_type == 'File': if IATFile.providedBy(newfile): newfile.setFile(data, filename=filename) else: newfile.file = wrapped_data elif portal_type == 'Image': if IATImage.providedBy(newfile): newfile.setImage(data, filename=filename) else: newfile.image = wrapped_data # Finalize content creation, reindex it newfile.reindexObject() notify(ObjectModifiedEvent(newfile)) loaded.append(newfile) if loaded: return loaded return False
def upload(self, files, title='', description=''): #TODO!!!!!!!!!!!!!!! #OGNI PACCHETTO CREA LA PROPRIA CARTELLA PER GLI ALLEGATI #E IL GRUPPO DI ISTRUTTORI/RUP #CHE HANNO RUOLI DI CONTRIBUTORI/EDITOR SULLA CARTELLA #QUESTO PACCHETTO DEVE CREARE LA CARTELLA DI PARTENZA CHE PER ORA CABLO IN documenti_allegati #import pdb;pdb.set_trace() if not self.doc.isDocument(): return docfolderId = self.doc.getId() dbfolderId = self.doc.getParentDatabase().id #TODO come configurare diverse cartelle per applicazione o plomino db (da fare sulle singole app)? target = self.context.portal_url.getPortalObject()[ATTACHMENT_FOLDER] with adopt_roles('Manager'): if not dbfolderId in target.keys(): target.invokeFactory("Folder", id=dbfolderId, title=dbfolderId) target = target[dbfolderId] if not docfolderId in target.keys(): target.invokeFactory("Folder", id=docfolderId, title=docfolderId) docFolder = target[docfolderId] for username, roles in self.doc.get_local_roles(): docFolder.manage_setLocalRoles(username, roles) if not isinstance(files, list): files = [files] #se non campo multiplo vuoto la cartella #TODO tenere allineati i files nella cartella con i nomi sul campo di plomino current_files = self.doc.getItem(self.fieldName) cleaned_files = {} if self.multiple: for fName in current_files: if fName in docFolder.keys(): cleaned_files[fName] = current_files[fName] self.doc.setItem(self.fieldName, cleaned_files) #se upload singolo cancello tutti i file presenti collegati al campo else: try: docFolder.manage_delObjects(current_files.keys()) except Exception as error: pass self.doc.removeItem(self.fieldName) namechooser = INameChooser(docFolder) loaded = [] for item in files: if item.filename: content_type = item.headers.get('Content-Type') filename = safe_unicode(item.filename) data = item.read() id_name = '' title = title and title[0] or filename # Get a unique id here id_name = namechooser.chooseName(title, docFolder) # Portal types allowed : File and Image # Since Plone 4.x both types use Blob if content_type in IMAGE_MIMETYPES: portal_type = 'Image' wrapped_data = NamedBlobImage(data=data, filename=filename) else: portal_type = 'File' wrapped_data = NamedBlobFile(data=data, filename=filename) # Create content docFolder.invokeFactory(portal_type, id=id_name, title=title, description=description[0]) newfile = docFolder[id_name] # Set data if portal_type == 'File': if IATFile.providedBy(newfile): newfile.setFile(data, filename=filename) else: newfile.file = wrapped_data elif portal_type == 'Image': if IATImage.providedBy(newfile): newfile.setImage(data, filename=filename) else: newfile.image = wrapped_data # Finalize content creation, reindex it newfile.reindexObject() notify(ObjectModifiedEvent(newfile)) loaded.append(newfile) if loaded: return loaded return False