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
-import jsonfield
import itertools
+import json
import logging
import re
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'))))
pa = PictureArea()
pa.picture = picture
pa.kind = kind
- pa.area = coords
+ pa.area = json.dumps(coords)
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)
+
+ @cached_render('picture/picturearea_short.html')
+ def midi_box(self):
+ themes = self.tags.filter(category='theme')
+ things = self.tags.filter(category='thing')
+ return {
+ 'area': self,
+ 'theme': themes[0] if themes else None,
+ 'thing': things[0] if things else None,
+ }
+
+ def clear_cache(self):
+ clear_cached_renders(self.midi_box)
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)
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
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)
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:
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
names = [tag[0] for tag in names]
return ', '.join(names)
+ @cached_render('picture/picture_mini_box.html')
+ def mini_box(self):
+ return {
+ 'picture': self,
+ }
+
+ @cached_render('picture/picture_short.html')
+ def midi_box(self):
+ return {
+ 'picture': self,
+ }
+
def related_themes(self):
return catalogue.models.Tag.objects.usage_for_queryset(
self.areas.all(), counts=True).filter(category__in=('theme', 'thing'))
- 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/p/%d/short.%s.html',
- '/katalog/p/%d/mini.%s.html',
- ]
- for lang in languages
- ])
+ 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: