+class Author(WikidataModel):
+ slug = models.SlugField(max_length=255, null=True, blank=True, unique=True)
+ first_name = models.CharField(_("first name"), max_length=255, blank=True)
+ last_name = models.CharField(_("last name"), max_length=255, blank=True)
+ genitive = models.CharField(
+ 'dopełniacz', max_length=255, blank=True,
+ help_text='utwory … (czyje?)'
+ )
+
+ name_de = models.CharField(_("name (de)"), max_length=255, blank=True)
+ name_lt = models.CharField(_("name (lt)"), max_length=255, blank=True)
+
+ 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'),
+ related_name='authors_born'
+ )
+ year_of_death = models.SmallIntegerField(_("year of death"), null=True, blank=True)
+ 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'),
+ related_name='authors_died'
+ )
+ status = models.PositiveSmallIntegerField(
+ _("status"),
+ null=True,
+ blank=True,
+ choices=[
+ (1, _("Alive")),
+ (2, _("Dead")),
+ (3, _("Long dead")),
+ (4, _("Unknown")),
+ ],
+ )
+ notes = models.TextField(_("notes"), blank=True, help_text=_('private'))
+
+ gazeta_link = models.CharField(_("gazeta link"), max_length=255, blank=True)
+ culturepl_link = models.CharField(_("culture.pl link"), max_length=255, blank=True)
+ plwiki = models.CharField(blank=True, max_length=255)
+ photo = models.ImageField(blank=True, null=True, upload_to='catalogue/author/')
+ photo_source = models.CharField(blank=True, max_length=255)
+ photo_attribution = models.CharField(max_length=255, blank=True)
+
+ description = models.TextField(_("description"), blank=True, help_text=_('for publication'))
+
+ priority = models.PositiveSmallIntegerField(
+ _("priority"),
+ default=0, choices=[(0, _("Low")), (1, _("Medium")), (2, _("High"))]
+ )
+ 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')
+ ordering = ("last_name", "first_name", "year_of_death")
+
+ class Wikidata:
+ first_name = WIKIDATA.GIVEN_NAME
+ last_name = WIKIDATA.LAST_NAME
+ date_of_birth = WIKIDATA.DATE_OF_BIRTH
+ year_of_birth = WIKIDATA.DATE_OF_BIRTH
+ place_of_birth = WIKIDATA.PLACE_OF_BIRTH
+ date_of_death = WIKIDATA.DATE_OF_DEATH
+ year_of_death = WIKIDATA.DATE_OF_DEATH
+ place_of_death = WIKIDATA.PLACE_OF_DEATH
+ gender = WIKIDATA.GENDER
+ notes = WikiMedia.append("description")
+ plwiki = "plwiki"
+ photo = WikiMedia.download(WIKIDATA.IMAGE)
+ photo_source = WikiMedia.descriptionurl(WIKIDATA.IMAGE)
+ photo_attribution = WikiMedia.attribution(WIKIDATA.IMAGE)
+
+ def _supplement(obj):
+ if not obj.first_name and not obj.last_name:
+ yield 'first_name', 'label'
+
+ def __str__(self):
+ name = f"{self.first_name} {self.last_name}"
+ if self.year_of_death is not None:
+ name += f' (zm. {self.year_of_death})'
+ return name
+
+ def get_absolute_url(self):
+ return reverse("catalogue_author", args=[self.slug])
+
+ @classmethod
+ def get_by_literal(cls, literal):
+ names = literal.split(',', 1)
+ names = [n.strip() for n in names]
+ if len(names) == 2:
+ return cls.objects.filter(last_name=names[0], first_name=names[1]).first()
+ else:
+ return cls.objects.filter(last_name_pl=names[0], first_name_pl='').first() or \
+ cls.objects.filter(first_name_pl=names[0], last_name_pl='').first() or \
+ cls.objects.filter(first_name_pl=literal, last_name_pl='').first() or \
+ cls.objects.filter(first_name_pl=literal, last_name_pl=None).first()
+
+ @property
+ def name(self):
+ return f"{self.last_name}, {self.first_name}"
+
+ @property
+ def pd_year(self):
+ if self.year_of_death:
+ return self.year_of_death + 71
+ elif self.year_of_death == 0:
+ return 0
+ else:
+ return None
+
+ def generate_description(self):
+ t = render_to_string(
+ 'catalogue/author_description.html',
+ {'obj': self}
+ )
+ 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)
+
+
+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