import django.dispatch
from django.contrib.contenttypes.fields import GenericRelation
from django.core.urlresolvers import reverse
-from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ugettext_lazy as _, get_language
import jsonfield
from fnpdjango.storage import BofhFileSystemStorage
from ssify import flush_ssi_includes
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
extra_info = jsonfield.JSONField(_('extra information'), default={})
gazeta_link = models.CharField(blank=True, max_length=240)
wiki_link = models.CharField(blank=True, max_length=240)
+ print_on_demand = models.BooleanField(_('print on demand'), default=False)
# files generated during publication
cover = EbookField(
pass
class Meta:
- ordering = ('sort_key',)
+ ordering = ('sort_key_author', 'sort_key')
verbose_name = _('book')
verbose_name_plural = _('books')
app_label = 'catalogue'
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 translator(self):
+ translators = self.extra_info.get('translators')
+ if not translators:
+ return None
+ if len(translators) > 3:
+ translators = translators[:2]
+ others = ' i inni'
+ else:
+ others = ''
+ return ', '.join(u'\xa0'.join(reversed(translator.split(', ', 1))) for translator in translators) + others
def save(self, force_insert=False, force_update=False, **kwargs):
from sortify import sortify
def language_name(self):
return dict(settings.LANGUAGES).get(self.language_code(), "")
+ def is_foreign(self):
+ return self.language_code() != settings.LANGUAGE_CODE
+
def has_media(self, type_):
if type_ in Book.formats:
return bool(getattr(self, "%s_file" % type_))
def download_pictures(self, remote_gallery_url):
gallery_path = self.gallery_path()
# delete previous files, so we don't include old files in ebooks
- for filename in os.listdir(gallery_path):
- file_path = os.path.join(gallery_path, filename)
- os.unlink(file_path)
+ if os.path.isdir(gallery_path):
+ for filename in os.listdir(gallery_path):
+ file_path = os.path.join(gallery_path, filename)
+ os.unlink(file_path)
ilustr_elements = list(self.wldocument().edoc.findall('//ilustr'))
if ilustr_elements:
makedirs(gallery_path)
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
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`.
"SP": (1, u"szkoła podstawowa"),
"SP1": (1, u"szkoła podstawowa"),
"SP2": (1, u"szkoła podstawowa"),
+ "SP3": (1, u"szkoła podstawowa"),
"P": (1, u"szkoła podstawowa"),
"G": (2, u"gimnazjum"),
"L": (3, u"liceum"),
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 ridero_link(self):
+ return 'https://ridero.eu/%s/books/wl_%s/' % (get_language(), self.slug.replace('-', '_'))
+
def add_file_fields():
for format_ in Book.formats:
).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)