Skip to content

Commit

Permalink
Merge branch 'release/v202212.1096'
Browse files Browse the repository at this point in the history
  • Loading branch information
mpasternak committed Dec 27, 2022
2 parents e8dcae2 + 65a236f commit ff71a30
Show file tree
Hide file tree
Showing 17 changed files with 194 additions and 23 deletions.
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ repos:
- id: trailing-whitespace
- id: mixed-line-ending

- repo: https://gitlab.com/pycqa/flake8
rev: '3.9.2'
- repo: https://github.com/PyCQA/flake8
rev: '6.0.0'
hooks:
- id: flake8
args: ["--exclude=*/migrations/*"]
Expand Down
10 changes: 10 additions & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ Historia zmian

.. towncrier release notes start
Bpp 202212.1096 (2022-12-27)
============================

Usprawnienie
------------

- * mapowanie kół naukowych do powiązania autora i jednostki do rekordu --
dla jednostek przypisz koło naukowe, do którego przypisany jest autor. (bez_numeru)


Bpp 202211.1095 (2022-11-30)
============================

Expand Down
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,6 @@ poetry-sync:
test-package-from-vcs: check-git-clean poetry-sync set-version-from-vcs bdist_wheel
ls -lash dist
git reset --hard

loc: clean
pygount -N ... -F "...,staticroot,migrations,fixtures" src --format=summary
9 changes: 9 additions & 0 deletions bin/importuj_oplaty_katalog.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/bash

export KATALOG="$1/raport.txt"

IFS=$(echo -en "\n\b")

for a in $1/*xlsx; do
python src/manage.py import_oplaty_publikacje --dry "$a" >> "$KATALOG" ;
done
6 changes: 6 additions & 0 deletions bin/mapuj_kola_naukowe.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash

python src/manage.py mapuj_kola_naukowe &> res.txt
grep "nie ma zadnego" res.txt > brak_kol.txt
grep "Przypisano" res.txt > przypisano.txt
grep "ma ilość przypisań" res.txt > wiele_kol.txt
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bpp-iplweb",
"version": "v202211.1095",
"version": "v202212.1096",
"devDependencies": {
"grunt": ">=1.5.2",
"grunt-contrib-qunit": "^2.0.0",
Expand Down
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "bpp_iplweb"
version = "202211.1095"
version = "202212.1096"
description = ""
authors = ["Michał Pasternak <michal.dtz@gmail.com>"]
license = "MIT"
Expand Down Expand Up @@ -60,7 +60,7 @@ pytest-recording = "^0.12.1"
towncrier = "^22.8.0"

[tool.bumpver]
current_version = "v202211.1095"
current_version = "v202212.1096"
version_pattern = "vYYYY0M.BUILD[-TAGNUM][GITHASH]"
commit_message = "bump version {old_version} -> {new_version}"
commit = true
Expand Down Expand Up @@ -216,7 +216,7 @@ build-backend = "poetry.core.masonry.api"

[tool.towncrier]
package = "bpp"
version = "202211.1095"
version = "202212.1096"
package_dir = "src"
filename = "HISTORY.rst"

Expand Down
2 changes: 2 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# https://github.com/PyCQA/flake8/issues/234

[flake8]
exclude = ['docs', 'src/*/tests','*/migrations/*']
max-line-length = 120
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def requirements(fn="requirements.txt"):

setup(
name="bpp-iplweb",
version="202211.1095",
version="202212.1096",
description="System informatyczny do zarządzania bibliografią publikacji pracowników naukowych",
long_description=readme,
long_description_content_type="text/x-rst",
Expand Down
13 changes: 9 additions & 4 deletions src/bpp/management/commands/import_oplaty_publikacje.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@ class Command(BaseCommand):
args = "<plik xls 1> <plik xls 2> ..."

def add_arguments(self, parser: OptionParser):
parser.add_argument("--dry", action=argparse.BooleanOptionalAction)
parser.add_argument("pliki", type=argparse.FileType("rb"), nargs="+")

@transaction.atomic
def handle(self, pliki, *args, **options):
def handle(self, dry, pliki, *args, **options):

for plik in pliki:
print()
Expand All @@ -36,8 +37,9 @@ def handle(self, pliki, *args, **options):
xlsx = pandas.read_excel(plik)
except ValueError:
print(f"Nie umiem otworzyc pliku {plik.name}")
continue

for wiersz, row in enumerate(xlsx.iloc):
for wiersz, row in xlsx.iterrows():
pk = normalize_rekord_id(row[1])
if pk is None:
continue
Expand All @@ -55,7 +57,7 @@ def handle(self, pliki, *args, **options):

if rekord.tytul_oryginalny != row["Tytuł oryginalny"]:
print(
f"wiersz {wiersz} -- tytuł rekordu inny niz w bazie, nie importuję (plik: "
f"wiersz {wiersz+2} -- tytuł rekordu inny niz w bazie, nie importuję (plik: "
f"{row['Tytuł oryginalny']}, baza {rekord.tytul_oryginalny})"
)
print()
Expand All @@ -77,10 +79,13 @@ def handle(self, pliki, *args, **options):
)
except ValidationError as e:
print(
f"wiersz {wiersz} -- problem z walidacją rekordu {rekord.tytul_oryginalny} -- "
f"wiersz {wiersz+2} -- problem z walidacją rekordu {rekord.tytul_oryginalny} -- "
f"{e}. Zmiany nie zostały wprowadzone do bazy. "
)
print()
continue

original.save()

if dry:
transaction.set_rollback(True)
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def handle(self, pliki, *args, **options):
)
except ValidationError as e:
print(
f"Problem z walidacją plik {plik} wiersz {wiersz} rekordu "
f"Problem z walidacją plik {plik} wiersz {wiersz+2} rekordu "
f"{rekord.tytul_oryginalny} -- {e}. Zmiany nie zostały wprowadzone do bazy. "
)
continue
Expand Down
99 changes: 99 additions & 0 deletions src/bpp/management/commands/mapuj_kola_naukowe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
from django.core.management import BaseCommand, CommandError, CommandParser
from django.db import transaction

from bpp.models import Autorzy, Jednostka


class Command(BaseCommand):
help = (
'Dla osob które maja prace z jednostki (parametru -- domyslnie "Uniwersytet Medyczny w Lublinie") '
"oraz wpisany kierunek studiów, ta procedura przypisuje im koła naukowe, do których są przypisani "
"jako autor w modelu Autor_Jednostka. "
"Jeżeli autor jest przypisany do kilku kół naukowych, system wyrzuca dla niego komunikat i nic nie robi. "
"Podobnie gdy autor nie jest w ogóle przypisany do żadnego koła"
)

def add_arguments(self, parser: CommandParser):

parser.add_argument(
"--jednostka",
default="Uniwersytet Medyczny w Lublinie",
help="Jednostka z której zostaną przypisani do kół przemapowywani studenci",
)
parser.add_argument(
"--rok",
type=int,
default=2022,
help="Ogranicz do roku",
)
parser.add_argument(
"--dry-run",
action="store_true",
default=False,
)

@transaction.atomic
def handle(self, jednostka, rok, dry_run, *args, **options):
for _jedn in Jednostka.objects.exclude(
rodzaj_jednostki=Jednostka.RODZAJ_JEDNOSTKI.KOLO_NAUKOWE
):
if (
_jedn.nazwa.lower().find("koło naukowe") >= 0
or _jedn.nazwa.lower().find("skn ") >= 0
):
print(
f"Jednostka {_jedn.nazwa} wydaje się byc kołem naukowym, "
f"ale nie ma określonego własciwego rodzaju jednostki. Ustawiam rodzaj na koło naukowe"
)
_jedn.rodzaj_jednostki = Jednostka.RODZAJ_JEDNOSTKI.KOLO_NAUKOWE
_jedn.save()

jednostka_id = -1
try:
jednostka_id = Jednostka.objects.get(nazwa=jednostka).pk
except Jednostka.DoesNotExist:
raise CommandError(
f'Brak jednostki o nazwie "{jednostka}". '
f"Uzyj parametru --jednostka i podaj inną nazwę"
)

for aj in Autorzy.objects.filter(jednostka__pk=jednostka_id, rekord__rok=rok):
# Znajdź dla autora jednostkę będącą kołem naukowym
autor = aj.autor

if aj.kierunek_studiow_id is None:
print(
f"Autor {autor} nie ma określonego kierunku studiów, nie przypiszę żadnego koła naukowego. "
f"Rekord: {aj.rekord.tytul_oryginalny}, {aj.rekord_id}"
)

kolo_naukowe = autor.jednostki.filter(
rodzaj_jednostki=Jednostka.RODZAJ_JEDNOSTKI.KOLO_NAUKOWE
)

if not kolo_naukowe.exists():
print(
f"Autor {autor} nie ma zadnego kola naukowego, nie mam gdzie przypisać -- "
f"praca {aj.rekord.tytul_oryginalny}, {aj.rekord_id}"
)
continue

elif kolo_naukowe.count() == 1:
aj = aj.original
aj.jednostka = kolo_naukowe.first()
aj.save()
print(
f"Przypisano autorowi {autor} koło {kolo_naukowe.first().nazwa} "
f"dla pracy {aj.rekord.tytul_oryginalny}, {aj.rekord_id}"
)
continue

else:
print(
f"Autor {autor} ma ilość przypisań do kół = {kolo_naukowe.count()}, proszę określić ręcznie. "
f"Rekord {aj.rekord.tytul_oryginalny}, {aj.rekord_id}"
)
continue

if dry_run:
transaction.rollback()
10 changes: 8 additions & 2 deletions src/django_bpp/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,14 @@

ENVFILE_PATH = os.path.join(os.path.expanduser("~"), ".env")

if os.path.exists(ENVFILE_PATH) and os.path.isfile(ENVFILE_PATH):
environ.Env.read_env(ENVFILE_PATH)
#
# Odczytaj plik ~/.env oraz dodatkowo ~/.env.local ;
# jeżeli zmienna jest zdefiniowana w tym drugim to nadpisz ten pierwszy...
#

for fn in [ENVFILE_PATH, ENVFILE_PATH + ".local"]:
if os.path.exists(fn) and os.path.isfile(fn):
environ.Env.read_env(fn, overwrite=True)

#
# Ustaw Sentry
Expand Down
2 changes: 1 addition & 1 deletion src/django_bpp/version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
VERSION = "202211.1095"
VERSION = "202212.1096"

if __name__ == "__main__":
import sys
Expand Down
20 changes: 12 additions & 8 deletions src/import_common/normalization.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ def remove_extra_spaces(s: str) -> str:
return s


def fix_spaces_before_dots_and_commas(s: str) -> str:
while s.find(" .") >= 0 or s.find(" ,") >= 0:
s = s.replace(" .", ". ").replace(" ,", ", ")
return s


def normalize_first_name(s: str) -> str | None:
if not isinstance(s, str) or s is None or s == "" or not s:
return
Expand Down Expand Up @@ -56,7 +62,7 @@ def normalize_nullboleanfield(s: Union[str, None, bool]) -> Union[bool, None]:
def normalize_skrot(s):
if s is None:
return
return remove_extra_spaces(s.lower().replace(" .", ". "))
return remove_extra_spaces(fix_spaces_before_dots_and_commas(s.lower()))


def normalize_tytul_naukowy(s):
Expand All @@ -66,9 +72,7 @@ def normalize_tytul_naukowy(s):
def normalize_title(s: str) -> str | None:
if s is None or not s:
return
while s.find(" ") >= 0:
s = s.replace(" ", " ")
return s.strip()
return remove_extra_spaces(s)


ONLINE_STR = "[online]"
Expand All @@ -77,13 +81,13 @@ def normalize_title(s: str) -> str | None:
def normalize_tytul_publikacji(s):
if s is None:
return
ret = remove_trailing_interpunction(normalize_skrot(s))
ret = remove_trailing_interpunction(
remove_extra_spaces(fix_spaces_before_dots_and_commas(s))
)
if ret.endswith(ONLINE_STR):
ret = ret[: -len(ONLINE_STR)].strip()
ret = ret.replace("\r", " ").replace("\n", " ")
while ret.find(" ") >= 0:
ret = ret.replace(" ", " ")
return ret
return remove_extra_spaces(ret)


def normalize_funkcja_autora(s: str) -> str:
Expand Down
1 change: 1 addition & 0 deletions src/import_common/tests/test_normalization.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ def test_normalize_orcid(i, o):
"to jest tytul z nowa linia bo tak",
),
("wytniemy online [online]", "wytniemy online"),
("A duzych liter NIE SPRAWDZILEM", "A duzych liter NIE SPRAWDZILEM"),
],
)
def test_normalize_tytul_publikacji(i, o):
Expand Down
26 changes: 26 additions & 0 deletions src/zglos_publikacje/tests/tests_zglos_publikacje.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,32 @@ def test_zglos_publikacje_bez_pliku_nie_artykul(
assert b"zostanie zaakceptowane" in page3.content


@pytest.mark.django_db
def test_zglos_publikacje_tytul_wielkosc_liter(
webtest_app, uczelnia, typy_odpowiedzialnosci
):
TYTUL_PRACY = "Test Wielkich Liter"

url = reverse("zglos_publikacje:nowe_zgloszenie")
page = webtest_app.get(url)
page.forms[0]["0-tytul_oryginalny"] = TYTUL_PRACY
page.forms[0][
"0-rodzaj_zglaszanej_publikacji"
] = Zgloszenie_Publikacji.Rodzaje.POZOSTALE

page.forms[0]["0-strona_www"] = "https://onet.pl"
page.forms[0]["0-rok"] = "2020"
page.forms[0]["0-email"] = "123@123.pl"

# Lista autorow
page2 = page.forms[0].submit()

# Sukces!
page2.forms[0].submit().maybe_follow()

assert Zgloszenie_Publikacji.objects.first().tytul_oryginalny == TYTUL_PRACY


def zrob_submit_calego_formularza(
webtest_app,
django_capture_on_commit_callbacks,
Expand Down

0 comments on commit ff71a30

Please sign in to comment.