From ddbf47767b1bad3e411754b2a2992d51956876df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pasternak?= Date: Sun, 23 Feb 2020 14:05:20 +0100 Subject: [PATCH 1/3] =?UTF-8?q?Procedura=20zatwierdzaj=C4=85ca=20podw?= =?UTF-8?q?=C3=B3jne=20przypisania?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../management/commands/integruj_dbf.py | 2 + src/import_dbf/util.py | 41 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/import_dbf/management/commands/integruj_dbf.py b/src/import_dbf/management/commands/integruj_dbf.py index c12895f02..94a969732 100644 --- a/src/import_dbf/management/commands/integruj_dbf.py +++ b/src/import_dbf/management/commands/integruj_dbf.py @@ -30,6 +30,7 @@ usun_podwojne_przypisania_b_a, wyswietl_prace_bez_dopasowania, wzbogacaj_charaktery, + zatwierdz_podwojne_przypisania, ) django.setup() @@ -136,6 +137,7 @@ def handle( pool.apply(wyswietl_prace_bez_dopasowania, (logger,)) if enable_all or options["enable_b_a"]: + zatwierdz_podwojne_przypisania() logger.info("Usuwanie podwojnych przypisan") pool.apply(usun_podwojne_przypisania_b_a, (logger,)) logger.debug("Integracja B_A") diff --git a/src/import_dbf/util.py b/src/import_dbf/util.py index dd2546430..baa51ab72 100644 --- a/src/import_dbf/util.py +++ b/src/import_dbf/util.py @@ -1368,6 +1368,47 @@ def wyswietl_prace_bez_dopasowania(logger): logger.info((rec.idt, rec.rok, rec.tytul_or_s)) +@transaction.atomic +def zatwierdz_podwojne_przypisania(logger): + """Zakładamy, że podwójne przypisania w bazie danych są POPRAWNE. Expertus + nie umożliwia sytuacji, gdzie dwóch Janów Kowalskich ma dwa rekordy + (zdaniem BG UMW), stąd w przypadku podwójnych przypisań autorów, utwórz + nowy rekord dla drugiego(czy na pewno?) autora + """ + from django.conf import settings + + setattr(settings, "ENABLE_DATA_AKT_PBN_UPDATE", False) + + for elem in ( + dbf.B_A.objects.order_by() + .values("idt_id", "idt_aut_id",) + .annotate(cnt=Count("*")) + .filter(cnt__gt=1) + ): + cnt = elem["cnt"] + for melem in dbf.B_A.objects.filter( + idt_id=elem["idt_id"], idt_aut_id=elem["idt_aut_id"] + ): + logger.info( + ( + "1 Podwojne przypisanie", + melem.idt.tytul_or_s, + "(", + melem.idt.rok, + ") - ", + melem.idt_aut, + ) + ) + import pdb + + pdb.set_trace() + raise NotImplementedError() + melem.delete() + cnt -= 1 + if cnt == 1: + break + + @transaction.atomic def usun_podwojne_przypisania_b_a(logger): from django.conf import settings From e98142e73a7a9d461c42f69de1a69243d48781b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pasternak?= Date: Sun, 23 Feb 2020 17:19:48 +0100 Subject: [PATCH 2/3] =?UTF-8?q?Podw=C3=B3jni=20autorzy=20s=C4=85=20OK,=20n?= =?UTF-8?q?ie=20usuwaj=20ich?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/import_dbf/Makefile | 37 +++++++++------- .../management/commands/integruj_dbf.py | 12 +++++- src/import_dbf/util.py | 43 +++++++++++++------ .../tests/test_raport_slotow_zerowy.py | 2 +- 4 files changed, 65 insertions(+), 29 deletions(-) diff --git a/src/import_dbf/Makefile b/src/import_dbf/Makefile index 26e2f483c..d05deab8c 100644 --- a/src/import_dbf/Makefile +++ b/src/import_dbf/Makefile @@ -22,23 +22,24 @@ integruj-dbf-autorzy: $(MANAGE) integruj_dbf --enable-autor importuj-dyscypliny: - $(MANAGE) importuj_dyscypliny 2017 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx - $(MANAGE) importuj_dyscypliny 2018 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx - $(MANAGE) importuj_dyscypliny 2019 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx - $(MANAGE) importuj_dyscypliny 2020 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx -v3 + $(MANAGE) importuj_dyscypliny -v0 2017 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx + $(MANAGE) importuj_dyscypliny -v0 2018 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx + $(MANAGE) importuj_dyscypliny -v0 2019 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx + $(MANAGE) importuj_dyscypliny -v0 2020 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx -v3 integruj-dbf-publikacje: $(MANAGE) integruj_dbf --enable-charakter-kbn-jezyk --charaktery-enrichment-xls /Volumes/Dane\ zaszyfrowane/UMWroclaw/charaktery.xlsx $(MANAGE) integruj_dbf --enable-zrodlo $(MANAGE) integruj_dbf --enable-publikacja + $(MANAGE) integruj_dbf --enable-zatwierdz-podwojne-przypisania $(MANAGE) integruj_dbf --enable-b-a $(MANAGE) integruj_dbf --enable-przypisz-jednostki przypisz-dyscypliny: - $(MANAGE) przypisz_dyscypliny 2017 --ustawiaj-pierwsza-gdy-dwie --disable-cache - $(MANAGE) przypisz_dyscypliny 2018 --ustawiaj-pierwsza-gdy-dwie --disable-cache - $(MANAGE) przypisz_dyscypliny 2019 --ustawiaj-pierwsza-gdy-dwie --disable-cache - $(MANAGE) przypisz_dyscypliny 2020 --ustawiaj-pierwsza-gdy-dwie --disable-cache + $(MANAGE) przypisz_dyscypliny -v0 2017 --ustawiaj-pierwsza-gdy-dwie --disable-cache + $(MANAGE) przypisz_dyscypliny -v0 2018 --ustawiaj-pierwsza-gdy-dwie --disable-cache + $(MANAGE) przypisz_dyscypliny -v0 2019 --ustawiaj-pierwsza-gdy-dwie --disable-cache + $(MANAGE) przypisz_dyscypliny -v0 2020 --ustawiaj-pierwsza-gdy-dwie --disable-cache integruj-dbf: integruj-dbf-autorzy importuj-dyscypliny integruj-dbf-publikacje przypisz-dyscypliny @@ -48,13 +49,13 @@ remove-dbfs: psql -U postgres -d bpp alter-schema: - cat sql/alter-schema.sql | $(PSQL_VERBOSE) - cat sql/translate-title.sql | $(PSQL_VERBOSE) - cat sql/translate-autor.sql | $(PSQL_VERBOSE) - cat sql/translate-poz.sql | $(PSQL_VERBOSE) - cat sql/translate-usi.sql | $(PSQL_VERBOSE) - cat sql/translate-zrodlo.sql | $(PSQL_VERBOSE) - cat sql/alter-umw.sql | $(PSQL_VERBOSE) + cat sql/alter-schema.sql | $(PSQL) + cat sql/translate-title.sql | $(PSQL) + cat sql/translate-autor.sql | $(PSQL) + cat sql/translate-poz.sql | $(PSQL) + cat sql/translate-usi.sql | $(PSQL) + cat sql/translate-zrodlo.sql | $(PSQL) + cat sql/alter-umw.sql | $(PSQL) delete-imported-data: cat sql/remove-imported.sql | $(PSQL) @@ -82,3 +83,9 @@ import-dbf: recreate-db import-converted-dbfs alter-schema integrate: disable-trigger integruj-dbf rebuild-cache enable-trigger rebuild: convert-dbfs import-dbf integrate + +moj-etap: import-dbf disable-trigger integruj-dbf-autorzy + $(MANAGE) integruj_dbf --enable-charakter-kbn-jezyk --charaktery-enrichment-xls /Volumes/Dane\ zaszyfrowane/UMWroclaw/charaktery.xlsx + $(MANAGE) integruj_dbf --enable-zrodlo + $(MANAGE) integruj_dbf --enable-publikacja + $(MANAGE) integruj_dbf --enable-zatwierdz-podwojne-przypisania diff --git a/src/import_dbf/management/commands/integruj_dbf.py b/src/import_dbf/management/commands/integruj_dbf.py index 94a969732..f1ab77fe3 100644 --- a/src/import_dbf/management/commands/integruj_dbf.py +++ b/src/import_dbf/management/commands/integruj_dbf.py @@ -57,6 +57,12 @@ def add_arguments(self, parser): parser.add_argument("--enable-zrodlo", action="store_true") parser.add_argument("--enable-b-a", action="store_true") + parser.add_argument( + "--enable-zatwierdz-podwojne-przypisania", + action="store_true", + help="""W przypadku, gdyby podwójne przypisania w bazie danych były OK, podaj ten argument + aby utworzyć dodatkowe rekordy dla prawidłowo zdublowanych autorów""", + ) parser.add_argument("--enable-przypisz-jednostki", action="store_true") def handle( @@ -136,8 +142,12 @@ def handle( pool.apply(wyswietl_prace_bez_dopasowania, (logger,)) + if enable_all or options["enable_zatwierdz_podwojne_przypisania"]: + logger.info("Zatwierdzanie podwójnych podwojnych przypisan") + zatwierdz_podwojne_przypisania(logger) + # pool.apply(zatwierdz_podwojne_przypisania, (logger,)) + if enable_all or options["enable_b_a"]: - zatwierdz_podwojne_przypisania() logger.info("Usuwanie podwojnych przypisan") pool.apply(usun_podwojne_przypisania_b_a, (logger,)) logger.debug("Integracja B_A") diff --git a/src/import_dbf/util.py b/src/import_dbf/util.py index baa51ab72..a3717aa4e 100644 --- a/src/import_dbf/util.py +++ b/src/import_dbf/util.py @@ -7,6 +7,7 @@ from django.contrib.contenttypes.models import ContentType from django.db import IntegrityError, transaction from django.db.models import Count, Q +from django.forms.models import model_to_dict from bpp import models as bpp from bpp.models import ( @@ -272,7 +273,7 @@ def exp_autor(base_aut, already_seen=None): @transaction.atomic -def integruj_autorow(): +def integruj_autorow(silent=False): tytuly = get_dict(bpp.Tytul, "skrot") funkcje = get_dict(bpp.Funkcja_Autora, "skrot") @@ -282,7 +283,10 @@ def integruj_autorow(): .order_by("idt_aut") ) - for (autor_id,) in pbar(base_query): + if not silent: + base_query = pbar(base_query) + + for (autor_id,) in base_query: a = dbf.Aut.objects.get(pk=autor_id) if a.bpp_autor_id is not None: continue @@ -1374,6 +1378,9 @@ def zatwierdz_podwojne_przypisania(logger): nie umożliwia sytuacji, gdzie dwóch Janów Kowalskich ma dwa rekordy (zdaniem BG UMW), stąd w przypadku podwójnych przypisań autorów, utwórz nowy rekord dla drugiego(czy na pewno?) autora + + Genialnie byłoby tu upewnić się, że każdy tworzony dodatkowy rekord + to rekord w obcej jednostce """ from django.conf import settings @@ -1385,28 +1392,40 @@ def zatwierdz_podwojne_przypisania(logger): .annotate(cnt=Count("*")) .filter(cnt__gt=1) ): - cnt = elem["cnt"] + elem["cnt"] for melem in dbf.B_A.objects.filter( idt_id=elem["idt_id"], idt_aut_id=elem["idt_aut_id"] - ): + )[1:]: logger.info( ( - "1 Podwojne przypisanie", + "Tworzę dodatkowe (podwójne) przypisanie", melem.idt.tytul_or_s, "(", melem.idt.rok, ") - ", melem.idt_aut, + ", jedn. ", + melem.idt_jed, ) ) - import pdb - pdb.set_trace() - raise NotImplementedError() - melem.delete() - cnt -= 1 - if cnt == 1: - break + kw = model_to_dict(melem.idt_aut) + kw["idt_jed_id"] = kw.pop("idt_jed") + kw["exp_id"] = None + kw["bpp_autor"] = None + kw["bpp_autor_id"] = None + kw["orcid_id"] = None + kw["pbn_id"] = None + kw["ref"] = None + from django.db.models import Max + + kw["idt_aut"] = dbf.Aut.objects.all().aggregate(c=Max("idt_aut"))["c"] + 1 + idt_aut = dbf.Aut.objects.create(**kw) + + melem.idt_aut = idt_aut + melem.save() + + integruj_autorow() @transaction.atomic diff --git a/src/raport_slotow/tests/test_raport_slotow_zerowy.py b/src/raport_slotow/tests/test_raport_slotow_zerowy.py index c085a9013..7f0a0da82 100644 --- a/src/raport_slotow/tests/test_raport_slotow_zerowy.py +++ b/src/raport_slotow/tests/test_raport_slotow_zerowy.py @@ -27,7 +27,7 @@ def fikstura_raportu_slotow( # Kowalski ma przypisanie i nie ma żadnych prac Autor_Dyscyplina.objects.create( - autor=autor_jan_kowalski, rok=2000, dyscyplina_naukowa=dyscyplina1 + autor=autor_jan_kowalski, rok=2020, dyscyplina_naukowa=dyscyplina1 ) return (autor_jan_kowalski, autor_jan_nowak) From d3facc4ae0f3d2f3a46f3cf4e081c497ab2f0ffd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pasternak?= Date: Sun, 23 Feb 2020 18:37:52 +0100 Subject: [PATCH 3/3] Napraw przy okazji #794 --- .gitignore | 1 + HISTORY.rst | 6 ++++ src/import_dbf/Makefile | 12 ++----- .../management/commands/integruj_dbf.py | 6 ---- src/import_dbf/util.py | 36 +++++++++++-------- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index fb0b7308d..c9675a73c 100644 --- a/.gitignore +++ b/.gitignore @@ -112,3 +112,4 @@ src/import_dbf/db-old/ /stellar.yaml .env +src/import_dbf/integruj-dbf-enable-publikacja.log.txt diff --git a/HISTORY.rst b/HISTORY.rst index 5195283f2..a3c003726 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -2,6 +2,12 @@ Historia zmian ============== +202002.18 +--------- + +* nie dodawaj pola 103 do konferencji przy imporcie DBF (#794) +* akceptuj podwójnych autorów przy imporcie DBF (#792) + 202002.17 --------- diff --git a/src/import_dbf/Makefile b/src/import_dbf/Makefile index d05deab8c..a66cf1cfa 100644 --- a/src/import_dbf/Makefile +++ b/src/import_dbf/Makefile @@ -1,4 +1,4 @@ -PSQL=psql -t --echo-errors bpp | grep -v "INSERT 0 1" +PSQL=psql -q -t --echo-errors bpp | grep -v "INSERT 0 1" PSQL_VERBOSE=psql -t --echo-errors -a bpp MANAGE=python ../manage.py DBF2SQL=python ../../../manage.py dbf2sql @@ -25,12 +25,12 @@ importuj-dyscypliny: $(MANAGE) importuj_dyscypliny -v0 2017 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx $(MANAGE) importuj_dyscypliny -v0 2018 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx $(MANAGE) importuj_dyscypliny -v0 2019 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx - $(MANAGE) importuj_dyscypliny -v0 2020 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx -v3 + $(MANAGE) importuj_dyscypliny -v0 2020 /Volumes/Dane\ zaszyfrowane/UMWroclaw/dyscypliny_BPP.xlsx integruj-dbf-publikacje: $(MANAGE) integruj_dbf --enable-charakter-kbn-jezyk --charaktery-enrichment-xls /Volumes/Dane\ zaszyfrowane/UMWroclaw/charaktery.xlsx $(MANAGE) integruj_dbf --enable-zrodlo - $(MANAGE) integruj_dbf --enable-publikacja + $(MANAGE) integruj_dbf --enable-publikacja > integruj-dbf-publikacja-log.txt $(MANAGE) integruj_dbf --enable-zatwierdz-podwojne-przypisania $(MANAGE) integruj_dbf --enable-b-a $(MANAGE) integruj_dbf --enable-przypisz-jednostki @@ -83,9 +83,3 @@ import-dbf: recreate-db import-converted-dbfs alter-schema integrate: disable-trigger integruj-dbf rebuild-cache enable-trigger rebuild: convert-dbfs import-dbf integrate - -moj-etap: import-dbf disable-trigger integruj-dbf-autorzy - $(MANAGE) integruj_dbf --enable-charakter-kbn-jezyk --charaktery-enrichment-xls /Volumes/Dane\ zaszyfrowane/UMWroclaw/charaktery.xlsx - $(MANAGE) integruj_dbf --enable-zrodlo - $(MANAGE) integruj_dbf --enable-publikacja - $(MANAGE) integruj_dbf --enable-zatwierdz-podwojne-przypisania diff --git a/src/import_dbf/management/commands/integruj_dbf.py b/src/import_dbf/management/commands/integruj_dbf.py index f1ab77fe3..55695ae7d 100644 --- a/src/import_dbf/management/commands/integruj_dbf.py +++ b/src/import_dbf/management/commands/integruj_dbf.py @@ -7,11 +7,9 @@ import django from django.core.management import BaseCommand -from bpp.models import Konferencja from bpp.util import partition_count from import_dbf.models import B_A, Bib from import_dbf.util import ( - ekstrakcja_konferencji, integruj_autorow, integruj_b_a, integruj_charaktery, @@ -127,10 +125,6 @@ def handle( partition_count(Bib.objects.exclude(analyzed=True), num_proc), ) - logger.info("Integruje konferencje") - if Konferencja.objects.count() < 100: - pool.apply(ekstrakcja_konferencji) - logger.info("Integruje publikacje") # pool.apply(integruj_publikacje) pool.starmap( diff --git a/src/import_dbf/util.py b/src/import_dbf/util.py index a3717aa4e..32f9d7a52 100644 --- a/src/import_dbf/util.py +++ b/src/import_dbf/util.py @@ -580,14 +580,6 @@ def mapuj_elementy_publikacji(offset, limit): rec.save() -@transaction.atomic -def ekstrakcja_konferencji(): - for elem in dbf.Bib_Desc.objects.filter(elem_id=103): - bpp.Konferencja.objects.get_or_create(nazwa=elem.value["a"]) - for literka in "bcde": - assert not elem.value.get(literka) - - def to_pubmed_id(ident): if not ident.strip() == "": return @@ -968,10 +960,15 @@ def integruj_publikacje(offset=None, limit=None): kw["szczegoly"] += elem.get("e") elif elem["id"] == 103: - # Konferencja - konferencja = bpp.Konferencja.objects.get(nazwa=elem["a"]) - assert not kw.get("konferencja"), (elem, rec) - kw["konferencja"] = konferencja + # Uwagi (nie: konferencja) + # Zgłoszenie #794 Przy imporcie wszystkie uwagi w opisach artykułów z czasopism + # (pole 103) stały informacjami o konferencjach, a spora część dotyczy czegoś + # innego. Pole to należy przenieść przy imporcie do pola "Informacje" + # (lub innego odpowiadającego uwadze). + if kw.get("uwagi") is None: + kw["uwagi"] = elem["a"] + else: + kw["uwagi"] += elem["a"] elif elem["id"] == 153: assert not kw.get("szczegoly") @@ -980,8 +977,19 @@ def integruj_publikacje(offset=None, limit=None): kw["szczegoly"] = exp_combine(elem.get("b"), elem.get("c")) elif elem["id"] == 104: - assert not kw.get("uwagi"), (kw["uwagi"], elem, rec, rec.idt) - kw["uwagi"] = elem["a"] + # assert not kw.get("uwagi"), (kw["uwagi"], elem, rec, rec.idt) + if kw.get("uwagi") is None: + kw["uwagi"] = elem["a"] + else: + print( + "Łączę pola UWAGI: %s | %s | %s " + % (rec.idt, kw.get("uwagi"), elem["a"]) + ) + kw["uwagi"] = exp_combine(kw.get("uwagi"), elem["a"], sep=". ") + kw["adnotacje"] = exp_combine( + kw.get("adnotacje"), "połączone pola uwag", sep=". " + ) + for literka in "bcd": assert not elem.get(literka), (elem, rec, rec.idt)