X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/0bd6d7d8e87e1d538661b6167d0a5d99428dfc39..070975c3e28093c54fa890962a756e89b5f4d155:/src/catalogue/models/book.py diff --git a/src/catalogue/models/book.py b/src/catalogue/models/book.py index d3e2a7756..c537e5d62 100644 --- a/src/catalogue/models/book.py +++ b/src/catalogue/models/book.py @@ -22,6 +22,7 @@ from catalogue import constants from catalogue.fields import EbookField from catalogue.models import Tag, Fragment, BookMedia from catalogue.utils import create_zip, gallery_url, gallery_path +from catalogue.models.tag import prefetched_relations from catalogue import app_settings from catalogue import tasks from wolnelektury.utils import makedirs @@ -92,7 +93,7 @@ class Book(models.Model): pass class Meta: - ordering = ('sort_key',) + ordering = ('sort_key_author', 'sort_key') verbose_name = _('book') verbose_name_plural = _('books') app_label = 'catalogue' @@ -109,8 +110,15 @@ class Book(models.Model): def authors(self): return self.tags.filter(category='author') + def tag_unicode(self, category): + relations = prefetched_relations(self, category) + if relations: + return ', '.join(rel.tag.name for rel in relations) + else: + return ', '.join(self.tags.filter(category=category).values_list('name', flat=True)) + def author_unicode(self): - return ", ".join(self.authors().values_list('name', flat=True)) + return self.tag_unicode('author') def save(self, force_insert=False, force_update=False, **kwargs): from sortify import sortify @@ -378,6 +386,7 @@ class Book(models.Model): for child in notify_cover_changed: child.parent_cover_changed() + book.save() # update sort_key_author cls.published.send(sender=cls, instance=book) return book @@ -491,6 +500,13 @@ class Book(models.Model): names = [tag[0] for tag in names] return ', '.join(names) + def publisher(self): + publisher = self.extra_info['publisher'] + if isinstance(publisher, basestring): + return publisher + elif isinstance(publisher, list): + return ', '.join(publisher) + @classmethod def tagged_top_level(cls, tags): """ Returns top-level books tagged with `tags`. @@ -576,6 +592,15 @@ class Book(models.Model): else: return None + def update_popularity(self): + count = self.tags.filter(category='set').values('user').order_by('user').distinct().count() + try: + pop = self.popularity + pop.count = count + pop.save() + except BookPopularity.DoesNotExist: + BookPopularity.objects.create(book=self, count=count) + def add_file_fields(): for format_ in Book.formats: @@ -595,3 +620,8 @@ def add_file_fields(): ).contribute_to_class(Book, field_name) add_file_fields() + + +class BookPopularity(models.Model): + book = models.OneToOneField(Book, related_name='popularity') + count = models.IntegerField(default=0)