6a27cd9d097549db867e4c01ef4097723de24e4c
[redakcja.git] / src / catalogue / models.py
1 from django.db import models
2 from django.utils.translation import gettext_lazy as _
3 from .constants import WIKIDATA
4 from .wikidata import WikidataMixin
5
6
7 class Author(WikidataMixin, models.Model):
8     slug = models.SlugField(max_length=255, null=True, blank=True, unique=True)
9     first_name = models.CharField(max_length=255, blank=True)
10     last_name = models.CharField(max_length=255, blank=True)
11
12     name_de = models.CharField(max_length=255, blank=True)
13     name_lt = models.CharField(max_length=255, blank=True)
14
15     year_of_death = models.SmallIntegerField(null=True, blank=True)
16     status = models.PositiveSmallIntegerField(
17         null=True,
18         blank=True,
19         choices=[
20             (1, _("Alive")),
21             (2, _("Dead")),
22             (3, _("Long dead")),
23             (4, _("Unknown")),
24         ],
25     )
26     notes = models.TextField(blank=True)
27     gazeta_link = models.CharField(max_length=255, blank=True)
28     culturepl_link = models.CharField(max_length=255, blank=True)
29
30     description = models.TextField(blank=True)
31     description_de = models.TextField(blank=True)
32     description_lt = models.TextField(blank=True)
33
34     priority = models.PositiveSmallIntegerField(
35         default=0, choices=[(0, _("Low")), (1, _("Medium")), (2, _("High"))]
36     )
37     collections = models.ManyToManyField("Collection", blank=True)
38
39     class Meta:
40         ordering = ("last_name", "first_name", "year_of_death")
41
42     class Wikidata:
43         first_name = WIKIDATA.GIVEN_NAME
44         last_name = WIKIDATA.LAST_NAME
45         year_of_death = WIKIDATA.DATE_OF_DEATH
46         notes = "description"
47
48     def __str__(self):
49         return f"{self.first_name} {self.last_name}"
50
51
52 class Book(WikidataMixin, models.Model):
53     slug = models.SlugField(max_length=255, blank=True, null=True, unique=True)
54     authors = models.ManyToManyField(Author, blank=True)
55     translators = models.ManyToManyField(
56         Author,
57         related_name="translated_book_set",
58         related_query_name="translated_book",
59         blank=True,
60     )
61     title = models.CharField(max_length=255, blank=True)
62     language = models.CharField(max_length=255, blank=True)
63     based_on = models.ForeignKey(
64         "self", models.PROTECT, related_name="translation", null=True, blank=True
65     )
66     scans_source = models.CharField(max_length=255, blank=True)
67     text_source = models.CharField(max_length=255, blank=True)
68     notes = models.TextField(blank=True)
69     priority = models.PositiveSmallIntegerField(
70         default=0, choices=[(0, _("Low")), (1, _("Medium")), (2, _("High"))]
71     )
72     pd_year = models.IntegerField(null=True, blank=True)
73     gazeta_link = models.CharField(max_length=255, blank=True)
74     collections = models.ManyToManyField("Collection", blank=True)
75
76     class Meta:
77         ordering = ("title",)
78
79     class Wikidata:
80         authors = WIKIDATA.AUTHOR
81         translators = WIKIDATA.TRANSLATOR
82         title = WIKIDATA.TITLE
83         language = WIKIDATA.LANGUAGE
84         based_on = WIKIDATA.BASED_ON
85         notes = "description"
86
87     def __str__(self):
88         txt = self.title
89         astr = self.authors_str()
90         if astr:
91             txt = f"{astr} – {txt}"
92         tstr = self.translators_str()
93         if tstr:
94             txt = f"{txt} (tłum. {tstr})"
95         return txt
96
97     def authors_str(self):
98         return ", ".join(str(author) for author in self.authors.all())
99
100     def translators_str(self):
101         return ", ".join(str(author) for author in self.translators.all())
102
103
104 class Collection(models.Model):
105     name = models.CharField(max_length=255)
106     slug = models.SlugField(max_length=255, unique=True)
107
108     def __str__(self):
109         return self.name