def from_xml_file(cls, xml_file, image_file=None, overwrite=False): """ Import xml and it's accompanying image file. If image file is missing, it will be fetched by librarian.picture.ImageStore which looks for an image file in the same directory the xml is, with extension matching its mime type. """ from sortify import sortify from django.core.files import File from librarian.picture import WLPicture, ImageStore close_xml_file = False close_image_file = False # class SimpleImageStore(object): # def path(self_, slug, mime_type): # """Returns the image file. Ignores slug ad mime_type.""" # return image_file if image_file is not None and not isinstance(image_file, File): image_file = File(open(image_file)) close_image_file = True if not isinstance(xml_file, File): xml_file = File(open(xml_file)) close_xml_file = True try: # use librarian to parse meta-data picture_xml = WLPicture.from_file( xml_file, image_store=ImageStore(picture_storage.path('images'))) # image_store=SimpleImageStore picture, created = Picture.objects.get_or_create( slug=picture_xml.slug) if not created and not overwrite: raise Picture.AlreadyExists('Picture %s already exists' % picture_xml.slug) picture.title = picture_xml.picture_info.title motif_tags = set() for part in picture_xml.partiter(): for motif in part['themes']: tag, created = catalogue.models.Tag.objects.get_or_create( slug=slughifi(motif), category='theme') if created: tag.name = motif tag.sort_key = sortify(tag.name) tag.save() motif_tags.add(tag) picture.tags = catalogue.models.Tag.tags_from_info(picture_xml.picture_info) + \ list(motif_tags) if image_file is not None: img = image_file else: img = picture_xml.image_file() # FIXME: hardcoded extension picture.image_file.save(path.basename(picture_xml.image_path), File(img)) picture.xml_file.save("%s.xml" % picture.slug, File(xml_file)) picture.save() finally: if close_xml_file: xml_file.close() if close_image_file: image_file.close() return picture
def from_xml_file(cls, xml_file, image_file=None, overwrite=False): """ Import xml and it's accompanying image file. If image file is missing, it will be fetched by librarian.picture.ImageStore which looks for an image file in the same directory the xml is, with extension matching its mime type. """ from sortify import sortify from django.core.files import File from librarian.picture import WLPicture, ImageStore close_xml_file = False close_image_file = False # class SimpleImageStore(object): # def path(self_, slug, mime_type): # """Returns the image file. Ignores slug ad mime_type.""" # return image_file if image_file is not None and not isinstance(image_file, File): image_file = File(open(image_file)) close_image_file = True if not isinstance(xml_file, File): xml_file = File(open(xml_file)) close_xml_file = True try: # use librarian to parse meta-data picture_xml = WLPicture.from_file(xml_file, image_store=ImageStore(picture_storage.path("images"))) # image_store=SimpleImageStore picture, created = Picture.objects.get_or_create(slug=picture_xml.slug) if not created and not overwrite: raise Picture.AlreadyExists("Picture %s already exists" % picture_xml.slug) picture.title = picture_xml.picture_info.title motif_tags = set() for part in picture_xml.partiter(): for motif in part["themes"]: tag, created = catalogue.models.Tag.objects.get_or_create(slug=slughifi(motif), category="theme") if created: tag.name = motif tag.sort_key = sortify(tag.name) tag.save() motif_tags.add(tag) picture.tags = catalogue.models.Tag.tags_from_info(picture_xml.picture_info) + list(motif_tags) if image_file is not None: img = image_file else: img = picture_xml.image_file() # FIXME: hardcoded extension picture.image_file.save(path.basename(picture_xml.image_path), File(img)) picture.xml_file.save("%s.xml" % picture.slug, File(xml_file)) picture.save() finally: if close_xml_file: xml_file.close() if close_image_file: image_file.close() return picture
def from_xml_file(cls, xml_file, image_file=None, image_store=None, overwrite=False): """ Import xml and it's accompanying image file. If image file is missing, it will be fetched by librarian.picture.ImageStore which looks for an image file in the same directory the xml is, with extension matching its mime type. """ from sortify import sortify from django.core.files import File from librarian.picture import WLPicture, ImageStore close_xml_file = False close_image_file = False if image_file is not None and not isinstance(image_file, File): image_file = File(open(image_file)) close_image_file = True if not isinstance(xml_file, File): xml_file = File(open(xml_file)) close_xml_file = True with transaction.atomic(): # use librarian to parse meta-data if image_store is None: image_store = ImageStore(picture_storage.path('images')) picture_xml = WLPicture.from_file(xml_file, image_store=image_store) picture, created = Picture.objects.get_or_create(slug=picture_xml.slug[:120]) if not created and not overwrite: raise Picture.AlreadyExists('Picture %s already exists' % picture_xml.slug) picture.areas.all().delete() picture.title = unicode(picture_xml.picture_info.title) picture.extra_info = picture_xml.picture_info.to_dict() picture_tags = set(catalogue.models.Tag.tags_from_info(picture_xml.picture_info)) motif_tags = set() thing_tags = set() area_data = {'themes': {}, 'things': {}} # Treat all names in picture XML as in default language. lang = settings.LANGUAGE_CODE for part in picture_xml.partiter(): if picture_xml.frame: c = picture_xml.frame[0] part['coords'] = [[p[0] - c[0], p[1] - c[1]] for p in part['coords']] if part.get('object', None) is not None: _tags = set() for objname in part['object'].split(','): objname = objname.strip().capitalize() tag, created = catalogue.models.Tag.objects.get_or_create( slug=slughifi(objname), category='thing') if created: tag.name = objname setattr(tag, 'name_%s' % lang, tag.name) tag.sort_key = sortify(tag.name) tag.save() # thing_tags.add(tag) area_data['things'][tag.slug] = { 'object': objname, 'coords': part['coords'], } _tags.add(tag) area = PictureArea.rectangle(picture, 'thing', part['coords']) area.save() area.tags = _tags else: _tags = set() for motifs in part['themes']: for motif in motifs.split(','): tag, created = catalogue.models.Tag.objects.get_or_create( slug=slughifi(motif), category='theme') if created: tag.name = motif tag.sort_key = sortify(tag.name) tag.save() # motif_tags.add(tag) _tags.add(tag) area_data['themes'][tag.slug] = { 'theme': motif, 'coords': part['coords'] } logging.debug("coords for theme: %s" % part['coords']) area = PictureArea.rectangle(picture, 'theme', part['coords']) area.save() area.tags = _tags.union(picture_tags) picture.tags = picture_tags.union(motif_tags).union(thing_tags) picture.areas_json = area_data if image_file is not None: img = image_file else: img = picture_xml.image_file() modified = cls.crop_to_frame(picture_xml, img) modified = cls.add_source_note(picture_xml, modified) picture.width, picture.height = modified.size modified_file = StringIO() modified.save(modified_file, format='JPEG', quality=95) # FIXME: hardcoded extension - detect from DC format or orginal filename picture.image_file.save(path.basename(picture_xml.image_path), File(modified_file)) picture.xml_file.save("%s.xml" % picture.slug, File(xml_file)) picture.save() tasks.generate_picture_html(picture.id) if close_xml_file: xml_file.close() if close_image_file: image_file.close() return picture