Nicer references.
[wolnelektury.git] / src / picture / models.py
index 75d84e2..2dadd0c 100644 (file)
@@ -15,14 +15,14 @@ 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 json
 import logging
 import re
 
 from PIL import Image
 
-from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import gettext_lazy as _
 from newtagging import managers
 from os import path
 
@@ -34,7 +34,7 @@ picture_storage = FileSystemStorage(location=path.join(
 
 class PictureArea(models.Model):
     picture = models.ForeignKey('picture.Picture', models.CASCADE, related_name='areas')
-    area = jsonfield.JSONField(_('area'), default={}, editable=False)
+    area = models.TextField(_('area'), default='{}', editable=False)
     kind = models.CharField(
         _('kind'), max_length=10, blank=False, null=False, db_index=True,
         choices=(('thing', _('thing')), ('theme', _('theme'))))
@@ -51,9 +51,12 @@ class PictureArea(models.Model):
         pa = PictureArea()
         pa.picture = picture
         pa.kind = kind
-        pa.area = coords
+        pa.area = json.dumps(coords)
         return pa
 
+    def get_area_json(self):
+        return json.loads(self.area)
+
     @cached_render('picture/picturearea_short.html')
     def midi_box(self):
         themes = self.tags.filter(category='theme')
@@ -77,14 +80,14 @@ class Picture(models.Model):
     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'')
+        _('sort key by author'), max_length=120, db_index=True, editable=False, default='')
     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={})
+    areas_json = models.TextField(_('picture areas JSON'), default='{}', editable=False)
+    extra_info = models.TextField(_('extra information'), default='{}')
     culturepl_link = models.CharField(blank=True, max_length=240)
     wiki_link = models.CharField(blank=True, max_length=240)
 
@@ -98,6 +101,8 @@ class Picture(models.Model):
 
     short_html_url_name = 'picture_short'
 
+    is_picture = True
+
     class AlreadyExists(Exception):
         pass
 
@@ -107,6 +112,9 @@ class Picture(models.Model):
         verbose_name = _('picture')
         verbose_name_plural = _('pictures')
 
+    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
 
@@ -115,7 +123,7 @@ class Picture(models.Model):
         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)
@@ -128,6 +136,15 @@ class Picture(models.Model):
     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:
@@ -163,7 +180,7 @@ class Picture(models.Model):
             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
@@ -196,7 +213,7 @@ class Picture(models.Model):
 
             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:
@@ -268,7 +285,7 @@ class Picture(models.Model):
                     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
@@ -288,8 +305,6 @@ class Picture(models.Model):
             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()
@@ -361,17 +376,3 @@ class Picture(models.Model):
     def clear_cache(self):
         clear_cached_renders(self.mini_box)
         clear_cached_renders(self.midi_box)
-
-    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