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 74f30f092..7489d9442 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -8,6 +8,8 @@ Historia zmian * wyświetlaj lata dla raportu zerowego w jednej kolumnie (#812) * nie uwzględniaj wpisów dyscyplin bez punktacji w raporcie zerowym (#785) * umożliwiaj oddzielne zarządzanie widocznością raportu slotów zerowych (#785) +* 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 26e2f483c..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 @@ -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 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 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) diff --git a/src/import_dbf/management/commands/integruj_dbf.py b/src/import_dbf/management/commands/integruj_dbf.py index c12895f02..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, @@ -30,6 +28,7 @@ usun_podwojne_przypisania_b_a, wyswietl_prace_bez_dopasowania, wzbogacaj_charaktery, + zatwierdz_podwojne_przypisania, ) django.setup() @@ -56,6 +55,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( @@ -120,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( @@ -135,6 +136,11 @@ 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"]: logger.info("Usuwanie podwojnych przypisan") pool.apply(usun_podwojne_przypisania_b_a, (logger,)) diff --git a/src/import_dbf/util.py b/src/import_dbf/util.py index dd2546430..32f9d7a52 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 @@ -576,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 @@ -964,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") @@ -976,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) @@ -1368,6 +1380,62 @@ 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 + + Genialnie byłoby tu upewnić się, że każdy tworzony dodatkowy rekord + to rekord w obcej jednostce + """ + 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) + ): + 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( + ( + "Tworzę dodatkowe (podwójne) przypisanie", + melem.idt.tytul_or_s, + "(", + melem.idt.rok, + ") - ", + melem.idt_aut, + ", jedn. ", + melem.idt_jed, + ) + ) + + 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 def usun_podwojne_przypisania_b_a(logger): from django.conf import settings