diff --git a/src/bpp/management/commands/wytnij_isbn_z_uwag.py b/src/bpp/management/commands/wytnij_isbn_z_uwag.py index c12bbdcd3..a0c63d612 100644 --- a/src/bpp/management/commands/wytnij_isbn_z_uwag.py +++ b/src/bpp/management/commands/wytnij_isbn_z_uwag.py @@ -12,36 +12,41 @@ ) import re +from bpp.util import wytnij_isbn_z_uwag + class Command(BaseCommand): help = 'Wycina ISBN z pola "Uwagi"' + def add_arguments(self, parser): + parser.add_argument("--przenies-do-uwag", action="store_true") + parser.add_argument("--skasuj", action="store_true") + @transaction.atomic - def handle(self, *args, **options): - isbn_regex = re.compile( - r"^isbn\s*[0-9]*[-| ][0-9]*[-| ][0-9]*[-| ][0-9]*[-| ][0-9]*", - flags=re.IGNORECASE, - ) + def handle(self, przenies_do_uwag, skasuj, *args, **options): + + if przenies_do_uwag and skasuj: + raise Exception("albo --skasuj, albo --przenies-do-uwag") for klass in Wydawnictwo_Zwarte, Wydawnictwo_Ciagle: for rec in klass.objects.filter(uwagi__istartswith="isbn"): - res = isbn_regex.search(rec.uwagi) - if res: - res = res.group() - orig_uwagi = rec.uwagi - rec.isbn = res.replace("ISBN", "").replace("isbn", "").strip() - rec.uwagi = rec.uwagi.replace(res, "").strip() - - while ( - rec.uwagi.startswith(".") - or rec.uwagi.startswith(";") - or rec.uwagi.startswith(",") - ): - rec.uwagi = rec.uwagi[1:].strip() - - print(f"[{orig_uwagi}] => ISBN [{rec.isbn}], uwagi [{rec.uwagi}]") - rec.save() - else: + + res = wytnij_isbn_z_uwag(rec.uwagi) + + if res is None: print( f"*** No match for [{rec.uwagi}] ({rec.tytul_oryginalny}), why?" ) + else: + isbn, rest = res + + print(f"[{rec.uwagi}] => ISBN [{isbn}], uwagi [{rest}]") + + if przenies_do_uwag: + rec.isbn = isbn + rec.uwagi = rest + rec.save() + + if skasuj: + rec.uwagi = rest + rec.save() diff --git a/src/bpp/tests/test_util.py b/src/bpp/tests/test_util.py index 536cc30fd..6ced4ea34 100644 --- a/src/bpp/tests/test_util.py +++ b/src/bpp/tests/test_util.py @@ -1,14 +1,40 @@ import pytest +from bpp.util import wytnij_isbn_z_uwag + @pytest.mark.django_db -def test_zaktualizuj_cache_ciagle(django_assert_num_queries, wydawnictwo_ciagle_z_dwoma_autorami, - wydawnictwo_zwarte_z_autorem): +def test_zaktualizuj_cache_ciagle( + django_assert_num_queries, + wydawnictwo_ciagle_z_dwoma_autorami, + wydawnictwo_zwarte_z_autorem, +): with django_assert_num_queries(2): wydawnictwo_ciagle_z_dwoma_autorami.zaktualizuj_cache() @pytest.mark.django_db -def test_zaktualizuj_cache_zwarte(django_assert_num_queries, wydawnictwo_zwarte_z_autorem): +def test_zaktualizuj_cache_zwarte( + django_assert_num_queries, wydawnictwo_zwarte_z_autorem +): with django_assert_num_queries(2): wydawnictwo_zwarte_z_autorem.zaktualizuj_cache() + + +@pytest.mark.parametrize( + "input,output,rest", + [ + ("ISBN 978-83-7374-091-4, ten tego", "978-83-7374-091-4", "ten tego"), + ("ISBN 83-200-1817-X", "83-200-1817-X", ""), + ("tu nie ma ISBNu", None, None), + ], +) +def test_wytnij_isbn_z_uwag(input, output, rest): + res = wytnij_isbn_z_uwag(input) + if output is None: + assert res is None + return + + isbn, reszta = res + assert isbn == output + assert reszta == rest diff --git a/src/bpp/util.py b/src/bpp/util.py index bf8a55a67..b245706ac 100644 --- a/src/bpp/util.py +++ b/src/bpp/util.py @@ -365,3 +365,24 @@ def usun_nieuzywany_typ_charakter(klass, field, dry_run): print(f"Kasuje {elem}") if not dry_run: elem.delete() + + +isbn_regex = re.compile( + r"^isbn\s*[0-9]*[-| ][0-9]*[-| ][0-9]*[-| ][0-9]*[-| ][0-9]*X?", + flags=re.IGNORECASE, +) + + +def wytnij_isbn_z_uwag(uwagi): + res = isbn_regex.search(uwagi) + if res: + res = res.group() + isbn = res.replace("ISBN", "").replace("isbn", "").strip() + reszta = uwagi.replace(res, "").strip() + + while ( + reszta.startswith(".") or reszta.startswith(";") or reszta.startswith(",") + ): + reszta = reszta[1:].strip() + + return isbn, reszta diff --git a/src/import_dbf/Makefile b/src/import_dbf/Makefile index 076a6d9d8..f528a0128 100644 --- a/src/import_dbf/Makefile +++ b/src/import_dbf/Makefile @@ -127,11 +127,12 @@ przenies-sortowanie-jednostek: echo "UPDATE bpp_jednostka SET kolejnosc = import_dbf_jed.sort::integer FROM import_dbf_jed WHERE import_dbf_jed.bpp_jednostka_id = bpp_jednostka.id" | $(PSQL_VERBOSE) przenies-isbn: - $(MANAGE) wytnij_isbn_z_uwag + $(MANAGE) wytnij_isbn_z_uwag --przenies-do-uwag > isbn-przenies.txt + # $(MANAGE) wytnij_isbn_z_uwag --skasuj > isbn-skasuj.txt usun-nieuzywane-charaktery-kbny: $(MANAGE) usun_nieuzywane_charaktery_kbny -integrate: disable-trigger integruj-dbf integruj-liste-wydawcow ustaw-obca-jednostke rebuild-cache ustaw-date-aktualizacji wylacz-alfabetyczne-sortowanie-jednostek przenies-sortowanie-jednostek przenies-isbn enable-trigger dodaj-aktualnosc usun-nieuzywane-charaktery-kbny +integrate: disable-trigger integruj-dbf integruj-liste-wydawcow ustaw-obca-jednostke przenies-isbn rebuild-cache ustaw-date-aktualizacji wylacz-alfabetyczne-sortowanie-jednostek przenies-sortowanie-jednostek enable-trigger dodaj-aktualnosc usun-nieuzywane-charaktery-kbny rebuild: convert-dbfs import-dbf integrate