Skip to content

Commit

Permalink
CtiOS: Add method for updating database (#50)
Browse files Browse the repository at this point in the history
* nova metoda uloz_vystup_aktualizuj_db, ktera aktualizuje vstupni databazi o ziskane osobni udaje ze sluzby ctiOS
* ulozeni vystupnich posidentu s nalezenymi chybami do JSON souboru se nove deje v ramci oddelene metody uloz_vystup_chybnych
* metoda uloz_vystup se stara pouze o zpracovani ulozeni vystupu osobnich udaju u uspesne stazenych pseudoidentifikatoru

Co-authored-by: Martin Landa <[email protected]>
  • Loading branch information
lindakarlovska and landam authored Jan 12, 2023
1 parent 8a6e275 commit 92bc86b
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 44 deletions.
26 changes: 23 additions & 3 deletions docs/notebooks/ctios_db.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -150,13 +150,13 @@
"name": "stderr",
"output_type": "stream",
"text": [
"ctiOS - INFO - Vystup byl ulozen zde: /home/linduska/pywsdp/tests/data/output/ctios_10_47_12_29_10_2022.db\n"
"ctiOS - INFO - Vystup byl ulozen zde: /home/linduska/pywsdp/tests/data/output/ctios_21_20_37_10_01_2023.db\n"
]
}
],
"source": [
"vystup, vystup_chybnych = ctios.uloz_vystup(\n",
" slovnik, vystupni_adresar, OutputFormat.GdalDb, slovnik_chybnych\n",
"vystup = ctios.uloz_vystup(\n",
" slovnik, vystupni_adresar, OutputFormat.GdalDb\n",
")"
]
},
Expand All @@ -182,6 +182,26 @@
" assert row == (5,)\n",
"con.close()"
]
},
{
"cell_type": "markdown",
"id": "93cc7998",
"metadata": {},
"source": [
"Může se stát, že nechceme kopírovat celý soubor databáze do nového umístění, ale pouze chceme aktualizovat vstupní databázový soubor. Toho můžeme dosáhnout takto:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "edb04e1f",
"metadata": {},
"outputs": [],
"source": [
"vystup = ctios.uloz_vystup_aktualizuj_db(\n",
" slovnik\n",
")"
]
}
],
"metadata": {
Expand Down
60 changes: 47 additions & 13 deletions docs/notebooks/ctios_json_csv.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 4,
"id": "654c8be8",
"metadata": {},
"outputs": [],
Expand All @@ -82,7 +82,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 5,
"id": "2719c63b",
"metadata": {
"scrolled": true
Expand Down Expand Up @@ -136,7 +136,7 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 6,
"id": "77c1d9fc",
"metadata": {},
"outputs": [],
Expand All @@ -156,22 +156,21 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 7,
"id": "b8c5dc93",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"ctiOS - INFO - Vystup byl ulozen zde: /home/linduska/pywsdp/tests/data/output/ctios_10_46_54_29_10_2022.csv\n",
"ctiOS - INFO - Zaznam o nezpracovanych identifikatorech byl ulozen zde: /home/linduska/pywsdp/tests/data/output/ctios_errors_10_46_54_29_10_2022.json\n"
"ctiOS - INFO - Vystup byl ulozen zde: /home/linduska/pywsdp/tests/data/output/ctios_21_12_56_10_01_2023.csv\n"
]
}
],
"source": [
"vystup, vystup_chybnych = ctios.uloz_vystup(\n",
" slovnik, vystupni_adresar, OutputFormat.Csv, slovnik_chybnych\n",
"vystup = ctios.uloz_vystup(\n",
" slovnik, vystupni_adresar, OutputFormat.Csv\n",
")"
]
},
Expand All @@ -185,24 +184,59 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 9,
"id": "1476f1f8",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"ctiOS - INFO - Vystup byl ulozen zde: /home/linduska/pywsdp/tests/data/output/ctios_10_46_54_29_10_2022.json\n",
"ctiOS - INFO - Zaznam o nezpracovanych identifikatorech byl ulozen zde: /home/linduska/pywsdp/tests/data/output/ctios_errors_10_46_54_29_10_2022.json\n"
"ctiOS - INFO - Vystup byl ulozen zde: /home/linduska/pywsdp/tests/data/output/ctios_21_16_05_10_01_2023.json\n"
]
}
],
"source": [
"vystup = ctios.uloz_vystup(\n",
" slovnik, vystupni_adresar, OutputFormat.Json\n",
")"
]
},
{
"cell_type": "markdown",
"id": "b4dd20fc",
"metadata": {},
"source": [
"Pokud chceme vypsat, které identifikátory nebyly kvůli chybě zpracovány a k jaké chybě došlo, můžeme si uložit výstup neúspěšně zpracovaných identifikátorů do json souboru."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "fd0f3d9f",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"ctiOS - INFO - Zaznam o nezpracovanych identifikatorech byl ulozen zde: /home/linduska/pywsdp/tests/data/output/ctios_errors_21_16_08_10_01_2023.json\n"
]
}
],
"source": [
"vystup, vystup_chybnych = ctios.uloz_vystup(\n",
" slovnik, vystupni_adresar, OutputFormat.Json, slovnik_chybnych\n",
"vystup_chybnych = ctios.uloz_vystup_chybnych(\n",
" slovnik_chybnych, vystupni_adresar\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "801c0461",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
Expand Down
3 changes: 1 addition & 2 deletions pywsdp/base/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@
from pywsdp.base.logger import WSDPLogger
from pywsdp.base.exceptions import WSDPError


__version__ = "2.0.2"
__version__ = "2.1.0"


class WSDPBase:
Expand Down
48 changes: 40 additions & 8 deletions pywsdp/modules/CtiOS/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ def posli_pozadavek(self, slovnik_identifikatoru: dict) -> dict:
vysledek ulozi do slovniku. Zaroven vypocte zaloguje statistiku procesu.
:param slovnik: vstupni parametry specificke pro danou sluzbu.
:return: objekt zeep knihovny prevedeny na slovnik a upraveny pro vystup
:return: tuple (slovnik - uspesne vracene pseudoidentifikatory s osobnimi udaji,
slovnik - chybne pseudoidentifikatory s popisem chyby)
"""
response, response_errors = self.client.send_request(slovnik_identifikatoru)
self.client.log_statistics()
Expand All @@ -99,19 +100,17 @@ def uloz_vystup(
vysledny_slovnik: dict,
vystupni_adresar: str,
format_souboru: OutputFormat,
slovnik_chybnych_identifikatoru: dict = None,
):
"""Konvertuje osobni udaje typu slovnik ziskane ze sluzby ctiOS do souboru o definovanem
formatu a soubor ulozi do definovaneho vystupniho adresare. Pokud adresar neexistuje, vytvori ho.
U databaze nejprve prekopiruje vstupni soubor do pozadovaneho adresare a pak databazi updatuje o osobni udaje.
:param vysledny_slovnik: slovnik vraceny pro uspesne zpracovane identifikatory
:param vystupni_adresar: cesta k vystupnimu adresari
:param format_souboru: format typu OutputFormat.GdalDb, OutputFormat.Json nebo OutputFormat.Csv
:param slovnik_chybnych_identifikatoru: slovnik vraceny pro neuspesne zpracovane identifikatory
:return: cesta k vystupnimu souboru
"""
cas = datetime.now().strftime("%H_%M_%S_%d_%m_%Y")
vystupni_cesta_chybnych = None

# kontrola existence vystupniho souboru
if os.path.exists(vystupni_adresar) == False:
Expand Down Expand Up @@ -165,19 +164,52 @@ def uloz_vystup(
)
# logovani ulozeni vystupu
self.logger.info("Vystup byl ulozen zde: {}".format(vystupni_cesta))
return vystupni_cesta

def uloz_vystup_aktualizuj_db(
self,
vysledny_slovnik: dict,
):
"""Updatuje vstupni databazi o osobni udaje ziskane ze sluzby ctiOS.
:param vysledny_slovnik: slovnik vraceny pro uspesne zpracovane identifikatory
:return: cesta k updatovane databazi
"""
db = DbManager(self._input_db, self.logger)
db.add_column_to_db("OS_ID", "text")
input_db_columns = db.get_columns_names()
db_dictionary = AttributeConverter(
_XML2DB_mapping, vysledny_slovnik, input_db_columns, self.logger
).convert_attributes()
db.update_rows_in_db(db_dictionary)
db.close_connection()
self.logger.info(
"Databaze v ceste {} byla aktualizovana".format(self._input_db)
)
return self._input_db

def uloz_vystup_chybnych(
self, slovnik_chybnych_identifikatoru: dict, vystupni_adresar: str
):
"""Ulozi slovnik chybnych identifikatoru vraceny metodou posli_pozadavek do json souboru.
:param slovnik_chybnych_identifikatoru: slovnik vraceny pro neuspesne zpracovane identifikatory
:param vystupni_adresar: cesta k vystupnimu adresari
"""
# zapsani chybnych identifikatoru do json souboru
if slovnik_chybnych_identifikatoru:
cas = datetime.now().strftime("%H_%M_%S_%d_%m_%Y")
vystupni_soubor = "".join(["ctios_errors_", cas, ".json"])
vystupni_cesta_chybnych = os.path.join(vystupni_adresar, vystupni_soubor)
with open(vystupni_cesta_chybnych, "w", newline="", encoding="utf-8") as f:
vystupni_cesta = os.path.join(vystupni_adresar, vystupni_soubor)
with open(vystupni_cesta, "w", newline="", encoding="utf-8") as f:
json.dump(slovnik_chybnych_identifikatoru, f, ensure_ascii=False)
self.logger.info(
"Zaznam o nezpracovanych identifikatorech byl ulozen zde: {}".format(
vystupni_cesta_chybnych
vystupni_cesta
)
)
return vystupni_cesta, vystupni_cesta_chybnych
return vystupni_cesta
return None

def vypis_statistiku(self):
"""Vytiskne statistiku zpracovanych pseudonymizovanych identifikatoru (POSIdentu).
Expand Down
37 changes: 19 additions & 18 deletions tests/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,9 +221,8 @@ def test_02a_ctiOS_json(self):
"Check the module output to json"
ctios = CtiOS(creds_test, trial=True)
slovnik, slovnik_chybnych = ctios.posli_pozadavek(parametry_ctiOS_dict)
vystup, vystup_chybnych = ctios.uloz_vystup(
slovnik, vystupni_adresar, OutputFormat.Json, slovnik_chybnych
)
vystup = ctios.uloz_vystup(slovnik, vystupni_adresar, OutputFormat.Json)
vystup_chybnych = ctios.uloz_vystup_chybnych(slovnik_chybnych, vystupni_adresar)
assert os.path.exists(vystup) == True
assert os.path.exists(vystup_chybnych) == True

Expand All @@ -242,16 +241,12 @@ def test_02a_ctiOS_json(self):
"im+o3Qoxrit4ZwyJIPjx3X788EOgtJieiZYw/eqwxTPERjsqLramxBhGoAaAnooYAliQoVBYy7Q7fN2cVAxsAoUoPFaReqsfYWOZJjMBj/6Q",
"4m3Yuf1esDMzbgNGYW7kvzjlaZALZ3v3D7cXmxgCcFp0RerVtxqo8yb87oI0FBCtp49AycQ5NNI3vl+b+SEa+8SfmGU4sqBPH2pX/76wyB",
]
if vystup_chybnych:
os.remove(vystup_chybnych)

