summaryrefslogtreecommitdiff
path: root/app/books/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/books/models.py')
-rw-r--r--app/books/models.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/app/books/models.py b/app/books/models.py
new file mode 100644
index 0000000..c8eb041
--- /dev/null
+++ b/app/books/models.py
@@ -0,0 +1,93 @@
+import os
+from PIL import Image
+from django.db import models
+from django.db.models.signals import post_save
+from django.contrib.sitemaps import Sitemap
+from django.dispatch import receiver
+from django.urls import reverse
+from django.apps import apps
+from django.utils.html import format_html
+from django.conf import settings
+
+# allows for manually ordering items:
+from orderable.models import Orderable
+
+from media.utils import resize_image
+from utils.util import markdown_to_html
+
+
+def get_upload_path(self, filename):
+ return "images/book-covers/%s" % (filename)
+
+
+class Book(Orderable):
+ title = models.CharField(max_length=200)
+ author_last_name = models.CharField(max_length=200)
+ author_first_name = models.CharField(max_length=200)
+ slug = models.CharField(max_length=50)
+ isbn = models.CharField(max_length=100, blank=True, null=True)
+ body_markdown = models.TextField(blank=True)
+ body_html = models.TextField(null=True, blank=True)
+ pages = models.CharField(max_length=5, blank=True, null=True)
+ amazon_link = models.CharField(max_length=400, blank=True, null=True)
+ bookshop_link = models.CharField(max_length=400, blank=True, null=True)
+ thriftbooks_link = models.CharField(max_length=400, blank=True, null=True)
+ other_link = models.CharField(max_length=400, blank=True, null=True)
+ image = models.FileField(upload_to=get_upload_path, null=True, blank=True)
+
+ def __str__(self):
+ return self.title
+
+ def get_absolute_url(self):
+ return reverse("books:detail", kwargs={"slug": self.slug})
+
+ def get_image_url(self):
+ return '%sbook-covers/%s' % (settings.IMAGES_URL, self.image.name.split('/')[-1])
+
+ def get_small_image_url(self):
+ filename, file_extension = os.path.splitext(self.image.path)
+ return "%s/book-covers/%s_small%s" % (settings.IMAGES_URL, filename.split('/')[-1], file_extension)
+
+ @property
+ def get_previous_admin_url(self):
+ n = self.get_previous_by_read_date()
+ return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name), args=[n.id])
+
+ @property
+ def get_next_admin_url(self):
+ model = apps.get_model(app_label=self._meta.app_label, model_name=self._meta.model_name)
+ try:
+ return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name), args=[self.get_next_by_read_date().pk])
+ except model.DoesNotExist:
+ return ''
+
+ def admin_thumbnail(self):
+ return format_html('<img src="%s" width="100" style="width:100px" />' % (self.get_image_url()))
+ admin_thumbnail.short_description = 'Thumbnail'
+
+ def save(self, *args, **kwargs):
+ if self.body_markdown:
+ self.body_html = markdown_to_html(self.body_markdown)
+ super(Book, self).save()
+
+
+@receiver(post_save, sender=Book)
+def post_save_events(sender, update_fields, created, instance, **kwargs):
+ if instance.image:
+ base_path = "%s/%s/" % (settings.MEDIA_ROOT, "/".join(str(i) for i in instance.image.name.split('/')[:-1]))
+ filename, file_extension = os.path.splitext(instance.image.path)
+ img = Image.open(instance.image.path)
+ resize_image(img, None, 160, 78, base_path, "%s_tn%s" % (filename.split('/')[-1], file_extension))
+ resize_image(img, None, 650, 78, base_path, "%s_small%s" % (filename.split('/')[-1], file_extension))
+
+
+class BookSitemap(Sitemap):
+ changefreq = "never"
+ priority = 0.7
+ protocol = "https"
+
+ def items(self):
+ return Book.objects.filter(is_public=True).exclude(body_markdown='')
+
+ def lastmod(self, obj):
+ return obj.read_date