From e43231c1f57c9041bd4f4811af9f7040bd81b253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pasternak?= Date: Wed, 22 Jun 2022 13:14:40 +0200 Subject: [PATCH] Usprawnione odpinanie miejsc pracy (#1229) --- HISTORY.rst | 2 + conftest.py | 16 +++ src/bpp/models/autor.py | 34 +++-- src/bpp/tests/util.py | 26 ++-- src/fixtures/conftest.py | 7 + src/import_pracownikow/models.py | 42 +++++- src/import_pracownikow/tests/conftest.py | 82 ++++++++++++ .../tests/test_models/test_models.py | 59 +-------- .../test_odepnij_autorow_spoza_pliku.py | 120 ++++++++++++++++++ .../test_models/test_reset_miejsca_pracy.py | 10 -- src/import_pracownikow/tests/test_views.py | 59 +++++++++ src/import_pracownikow/views.py | 35 +---- 12 files changed, 377 insertions(+), 115 deletions(-) create mode 100644 src/import_pracownikow/tests/conftest.py create mode 100644 src/import_pracownikow/tests/test_models/test_odepnij_autorow_spoza_pliku.py delete mode 100644 src/import_pracownikow/tests/test_models/test_reset_miejsca_pracy.py create mode 100644 src/import_pracownikow/tests/test_views.py diff --git a/HISTORY.rst b/HISTORY.rst index 340e20986..020fb0025 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -27,6 +27,8 @@ dev * pole bazodanowe "aktualny" znika z modelu Autor (b/n), * pola "aktualna jednostka" oraz "aktualna funkcja" dla modelu Autor mogą mieć wartość pustą (null) (b/n), +* poprawiony skrypt odpinający miejsca pracy podczas importu danych + kadrowych (#1229) 202205.1086 ----------- diff --git a/conftest.py b/conftest.py index 84fb7c42b..fe99a65dc 100644 --- a/conftest.py +++ b/conftest.py @@ -1 +1,17 @@ +from datetime import timedelta + +import pytest + from fixtures import * # noqa + + +@pytest.fixture(scope="session") +def today(): + from django.utils import timezone + + return timezone.now().date() + + +@pytest.fixture(scope="session") +def yesterday(today): + return today - timedelta(days=1) diff --git a/src/bpp/models/autor.py b/src/bpp/models/autor.py index 1a987a61d..ecbe945d4 100644 --- a/src/bpp/models/autor.py +++ b/src/bpp/models/autor.py @@ -1,6 +1,8 @@ """ Autorzy """ +from __future__ import annotations + from datetime import date, datetime, timedelta from autoslug import AutoSlugField @@ -197,34 +199,42 @@ def __str__(self): return buf - def dodaj_jednostke(self, jednostka, rok=None, funkcja=None): - if rok is None: - rok = datetime.now().date().year - 1 + def dodaj_jednostke( + self, jednostka, rok=None, funkcja=None + ) -> Autor_Jednostka | None: - start_pracy = date(rok, 1, 1) - koniec_pracy = date(rok, 12, 31) + start_pracy = None + koniec_pracy = None - if Autor_Jednostka.objects.filter( + if rok is not None: + start_pracy = date(rok, 1, 1) + koniec_pracy = date(rok, 12, 31) + + czy_juz_istnieje = Autor_Jednostka.objects.filter( autor=self, jednostka=jednostka, - rozpoczal_prace__lte=start_pracy, - zakonczyl_prace__gte=koniec_pracy, - ): + rozpoczal_prace__lte=start_pracy or date(1, 1, 1), + zakonczyl_prace__gte=koniec_pracy or date(999, 12, 31), + ) + + if czy_juz_istnieje.exists(): # Ten czas jest już pokryty - return + return czy_juz_istnieje.first() try: - Autor_Jednostka.objects.create( + ret = Autor_Jednostka.objects.create( autor=self, - rozpoczal_prace=start_pracy, jednostka=jednostka, funkcja=funkcja, + rozpoczal_prace=start_pracy, zakonczyl_prace=koniec_pracy, ) except IntegrityError: return self.defragmentuj_jednostke(jednostka) + return ret + def defragmentuj_jednostke(self, jednostka): Autor_Jednostka.objects.defragmentuj(autor=self, jednostka=jednostka) diff --git a/src/bpp/tests/util.py b/src/bpp/tests/util.py index 7e5a3e1fe..2db640646 100644 --- a/src/bpp/tests/util.py +++ b/src/bpp/tests/util.py @@ -1,13 +1,15 @@ -# -*- encoding: utf-8 -*- - """Ten moduł zawiera 'normalne', dla ludzi funkcje, które mogą być używane do ustawiania testów.""" +from __future__ import annotations + +import cgi import random import re import time import warnings from datetime import datetime +from django.http import HttpResponse from django.urls import reverse from model_mommy import mommy from selenium.webdriver.common.keys import Keys @@ -130,10 +132,10 @@ def any_wydawnictwo(klass, rok=None, **kw): kl = str(klass).split(".")[-1].replace("'>", "") kw_wyd = dict( - tytul="Tytul %s %s" % (kl, c), - tytul_oryginalny="Tytul oryginalny %s %s" % (kl, c), - uwagi="Uwagi %s %s" % (kl, c), - szczegoly="Szczegóły %s %s" % (kl, c), + tytul=f"Tytul {kl} {c}", + tytul_oryginalny=f"Tytul oryginalny {kl} {c}", + uwagi=f"Uwagi {kl} {c}", + szczegoly=f"Szczegóły {kl} {c}", ) if klass == Patent: @@ -374,7 +376,7 @@ def assertPopupContains(browser, text, accept=True): """ alert = browser.driver.switch_to.alert if text not in alert.text: - raise AssertionError("%r not found in %r" % (text, alert.text)) + raise AssertionError(f"{text!r} not found in {alert.text!r}") if accept: alert.accept() @@ -527,11 +529,19 @@ def browse_praca_url(model): ) # ContentType.objects.get_for_model(model).pk, model.pk) -def normalize_html(s): +def normalize_html(s: bytes | str, default_encoding="utf-8"): + if isinstance(s, bytes): + s = s.decode(default_encoding) s = s.replace("\r\n", " ").replace("\n", " ") return re.sub(r"\s\s+", " ", s) +def normalize_response_content(res: HttpResponse): + return normalize_html( + res.content, cgi.parse_header(res["content-type"])[1]["charset"] + ) + + def rozwin_ekstra_informacje_na_stronie_edycji_wydawnictwa(admin_browser): for elem in admin_browser.find_by_tag("h2")[:3]: show_element(admin_browser, elem) # ._element) diff --git a/src/fixtures/conftest.py b/src/fixtures/conftest.py index e4cc71b13..b2aa7c7dc 100644 --- a/src/fixtures/conftest.py +++ b/src/fixtures/conftest.py @@ -197,6 +197,13 @@ def uczelnia(db): )[0] +@pytest.fixture +def uczelnia_z_obca_jednostka(uczelnia, obca_jednostka): + uczelnia.obca_jednostka = obca_jednostka + uczelnia.save() + return uczelnia + + @pytest.mark.django_db def _wydzial_maker(nazwa, skrot, uczelnia, **kwargs): return Wydzial.objects.get_or_create( diff --git a/src/import_pracownikow/models.py b/src/import_pracownikow/models.py index df151a8d1..ad53d9a35 100644 --- a/src/import_pracownikow/models.py +++ b/src/import_pracownikow/models.py @@ -1,6 +1,6 @@ # Create your models here. from copy import copy -from datetime import date +from datetime import date, timedelta from django import forms from django.core.serializers.json import DjangoJSONEncoder @@ -34,6 +34,8 @@ from django.contrib.postgres.fields import JSONField +from django.utils import timezone + from bpp.models import ( Autor, Autor_Jednostka, @@ -264,6 +266,44 @@ def get_details_set(self): "wymiar_etatu", ) + def autorzy_spoza_pliku_set(self, uczelnia=None): + """ + Zwraca wszystkie połączenia Autor + Jednostka, gdzie: + 1) połączenie autor + jednostka nie występuje w imporcie danych (self) + 2) jednostka nie jest obca, + 3) jednostka ma pole "zarzadzaj_automatycznie" zaznaczone jako True + """ + + autorzy_jednostki_z_pliku = self.importpracownikowrow_set.values_list( + "autor_jednostka" + ).distinct() + + qry = ( + Autor_Jednostka.objects.exclude(pk__in=autorzy_jednostki_z_pliku) + .exclude(autor__aktualna_jednostka=None) + .exclude(jednostka__zarzadzaj_automatycznie=False) + ) + + if uczelnia is not None and uczelnia.obca_jednostka_id is not None: + qry = qry.exclude(autor__aktualna_jednostka_id=uczelnia.obca_jednostka_id) + + return qry + + @transaction.atomic + def odepnij_autorow_spoza_pliku(self, uczelnia=None, today=None, yesterday=None): + if today is None: + today = timezone.now().date() + + if yesterday is None: + yesterday = today - timedelta(days=1) + + for elem in self.autorzy_spoza_pliku_set(uczelnia=uczelnia): + elem.zakonczyl_prace = yesterday + elem.podstawowe_miejsce_pracy = False + elem.save() + + elem.refresh_from_db() + def on_finished(self): self.send_processing_finished() diff --git a/src/import_pracownikow/tests/conftest.py b/src/import_pracownikow/tests/conftest.py new file mode 100644 index 000000000..aceb7db0d --- /dev/null +++ b/src/import_pracownikow/tests/conftest.py @@ -0,0 +1,82 @@ +import os + +import pytest +from django.core.files.uploadedfile import SimpleUploadedFile +from model_mommy import mommy + +from import_pracownikow.models import ImportPracownikow + +from bpp.models import Autor, Jednostka + + +def testdata_xls_path_factory(suffix=""): + return os.path.join(os.path.dirname(__file__), "", f"testdata{suffix}.xlsx") + + +def import_pracownikow_factory(user, path): + i = ImportPracownikow(owner=user) + i.plik_xls = SimpleUploadedFile( + "import_dyscyplin_zrodel_przyklad.xlsx", open(path, "rb").read() + ) + i.save() + return i + + +@pytest.fixture +def testdata_xlsx_path(): + return testdata_xls_path_factory() + + +@pytest.fixture +def testdata_brak_naglowka_xlsx_path(): + return testdata_xls_path_factory("_brak_naglowka") + + +@pytest.fixture +def autor_z_pliku(): + return mommy.make(Autor, nazwisko="Kowalski", imiona="Jan", pk=50) + + +@pytest.fixture +def jednostka_z_pliku(): + return mommy.make( + Jednostka, + nazwa="Katedra i Klinika Dermatologii, Wenerologii i Dermatologii Dziecięcej", + skrot="Kat. i Klin. Derm., Wen. i Derm. Dz.", + ) + + +@pytest.fixture +def baza_importu_pracownikow(autor_z_pliku, jednostka_z_pliku): + pass + + +@pytest.fixture +def autor_spoza_pliku(): + return mommy.make(Autor, nazwisko="Nowak", imiona="Marian", pk=100) + + +@pytest.fixture +def jednostka_spoza_pliku() -> Jednostka: + return mommy.make( + Jednostka, + nazwa="Jednostka Spozaplikowa", + skrot="Jedn. Spoz.", + zarzadzaj_automatycznie=True, + ) + + +@pytest.fixture +def import_pracownikow(admin_user, baza_importu_pracownikow, testdata_xlsx_path): + return import_pracownikow_factory(admin_user, testdata_xlsx_path) + + +@pytest.fixture +def import_pracownikow_performed(import_pracownikow) -> ImportPracownikow: + import_pracownikow.perform() + return import_pracownikow + + +@pytest.fixture +def import_pracownikow_brak_naglowka(admin_user, testdata_brak_naglowka_xlsx_path): + return import_pracownikow_factory(admin_user, testdata_brak_naglowka_xlsx_path) diff --git a/src/import_pracownikow/tests/test_models/test_models.py b/src/import_pracownikow/tests/test_models/test_models.py index ffbb5d56d..785c9457b 100644 --- a/src/import_pracownikow/tests/test_models/test_models.py +++ b/src/import_pracownikow/tests/test_models/test_models.py @@ -1,55 +1,11 @@ -import os - import pytest -from django.core.files.uploadedfile import SimpleUploadedFile -from model_mommy import mommy - -from import_pracownikow.models import ImportPracownikow - -from bpp.models import Autor, Autor_Jednostka, Jednostka - - -def testdata_xls_path_factory(suffix=""): - return os.path.join(os.path.dirname(__file__), "..", f"testdata{suffix}.xlsx") - - -@pytest.fixture -def testdata_xlsx_path(): - return testdata_xls_path_factory() - - -@pytest.fixture -def testdata_brak_naglowka_xlsx_path(): - return testdata_xls_path_factory("_brak_naglowka") - - -def import_pracownikow_factory(user, path): - i = ImportPracownikow(owner=user) - i.plik_xls = SimpleUploadedFile( - "import_dyscyplin_zrodel_przyklad.xlsx", open(path, "rb").read() - ) - i.save() - return i - - -@pytest.fixture -def baza_importu_pracownikow(): - mommy.make( - Jednostka, - nazwa="Katedra i Klinika Dermatologii, Wenerologii i Dermatologii Dziecięcej", - ) - mommy.make(Autor, nazwisko="Kowalski", imiona="Jan", pk=50) +from import_pracownikow.tests.conftest import ( + import_pracownikow_factory, + testdata_xls_path_factory, +) -@pytest.fixture -def import_pracownikow(admin_user, baza_importu_pracownikow, testdata_xlsx_path): - return import_pracownikow_factory(admin_user, testdata_xlsx_path) - - -@pytest.fixture -def import_pracownikow_performed(import_pracownikow): - import_pracownikow.perform() - return import_pracownikow +from bpp.models import Autor, Autor_Jednostka def test_ImportPracownikow_perform(import_pracownikow): @@ -82,11 +38,6 @@ def test_ImportPracownikow_perform_aktualizacja_tytulu_brakujacy_tytul( assert Autor.objects.get(pk=50).tytul is None -@pytest.fixture -def import_pracownikow_brak_naglowka(admin_user, testdata_brak_naglowka_xlsx_path): - return import_pracownikow_factory(admin_user, testdata_brak_naglowka_xlsx_path) - - def test_ImportPracownikow_brak_naglowka(import_pracownikow_brak_naglowka): import_pracownikow_brak_naglowka.perform() assert import_pracownikow_brak_naglowka.importpracownikowrow_set.count() == 0 diff --git a/src/import_pracownikow/tests/test_models/test_odepnij_autorow_spoza_pliku.py b/src/import_pracownikow/tests/test_models/test_odepnij_autorow_spoza_pliku.py new file mode 100644 index 000000000..a963730f0 --- /dev/null +++ b/src/import_pracownikow/tests/test_models/test_odepnij_autorow_spoza_pliku.py @@ -0,0 +1,120 @@ +from datetime import date + + +def test_odepnij_autorow_spoza_pliku_autor_jest_w_pliku_ale_odpinamy_inne_miejsca_zarzadzaj_automatycznie( + import_pracownikow_performed, + autor_z_pliku, + jednostka_z_pliku, + jednostka_spoza_pliku, + today, + yesterday, +): + aj_spoza_pliku = autor_z_pliku.dodaj_jednostke(jednostka_spoza_pliku) + jednostka_spoza_pliku.zarzadzaj_automatycznie = True + jednostka_spoza_pliku.save() + + # Odpinamy + import_pracownikow_performed.odepnij_autorow_spoza_pliku( + today=today, yesterday=yesterday + ) + + # Odpięcie automatyczne jednostek zarządzanych automatycznie powinno odpiąc te jednostki + # a w sytuacji, gdy autorowi nie pozostanie zadna jednostka, aktualna jednostka + # będzie miała wartość None: + + autor_z_pliku.refresh_from_db() + assert autor_z_pliku.aktualna_jednostka == jednostka_z_pliku + + # Przypisanie Autor+Jednostka znajdujące się w pliku zostanie dodane od dzisiaj + assert autor_z_pliku.autor_jednostka_set.get( + jednostka=jednostka_z_pliku + ).rozpoczal_prace == date(2016, 10, 1) + + # Przypisania Autor + Jednostka spoza pliku bedzie miała "odpięte" miejsce pracy + # czyli datę zakończenia równą wczoraj + aj_spoza_pliku.refresh_from_db() + assert aj_spoza_pliku.zakonczyl_prace == yesterday + assert aj_spoza_pliku.podstawowe_miejsce_pracy is False + + +def test_odepnij_autorow_spoza_pliku_autor_jest_w_pliku_ale_odpinamy_inne_miejsca_nie_zarzadzaj_automatycznie( + import_pracownikow_performed, + autor_z_pliku, + jednostka_z_pliku, + jednostka_spoza_pliku, + today, + yesterday, +): + autor_z_pliku.dodaj_jednostke(jednostka_spoza_pliku) + jednostka_spoza_pliku.zarzadzaj_automatycznie = False + jednostka_spoza_pliku.save() + + # Zweryfikujmy stan po imporcie -- `autor_z_pliku` przypięty do `jednostka_z_pliku` + autor_z_pliku.refresh_from_db() + assert autor_z_pliku.aktualna_jednostka == jednostka_z_pliku + + # Przy wykorzystaniu przez tą funkcję parametru 'import_pracownikow_performed', mamy w bazie + # danych stan taki, jak w pliku -- czyli "podstawowe miejsce pracy" ustawione dla pana + # `autor_z_pliku` na `jednostka_z_pliku`. Z tym, że teraz chcemy przetestować odpinanie jednostek + # zatem skasujemy tą informację z pliku importu, aby było tak jak gdyby tego wpisu w pliku + # importu nie było. Zatem, oczekiwanym zachowaniem będzie przez system odpięcie jednostki + # `jednostka_z_pliku` (bo jest zarządzana automatycznie) oraz NIE odpięcie jednostki `jednostka_spoza_pliku` + # gdyż ona ma `zarzadzaj_automatycznie` ustawione na False. + + import_pracownikow_performed.importpracownikowrow_set.all().delete() + + # Skasowana. + + # Teraz odpinamy: + import_pracownikow_performed.odepnij_autorow_spoza_pliku( + today=today, yesterday=yesterday + ) + + # Odpięcie jednostek nie-zarządzanych automatycznie powinno ich nie ruszać: + + autor_z_pliku.refresh_from_db() + assert autor_z_pliku.aktualna_jednostka == jednostka_spoza_pliku + + +def test_odepnij_autorow_spoza_pliku_inny_autor_czy_odepnie_automatyczna( + import_pracownikow_performed, + autor_z_pliku, + jednostka_z_pliku, + autor_spoza_pliku, + jednostka_spoza_pliku, +): + autor_spoza_pliku.dodaj_jednostke(jednostka_spoza_pliku) + jednostka_spoza_pliku.zarzadzaj_automatycznie = True + jednostka_spoza_pliku.save() + + autor_spoza_pliku.refresh_from_db() + assert autor_spoza_pliku.aktualna_jednostka == jednostka_spoza_pliku + + # Odpinamy + import_pracownikow_performed.odepnij_autorow_spoza_pliku() + + # Czy autor_spoza_pliku ma odpietą jednostkę? + autor_spoza_pliku.refresh_from_db() + assert autor_spoza_pliku.aktualna_jednostka is None + + +def test_odepnij_autorow_spoza_pliku_inny_autor_czy_nie_odepnie_nie_automatyczna( + import_pracownikow_performed, + autor_z_pliku, + jednostka_z_pliku, + autor_spoza_pliku, + jednostka_spoza_pliku, +): + autor_spoza_pliku.dodaj_jednostke(jednostka_spoza_pliku) + jednostka_spoza_pliku.zarzadzaj_automatycznie = False + jednostka_spoza_pliku.save() + + autor_spoza_pliku.refresh_from_db() + assert autor_spoza_pliku.aktualna_jednostka == jednostka_spoza_pliku + + # Odpinamy + import_pracownikow_performed.odepnij_autorow_spoza_pliku() + + # Czy autor_spoza_pliku ma odpietą jednostkę? + autor_spoza_pliku.refresh_from_db() + assert autor_spoza_pliku.aktualna_jednostka == jednostka_spoza_pliku diff --git a/src/import_pracownikow/tests/test_models/test_reset_miejsca_pracy.py b/src/import_pracownikow/tests/test_models/test_reset_miejsca_pracy.py deleted file mode 100644 index d5f0c70ff..000000000 --- a/src/import_pracownikow/tests/test_models/test_reset_miejsca_pracy.py +++ /dev/null @@ -1,10 +0,0 @@ -def test_autorzy_spoza_pliku_autor_jest_w_pliku_ale_odpinamy_inne_miejsca(): - raise NotImplementedError - - -def test_odpinanie_wszystkiego_ustawianie_obcej_jednostki(): - raise NotImplementedError - - -def test_odpinanie_wszystkiego_oprocz_jednostki_nie_odpinanej_automatycznie(): - raise NotImplementedError diff --git a/src/import_pracownikow/tests/test_views.py b/src/import_pracownikow/tests/test_views.py new file mode 100644 index 000000000..42ed35a22 --- /dev/null +++ b/src/import_pracownikow/tests/test_views.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +import django.test.client +from django.http import HttpResponse +from django.urls import reverse + +from bpp.models import Autor +from bpp.tests import normalize_response_content + + +def test_ImportPracownikowResetujPodstawoweMiejscePracyView_nic_do_odpiecia( + import_pracownikow_performed, + uczelnia_z_obca_jednostka, + admin_client: django.test.client.Client, +): + url = reverse( + "import_pracownikow:importpracownikow-results", + kwargs={"pk": import_pracownikow_performed.pk}, + ) + res: HttpResponse = admin_client.get(url) + assert "tego pliku nie powoduje" in normalize_response_content(res) + + +def test_ImportPracownikowResetujPodstawoweMiejscePracyView_czlowiek_do_odpiecia( + import_pracownikow_performed, + uczelnia_z_obca_jednostka, + admin_client: django.test.client.Client, + autor_spoza_pliku: Autor, + jednostka_spoza_pliku, +): + autor_spoza_pliku.dodaj_jednostke(jednostka_spoza_pliku) + + url = reverse( + "import_pracownikow:importpracownikow-results", + kwargs={"pk": import_pracownikow_performed.pk}, + ) + res: HttpResponse = admin_client.get(url) + assert "tego pliku nie powoduje" not in normalize_response_content(res) + + +def test_ImportPracownikowResetujPodstawoweMiejscePracyView_autor_do_odpiecia( + import_pracownikow_performed, + uczelnia_z_obca_jednostka, + admin_client: django.test.client.Client, + autor_spoza_pliku, + jednostka_spoza_pliku, +): + autor_spoza_pliku.dodaj_jednostke(jednostka_spoza_pliku) + autor_spoza_pliku.refresh_from_db() + assert autor_spoza_pliku.aktualna_jednostka == jednostka_spoza_pliku + + url = reverse( + "import_pracownikow:importpracownikow-resetuj-podstawowe-miejsce-pracy", + kwargs={"pk": import_pracownikow_performed.pk}, + ) + admin_client.get(url) + + autor_spoza_pliku.refresh_from_db() + assert autor_spoza_pliku.aktualna_jednostka is None diff --git a/src/import_pracownikow/views.py b/src/import_pracownikow/views.py index 26fb2f44e..1488081aa 100644 --- a/src/import_pracownikow/views.py +++ b/src/import_pracownikow/views.py @@ -1,5 +1,4 @@ # Create your views here. -from datetime import timedelta from braces.views import GroupRequiredMixin from django.http import HttpResponseRedirect @@ -17,9 +16,7 @@ from django.contrib import messages -from django.utils import timezone - -from bpp.models import Autor_Jednostka, Uczelnia +from bpp.models import Uczelnia class BaseImportPracownikowMixin(GroupRequiredMixin): @@ -46,14 +43,9 @@ class ImportPracownikowDetailsView(BaseImportPracownikowMixin, LongRunningDetail class ImportPracownikowResultsView(BaseImportPracownikowMixin, LongRunningResultsView): def autorzy_spoza_pliku(self): uczelnia = Uczelnia.objects.get_for_request(self.request) - return ( - Autor_Jednostka.objects.exclude( - autor_id__in=self.get_queryset().values_list("autor_id").distinct() - ) - .exclude(autor__aktualna_jednostka_id=uczelnia.obca_jednostka_id) - .exclude(jednostka__zarzadzaj_automatycznie=False) - .select_related("autor", "autor__tytul", "jednostka", "jednostka__wydzial") - ) + return self.parent_object.autorzy_spoza_pliku_set( + uczelnia=uczelnia + ).select_related("autor", "autor__tytul", "jednostka", "jednostka__wydzial") def get_context_data(self, **kwargs): return super().get_context_data(autorzy_spoza_pliku=self.autorzy_spoza_pliku()) @@ -61,26 +53,9 @@ def get_context_data(self, **kwargs): class ImportPracownikowResetujPodstawoweMiejscePracyView(ImportPracownikowResultsView): def get(self, request, *args, **kwargs): - today = timezone.now().date() - yesterday = today - timedelta(days=1) - uczelnia = Uczelnia.objects.get_for_request(self.request) - seen_aut = set() - - self.autorzy_spoza_pliku().update( - zakonczyl_prace=yesterday, podstawowe_miejsce_pracy=False - ) - - for autor_jednostka in self.autorzy_spoza_pliku(): - if autor_jednostka.autor_id in seen_aut: - continue - Autor_Jednostka.objects.get_or_create( - autor_id=autor_jednostka.autor_id, - jednostka=uczelnia.obca_jednostka, - rozpoczal_prace=today, - ) - seen_aut.add(autor_jednostka.autor_id) + self.parent_object.odepnij_autorow_spoza_pliku(uczelnia=uczelnia) messages.info( request, "Podstawowe miejsca pracy autorów zostały zaktualizowane."