X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/db255ed9d242c56b010061fbdef8de9b696869d4..91a20d3c82e0edcd883148b14df90b56a38ba2b2:/src/depot/models.py?ds=sidebyside diff --git a/src/depot/models.py b/src/depot/models.py index b68b5365..15c0d3a8 100644 --- a/src/depot/models.py +++ b/src/depot/models.py @@ -9,7 +9,8 @@ from django.db import models from django.utils.timezone import now from librarian.cover import make_cover from librarian.builders import EpubBuilder, MobiBuilder -from .legimi import legimi +from .publishers.legimi import Legimi +from .publishers.woblink import Woblink class Package(models.Model): @@ -27,14 +28,14 @@ class Package(models.Model): self.set_status(self.get_status()) except: pass - + try: self.set_definition(self.get_definition()) except: pass super().save(*args, **kwargs) - + def get_status(self): return json.loads(self.status_json) @@ -121,8 +122,21 @@ class Package(models.Model): ) -class LegimiBookPublish(models.Model): +class SiteBook(models.Model): + site = models.ForeignKey('Site', models.SET_NULL, null=True) book = models.ForeignKey('documents.Book', models.CASCADE) + external_id = models.CharField(max_length=255, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + + class Meta: + unique_together = (('book', 'site'),) + + def __str__(self): + return f'{self.site} : {self.book} : {self.external_id}' + + +class SiteBookPublish(models.Model): + site_book = models.ForeignKey(SiteBook, models.PROTECT, null=True, blank=True) user = models.ForeignKey(settings.AUTH_USER_MODEL, models.SET_NULL, null=True) created_at = models.DateTimeField() started_at = models.DateTimeField(null=True, blank=True) @@ -136,12 +150,16 @@ class LegimiBookPublish(models.Model): error = models.TextField(blank=True) @classmethod - def create_for(cls, book, user): + def create_for(cls, book, user, site): book.assert_publishable() changes = book.get_current_changes(publishable=True) - me = cls.objects.create(book=book, user=user, created_at=now()) + site_book, created = SiteBook.objects.get_or_create( + site=site, book=book + ) + me = cls.objects.create( + site_book=site_book, user=user, created_at=now()) for change in changes: - me.legimichunkpublish_set.create(change=change) + me.sitechunkpublish_set.create(change=change) return me def publish(self): @@ -151,9 +169,11 @@ class LegimiBookPublish(models.Model): try: changes = [ p.change for p in - self.legimichunkpublish_set.order_by('change__chunk__number') + self.sitechunkpublish_set.order_by('change__chunk__number') ] - legimi.send_book(self.book, changes=changes) + + self.site.publish(self, changes=changes) + except Exception: self.status = 110 self.error = traceback.format_exc() @@ -164,6 +184,77 @@ class LegimiBookPublish(models.Model): self.save(update_fields=['status', 'finished_at', 'error']) -class LegimiChunkPublish(models.Model): - book_publish = models.ForeignKey(LegimiBookPublish, models.CASCADE) +class SiteChunkPublish(models.Model): + book_publish = models.ForeignKey(SiteBookPublish, models.CASCADE) change = models.ForeignKey('documents.ChunkChange', models.CASCADE) + + +class Site(models.Model): + name = models.CharField(max_length=255) + site_type = models.CharField(max_length=32, choices=[ + ('legimi', 'Legimi'), + ('woblink', 'Woblink'), + ]) + username = models.CharField(max_length=255) + password = models.CharField(max_length=255) + publisher_handle = models.CharField(max_length=255, blank=True) + description_add = models.TextField(blank=True) + + def __str__(self): + return self.name + + def get_texts(self): + return [t.text for t in self.mediainserttext_set.all()] + + def get_price(self, words, pages): + price_obj = self.pricelevel_set.exclude( + min_pages__gt=pages + ).exclude( + min_words__gt=words + ).order_by('-price').first() + if price_obj is None: + return None + return price_obj.price + + def get_publisher(self): + if self.site_type == 'legimi': + pub_class = Legimi + elif self.site_type == 'woblink': + pub_class = Woblink + return pub_class(self.username, self.password, self.publisher_handle) + + def publish(self, site_book_publish, changes): + self.get_publisher().send_book( + site_book_publish, + changes=changes, + ) + + def can_publish(self, book): + return self.get_publisher().can_publish(self, book) + + def get_last(self, book): + return SiteBookPublish.objects.filter( + site_book__site=self, site_book__book=book + ).order_by('-created_at').first() + + def get_external_id_for_book(self, book): + site_book = self.sitebook_set.filter(book=book).first() + return (site_book and site_book.external_id) or '' + +class PriceLevel(models.Model): + site = models.ForeignKey(Site, models.CASCADE) + min_pages = models.IntegerField(null=True, blank=True) + min_words = models.IntegerField(null=True, blank=True) + price = models.IntegerField() + + class Meta: + ordering = ('price',) + + +class MediaInsertText(models.Model): + site = models.ForeignKey(Site, models.CASCADE) + ordering = models.IntegerField() + text = models.TextField() + + class Meta: + ordering = ('ordering',)