+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)
+
+ 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)
+ 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)
+ 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)
+ gazeta_link = models.CharField(_("gazeta link"), max_length=255, blank=True)
+ culturepl_link = models.CharField(_("culture.pl link"), max_length=255, blank=True)
+
+ description = models.TextField(_("description"), blank=True)
+
+ priority = models.PositiveSmallIntegerField(
+ _("priority"),
+ default=0, choices=[(0, _("Low")), (1, _("Medium")), (2, _("High"))]
+ )
+ collections = models.ManyToManyField("Collection", blank=True, verbose_name=_("collections"))
+
+ 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 = "description"
+
+ 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])
+
+ @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
+
+
+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)
+
+ class Meta:
+ abstract = True