Update Celery to 4.3
[wolnelektury.git] / src / picture / models.py
index 4d8dac8..75d84e2 100644 (file)
@@ -1,20 +1,19 @@
-# -*- 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
 # 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 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 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 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
 from io import BytesIO
 import jsonfield
 import itertools
@@ -34,7 +33,7 @@ picture_storage = FileSystemStorage(location=path.join(
 
 
 class PictureArea(models.Model):
 
 
 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,
     area = jsonfield.JSONField(_('area'), default={}, editable=False)
     kind = models.CharField(
         _('kind'), max_length=10, blank=False, null=False, db_index=True,
@@ -55,18 +54,18 @@ class PictureArea(models.Model):
         pa.area = coords
         return pa
 
         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):
 
 
 class Picture(models.Model):
@@ -142,9 +141,8 @@ class Picture(models.Model):
     def tags_by_category(self):
         return split_tags(self.tags)
 
     def tags_by_category(self):
         return split_tags(self.tags)
 
-    @permalink
     def get_absolute_url(self):
     def get_absolute_url(self):
-        return 'picture_detail', [self.slug]
+        return reverse('picture_detail', args=[self.slug])
 
     def get_initial(self):
         try:
 
     def get_initial(self):
         try:
@@ -344,23 +342,25 @@ class Picture(models.Model):
             names = [tag[0] for tag in names]
         return ', '.join(names)
 
             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 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:
 
     def search_index(self, picture_info=None, index=None, index_tags=True, commit=True):
         if index is None: