• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

iplweb / bpp / 69252c38-21b1-49f8-98a5-a21d59416a66

17 Feb 2025 01:27AM UTC coverage: 47.492% (+0.7%) from 46.838%
69252c38-21b1-49f8-98a5-a21d59416a66

push

circleci

mpasternak
Merge branch 'release/v202502.1156'

2 of 8 new or added lines in 3 files covered. (25.0%)

2233 existing lines in 114 files now uncovered.

16671 of 35103 relevant lines covered (47.49%)

1.2 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

85.0
src/bpp/models/system.py
1
"""
2
Małe klasy pomocnicze dla całego systemu
3
"""
4
import warnings
3✔
5

6
from django.db import models
3✔
7
from django.db.models import CASCADE
3✔
8
from django.db.models.signals import post_migrate
3✔
9
from django.dispatch import receiver
3✔
10
from django.urls import reverse
3✔
11
from model_utils import Choices
3✔
12
from mptt.fields import TreeForeignKey
3✔
13
from mptt.models import MPTTModel
3✔
14

15
from bpp import const
3✔
16
from bpp.models.abstract import ModelZNazwa, NazwaISkrot
3✔
17

18
NAZWY_PRIMO = [
3✔
19
    "",
20
    "Artykuł",
21
    "Książka",
22
    "Zasób tekstowy",
23
    "Rozprawa naukowa",
24
    "Recenzja",
25
    "Artykuł prasowy",
26
    "Rozdział",
27
    "Czasopismo",
28
    "Dane badawcze",
29
    "Materiał konferencyjny",
30
    "Obraz",
31
    "Baza",
32
    "Zestaw danych statystycznych",
33
    "Multimedia",
34
    "Inny",
35
]
36

37
NAZWY_PRIMO = list(zip(NAZWY_PRIMO, NAZWY_PRIMO))
3✔
38

39
RODZAJE_DOKUMENTOW_PBN = [
3✔
40
    ("article", "Artykuł"),
41
    ("book", "Książka"),
42
    ("chapter", "Rozdział"),
43
]
44

45

46
class Charakter_PBN(models.Model):
3✔
47
    wlasciwy_dla = models.CharField(
3✔
48
        "Właściwy dla...", max_length=20, choices=RODZAJE_DOKUMENTOW_PBN
49
    )
50
    identyfikator = models.CharField(max_length=100)
3✔
51
    opis = models.CharField(max_length=500)
3✔
52
    help_text = models.TextField(blank=True)
3✔
53

54
    class Meta:
3✔
55
        ordering = ["identyfikator"]
3✔
56
        verbose_name = "Charakter PBN"
3✔
57
        verbose_name_plural = "Charaktery PBN"
3✔
58

59
    def __str__(self):
3✔
60
        return self.opis
×
61

62

63
CHARAKTER_SLOTY = Choices(
3✔
64
    (const.CHARAKTER_SLOTY_KSIAZKA, "ksiazka", "Książka"),
65
    (const.CHARAKTER_SLOTY_ROZDZIAL, "rozdzial", "Rozdział"),
66
    (const.CHARAKTER_SLOTY_REFERAT, "referat", "Referat"),
67
)
68

69
RODZAJ_PBN_CHOICES = [
3✔
70
    (None, "nie eksportuj do PBN"),
71
    (const.RODZAJ_PBN_ARTYKUL, "artykuł"),
72
    (const.RODZAJ_PBN_KSIAZKA, "książka"),
73
    (const.RODZAJ_PBN_ROZDZIAL, "rozdział"),
74
    (const.RODZAJ_PBN_POSTEPOWANIE, "postępowanie"),
75
]
76

77
CHARAKTER_OGOLNY_CHOICES = Choices(
3✔
78
    (const.CHARAKTER_OGOLNY_ARTYKUL, "artykul", "Artykuł"),
79
    (const.CHARAKTER_OGOLNY_KSIAZKA, "ksiazka", "Książka"),
80
    (const.CHARAKTER_OGOLNY_ROZDZIAL, "rozdzial", "Rozdział"),
81
    (const.CHARAKTER_OGOLNY_INNE, "inne", "Inne"),
82
)
83

84

85
class Charakter_Formalny(NazwaISkrot, MPTTModel):
3✔
86
    class CHARAKTER_CROSSREF(models.IntegerChoices):
3✔
87
        JOURNAL_ARTICLE = 1, "journal-article"
3✔
88
        PROCEEDINGS_ARTICLE = 2, "proceedings-article"
3✔
89
        BOOK = 3, "book"
3✔
90
        BOOK_CHAPTER = 4, "book-chapter"
3✔
91

92
    denorm_always_skip = (
3✔
93
        "tree_id",
94
        "lft",
95
        "rght",
96
        "level",
97
    )
98
    parent = TreeForeignKey(
3✔
99
        "self",
100
        verbose_name="Charakter nadrzędny",
101
        on_delete=models.CASCADE,
102
        null=True,
103
        blank=True,
104
        related_name="children",
105
    )
106

107
    charakter_ogolny = models.CharField(
3✔
108
        max_length=3,
109
        help_text="""Charakter ogólny uzywany jest m.in. do generowania opisów bibliograficznych. Stanowi on
110
        ogólne określenie rekordu, czy jest to książka, rozdział czy coś innego. """,
111
        default=const.CHARAKTER_OGOLNY_INNE,
112
        choices=CHARAKTER_OGOLNY_CHOICES,
113
    )
114

115
    publikacja = models.BooleanField(
3✔
116
        help_text="""Jest charakterem dla publikacji""", default=False
117
    )
118
    streszczenie = models.BooleanField(
3✔
119
        help_text="""Jest charakterem dla streszczeń""", default=False
120
    )
121

122
    nazwa_w_primo = models.CharField(
3✔
123
        "Nazwa w Primo",
124
        max_length=100,
125
        help_text="""
126
    Nazwa charakteru formalnego w wyszukiwarce Primo, eksponowana przez OAI-PMH. W przypadku,
127
    gdy to pole jest puste, prace o danym charakterze formalnym nie będą udostępniane przez
128
    protokół OAI-PMH.
129
    """,
130
        blank=True,
131
        default="",
132
        choices=NAZWY_PRIMO,
133
        db_index=True,
134
    )
135

136
    charakter_pbn = models.ForeignKey(
3✔
137
        Charakter_PBN,
138
        verbose_name="Charakter PBN",
139
        blank=True,
140
        null=True,
141
        default=None,
142
        help_text="""Wartość wybrana w tym polu zostanie użyta jako zawartość tagu <is>
143
                                      w plikach eksportu do PBN""",
144
        on_delete=CASCADE,
145
    )
146

147
    rodzaj_pbn = models.PositiveSmallIntegerField(
3✔
148
        verbose_name="Rodzaj dla PBN",
149
        choices=RODZAJ_PBN_CHOICES,
150
        null=True,
151
        blank=True,
152
        help_text="""Pole określające, czy wydawnictwa posiadające dany charakter formalny zostaną włączone
153
        do eksportu PBN jako artykuły, rozdziały czy książki. """,
154
        default=None,
155
    )
156

157
    charakter_sloty = models.PositiveSmallIntegerField(
3✔
158
        "Charakter dla slotów",
159
        null=True,
160
        blank=True,
161
        default=None,
162
        choices=CHARAKTER_SLOTY,
163
        help_text="""Jak potraktować ten charakter przy kalkulacji slotów dla wydawnictwa zwartego?""",
164
    )
165

166
    charakter_crossref = models.PositiveSmallIntegerField(
3✔
167
        "Charakter w CrossRef",
168
        null=True,
169
        blank=True,
170
        default=None,
171
        choices=CHARAKTER_CROSSREF.choices,
172
        unique=True,
173
    )
174

175
    wliczaj_do_rankingu = models.BooleanField(default=True)
3✔
176

177
    class Meta:
3✔
178
        ordering = ["nazwa"]
3✔
179
        app_label = "bpp"
3✔
180
        verbose_name = "charakter formalny"
3✔
181
        verbose_name_plural = "charaktery formalne"
3✔
182

183
    class MPTTMeta:
3✔
184
        order_insertion_by = ["nazwa"]
3✔
185

186
    #
187
    # Kompatybilne API dla .artykul_pbn, .rozdzial_pbn, .ksiazka_pbn
188
    #
189

190
    def get_rodzaj(self, typ):
3✔
191
        warnings.warn("W przyszlosci uzyj pola 'rodzaj_pbn'", DeprecationWarning)
×
192
        v = getattr(const, "RODZAJ_PBN_%s" % typ.upper())
×
193
        if self.rodzaj_pbn == v:
×
194
            return True
×
195
        return False
×
196

197
    def set_rodzaj(self, typ, value):
3✔
198
        warnings.warn("W przyszlosci uzyj pola 'rodzaj_pbn'", DeprecationWarning)
×
199
        v = getattr(const, "RODZAJ_PBN_%s" % typ.upper())
×
200
        if value is True:
×
201
            self.rodzaj_pbn = v
×
202
        else:
203
            raise NotImplementedError(
×
204
                "Nie wiem jak sie zachowac, gdy atrybut self.%s_pbn jest ustawiany na False"
205
                % typ
206
            )
207

208
    def get_artykul_pbn(self):
3✔
209
        return self.get_rodzaj("artykul")
×
210

211
    def get_ksiazka_pbn(self):
3✔
212
        return self.get_rodzaj("ksiazka")
×
213

214
    def get_rozdzial_pbn(self):
3✔
215
        return self.get_rodzaj("rozdzial")
×
216

217
    def set_artykul_pbn(self, v):
3✔
218
        return self.set_rodzaj("artykul", v)
×
219

220
    def set_ksiazka_pbn(self, v):
3✔
221
        return self.set_rodzaj("ksiazka", v)
×
222

223
    def set_rozdzial_pbn(self, v):
3✔
224
        return self.set_rodzaj("rozdzial", v)
×
225

226
    artykul_pbn = property(get_artykul_pbn, set_artykul_pbn)
3✔
227
    ksiazka_pbn = property(get_ksiazka_pbn, set_ksiazka_pbn)
3✔
228
    rozdzial_pbn = property(get_rozdzial_pbn, set_rozdzial_pbn)
3✔
229

230
    def get_absolute_url(self):
3✔
231
        return reverse("admin:bpp_charakter_formalny_change", args=(self.pk,))
×
232

233

234
@receiver(post_migrate)
3✔
235
def rebuild_handler(sender, **kwargs):
3✔
236
    # Ponieważ przechodzimy z modelu bez-MPTT na model z-MPTT, wypełniamy
237
    # mu defaultowe wartości dla poziomu, parents, itp. Stąd też, po migracji
238
    # potrzebne jest przebudowanie obiektów, aby relacje rodzic-dziecko
239
    # realizowane byłyprawidłowo
240
    if sender.name == "bpp":
3✔
241
        Charakter_Formalny.objects.rebuild()
3✔
242

243

244
class Status_Korekty(ModelZNazwa):
3✔
245
    class Meta:
3✔
246
        verbose_name = "status korekty"
3✔
247
        verbose_name_plural = "statusy korekty"
3✔
248
        app_label = "bpp"
3✔
249

250

251
class Zrodlo_Informacji(ModelZNazwa):
3✔
252
    class Meta:
3✔
253
        verbose_name = "źródło informacji o bibliografii"
3✔
254
        verbose_name_plural = "źródła informacji o bibliografii"
3✔
255
        app_label = "bpp"
3✔
256

257

258
class Typ_Odpowiedzialnosci(NazwaISkrot):
3✔
259
    typ_ogolny = models.SmallIntegerField(
3✔
260
        "Ogólny typ odpowiedzialności",
261
        choices=[
262
            (const.TO_AUTOR, "autor"),
263
            (const.TO_REDAKTOR, "redaktor"),
264
            (const.TO_INNY, "inny"),
265
            (const.TO_TLUMACZ, "tłumacz"),
266
            (const.TO_KOMENTATOR, "komentator"),
267
            (const.TO_RECENZENT, "recenzent"),
268
            (const.TO_OPRACOWAL, "opracował"),
269
            (const.TO_REDAKTOR_TLUMACZENIA, "redaktor tłumaczenia"),
270
        ],
271
        default=const.TO_AUTOR,
272
        help_text="""Pole to jest używane celem rozróżniania typu odpowiedzialności
273
        na cele eksportu do PBN (autor i redaktor) oraz może być też wykorzystywane
274
        np. w raportach autorów i jednostek.
275
        """,
276
        db_index=True,
277
    )
