sponsor alt
[wolnelektury.git] / src / picture / models.py
index 416c846..dec9960 100644 (file)
@@ -1,5 +1,5 @@
-# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
-# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+# This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
 from django.db import models, transaction
 import catalogue.models
 #
 from django.db import models, transaction
 import catalogue.models
@@ -9,21 +9,19 @@ from django.contrib.contenttypes.fields import GenericRelation
 from django.core.files.storage import FileSystemStorage
 from django.urls import reverse
 from slugify import slugify
 from django.core.files.storage import FileSystemStorage
 from django.urls import reverse
 from slugify import slugify
-from ssify import flush_ssi_includes
 
 from catalogue.models.tag import prefetched_relations
 from catalogue.utils import split_tags
 from picture import tasks
 from wolnelektury.utils import cached_render, clear_cached_renders
 from io import BytesIO
 
 from catalogue.models.tag import prefetched_relations
 from catalogue.utils import split_tags
 from picture import tasks
 from wolnelektury.utils import cached_render, clear_cached_renders
 from io import BytesIO
-import jsonfield
 import itertools
 import itertools
+import json
 import logging
 import re
 
 from PIL import Image
 
 import logging
 import re
 
 from PIL import Image
 
-from django.utils.translation import ugettext_lazy as _
 from newtagging import managers
 from os import path
 
 from newtagging import managers
 from os import path
 