def test_02b_ctiOS_csv(self):
"Check the module output to csv"
ctios = CtiOS(creds_test, trial=True)
slovnik, slovnik_chybnych = ctios.posli_pozadavek(parametry_ctiOS_dict)
vystup, vystup_chybnych = ctios.uloz_vystup(
slovnik, vystupni_adresar, OutputFormat.Csv, slovnik_chybnych
)
vystup = ctios.uloz_vystup(slovnik, vystupni_adresar, OutputFormat.Csv)
assert os.path.exists(vystup) == True

with open(vystup, mode="r") as csv_file:
Expand All @@ -260,30 +255,36 @@ def test_02b_ctiOS_csv(self):
if line[0] == parametry_ctiOS_dict["pOSIdent"][3]:
boolean = 1
assert boolean == 1

os.remove(vystup)
if vystup_chybnych:
os.remove(vystup_chybnych)

def test_02c_ctiOS_db(self):
def test_02c_ctiOS_uloz_vystup_db(self):
"Check the module output to SQLite DB"
ctios = CtiOS(creds_test, trial=True)
parametry_ctiOS_db = ctios.nacti_identifikatory_z_db(db_path)
slovnik, slovnik_chybnych = ctios.posli_pozadavek(parametry_ctiOS_db)
vystup, vystup_chybnych = ctios.uloz_vystup(
slovnik, vystupni_adresar, OutputFormat.GdalDb, slovnik_chybnych
)
vystup = ctios.uloz_vystup(slovnik, vystupni_adresar, OutputFormat.GdalDb)
assert os.path.exists(vystup) == True

con = sqlite3.connect(vystup)
cur = con.cursor()
for row in cur.execute("SELECT count(*) FROM OPSUB"):
assert row == (108,)
con.close()

os.remove(vystup)
if vystup_chybnych:
os.remove(vystup_chybnych)

def test_02d_ctiOS_aktualizuj_db(self):
"Check the update of SQLite DB"
ctios = CtiOS(creds_test, trial=True)
parametry_ctiOS_db = ctios.nacti_identifikatory_z_db(db_path)
slovnik, slovnik_chybnych = ctios.posli_pozadavek(parametry_ctiOS_db)
vystup = ctios.uloz_vystup_aktualizuj_db(slovnik)
assert os.path.exists(vystup) == True

con = sqlite3.connect(vystup)
cur = con.cursor()
for row in cur.execute("SELECT count(*) FROM OPSUB"):
assert row == (108,)
con.close()

def test_02a_generujCenoveUdajeDleKu(self):
"Check the module output to zip"
Expand Down

0 comments on commit 92bc86b

Please sign in to comment.