-# -*- coding: utf-8 -*-
# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
from django.db import models, transaction
import catalogue.models
-from django.db.models import permalink
from sorl.thumbnail import ImageField
from django.conf import settings
from django.contrib.contenttypes.fields import GenericRelation
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
class PictureArea(models.Model):
- picture = models.ForeignKey('picture.Picture', related_name='areas')
+ picture = models.ForeignKey('picture.Picture', models.CASCADE, related_name='areas')
area = jsonfield.JSONField(_('area'), default={}, editable=False)
kind = models.CharField(
_('kind'), max_length=10, blank=False, null=False, db_index=True,
pa.area = 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
- ])
+ @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):
def tags_by_category(self):
return split_tags(self.tags)
- @permalink
def get_absolute_url(self):
- return 'picture_detail', [self.slug]
+ return reverse('picture_detail', args=[self.slug])
def get_initial(self):
try:
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: