sysnet-pyutils 1.2.5__py3-none-any.whl → 1.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,8 @@ import pytz
5
5
 
6
6
  from sysnet_pyutils.utils import is_valid_email, TZ
7
7
 
8
+ PAGE_SIZE = 10
9
+
8
10
  def get_dict_value(data: dict, item_name: str) -> Union[Any, None]:
9
11
  """
10
12
  Extrahuje hodnotu ze slovníku. Používá se pro load dat JSON do objektů
@@ -320,3 +322,52 @@ def dict_convert_date_to_str(data: dict):
320
322
  dict_convert_date_to_str(item)
321
323
  else:
322
324
  pass
325
+
326
+
327
+ def paging_to_mongo(start=0, page_size=PAGE_SIZE, page=0):
328
+ if start is None:
329
+ start = 0
330
+ if page_size is None:
331
+ page_size = PAGE_SIZE
332
+ if page is None:
333
+ page = 0
334
+ page += start // page_size
335
+ start = start % page_size
336
+ # pokud pocatecni dokument nesouhlasí se začátkem stránky, zkrátí se stránka
337
+ skip = start + page * page_size
338
+ limit = page_size
339
+ if start != 0:
340
+ limit = page_size - start
341
+ out = {
342
+ 'start': start,
343
+ 'page_size': page_size,
344
+ 'page': page,
345
+ 'skip': skip,
346
+ 'limit': limit}
347
+ return out
348
+
349
+
350
+ def recursive_update(out_object, original, updated):
351
+ """
352
+ Rekurzivní aktualizace slovníků
353
+
354
+ :param out_object: Datový objekt k aktualizaci
355
+ :param original: Uložený slovník
356
+ :param updated: Aktualizace (dodaná metodou PUT)
357
+ :return: Aktualizovaný původní slovník
358
+ """
359
+ out = original
360
+ for k, v in updated.items():
361
+ if k not in out:
362
+ # Ignoruj položky, které nejsou v originále
363
+ continue
364
+ if (v is None) and (isinstance(out.get(k), dict) or isinstance(out.get(k), list)):
365
+ # Pokud je místo slovníku nebo seznamu None, přeskočit
366
+ continue
367
+ if isinstance(v, dict) and isinstance(out.get(k), dict):
368
+ # Pokud je aktualizován slovník, rekurze
369
+ recursive_update(getattr(out_object, k), out[k], v)
370
+ else:
371
+ out[k] = v
372
+ setattr(out_object, k, v)
373
+ return out
@@ -6,7 +6,7 @@ from datetime import datetime
6
6
  from enum import Enum
7
7
  from typing import Optional, List, Tuple, Any, ClassVar, Dict
8
8
 
9
- from pydantic import BaseModel, Field, EmailStr, StrictStr
9
+ from pydantic import BaseModel, Field, EmailStr, StrictStr, StrictBool
10
10
  from typing_extensions import Self
11
11
 
12
12
  from sysnet_pyutils.utils import local_now, is_valid_unid, is_valid_pid, is_valid_uuid
@@ -150,6 +150,20 @@ class AclType(BaseModel):
150
150
  )
151
151
 
152
152
 
153
+ class MetadataEssentialType(BaseModel):
154
+ """
155
+ Hlavní metadata
156
+ """ # noqa: E501
157
+ identifier: Optional[StrictStr] = Field(default=None, description="identifikátor uuid")
158
+ date_created: Optional[datetime] = Field(default=None, description="Datum a čas")
159
+ date_modified: Optional[datetime] = Field(default=None, description="Datum a čas")
160
+ date_deleted: Optional[datetime] = Field(default=None, description="Datum a čas")
161
+ deleted: Optional[StrictBool] = Field(default=False, description="Dokument byl odstraněn")
162
+ valid: Optional[StrictBool] = Field(default=True, description="Dokument je platný/neplatný")
163
+ duplicates: Optional[StrictStr] = Field(default=None, description="Dokument je duplicitní k jinému dokumentu s daným identifikátorem")
164
+
165
+
166
+
153
167
  class MetadataTypeEntry(BaseModel):
154
168
  title: Optional[str] = Field(default=None, description='Název dokumentu')
155
169
  id_no: Optional[str] = Field(default=None, description='Číslo dokumentu', examples=['23CZ123456'])
sysnet_pyutils/utils.py CHANGED
@@ -918,3 +918,53 @@ def parse_ldap_name(ldap_name: str) -> Tuple[Union[str, None], Union[str, None]]
918
918
  cn = item.split('=')[-1]
919
919
  break
920
920
  return cn, ldap_name
921
+
922
+
923
+ class Context(LoggedObject, metaclass=Singleton):
924
+ def __init__(
925
+ self,
926
+ config=None,
927
+ api_key=None,
928
+ user_name=None,
929
+ agenda=None,
930
+ cert_file=None,
931
+ cert_pass=None):
932
+ super().__init__(object_name='CONTEXT')
933
+ self.config = config
934
+ if self.config is None:
935
+ self.log.error(f"{self.name} FAILED - Missing config")
936
+ self.api_key = api_key
937
+ self.user_name = user_name
938
+ self.agenda = agenda
939
+ self.authenticated = False
940
+ self.cert_file = cert_file
941
+ self.cert_pass = cert_pass
942
+ self.log.info(f"{self.name} Created")
943
+
944
+ def clear(self):
945
+ self.api_key = None
946
+ self.user_name = None
947
+ self.agenda = None
948
+ self.authenticated = False
949
+ self.cert_file = None
950
+ self.cert_pass = None
951
+ self.log.info(f"{self.name} Cleared")
952
+
953
+ def check_api_key(self, api_key):
954
+ self.clear()
955
+ if api_key in [None, '']:
956
+ return False
957
+ for agenda in self.config.keys():
958
+ if 'api_keys' not in self.config[agenda]:
959
+ continue
960
+ for ak in self.config[agenda]['api_keys']:
961
+ if api_key in ak.keys():
962
+ self.api_key = api_key
963
+ self.agenda = agenda
964
+ self.user_name = ak[api_key]
965
+ self.authenticated = True
966
+ self.log.info(f"{self.name} - User '{self.user_name}' logged in")
967
+ break
968
+ if self.authenticated:
969
+ break
970
+ return self.authenticated
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sysnet-pyutils
3
- Version: 1.2.5
3
+ Version: 1.3.0
4
4
  Summary: Python Utilities
5
5
  Author-email: Data Developer <info@sysnet.cz>
6
6
  Project-URL: Homepage, https://github.com/SYSNET-CZ/pyutils
@@ -81,12 +81,12 @@ Konvertuje hex string na int
81
81
  #### cron_to_dict(cron):
82
82
  Konvertuje cron text do slovníku
83
83
  * param cron: cron text (například '35 21 * * *')
84
- * return: dict of cron
84
+ * return: dict of cron
85
85
  --------------------------------------------------------
86
86
  #### cs_bool(value=None):
87
87
  Vrátí českou textovou hodnotu 'ano'/'ne' pokud je bool(value) True/False
88
88
  * param value: Obecný objekt
89
- * return: 'ano' or 'ne'
89
+ * return: 'ano' or 'ne'
90
90
  --------------------------------------------------------
91
91
  #### date_to_datetime(date_value):
92
92
  Konvertuje date na datetime v lokální časové zóně
@@ -186,7 +186,7 @@ Opraví PID
186
186
  ----------------------------------------------------------------
187
187
  #### pid_next():
188
188
  Vygeneruje korektní PID
189
- * return: PID
189
+ * return: PID
190
190
  ----------------------------------------------------------------
191
191
  #### remove_empty(source_list):
192
192
  Odstraní prázdné položky ze seznamu
@@ -256,7 +256,7 @@ Rekurzivně převede klíče ve slovníku z VelbloudíNotace do hadí_notace
256
256
  Parsuje XML string do XML dictionary
257
257
  podle pravidel viz https://github.com/martinblech/xmltodict
258
258
  * param xml_text: XML text
259
- * return: XML dictionary
259
+ * return: XML dictionary
260
260
  --------------------------------------------------------------------------------------------------------------------------------
261
261
  #### dict_to_xml(xml_dict):
262
262
  Parsuje XML dict do XML textu podle
@@ -279,7 +279,7 @@ Konvertuje písmennou hodnotu na celočíselnou
279
279
 
280
280
  #### local_now():
281
281
  Vrací aktuální časovou značku v lokální časové zóně.
282
- * return: datetime.datetime
282
+ * return: datetime.datetime
283
283
 
284
284
  #### is_valid_unid(unid):
285
285
  Kontrola validity HCL Notes UNIID
@@ -365,3 +365,8 @@ Typ osoby (zdroj CRŽP):
365
365
  - businessNaturalPerson: tuzemská fyzická osoba podnikající
366
366
  - naturalPerson: tuzemská fyzická osoba nepodnikající
367
367
  - foreignNaturalPerson: zahraniční fyzická osoba podnikající
368
+
369
+
370
+ ### Verze 1.3.0
371
+
372
+ Přidána třida **Context**, která se používá při ověřování API-KEY
@@ -1,17 +1,17 @@
1
1
  sysnet_pyutils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  sysnet_pyutils/barcode.py,sha256=5dM1ISvVVP966JQxGiZBUYJoPx_jgzWEpEQ2uIOxTd4,2622
3
- sysnet_pyutils/data_utils.py,sha256=foePXYsPJyl7zdzb4RENO937uNV5G05GdW_En6ql4kw,9673
3
+ sysnet_pyutils/data_utils.py,sha256=1OV89carnQCQgB7wahTEsfg-jR6bQcsz0-NKiiSlk00,11283
4
4
  sysnet_pyutils/domino.py,sha256=dGmg9d1PMPOyA_ysXBHVu_zabKGCJEuno3Yw3DexExQ,2671
5
5
  sysnet_pyutils/geo.py,sha256=smAkRfobvKqjr3_UIjU5huDbnkb3_edD_xmv4R0r5Q0,2938
6
6
  sysnet_pyutils/ident.py,sha256=OkGne8xLEFd2zNdIm7HTPJ_K-fIN9rz7tOR-H0PWDRE,2845
7
7
  sysnet_pyutils/log.py,sha256=SFuCPvFTg31LFvnyG24hCTe73FonfS0_FaAHRBhEvlw,2165
8
8
  sysnet_pyutils/ses.py,sha256=WJzs0y2QnF4XGDGjls_W0p0v6DJ4fZ4_97m3XbzpaFw,2713
9
9
  sysnet_pyutils/tools.py,sha256=ZioHvUIufrhuJyZLdPnuMUD8Li5LTljSMSCxqRnKIi4,377
10
- sysnet_pyutils/utils.py,sha256=4dOqlP8JhKaIzWlbYw4PLckBf1SigBJK-MzK1EWTgYk,23523
10
+ sysnet_pyutils/utils.py,sha256=koG5SY0DQWTJ9qBv1C1sXq9pN6G2KeN9POGzerZJQX4,25160
11
11
  sysnet_pyutils/models/__init__.py,sha256=oozOr_DKhenkM9BDaPOmtbLXhP5vtMUCjBPEjZDW4GQ,167
12
- sysnet_pyutils/models/general.py,sha256=ZN7DUM_1Pnu--Rre22qqrygWnD_RAxR-gEn5a-hIs4k,22588
13
- sysnet_pyutils-1.2.5.dist-info/licenses/LICENSE,sha256=bx5iLIKjgAdYQ7sISn7DsfHRKkoCUm1154sJJKhgqnU,35184
14
- sysnet_pyutils-1.2.5.dist-info/METADATA,sha256=RPOygEMyUmGgzJiYkvzGuZu4C2pAUvumB6IkRH7KdnI,15747
15
- sysnet_pyutils-1.2.5.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
16
- sysnet_pyutils-1.2.5.dist-info/top_level.txt,sha256=ZKTltQWbLlWBXw4oovo1w7ui-JQ1WoyECqMSWdBj6XE,15
17
- sysnet_pyutils-1.2.5.dist-info/RECORD,,
12
+ sysnet_pyutils/models/general.py,sha256=6AE5RfLmvW4oq7V6Iqpbq7l-Lsqt2Kkh7yLaXu58fRc,23386
13
+ sysnet_pyutils-1.3.0.dist-info/licenses/LICENSE,sha256=bx5iLIKjgAdYQ7sISn7DsfHRKkoCUm1154sJJKhgqnU,35184
14
+ sysnet_pyutils-1.3.0.dist-info/METADATA,sha256=0k0neOAOpHp4zbpbo_LY7kHD7b2YEwI38jGL-LSmMMk,15835
15
+ sysnet_pyutils-1.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
+ sysnet_pyutils-1.3.0.dist-info/top_level.txt,sha256=ZKTltQWbLlWBXw4oovo1w7ui-JQ1WoyECqMSWdBj6XE,15
17
+ sysnet_pyutils-1.3.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5