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

iplweb / bpp / dedd10c6-fb94-4555-854a-16d9255205b4

24 Aug 2025 08:22PM UTC coverage: 43.704% (-3.2%) from 46.899%
dedd10c6-fb94-4555-854a-16d9255205b4

push

circleci

mpasternak
Merge branch 'release/v202508.1204'

4 of 4 new or added lines in 2 files covered. (100.0%)

739 existing lines in 33 files now uncovered.

16905 of 38681 relevant lines covered (43.7%)

0.79 hits per line

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

8.62
src/bpp/admin/helpers/pbn_api/common.py
1
from django.urls import reverse
2✔
2
from sentry_sdk import capture_exception
2✔
3

4
from import_common.normalization import normalize_isbn
2✔
5
from pbn_api.exceptions import (
2✔
6
    AccessDeniedException,
7
    BrakZdefiniowanegoObiektuUczelniaWSystemieError,
8
    CharakterFormalnyNieobslugiwanyError,
9
    NeedsPBNAuthorisationException,
10
    PKZeroExportDisabled,
11
    PraceSerwisoweException,
12
    ResourceLockedException,
13
    SameDataUploadedRecently,
14
)
15
from pbn_api.models import SentData
2✔
16

17
from django.contrib.contenttypes.models import ContentType
2✔
18

19
from bpp.admin.helpers import link_do_obiektu
2✔
20

21

22
def sprawdz_czy_ustawiono_wysylke_tego_charakteru_formalnego(charakter_formalny):
2✔
23
    if charakter_formalny.rodzaj_pbn is None:
×
24
        raise CharakterFormalnyNieobslugiwanyError(
×
25
            "ten rekord nie może być wyeksportowany do PBN, gdyż ustawienia jego charakteru formalnego "
26
            "po stronie bazy BPP na to nie pozwalają"
27
        )
28

29

30
def sprawdz_wysylke_do_pbn_w_parametrach_uczelni(uczelnia):
2✔
31
    """
32
    :param uczelnia:
33
    :return: zwraca False jeżeli integracja wyłączona lub aktualizowanie na bieżąco wyłączone;
34
    zwraca obiekt uczelnia jeżeli jest OK,
35
    podnosi wyjątek jeżeli brak obiektu Uczelnia
36
    """
37
    if uczelnia is None:
×
38
        raise BrakZdefiniowanegoObiektuUczelniaWSystemieError()
×
39

40
    if not uczelnia.pbn_integracja or not uczelnia.pbn_aktualizuj_na_biezaco:
×
41
        return False
×
42

43
    return uczelnia
×
44

45

46
def sprobuj_wyslac_do_pbn(
2✔
47
    obj, pbn_client, uczelnia, notificator, force_upload=False, raise_exceptions=False
48
):
49

50
    # Sprawdź, czy wydawnictwo nadrzędne ma odpowoednik PBN:
51
    if (
×
52
        hasattr(obj, "wydawnictwo_nadrzedne_id")
53
        and obj.wydawnictwo_nadrzedne_id is not None
54
    ):
55
        wn = obj.wydawnictwo_nadrzedne
×
56
        if wn.pbn_uid_id is None:
×
57
            notificator.info(
×
58
                "Wygląda na to, że wydawnictwo nadrzędne tego rekordu nie posiada odpowiednika "
59
                "w PBN, spróbuję go pobrać.",
60
            )
61
            udalo = False
×
62
            if wn.isbn:
×
63
                ni = normalize_isbn(wn.isbn)
×
64
                if ni:
×
65
                    from pbn_api.integrator import _pobierz_prace_po_elemencie
×
66

67
                    res = None
×
68
                    try:
×
69
                        res = _pobierz_prace_po_elemencie(pbn_client, "isbn", ni)
×
70
                    except PraceSerwisoweException:
×
71
                        notificator.warning(
×
72
                            "Pobieranie z PBN odpowiednika wydawnictwa nadrzędnego pracy po ISBN nie powiodło się "
73
                            "-- trwają prace serwisowe po stronie PBN. ",
74
                        )
75
                    except NeedsPBNAuthorisationException:
×
76
                        notificator.warning(
×
77
                            "Wyszukanie PBN UID wydawnictwa nadrzędnego po ISBN nieudane - "
78
                            "autoryzuj się najpierw w PBN. ",
79
                        )
80

81
                    if res:
×
82
                        notificator.info(
×
83
                            f"Udało się dopasować PBN UID wydawnictwa nadrzędnego po ISBN "
84
                            f"({', '.join([x.tytul_oryginalny for x in res])}). ",
85
                        )
86
                        udalo = True
×
87

88
            elif wn.doi:
×
89
                nd = normalize_isbn(wn.doi)
×
90
                if nd:
×
91
                    from pbn_api.integrator import _pobierz_prace_po_elemencie
×
92

93
                    res = None
×
94
                    try:
