Code layout change.
[wolnelektury.git] / src / catalogue / models / source.py
diff --git a/src/catalogue/models/source.py b/src/catalogue/models/source.py
new file mode 100644 (file)
index 0000000..9aff4ef
--- /dev/null
@@ -0,0 +1,45 @@
+# -*- 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
+from django.utils.translation import ugettext_lazy as _
+
+
+class Source(models.Model):
+    """A collection of books, which might be defined before publishing them."""
+    netloc = models.CharField(_('network location'), max_length=120, primary_key=True)
+    name = models.CharField(_('name'), max_length=120, blank=True)
+
+    class Meta:
+        ordering = ('netloc',)
+        verbose_name = _('source')
+        verbose_name_plural = _('sources')
+        app_label = 'catalogue'
+
+    def __unicode__(self):
+        return self.netloc
+
+    def save(self, *args, **kwargs):
+        from catalogue.models import Book
+        try:
+            str(self.pk)
+            old_self = type(self).objects.get(pk=self)
+        except type(self).DoesNotExist:
+            old_name = u''
+            old_netloc = self.netloc
+        else:
+            old_name = old_self.name
+            old_netloc = old_self.netloc
+
+        ret = super(Source, self).save(*args, **kwargs)
+
+        # If something really changed here, find relevant books
+        # and invalidate their cached includes.
+        if old_name != self.name or old_netloc != self.netloc:
+            for book in Book.objects.all():
+                source = book.extra_info.get('source_url', '')
+                if self.netloc in source or (old_netloc != self.netloc
+                        and old_netloc in source):
+                    book.flush_includes()
+        return ret