X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/41886adc4962a2aea572be1f71297c8a01bf99fb..573b9004c7bc2a6a2b29335155b4ff55d142c6b6:/src/catalogue/models.py diff --git a/src/catalogue/models.py b/src/catalogue/models.py index 1eb497f0..d2befb90 100644 --- a/src/catalogue/models.py +++ b/src/catalogue/models.py @@ -30,10 +30,15 @@ class Author(WikidataModel): gender = models.CharField(_("gender"), max_length=255, blank=True) nationality = models.CharField(_("nationality"), max_length=255, blank=True) + year_of_birth = models.SmallIntegerField(_("year of birth"), null=True, blank=True) year_of_birth_inexact = models.BooleanField(_("inexact"), default=False) year_of_birth_range = models.SmallIntegerField(_("year of birth, range end"), null=True, blank=True) date_of_birth = models.DateField(_("date_of_birth"), null=True, blank=True) + century_of_birth = models.SmallIntegerField( + _("century of birth"), null=True, blank=True, + help_text=_('Set if year unknown. Negative for BC.') + ) place_of_birth = models.ForeignKey( 'Place', models.PROTECT, null=True, blank=True, verbose_name=_('place of birth'), @@ -43,6 +48,10 @@ class Author(WikidataModel): year_of_death_inexact = models.BooleanField(_("inexact"), default=False) year_of_death_range = models.SmallIntegerField(_("year of death, range end"), null=True, blank=True) date_of_death = models.DateField(_("date_of_death"), null=True, blank=True) + century_of_death = models.SmallIntegerField( + _("century of death"), null=True, blank=True, + help_text=_('Set if year unknown. Negative for BC.') + ) place_of_death = models.ForeignKey( 'Place', models.PROTECT, null=True, blank=True, verbose_name=_('place of death'), @@ -76,6 +85,8 @@ class Author(WikidataModel): ) collections = models.ManyToManyField("Collection", blank=True, verbose_name=_("collections")) + woblink = models.IntegerField(null=True, blank=True) + class Meta: verbose_name = _('author') verbose_name_plural = _('authors') @@ -130,6 +141,47 @@ class Author(WikidataModel): ) return t + def century_description(self, number): + n = abs(number) + letters = '' + while n > 10: + letters += 'X' + n -= 10 + if n == 9: + letters += 'IX' + n = 0 + elif n >= 5: + letters += 'V' + n -= 5 + if n == 4: + letters += 'IV' + n = 0 + letters += 'I' * n + letters += ' w.' + if number < 0: + letters += ' p.n.e.' + return letters + + def birth_century_description(self): + return self.century_description(self.century_of_birth) + + def death_century_description(self): + return self.century_description(self.century_of_death) + + def year_description(self, number): + n = abs(number) + letters = str(n) + letters += ' r.' + if number < 0: + letters += ' p.n.e.' + return letters + + def year_of_birth_description(self): + return self.year_description(self.year_of_birth) + def year_of_death_description(self): + return self.year_description(self.year_of_death) + + class NotableBook(OrderableModel): author = models.ForeignKey(Author, models.CASCADE) book = models.ForeignKey('Book', models.CASCADE) @@ -138,6 +190,7 @@ class NotableBook(OrderableModel): class Category(WikidataModel): name = models.CharField(_("name"), max_length=255) slug = models.SlugField(max_length=255, unique=True) + description = models.TextField(_("description"), blank=True, help_text=_('for publication')) class Meta: abstract = True @@ -287,6 +340,18 @@ class Book(WikidataModel): def translators_last_names(self): return ', '.join(a.last_name for a in self.translators.all()) + def document_book__project(self): + b = self.document_books.first() + if b is None: return '' + if b.project is None: return '' + return b.project.name + + def audience(self): + try: + return self.document_books.first().wldocument().book_info.audience or '' + except: + return '' + def get_estimated_costs(self): return { work_type: work_type.calculate(self) @@ -307,6 +372,9 @@ class Book(WikidataModel): if pbr is not None and pbr.timestamp.date() > cutoff: months = (this_month - pbr.timestamp.date()).days / 365 * 12 + if not months: + return + stats = self.bookmonthlystats_set.filter(date__gte=cutoff).aggregate( views_page=models.Sum('views_page'), views_reader=models.Sum('views_reader') @@ -315,6 +383,25 @@ class Book(WikidataModel): self.monthly_views_reader = stats['views_reader'] / months self.save(update_fields=['monthly_views_page', 'monthly_views_reader']) + @property + def content_stats(self): + if hasattr(self, '_content_stats'): + return self._content_stats + try: + stats = self.document_books.first().wldocument().get_statistics()['total'] + except Exception as e: + stats = {} + self._content_stats = stats + return stats + + chars = lambda self: self.content_stats.get('chars', '') + chars_with_fn = lambda self: self.content_stats.get('chars_with_fn', '') + words = lambda self: self.content_stats.get('words', '') + words_with_fn = lambda self: self.content_stats.get('words_with_fn', '') + verses = lambda self: self.content_stats.get('verses', '') + verses_with_fn = lambda self: self.content_stats.get('verses_with_fn', '') + chars_out_verse = lambda self: self.content_stats.get('chars_out_verse', '') + chars_out_verse_with_fn = lambda self: self.content_stats.get('chars_out_verse_with_fn', '') class CollectionCategory(models.Model): name = models.CharField(_("name"), max_length=255) @@ -472,3 +559,14 @@ class BookMonthlyStats(models.Model): defaults={which: views} ) book.update_monthly_stats() + + +class Thema(models.Model): + code = models.CharField(max_length=128, unique=True) + name = models.CharField(max_length=1024) + description = models.TextField(blank=True) + usable = models.BooleanField() + hidden = models.BooleanField(default=False) + + class Meta: + ordering = ('code',)