X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/cfe30a8b506379030bd36bfabd5a17efe83c3100..a1e5a5980a2354b855e79479701c5198884f7d5f:/apps/picture/models.py diff --git a/apps/picture/models.py b/apps/picture/models.py index 2d2440884..c34b39a25 100644 --- a/apps/picture/models.py +++ b/apps/picture/models.py @@ -5,8 +5,11 @@ from sorl.thumbnail import ImageField from django.conf import settings from django.core.files.storage import FileSystemStorage from django.utils.datastructures import SortedDict -from librarian import dcparser, picture -from slughifi import slughifi +from django.template.loader import render_to_string +from django.core.cache import get_cache +from catalogue.utils import split_tags +from django.utils.safestring import mark_safe +from fnpdjango.utils.text.slughifi import slughifi from django.utils.translation import ugettext_lazy as _ from newtagging import managers @@ -41,9 +44,6 @@ class Picture(models.Model): verbose_name = _('picture') verbose_name_plural = _('pictures') - URLID_RE = r'[a-z0-9-]+' - FILEID_RE = r'[a-z0-9-]+' - def save(self, force_insert=False, force_update=False, reset_short_html=True, **kwargs): from sortify import sortify @@ -51,6 +51,9 @@ class Picture(models.Model): ret = super(Picture, self).save(force_insert, force_update) + if reset_short_html: + self.reset_short_html() + return ret def __unicode__(self): @@ -58,35 +61,46 @@ class Picture(models.Model): @permalink def get_absolute_url(self): - return ('picture.views.picture_detail', [self.urlid()]) - - def urlid(self): - return self.slug + return ('picture.views.picture_detail', [self.slug]) @classmethod 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 + 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) + picture_xml = WLPicture.from_file(xml_file, + image_store=ImageStore(picture_storage.path('images'))) + # image_store=SimpleImageStore - pict, created = Picture.objects.get_or_create(slug=picture_xml.slug) + 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) - pict.title = picture_xml.picture_info.title + picture.title = picture_xml.picture_info.title - # from nose.tools import set_trace; set_trace() motif_tags = set() for part in picture_xml.partiter(): for motif in part['themes']: @@ -97,7 +111,7 @@ class Picture(models.Model): tag.save() motif_tags.add(tag) - pict.tags = catalogue.models.Tag.tags_from_info(picture_xml.picture_info) + \ + picture.tags = catalogue.models.Tag.tags_from_info(picture_xml.picture_info) + \ list(motif_tags) if image_file is not None: @@ -105,14 +119,17 @@ class Picture(models.Model): else: img = picture_xml.image_file() - pict.image_file.save(path.basename(picture_xml.image_path), File(img)) + # FIXME: hardcoded extension + picture.image_file.save(path.basename(picture_xml.image_path), File(img)) - pict.xml_file.save("%s.xml" % pict.slug, File(xml_file)) - pict.save() + picture.xml_file.save("%s.xml" % picture.slug, File(xml_file)) + picture.save() finally: if close_xml_file: xml_file.close() - return pict + if close_image_file: + image_file.close() + return picture @classmethod def picture_list(cls, filter=None): @@ -131,7 +148,7 @@ class Picture(models.Model): for tag in catalogue.models.Tag.objects.filter(category='author'): pics_by_author[tag] = [] - for pic in pics: + for pic in pics.iterator(): authors = list(pic.tags.filter(category='author')) if authors: for author in authors: @@ -144,6 +161,35 @@ class Picture(models.Model): @property def info(self): if not hasattr(self, '_info'): + from librarian import dcparser + from librarian import picture info = dcparser.parse(self.xml_file.path, picture.PictureInfo) self._info = info return self._info + + def reset_short_html(self): + if self.id is None: + return + + cache_key = "Picture.short_html/%d" % (self.id) + get_cache('permanent').delete(cache_key) + + def short_html(self): + if self.id: + cache_key = "Picture.short_html/%d" % (self.id) + short_html = get_cache('permanent').get(cache_key) + else: + short_html = None + + if short_html is not None: + return mark_safe(short_html) + else: + tags = self.tags.filter(category__in=('author', 'kind', 'epoch')) + tags = split_tags(tags) + + short_html = unicode(render_to_string('picture/picture_short.html', + {'picture': self, 'tags': tags})) + + if self.id: + get_cache('permanent').set(cache_key, short_html) + return mark_safe(short_html)