×
95
                        res = _pobierz_prace_po_elemencie(pbn_client, "doi", nd)
×
96
                    except PraceSerwisoweException as e:
×
97
                        notificator.warning(
×
98
                            "Pobieranie z PBN odpowiednika wydawnictwa nadrzędnego pracy po DOI nie powiodło się "
99
                            "-- trwają prace serwisowe po stronie PBN. ",
100
                        )
101
                        if raise_exceptions:
×
102
                            raise e
×
103

104
                    except NeedsPBNAuthorisationException as e:
×
105
                        notificator.warning(
×
106
                            "Wyszukanie PBN UID wydawnictwa nadrzędnego po DOI nieudane - "
107
                            "autoryzuj się najpierw w PBN. ",
108
                        )
109
                        if raise_exceptions:
×
110
                            raise e
×
111

112
                    if res:
×
113
                        notificator.info(
×
114
                            f"Udało się dopasować PBN UID wydawnictwa nadrzędnego po DOI. "
115
                            f"({', '.join([x.tytul_oryginalny for x in res])}). ",
116
                        )
117
                        udalo = True
×
118

119
            if not udalo:
×
120
                notificator.warning(
×
121
                    "Wygląda na to, że nie udało się dopasować rekordu nadrzędnego po ISBN/DOI do rekordu "
122
                    "po stronie PBN. Jeżeli jednak dokonano autoryzacji w PBN, to pewne rekordy z PBN "
123
                    "zostały teraz pobrane i możesz spróbować ustawić odpowiednik "
124
                    "PBN dla wydawnictwa nadrzędnego ręcznie. ",
125
                )
126

127
    #
128
    # Sprawdź, czy każdy autor z dyscypliną ma odpowiednik w PBN, jeżeli nie -- wyświetl ostrzeżenie
129
    #
130

131
    for autor in (
×
132
        obj.autorzy_set.exclude(dyscyplina_naukowa=None)
133
        .exclude(jednostka__skupia_pracownikow=False)
134
        .exclude(afiliuje=False)
135
        .exclude(przypieta=False)
136
        .filter(autor__pbn_uid_id=None)
137
    ):
138
        url = reverse("admin:bpp_autor_change", args=(autor.autor_id,))
×
139
        notificator.warning(
×
140
            f"Autor {autor} ma w tej pracy przypiętą dyscyplinę i afiluje, ale nie "
141
            f"zostanie oświadczona w PBN, gdyż autor nie posiada odpowiednika w PBN. <a href={url} target=_blank>"
142
            f"Kliknij tutaj</a> aby wyedytować tego autora. "
143
        )
144

145
    open_in_pbn_link = ""
×
146
    if obj.pbn_uid_id:
×
UNCOV
147
        open_in_pbn_link = (
×
148
            f'<a target=_blank href="{obj.link_do_pbn()}">Otwórz w PBN</a>. '
149
        )
150

UNCOV
151
    open_in_pi_link = obj.link_do_pi() or ""
×
UNCOV
152
    if open_in_pi_link:
×
UNCOV
153
        open_in_pi_link = f'<a target=_blank href="{open_in_pi_link}">Otwórz w Profilu Instytucji</a>. '
×
154

UNCOV
155
    try:
×
UNCOV
156
        pbn_client.sync_publication(
×
157
            obj,
158
            notificator=notificator,
159
            force_upload=force_upload,
160
            delete_statements_before_upload=uczelnia.pbn_api_kasuj_przed_wysylka,
161
            export_pk_zero=not uczelnia.pbn_api_nie_wysylaj_prac_bez_pk,
162
            always_affiliate_to_uid=(
163
                uczelnia.pbn_uid_id
164
                if uczelnia.pbn_api_afiliacja_zawsze_na_uczelnie
165
                else None
166
            ),
167
        )
168

169
        # Być moze obj.pbn_uid_id uległ zmianie. Jeżeli tak -- zregeneruj link:
UNCOV
170
        if obj.pbn_uid_id:
×
UNCOV
171
            open_in_pbn_link = f'<a target=_blank href="{obj.link_do_pbn()}">Kliknij tutaj, aby otworzyć w PBN</a>. '
×
UNCOV
172
        open_in_pi_link = obj.link_do_pi() or ""
×
173
        if open_in_pi_link:
×
174
            open_in_pi_link = f'<a target=_blank href="{open_in_pi_link}">Otwórz w Profilu Instytucji</a>. '
×
175

176
    except SameDataUploadedRecently as e:
×
UNCOV
177
        link_do_wyslanych = reverse(
×
178
            "admin:pbn_api_sentdata_change",
179
            args=(SentData.objects.get_for_rec(obj).pk,),
180
        )
181