@@ -35,10 +33,11 @@ picture_storage = FileSystemStorage(location=path.join(
 
 class PictureArea(models.Model):
     picture = models.ForeignKey('picture.Picture', models.CASCADE, related_name='areas')
 
 class PictureArea(models.Model):
     picture = models.ForeignKey('picture.Picture', models.CASCADE, related_name='areas')
-    area = jsonfield.JSONField(_('area'), default={}, editable=False)
+    area = models.TextField('obszar', default='{}', editable=False)
     kind = models.CharField(
     kind = models.CharField(
-        _('kind'), max_length=10, blank=False, null=False, db_index=True,
-        choices=(('thing', _('thing')), ('theme', _('theme'))))
+        'typ', max_length=10, blank=False, null=False, db_index=True,
+        choices=(('thing', 'przedmiot'), ('theme', 'motyw'))
+    )
 
     objects = models.Manager()
     tagged = managers.ModelTaggedItemManager(catalogue.models.Tag)
 
     objects = models.Manager()
     tagged = managers.ModelTaggedItemManager(catalogue.models.Tag)
@@ -52,21 +51,11 @@ class PictureArea(models.Model):
         pa = PictureArea()
         pa.picture = picture
         pa.kind = kind
         pa = PictureArea()
         pa.picture = picture
         pa.kind = kind
-        pa.area = coords
+        pa.area = json.dumps(coords)
         return pa
 
         return pa
 
-    def flush_includes(self, languages=True):
-        if not languages:
-            return
-        if languages is True:
-            languages = [lc for (lc, _ln) in settings.LANGUAGES]
-        flush_ssi_includes([
-            template % (self.pk, lang)
-            for template in [
-                '/katalog/pa/%d/short.%s.html',
-                ]
-            for lang in languages
-            ])
+    def get_area_json(self):
+        return json.loads(self.area)
 
 
 class Picture(models.Model):
 
 
 class Picture(models.Model):
@@ -74,18 +63,18 @@ class Picture(models.Model):
     Picture resource.
 
     """
     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)
+    title = models.CharField('tytuł', max_length=32767)
+    slug = models.SlugField('slug', max_length=120, db_index=True, unique=True)
+    sort_key = models.CharField('klucz sortowania', max_length=120, db_index=True, editable=False)
     sort_key_author = models.CharField(
     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={})
+        'klucz sortowania wg autora', max_length=120, db_index=True, editable=False, default='')
+    created_at = models.DateTimeField('data utworzenia', auto_now_add=True, db_index=True)
+    changed_at = models.DateTimeField('data zmiany', auto_now=True, db_index=True)
+    xml_file = models.FileField('plik xml', upload_to="xml", storage=picture_storage)
+    image_file = ImageField('plik obrazu', upload_to="images", storage=picture_storage)
+    html_file = models.FileField('plik html', upload_to="html", storage=picture_storage)
+    areas_json = models.TextField('obszary w JSON', default='{}', editable=False)
+    extra_info = models.TextField('dodatkowa informacja', default='{}')
     culturepl_link = models.CharField(blank=True, max_length=240)
     wiki_link = models.CharField(blank=True, max_length=240)
 
     culturepl_link = models.CharField(blank=True, max_length=240)
     wiki_link = models.CharField(blank=True, max_length=240)
 
@@ -99,14 +88,19 @@ class Picture(models.Model):
 
     short_html_url_name = 'picture_short'
 
 
     short_html_url_name = 'picture_short'
 
+    is_picture = True
+
     class AlreadyExists(Exception):
         pass
 
     class Meta:
         ordering = ('sort_key_author', 'sort_key')
 
     class AlreadyExists(Exception):
         pass
 
     class Meta:
         ordering = ('sort_key_author', 'sort_key')
 
-        verbose_name = _('picture')
-        verbose_name_plural = _('pictures')
+        verbose_name = 'obraz'
+        verbose_name_plural = 'obrazy'
+
+    def get_extra_info_json(self):
+        return json.loads(self.extra_info or '{}')
 
     def save(self, force_insert=False, force_update=False, **kwargs):
         from sortify import sortify
 
     def save(self, force_insert=False, force_update=False, **kwargs):
         from sortify import sortify
@@ -116,7 +110,7 @@ class Picture(models.Model):
         try:
             author = self.authors().first().sort_key
         except AttributeError:
         try:
             author = self.authors().first().sort_key
         except AttributeError:
-            author = u''
+            author = ''
         self.sort_key_author = author
 
         ret = super(Picture, self).save(force_insert, force_update)
         self.sort_key_author = author
 
         ret = super(Picture, self).save(force_insert, force_update)
@@ -129,6 +123,15 @@ class Picture(models.Model):
     def authors(self):
         return self.tags.filter(category='author')
 
     def authors(self):
         return self.tags.filter(category='author')
 
+    def epochs(self):
+        return self.tags.filter(category='epoch')
+
+    def genres(self):
+        return self.tags.filter(category='genre')
+
+    def kinds(self):
+        return self.tags.filter(category='kind')
+
     def tag_unicode(self, category):
         relations = prefetched_relations(self, category)
         if relations:
     def tag_unicode(self, category):
         relations = prefetched_relations(self, category)
         if relations:
@@ -164,7 +167,7 @@ class Picture(models.Model):
             return None
 
     @classmethod
             return None
 
     @classmethod
-    def from_xml_file(cls, xml_file, image_file=None, image_store=None, overwrite=False, search_index=True):
+    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
         """
         Import xml and it's accompanying image file.
         If image file is missing, it will be fetched by librarian.picture.ImageStore
@@ -197,7 +200,7 @@ class Picture(models.Model):
 
             picture.areas.all().delete()
             picture.title = str(picture_xml.picture_info.title)
 
             picture.areas.all().delete()
             picture.title = str(picture_xml.picture_info.title)
-            picture.extra_info = picture_xml.picture_info.to_dict()
+            picture.extra_info = json.dumps(picture_xml.picture_info.to_dict())
 
             picture_tags = set(catalogue.models.Tag.tags_from_info(picture_xml.picture_info))
             for tag in picture_tags:
 
             picture_tags = set(catalogue.models.Tag.tags_from_info(picture_xml.picture_info))
             for tag in picture_tags:
@@ -269,7 +272,7 @@ class Picture(models.Model):
                     area.tags = _tags.union(picture_tags)
 
             picture.tags = picture_tags
                     area.tags = _tags.union(picture_tags)
 
             picture.tags = picture_tags
-            picture.areas_json = area_data
+            picture.areas_json = json.dumps(area_data)
 
             if image_file is not None:
                 img = image_file
 
             if image_file is not None:
                 img = image_file
@@ -289,8 +292,6 @@ class Picture(models.Model):
             picture.xml_file.save("%s.xml" % picture.slug, File(xml_file))
             picture.save()
             tasks.generate_picture_html(picture.id)
             picture.xml_file.save("%s.xml" % picture.slug, File(xml_file))
             picture.save()
             tasks.generate_picture_html(picture.id)
-            if not settings.NO_SEARCH_INDEX and search_index:
-                tasks.index_picture.delay(picture.id, picture_info=picture_xml.picture_info)
 
         if close_xml_file:
             xml_file.close()
 
         if close_xml_file:
             xml_file.close()
@@ -353,31 +354,5 @@ class Picture(models.Model):
         return catalogue.models.Tag.objects.usage_for_queryset(
             self.areas.all(), counts=True).filter(category__in=('theme', 'thing'))
 
         return catalogue.models.Tag.objects.usage_for_queryset(
             self.areas.all(), counts=True).filter(category__in=('theme', 'thing'))
 
-    def flush_includes(self, languages=True):
+    def clear_cache(self):
         clear_cached_renders(self.mini_box)
         clear_cached_renders(self.mini_box)
-        if not languages:
-            return
-        if languages is True:
-            languages = [lc for (lc, _ln) in settings.LANGUAGES]
-        flush_ssi_includes([
-            template % (self.pk, lang)
-            for template in [
-                '/katalog/p/%d/short.%s.html',
-                '/katalog/p/%d/mini.%s.html',
-                ]
-            for lang in languages
-            ])
-
-    def search_index(self, picture_info=None, index=None, index_tags=True, commit=True):
-        if index is None:
-            from search.index import Index
-            index = Index()
-        try:
-            index.index_picture(self, picture_info)
-            if index_tags:
-                index.index_tags()
-            if commit:
-                index.index.commit()
-        except Exception as e:
-            index.index.rollback()
-            raise e