X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/357027375ff8867f42ca34bcbfb5a78b5b185fc3..65e46c7561ac8603cfc0fe0a848209e567df3daa:/src/picture/models.py?ds=sidebyside diff --git a/src/picture/models.py b/src/picture/models.py index 5aabe3c89..dc7142c0a 100644 --- a/src/picture/models.py +++ b/src/picture/models.py @@ -17,6 +17,7 @@ from StringIO import StringIO import jsonfield import itertools import logging +import re from PIL import Image @@ -33,14 +34,13 @@ picture_storage = FileSystemStorage(location=path.join( class PictureArea(models.Model): picture = models.ForeignKey('picture.Picture', related_name='areas') area = jsonfield.JSONField(_('area'), default={}, editable=False) - kind = models.CharField(_('kind'), max_length=10, blank=False, - null=False, db_index=True, - choices=(('thing', _('thing')), - ('theme', _('theme')))) - - objects = models.Manager() - tagged = managers.ModelTaggedItemManager(catalogue.models.Tag) - tags = managers.TagDescriptor(catalogue.models.Tag) + kind = models.CharField( + _('kind'), max_length=10, blank=False, null=False, db_index=True, + choices=(('thing', _('thing')), ('theme', _('theme')))) + + objects = models.Manager() + tagged = managers.ModelTaggedItemManager(catalogue.models.Tag) + tags = managers.TagDescriptor(catalogue.models.Tag) tag_relations = GenericRelation(catalogue.models.Tag.intermediary_table_model) short_html_url_name = 'picture_area_short' @@ -72,26 +72,27 @@ class Picture(models.Model): Picture resource. """ - title = models.CharField(_('title'), max_length=32767) - slug = models.SlugField(_('slug'), max_length=120, db_index=True, unique=True) - sort_key = models.CharField(_('sort key'), max_length=120, db_index=True, editable=False) - sort_key_author = models.CharField(_('sort key by author'), max_length=120, db_index=True, editable=False, default=u'') - created_at = models.DateTimeField(_('creation date'), auto_now_add=True, db_index=True) - changed_at = models.DateTimeField(_('creation date'), auto_now=True, db_index=True) - xml_file = models.FileField('xml_file', upload_to="xml", storage=picture_storage) - image_file = ImageField(_('image_file'), upload_to="images", storage=picture_storage) - html_file = models.FileField('html_file', upload_to="html", storage=picture_storage) - areas_json = jsonfield.JSONField(_('picture areas JSON'), default={}, editable=False) - extra_info = jsonfield.JSONField(_('extra information'), default={}) - culturepl_link = models.CharField(blank=True, max_length=240) - wiki_link = models.CharField(blank=True, max_length=240) - - width = models.IntegerField(null=True) - height = models.IntegerField(null=True) - - objects = models.Manager() - tagged = managers.ModelTaggedItemManager(catalogue.models.Tag) - tags = managers.TagDescriptor(catalogue.models.Tag) + title = models.CharField(_('title'), max_length=32767) + slug = models.SlugField(_('slug'), max_length=120, db_index=True, unique=True) + sort_key = models.CharField(_('sort key'), max_length=120, db_index=True, editable=False) + sort_key_author = models.CharField( + _('sort key by author'), max_length=120, db_index=True, editable=False, default=u'') + created_at = models.DateTimeField(_('creation date'), auto_now_add=True, db_index=True) + changed_at = models.DateTimeField(_('creation date'), auto_now=True, db_index=True) + xml_file = models.FileField(_('xml file'), upload_to="xml", storage=picture_storage) + image_file = ImageField(_('image file'), upload_to="images", storage=picture_storage) + html_file = models.FileField(_('html file'), upload_to="html", storage=picture_storage) + areas_json = jsonfield.JSONField(_('picture areas JSON'), default={}, editable=False) + extra_info = jsonfield.JSONField(_('extra information'), default={}) + culturepl_link = models.CharField(blank=True, max_length=240) + wiki_link = models.CharField(blank=True, max_length=240) + + width = models.IntegerField(null=True) + height = models.IntegerField(null=True) + + objects = models.Manager() + tagged = managers.ModelTaggedItemManager(catalogue.models.Tag) + tags = managers.TagDescriptor(catalogue.models.Tag) tag_relations = GenericRelation(catalogue.models.Tag.intermediary_table_model) short_html_url_name = 'picture_short' @@ -100,7 +101,7 @@ class Picture(models.Model): pass class Meta: - ordering = ('sort_key',) + ordering = ('sort_key_author', 'sort_key') verbose_name = _('picture') verbose_name_plural = _('pictures') @@ -123,9 +124,36 @@ class Picture(models.Model): def __unicode__(self): return self.title + def author_str(self): + return ", ".join(str(t) for t in self.tags.filter(category='author')) + + def tag_unicode(self, category): + return ", ".join(unicode(t) for t in self.tags.filter(category=category)) + + def author_unicode(self): + return self.tag_unicode('author') + @permalink def get_absolute_url(self): - return ('picture.views.picture_detail', [self.slug]) + return 'picture.views.picture_detail', [self.slug] + + def get_initial(self): + try: + return re.search(r'\w', self.title, re.U).group(0) + except AttributeError: + return '' + + def get_next(self): + try: + return type(self).objects.filter(sort_key__gt=self.sort_key)[0] + except IndexError: + return None + + def get_previous(self): + try: + return type(self).objects.filter(sort_key__lt=self.sort_key).order_by('-sort_key')[0] + except IndexError: + return None @classmethod def from_xml_file(cls, xml_file, image_file=None, image_store=None, overwrite=False): @@ -141,7 +169,6 @@ class Picture(models.Model): 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 @@ -168,7 +195,7 @@ class Picture(models.Model): motif_tags = set() thing_tags = set() - area_data = {'themes':{}, 'things':{}} + area_data = {'themes': {}, 'things': {}} # Treat all names in picture XML as in default language. lang = settings.LANGUAGE_CODE @@ -181,13 +208,14 @@ class Picture(models.Model): _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') + 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) + # thing_tags.add(tag) area_data['things'][tag.slug] = { 'object': objname, 'coords': part['coords'], @@ -201,12 +229,13 @@ class Picture(models.Model): _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') + 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) + # motif_tags.add(tag) _tags.add(tag) area_data['themes'][tag.slug] = { 'theme': motif, @@ -260,10 +289,7 @@ class Picture(models.Model): from PIL import ImageDraw, ImageFont from librarian import get_resource - annotated = Image.new(img.mode, - (img.size[0], img.size[1] + 40), - (255, 255, 255) - ) + annotated = Image.new(img.mode, (img.size[0], img.size[1] + 40), (255, 255, 255)) annotated.paste(img, (0, 0)) annotation = Image.new('RGB', (img.size[0] * 3, 120), (255, 255, 255)) ImageDraw.Draw(annotation).text( @@ -275,14 +301,14 @@ class Picture(models.Model): annotated.paste(annotation.resize((img.size[0], 40), Image.ANTIALIAS), (0, img.size[1])) return annotated + # WTF/unused @classmethod def picture_list(cls, filter=None): """Generates a hierarchical listing of all pictures Pictures are optionally filtered with a test function. """ - pics = cls.objects.all().order_by('sort_key')\ - .only('title', 'slug', 'image_file') + pics = cls.objects.all().order_by('sort_key').only('title', 'slug', 'image_file') if filter: pics = pics.filter(filter).distinct()