UNCOV
182
        notificator.info(
×
183
            f'Identyczne dane rekordu "{link_do_obiektu(obj)}" zostały wgrane do PBN w dniu {e}. '
184
            f"Nie aktualizuję w PBN API. Jeżeli chcesz wysłać ten rekord do PBN, musisz dokonać jakiejś zmiany "
185
            f"danych rekodu lub "
186
            f'usunąć informacje o <a target=_blank href="{link_do_wyslanych}">wcześniej wysłanych danych do PBN</a> '
187
            f"(Redagowanie -> PBN API -> Wysłane informacje). {open_in_pbn_link}{open_in_pi_link}"
188
        )
189
        if raise_exceptions:
×
190
            raise e
×
191

UNCOV
192
        return
×
193

194
    except AccessDeniedException as e:
×
195
        notificator.warning(
×
196
            f'Nie można zsynchronizować obiektu "{link_do_obiektu(obj)}" z PBN pod adresem '
197
            f"API {e.url}. Brak dostępu -- najprawdopodobniej użytkownik nie posiada odpowiednich uprawnień "
198
            f"po stronie PBN/POLON. {open_in_pbn_link}{open_in_pi_link}",
199
        )
200
        if raise_exceptions:
×
UNCOV
201
            raise e
×
202

UNCOV
203
        return
×
204

205
    except PKZeroExportDisabled as e:
×
206
        notificator.warning(
×
207
            f"Eksport prac z PK=0 jest wyłączony w konfiguracji. Próba wysyłki do PBN rekordu "
208
            f'"{link_do_obiektu(obj)}" nie została podjęta z uwagi na konfigurację systemu. ',
209
        )
210
        if raise_exceptions:
×
211
            raise e
×
212

UNCOV
213
        return
×
214

UNCOV
215
    except NeedsPBNAuthorisationException as e:
×
216
        notificator.warning(
×
217
            f'Nie można zsynchronizować obiektu "{link_do_obiektu(obj)}" z PBN pod adresem '
218
            f"API {e.url}. Brak dostępu z powodu nieprawidłowego tokena -- wymagana autoryzacja w PBN. "
219
            f'<a target=_blank href="{reverse("pbn_api:authorize")}">Kliknij tutaj, aby autoryzować sesję</a>. '
220
            f"{open_in_pbn_link}{open_in_pi_link}",
221
        )
222
        if raise_exceptions:
×
223
            raise e
×
224

UNCOV
225
        return
×
226

227
    except ResourceLockedException as e:
×
228
        notificator.warning(
×
229
            f'Nie można zsynchronizować obiektu "{link_do_obiektu(obj)}" z PBN pod adresem '
230
            f"API {e.url}, ponieważ obiekt po stronie serwera PBN jest zablokowany. Spróbuj ponownie za jakiś czas. "
231
            f"{open_in_pbn_link}{open_in_pi_link}",
232
        )
233

UNCOV
234
        if raise_exceptions:
×
UNCOV
235
            raise e
×
236

237
        return
×
238

UNCOV
239
    except Exception as e:
×
UNCOV
240
        try:
×
UNCOV
241
            link_do_wyslanych = reverse(
×
242
                "admin:pbn_api_sentdata_change",
243
                args=(SentData.objects.get_for_rec(obj).pk,),
244
            )
245
        except SentData.DoesNotExist:
×
246
            link_do_wyslanych = None
×
247

248
        extra = ""
×
UNCOV
249
        if link_do_wyslanych:
×
250
            extra = (
×
251
                '<a target=_blank href="%s">Kliknij, aby otworzyć widok wysłanych danych</a>.'
252
                % link_do_wyslanych
253
            )
254

UNCOV
255
        notificator.warning(
×
256
            f'Nie można zsynchronizować obiektu "{link_do_obiektu(obj)}" z PBN. '
257
            f"Kod błędu: {e}. {extra} {open_in_pbn_link}{open_in_pi_link}"
258
        )
259

260
        # Zaloguj problem do Sentry, bo w sumie nie wiadomo, co to za problem na tym etapie...
261
        capture_exception(e)
×
262

UNCOV
263
        if raise_exceptions:
×
UNCOV
264
            raise e
×
265

UNCOV
266
        return
×
267

UNCOV
268
    sent_data = SentData.objects.get(
×
269
        content_type=ContentType.objects.get_for_model(obj), object_id=obj.pk
270
    )
UNCOV
271
    sent_data_link = link_do_obiektu(sent_data, "Otwórz widok wysłanych danych. ")
×
272

UNCOV
273
    publication_link = link_do_obiektu(
×
274
        sent_data.pbn_uid,
275
        "Otwórz lokalną kopię danych z PBN. ",
276
    )
277

UNCOV
278
    notificator.success(
×
279
        f"Dane w PBN dla rekordu {link_do_obiektu(obj)} zostały zaktualizowane. "
280
        f"{open_in_pbn_link}{open_in_pi_link}{sent_data_link}{publication_link}",
281
    )
282

UNCOV
283
    return sent_data
×
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