278

279
    class Meta:
3✔
280
        verbose_name = "typ odpowiedzialności"
3✔
281
        verbose_name_plural = "typy odpowiedzialności"
3✔
282
        ordering = ["nazwa"]
3✔
283
        app_label = "bpp"
3✔
284

285
    def __str__(self):
3✔
UNCOV
286
        return self.nazwa
1✔
287

288

289
class Jezyk(NazwaISkrot):
3✔
290
    class SKROT_CROSSREF(models.TextChoices):
3✔
291
        en = "en", "en - angielski"
3✔
292
        es = "es", "es - hiszpański"
3✔
293

294
    skrot_crossref = models.CharField(
3✔
295
        max_length=10,
296
        verbose_name="Skrót nazwy języka wg API CrossRef",
297
        choices=SKROT_CROSSREF.choices,
298
        blank=True,
299
        null=True,
300
        unique=True,
301
    )
302

303
    pbn_uid = models.ForeignKey(
3✔
304
        "pbn_api.Language", null=True, blank=True, on_delete=models.SET_NULL
305
    )
306

307
    class Meta:
3✔
308
        verbose_name = "język"
3✔
309
        verbose_name_plural = "języki"
3✔
310
        ordering = ["nazwa"]
3✔
311
        app_label = "bpp"
3✔
312

313
    def get_skrot_dla_pbn(self):
3✔
314
        if self.skrot_dla_pbn:
×
315
            return self.skrot_dla_pbn
×
316

317
        return self.skrot
×
318

319

320
class Typ_KBN(NazwaISkrot):
3✔
321
    artykul_pbn = models.BooleanField(
3✔
322
        "Artykuł w PBN",
323
        help_text="""Wydawnictwa ciągłe posiadające
324
    ten typ MNiSW/MEiN zostaną włączone do eksportu PBN jako artykuły""",
325
        default=False,
326
    )
327

328
    charakter_pbn = models.ForeignKey(
3✔
329
        Charakter_PBN,
330
        verbose_name="Charakter PBN",
331
        blank=True,
332
        null=True,
333
        default=None,
334
        help_text="""Wartość wybrana w tym polu zostanie użyta jako
335
        fallback, tzn. jeżeli dla charakteru formalnego danego rekordu nie
336
        określono odpowiedniego charakteru PBN, to zostanie użyta wartość
337
        tego pola, o ile wybrana. """,
338
        on_delete=CASCADE,
339
    )
340

341
    wliczaj_do_rankingu = models.BooleanField(default=True)
3✔
342

343
    class Meta:
3✔
344
        verbose_name = "typ MNiSW/MEiN"
3✔
345
        verbose_name_plural = "typy KBN"
3✔
346
        ordering = ["nazwa"]
3✔
347
        app_label = "bpp"
3✔
348

349

350
class Rodzaj_Prawa_Patentowego(ModelZNazwa):
3✔
351
    class Meta:
3✔
352
        verbose_name = "rodzaj prawa patentowego"
3✔
353
        verbose_name_plural = "rodzaje praw patentowych"
3✔
354
        ordering = [
3✔
355
            "nazwa",
356
        ]
357
        app_label = "bpp"
3✔
358

359

360
class Zewnetrzna_Baza_Danych(NazwaISkrot):
3✔
361
    class Meta:
3✔
362
        verbose_name = "zewnętrzna baza danych"
3✔
363
        verbose_name_plural = "zenwętrzne bazy danych"
3✔
364
        ordering = [
3✔
365
            "nazwa",
366
        ]
367
        app_label = "bpp"
3✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc