sysnet-pyutils 1.0.8__py3-none-any.whl → 1.1.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.
- sysnet_pyutils/models/__init__.py +10 -0
- sysnet_pyutils/models/general.py +262 -0
- {sysnet_pyutils-1.0.8.dist-info → sysnet_pyutils-1.1.0.dist-info}/METADATA +11 -1
- {sysnet_pyutils-1.0.8.dist-info → sysnet_pyutils-1.1.0.dist-info}/RECORD +7 -5
- {sysnet_pyutils-1.0.8.dist-info → sysnet_pyutils-1.1.0.dist-info}/LICENSE +0 -0
- {sysnet_pyutils-1.0.8.dist-info → sysnet_pyutils-1.1.0.dist-info}/WHEEL +0 -0
- {sysnet_pyutils-1.0.8.dist-info → sysnet_pyutils-1.1.0.dist-info}/top_level.txt +0 -0
@@ -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
|
3
|
+
Version: 1.1.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
|
@@ -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é
|
@@ -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
|
12
|
-
sysnet_pyutils
|
13
|
-
sysnet_pyutils-1.0.
|
14
|
-
sysnet_pyutils-1.0.
|
15
|
-
sysnet_pyutils-1.0.
|
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.0.dist-info/LICENSE,sha256=bx5iLIKjgAdYQ7sISn7DsfHRKkoCUm1154sJJKhgqnU,35184
|
14
|
+
sysnet_pyutils-1.1.0.dist-info/METADATA,sha256=0JaJMhUht0BhXw9nadGcc8-GNwTT7wO3aXzLFhLDqFg,14744
|
15
|
+
sysnet_pyutils-1.1.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
16
|
+
sysnet_pyutils-1.1.0.dist-info/top_level.txt,sha256=ZKTltQWbLlWBXw4oovo1w7ui-JQ1WoyECqMSWdBj6XE,15
|
17
|
+
sysnet_pyutils-1.1.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|