sysnet-pyutils 1.0.8__py3-none-any.whl → 1.1.1__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.
@@ -3,8 +3,7 @@ from typing import Union, List, Any
3
3
 
4
4
  import pytz
5
5
 
6
- from utils import is_valid_email, TZ
7
-
6
+ from sysnet_pyutils.utils import is_valid_email, TZ
8
7
 
9
8
  def get_dict_value(data: dict, item_name: str) -> Union[Any, None]:
10
9
  """
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ File name:
6
+ Author: "SYSNET s.r.o."<rjaeger@sysnet.cz>
7
+ Created:
8
+ Version: 1.0.0
9
+ Description:
10
+ """
@@ -0,0 +1,262 @@
1
+ from datetime import datetime
2
+ from enum import Enum
3
+ from typing import Optional, List, Tuple, Any
4
+ from uuid import UUID
5
+
6
+ from pydantic import BaseModel, Field, EmailStr
7
+
8
+ from sysnet_pyutils.utils import local_now
9
+
10
+
11
+ class ApiError(Exception):
12
+ def __init__(self, code: int = 500, message: str = None):
13
+ self.code = code
14
+ self.message = message
15
+
16
+
17
+ class ErrorModel(BaseModel):
18
+ code: int
19
+ message: str
20
+
21
+
22
+ class UserType(BaseModel):
23
+ identifier: Optional[str] = Field(
24
+ default=None,
25
+ description='identifikátor uživatele (PID nebo UUID)',
26
+ examples=['ABC123456789'],
27
+ )
28
+ name: Optional[str] = Field(
29
+ default=None, description='Jméno uživatele', examples=['Jiří Novák']
30
+ )
31
+ dn: Optional[str] = Field(
32
+ default=None,
33
+ description='Příznačné jméno (distinguished name) LDAP',
34
+ examples=['cn=Jiří Novák, o=AOPK, c=CZ'],
35
+ )
36
+ email: Optional[EmailStr] = Field(default=None, description='Adresa elektronické pošty', examples=['jiri.novak@aopk.cz'])
37
+ phone: Optional[str] = Field(default=None, description='Telefonní číslo uživatele')
38
+ name_first: Optional[str] = Field(default=None, description='Křestní jméno uživatele', examples=['Jiří'])
39
+ name_last: Optional[str] = Field(default=None, description='Příjmení uživatele', examples=['Novák'])
40
+ name_full: Optional[str] = Field(default=None, description='Úplné jméno uživatele', examples=['MUDr. Jiří Novák, PhD.'])
41
+
42
+
43
+ class AclLevelEnum(Enum):
44
+ READ = 'R'
45
+ WRITE = 'W'
46
+ MANAGE = 'M'
47
+
48
+ @classmethod
49
+ def has_value(cls, value):
50
+ return value in cls._value2member_map_
51
+
52
+
53
+ class CodeValueType(BaseModel):
54
+ # kód/hodnota
55
+ code: Optional[str] = Field(default=None, description='Kód položky', examples=['CZ'])
56
+ value: Optional[str] = Field(default=None, description='Hodnota položky', examples=['Česká republika / Czech republic'])
57
+
58
+ def __eq__(self, other):
59
+ if not isinstance(other, CodeValueType):
60
+ return NotImplemented
61
+ return self.code == other.code and self.value == other.value
62
+
63
+ def load_data(self, data: Tuple[Any, Any]):
64
+ self.code = data[0]
65
+ self.value = data[1]
66
+ return self
67
+
68
+ class RegionalValueType(CodeValueType):
69
+ # kód/hodnota/rok/kraj
70
+ year: Optional[int] = Field(default=None, description='Rok platnotsi položky', examples=[2022])
71
+ region: Optional[str] = Field(default=None, description='Kraj platnosti položky', examples=['Středočeský kraj'])
72
+
73
+
74
+ class TimeLimitedType(CodeValueType):
75
+ # kód/hodnota
76
+ date_from: Optional[datetime] = Field(default=None, description='Platí od data')
77
+ date_to: Optional[datetime] = Field(default=None, description='Platí do data')
78
+
79
+
80
+ class LogItemType(BaseModel):
81
+ # položka logu
82
+ timestamp: datetime = Field(default=local_now(), description='Časová značka logu')
83
+ originator: Optional[str] = Field(default='SYSTEM', description='Zdroj logu', examples=['<NAME>'])
84
+ message: Optional[str] = Field(default=None, description='Zpráva logu', examples=['Autorizováno'])
85
+
86
+
87
+ class ContainerHistoryItemType(BaseModel):
88
+ # položka historie zařazení do kontejnerů
89
+ timestamp: datetime = Field(default=local_now(), description='Časová značka logu')
90
+ originator: Optional[str] = Field(default='SYSTEM', description='Zdroj logu', examples=['<NAME>'])
91
+ container: Optional[UUID] = Field(default=None, description='Identifikátor kontejneru')
92
+ message: Optional[str] = Field(default=None, description='Zpráva logu', examples=['Autorizováno'])
93
+
94
+
95
+ class AclType(BaseModel):
96
+ name: Optional[str] = Field(
97
+ default=None,
98
+ description='Uživatelské jméno nebo název role',
99
+ examples=['jan.novak@email.com'],
100
+ )
101
+ level: Optional[AclLevelEnum] = Field(
102
+ default=None, description='Úroveň přístupu (reader, writer, manager)'
103
+ )
104
+ can_delete: Optional[bool] = Field(
105
+ default=False, description='Oprávnění odstraňovat dokumenty'
106
+ )
107
+
108
+
109
+ class MetadataTypeEntry(BaseModel):
110
+ title: Optional[str] = Field(default=None, description='Název dokumentu')
111
+ id_no: Optional[str] = Field(default=None, description='Číslo dokumentu', examples=['23CZ123456'])
112
+ unid: Optional[str] = Field(default=None, description='Domino universal ID', examples=['3005277CB984B7FFC12587890060E2BF'])
113
+ pid: Optional[str] = Field(default=None, description='Unique identifier', examples=['MBOA7HNBDJTR'])
114
+ uuid: Optional[UUID] = Field(default=None, description='Unique identifier')
115
+ form: Optional[str] = Field(default=None, description='Formulář', examples=['certificate'])
116
+ authorized: Optional[bool] = Field(default=False, description='Dokument byl autorizován')
117
+ archived: Optional[bool] = Field(default=False, description='Dokument byl archivován')
118
+ deleted: Optional[bool] = Field(default=False, description='Dokument byl odstraněn')
119
+
120
+
121
+ class MetadataTypeBase(BaseModel):
122
+ title: Optional[str] = Field(default=None, description='Název dokumentu')
123
+ id_no: Optional[str] = Field(default=None, description='Číslo dokumentu', examples=['23CZ123456'])
124
+ id_no_local: Optional[str] = Field(default=None, description='Lokální číslo dokumentu', examples=['23CZ123456'])
125
+ id_no_list: Optional[List[str]] = Field(default=None, description='Seznam všech čísel dokumentu', examples=['23CZ123456'])
126
+ creator: Optional[str] = Field(
127
+ default=None,
128
+ description='Tvůrce dokumentu - Subjekt primárně odpovědný za vytvoření dokument.',
129
+ examples=['CN=Jan Novák/O=CITES/C=CZ'],
130
+ )
131
+ created_by_official: Optional[bool] = Field(default=False, description='Vytvořeno úředníkem')
132
+ contributor: Optional[UserType] = Field(default=None, description='Přispěvatel (podílí se na obsahu dokumentu)')
133
+ acl: Optional[List[AclType]] = Field(default=None, description='seznam přístupových práv')
134
+
135
+
136
+ class MetadataType(MetadataTypeBase):
137
+ date_created: Optional[datetime] = Field(
138
+ default=local_now(),
139
+ description='Datum a čas vytvoření dokumentu',
140
+ examples=['2023-04-20T05:12:03Z'],
141
+ )
142
+ date_modified: Optional[datetime] = Field(
143
+ default=local_now(),
144
+ description='Datum a čas poslední úpravy dokumentu',
145
+ examples=['2023-04-20T05:12:03Z'],
146
+ )
147
+ date_authorized: Optional[datetime] = Field(
148
+ default=None,
149
+ description='Datum a čas autorizace',
150
+ examples=['2023-04-20T05:12:03Z'],
151
+ )
152
+ date_archived: Optional[datetime] = Field(
153
+ default=None,
154
+ description='Datum a čas archivace',
155
+ examples=['2023-04-20T05:12:03Z'],
156
+ )
157
+ date_deleted: Optional[datetime] = Field(
158
+ default=None,
159
+ description='Datum a čas odstranění',
160
+ examples=['2023-04-20T05:12:03Z'],
161
+ )
162
+ unid: Optional[str] = Field(default=None, description='Domino universal ID', examples=['3005277CB984B7FFC12587890060E2BF'])
163
+ pid: Optional[str] = Field(default=None, description='Unique identifier', examples=['MBOA7HNBDJTR'])
164
+ uuid: Optional[UUID] = Field(default=None, description='Unique identifier')
165
+ form: Optional[str] = Field(default=None, description='Formulář', examples=['certificate'])
166
+ authorized: Optional[bool] = Field(default=False, description='Dokument byl autorizován')
167
+ archived: Optional[bool] = Field(default=False, description='Dokument byl archivován')
168
+ deleted: Optional[bool] = Field(default=False, description='Dokument byl odstraněn')
169
+ has_attachments: Optional[bool] = Field(default=False, description='Dokument má/nemá přílohy')
170
+ container: Optional[UUID] = Field(default=None, description='Identifikátor kontejneru, do kterého je dokument zařazen.')
171
+ container_history: Optional[List[ContainerHistoryItemType]] = Field(default=None, description='Historie kontejnerů')
172
+
173
+
174
+ class ListTypeBase(BaseModel):
175
+ start: Optional[int] = Field(default=None, description='Počáteční dokument na stránce', examples=[0])
176
+ page_size: Optional[int] = Field(default=None, description='Velikost stránky', examples=[10])
177
+ page: Optional[int] = Field(default=None, description='Požadovaná stránka', examples=[0])
178
+ count: Optional[int] = Field(default=None, description='celkový počet vrácených položek', examples=[25])
179
+
180
+
181
+ class LinkedType(BaseModel):
182
+ # Identifikace pevně provázaného dokumemtu (nadřízený nebo jinak provázaný)
183
+ title: Optional[str] = Field(default=None, description='Název provázaného dokumentu', examples=['Žádost o vydání permitu'])
184
+ code: Optional[str] = Field(default=None, description='Kód vazby', examples=['CRŽP', 'CITS', 'IPPC'])
185
+ id: Optional[str] = Field(default=None, description='Hlavní identifikátor', examples=['0c282c62-1918-4fbe-ad2c-e49a021f4801'])
186
+ unid: Optional[str] = Field(default=None, description='Domino universal ID', examples=['3005277CB984B7FFC12587890060E2BF'])
187
+ pid: Optional[str] = Field(default=None, description='PID (dvanáctimístný identifikátor', examples=['MBOA7HNBDJTR'])
188
+ uuid: Optional[UUID] = Field(default=None, description='Jednoznačný identifikátor', examples=['0c282c62-1918-4fbe-ad2c-e49a021f4801'])
189
+
190
+
191
+ class GeoPointJtskType(BaseModel):
192
+ x: Optional[float] = Field(default=None, description='JTSK - X', examples=[-1182833.13])
193
+ y: Optional[float] = Field(default=None, description='JTSK - Y', examples=[-784886.70])
194
+
195
+
196
+ class GeoPointType(BaseModel):
197
+ lat: Optional[float] = Field(default=None, description='WGS84 - latitude', examples=[-4.3202115])
198
+ lon: Optional[float] = Field(default=None, description='WGS84 - longitude', examples=[55.7520211])
199
+
200
+
201
+ class MapSheet50Type(BaseModel):
202
+ # objekt mapový list 1:50000
203
+ id: Optional[str] = Field(default=None, description='Identifikátor mapového listu', examples=['03-44'])
204
+ name: Optional[str] = Field(default=None, description='Název mapového listu', examples=['Dvůr Králové'])
205
+
206
+
207
+ class BasinType(BaseModel):
208
+ # objekt povodí
209
+ id: Optional[int] = Field(default=None, description='Identifikátor', examples=[4236])
210
+ id_1: Optional[int] = Field(default=None, description='Identifikátor', examples=[1])
211
+ id_2: Optional[int] = Field(default=None, description='Identifikátor', examples=[11])
212
+ id_3: Optional[int] = Field(default=None, description='Identifikátor', examples=[49])
213
+ chp: Optional[str] = Field(default=None, description='', examples=['1-11-04-0300-0-00'])
214
+ chp_d: Optional[str] = Field(default=None, description='', examples=['1-11-04-0300-0-00'])
215
+ chp_u: Optional[str] = Field(default=None, description='', examples=['1-11-04-0300-0-00'])
216
+ basin_name_1: Optional[str] = Field(default=None, description='naz_pov_1', examples=['povodí Labe'])
217
+ basin_name_2: Optional[str] = Field(default=None, description='naz_pov_2', examples=['Berounka od Úslavy po ústí'])
218
+ basin_name_3: Optional[str] = Field(default=None, description='naz_pov_3', examples=['Litavka a Berounka od Litavky po Loděnici'])
219
+ stream_name: Optional[str] = Field(default=None, description='naz_tok', examples=['Červený potok'])
220
+ stream_name_2: Optional[str] = Field(default=None, description='naz_tok_2', examples=[''])
221
+
222
+
223
+ class LocationType(BaseModel):
224
+ # Lokalita
225
+ ruian_adm: Optional[int] = Field(default=None, description='Kód adresního místa RUIAN', examples=[21844895])
226
+ ruian_adm_name: Optional[str] = Field(default=None, description='Název adresního místa RUIAN', examples=['Kaplanova 1931/1, 14800 Praha 11'])
227
+ basin: Optional[BasinType] = Field(default=None, description='Povodí')
228
+ sheet50: Optional[MapSheet50Type] = Field(default=None, description='Mapový list')
229
+ street: Optional[str] = Field(default=None, description='Ulice nebo část obce a číslo popisné, evidenční, orientační', examples=['Kolmá 53/1230'])
230
+ city: Optional[str] = Field(default=None, description='Název obce', examples=['Slepičí Lhota'])
231
+ zip: Optional[str] = Field(default=None, description='PSČ', examples=['987 22'])
232
+ region: Optional[str] = Field(default=None, description='Kraj', examples=['Středočeský kraj'])
233
+ country: Optional[CodeValueType] = Field(default=None, description='Stát', examples=[{'code': 'SK', 'value': 'Slovensko'}])
234
+ address_list: Optional[list[str]] = Field(default=None, description='Seznam adresních položek', examples=['Kolmá 53/1230', 'Slepičí Lhota', '987 22', 'CZ'])
235
+ note: Optional[str] = Field(default=None, description='Poznámka', examples=['Parcela číslo 113/7'])
236
+ wgs: Optional[GeoPointType] = Field(default=None, description='WGS84')
237
+ jtsk: Optional[GeoPointJtskType] = Field(default=None, description='JTSK')
238
+
239
+
240
+ class PersonBaseType(BaseModel):
241
+ # Osoba z Registru osob
242
+ unid: Optional[str] = Field(default=None, description='Domino universal ID', examples=['3005277CB984B7FFC12587890060E2BF'])
243
+ pid: Optional[str] = Field(default=None, description='Unique identifier', examples=['MBOA7HNBDJTR'])
244
+ uuid: Optional[UUID] = Field(default=None, description='Unique identifier')
245
+ ico: Optional[str] = Field(default=None, description='IČO osoby')
246
+ name: Optional[str] = Field(default=None, description='Název osoby', examples=['B.A.R. Reptofilia'])
247
+ email: Optional[EmailStr] = Field(default=None, description='Email osoby')
248
+ address: Optional[str] = Field(default=None, description='Adresa osoby', examples=['Ulice Závodu Míru 2\n87423 Otrokovice'])
249
+ country: Optional[CodeValueType] = Field(default=None, description='Země adresy osoby')
250
+ main_person: Optional[LinkedType] = Field(default=None, description='Odkaz na hlavní osobu do registru')
251
+ linked_persons: Optional[list[LinkedType]] = Field(default=None, description='Odkaz na další osoby do registru')
252
+
253
+
254
+ class WorkflowType(BaseModel):
255
+ # Položka životního cyklu
256
+ node_code: Optional[str] = Field(default=None, description='Kód schvalovacího uzlu (APPROVE, AUTHORIZE, REJECT, ...)', examples=['APPROVE', 'AUTHORIZE', 'REJECT'])
257
+ node_name: Optional[str] = Field(default=None, description='Název schvalovacího uzlu (schválení, autorizace, ...)', examples=['Schválení'])
258
+ responsible: Optional[PersonBaseType] = Field(default=None, description='Odpovědná osoba')
259
+ date_execution: Optional[datetime] = Field(default=local_now(), description='Datum provedení')
260
+ executor: Optional[UserType] = Field(default='SYSTEM', description='Uživatel, který provedl událost')
261
+ status_from: Optional[str] = Field(default=None, description='Předchozí stav')
262
+ status_to: Optional[str] = Field(default=None, description='Následný stav')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sysnet-pyutils
3
- Version: 1.0.8
3
+ Version: 1.1.1
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
@@ -21,6 +21,7 @@ Requires-Dist: xmltodict>=0.13.0
21
21
  Requires-Dist: boto3>=1.34.34
22
22
  Requires-Dist: botocore>=1.34.34
23
23
  Requires-Dist: pymongo>=4.7.2
24
+ Requires-Dist: pydantic>=2.10.6
24
25
 
25
26
  # sysnet-pyutils
26
27
 
@@ -322,6 +323,15 @@ Vhodné pro MongoDB pro ukládání položek typu datum.
322
323
  Kontrola validity emailové adresy
323
324
  * param email: hodnota
324
325
  * return: True/False
326
+ --------------------------------------------------------------------------------------------------------------------------------
327
+
328
+ ### verze 1.1.0
329
+
330
+ * #### Přidán obecný datový slovník SYSNET do balíku models.general
331
+
332
+ Datový slovník je vytvořen pomocí pydantic a je plně kompatibilní s FastAPI.
333
+ Obsahuje základní datové typy, které se používají ve všech aplikacích SYSNET.
334
+
325
335
 
326
336
 
327
337
  ## Systémové proměnné
@@ -1,6 +1,6 @@
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=isIlaEKIGK2_7my06oTAcvxCwTMCXy0g83HPbAl-V_Y,9660
3
+ sysnet_pyutils/data_utils.py,sha256=foePXYsPJyl7zdzb4RENO937uNV5G05GdW_En6ql4kw,9673
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=GyNPF_LNqssMtMzuegpL1GK-0B-ysDiH18kYAdiE2hg,2807
@@ -8,8 +8,10 @@ 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
10
  sysnet_pyutils/utils.py,sha256=Y95MyEuZlSlTVsQ2rOArdkTN7xqcGsCA7RA6VoBHSSk,23257
11
- sysnet_pyutils-1.0.8.dist-info/LICENSE,sha256=bx5iLIKjgAdYQ7sISn7DsfHRKkoCUm1154sJJKhgqnU,35184
12
- sysnet_pyutils-1.0.8.dist-info/METADATA,sha256=B3ShZ6xRs2VbdtYtehJplL6DLielN95s8t20N1jYnXw,14307
13
- sysnet_pyutils-1.0.8.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
14
- sysnet_pyutils-1.0.8.dist-info/top_level.txt,sha256=ZKTltQWbLlWBXw4oovo1w7ui-JQ1WoyECqMSWdBj6XE,15
15
- sysnet_pyutils-1.0.8.dist-info/RECORD,,
11
+ sysnet_pyutils/models/__init__.py,sha256=oozOr_DKhenkM9BDaPOmtbLXhP5vtMUCjBPEjZDW4GQ,167
12
+ sysnet_pyutils/models/general.py,sha256=jqvPoKa6jKXfPLubNSSJZpSpIUG5Sw8A_zwDRlEp8VQ,14706
13
+ sysnet_pyutils-1.1.1.dist-info/LICENSE,sha256=bx5iLIKjgAdYQ7sISn7DsfHRKkoCUm1154sJJKhgqnU,35184
14
+ sysnet_pyutils-1.1.1.dist-info/METADATA,sha256=lj6VZ1NHlDcVLQSoOBr11_XSOVULaF3DTA4IotTnHeY,14744
15
+ sysnet_pyutils-1.1.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
16
+ sysnet_pyutils-1.1.1.dist-info/top_level.txt,sha256=ZKTltQWbLlWBXw4oovo1w7ui-JQ1WoyECqMSWdBj6XE,15
17
+ sysnet_pyutils-1.1.1.dist-info/RECORD,,