simpleworkernet 0.0.1b1__tar.gz
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.
- simpleworkernet-0.0.1b1/PKG-INFO +42 -0
- simpleworkernet-0.0.1b1/README.md +29 -0
- simpleworkernet-0.0.1b1/pyproject.toml +25 -0
- simpleworkernet-0.0.1b1/setup.cfg +4 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Additional_data.py +233 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Address.py +581 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Advertising.py +43 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Attach.py +72 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Billing.py +29 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Cable_route.py +94 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Call.py +77 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Commutation.py +71 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Cross.py +51 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Customer.py +577 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Cwdm.py +31 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Device.py +367 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/Employee.py +319 -0
- simpleworkernet-0.0.1b1/simpleworkernet/Categories/__init__.py +15 -0
- simpleworkernet-0.0.1b1/simpleworkernet/__init__.py +3 -0
- simpleworkernet-0.0.1b1/simpleworkernet/apiclient.py +127 -0
- simpleworkernet-0.0.1b1/simpleworkernet/common.py +1338 -0
- simpleworkernet-0.0.1b1/simpleworkernet.egg-info/PKG-INFO +42 -0
- simpleworkernet-0.0.1b1/simpleworkernet.egg-info/SOURCES.txt +23 -0
- simpleworkernet-0.0.1b1/simpleworkernet.egg-info/dependency_links.txt +1 -0
- simpleworkernet-0.0.1b1/simpleworkernet.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: simpleworkernet
|
|
3
|
+
Version: 0.0.1b1
|
|
4
|
+
Summary: SDK-компонент для трансформации и типизации API-ответов сервера WorkerNet
|
|
5
|
+
Author-email: BusyBeaver <busybeaver.bb@gmail.com>
|
|
6
|
+
Classifier: Programming Language :: Python :: 3
|
|
7
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
8
|
+
Classifier: Operating System :: OS Independent
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
11
|
+
Requires-Python: >=3.10
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
|
|
14
|
+
## simleworkernet
|
|
15
|
+
Высокопроизводительный Python клиент для REST API системы WorkerNet с интеллектуальной системой трансформации и типизации сложных JSON структур.
|
|
16
|
+
|
|
17
|
+
## 🌟 Особенности
|
|
18
|
+
|
|
19
|
+
### 🚀 SmartData Framework
|
|
20
|
+
SmartData — это специализированный SDK-компонент для обработки API-ответов сервера WorkerNet. Он превращает сырые, динамически типизированные JSON-данные сервера в строго типизированные объекты Python с поддержкой глубокого поиска и автоматической трансформации коллекций.
|
|
21
|
+
|
|
22
|
+
- Автоматическое приведение типов согласно аннотациям Python
|
|
23
|
+
- Сохранение метаданных о пути извлечения данных
|
|
24
|
+
- Глубокий поиск по любым уровням вложенности
|
|
25
|
+
- Fluent-интерфейс для фильтрации, сортировки и агрегации
|
|
26
|
+
- Поддержка экспорта/импорта (JSON, Pickle, Gzip)
|
|
27
|
+
|
|
28
|
+
### 🔧 BaseModel Engine
|
|
29
|
+
**BaseModel** - мощная система рекурсивного кастинга типов:
|
|
30
|
+
- Автоматическое преобразование данных в типизированные объекты
|
|
31
|
+
- Поддержка Union, Optional, List, вложенных моделей
|
|
32
|
+
- Постобработка и схлопывание избыточных структур
|
|
33
|
+
- Сериализация/десериализация с сохранением типов
|
|
34
|
+
|
|
35
|
+
## 📦 Установка
|
|
36
|
+
```bash
|
|
37
|
+
pip install simpleworkernet
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Автор
|
|
42
|
+
- [Андрей Литвинов](https://t.me/busy4beaver)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
## simleworkernet
|
|
2
|
+
Высокопроизводительный Python клиент для REST API системы WorkerNet с интеллектуальной системой трансформации и типизации сложных JSON структур.
|
|
3
|
+
|
|
4
|
+
## 🌟 Особенности
|
|
5
|
+
|
|
6
|
+
### 🚀 SmartData Framework
|
|
7
|
+
SmartData — это специализированный SDK-компонент для обработки API-ответов сервера WorkerNet. Он превращает сырые, динамически типизированные JSON-данные сервера в строго типизированные объекты Python с поддержкой глубокого поиска и автоматической трансформации коллекций.
|
|
8
|
+
|
|
9
|
+
- Автоматическое приведение типов согласно аннотациям Python
|
|
10
|
+
- Сохранение метаданных о пути извлечения данных
|
|
11
|
+
- Глубокий поиск по любым уровням вложенности
|
|
12
|
+
- Fluent-интерфейс для фильтрации, сортировки и агрегации
|
|
13
|
+
- Поддержка экспорта/импорта (JSON, Pickle, Gzip)
|
|
14
|
+
|
|
15
|
+
### 🔧 BaseModel Engine
|
|
16
|
+
**BaseModel** - мощная система рекурсивного кастинга типов:
|
|
17
|
+
- Автоматическое преобразование данных в типизированные объекты
|
|
18
|
+
- Поддержка Union, Optional, List, вложенных моделей
|
|
19
|
+
- Постобработка и схлопывание избыточных структур
|
|
20
|
+
- Сериализация/десериализация с сохранением типов
|
|
21
|
+
|
|
22
|
+
## 📦 Установка
|
|
23
|
+
```bash
|
|
24
|
+
pip install simpleworkernet
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Автор
|
|
29
|
+
- [Андрей Литвинов](https://t.me/busy4beaver)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "simpleworkernet"
|
|
7
|
+
version = "0.0.1b1"
|
|
8
|
+
authors = [
|
|
9
|
+
{ name="BusyBeaver", email="busybeaver.bb@gmail.com" },
|
|
10
|
+
]
|
|
11
|
+
description = "SDK-компонент для трансформации и типизации API-ответов сервера WorkerNet"
|
|
12
|
+
readme = "README.md"
|
|
13
|
+
requires-python = ">=3.10"
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"License :: OSI Approved :: MIT License",
|
|
17
|
+
"Operating System :: OS Independent",
|
|
18
|
+
"Intended Audience :: Developers",
|
|
19
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
20
|
+
]
|
|
21
|
+
dependencies = []
|
|
22
|
+
|
|
23
|
+
#[tool.setuptools.packages.find]
|
|
24
|
+
#where = ["."]
|
|
25
|
+
#include = ["smartdata*"]
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from enum import IntEnum
|
|
3
|
+
from typing import List, Dict, Any, Literal
|
|
4
|
+
from ..common import BaseCategory, BaseModel, vStr, vFlag, ApiRetId, ApiRetResult, ApiRetSData, api_method, smart_model
|
|
5
|
+
|
|
6
|
+
class Additional_data(BaseCategory):
|
|
7
|
+
"""Действие с дополнительными полями/данными"""
|
|
8
|
+
|
|
9
|
+
class In_cat_id(IntEnum):
|
|
10
|
+
"""Дополнительные поля имеют категории (cat_id)"""
|
|
11
|
+
cable_lines=2
|
|
12
|
+
'''Кабельные линии'''
|
|
13
|
+
radio=6
|
|
14
|
+
'''Радиооборудование'''
|
|
15
|
+
buildings=7
|
|
16
|
+
'''Здания'''
|
|
17
|
+
switch=8
|
|
18
|
+
'''Коммутаторы'''
|
|
19
|
+
mediaconverters=9
|
|
20
|
+
'''Медиаконвертеры'''
|
|
21
|
+
system_devices=10
|
|
22
|
+
'''Системные устройства'''
|
|
23
|
+
tariffs=12
|
|
24
|
+
'''Тарифы (только для ручных биллингов)'''
|
|
25
|
+
additional_services=13
|
|
26
|
+
'''Дополнительные услуги (только для ручных биллингов)'''
|
|
27
|
+
nodes=14
|
|
28
|
+
'''Сооружения связи'''
|
|
29
|
+
odf=15
|
|
30
|
+
'''Кроссы/ODF'''
|
|
31
|
+
vlan=16
|
|
32
|
+
'''VLAN'''
|
|
33
|
+
tasks=17
|
|
34
|
+
'''Задания'''
|
|
35
|
+
auto=18
|
|
36
|
+
'''Автотранспорт'''
|
|
37
|
+
advertising_camps=19
|
|
38
|
+
'''Рекламные кампании'''
|
|
39
|
+
custom_devices=20
|
|
40
|
+
'''Произвольные устройства'''
|
|
41
|
+
traders=21
|
|
42
|
+
'''Поставщики'''
|
|
43
|
+
splitters=23
|
|
44
|
+
'''Делители/Уплотнители'''
|
|
45
|
+
owners=24
|
|
46
|
+
'''Собственники'''
|
|
47
|
+
inventory=25
|
|
48
|
+
'''ТМЦ'''
|
|
49
|
+
cable_channels=26
|
|
50
|
+
'''Кабельные каналы'''
|
|
51
|
+
cable_traces=27
|
|
52
|
+
'''Кабельные трассы (кабельных линий)'''
|
|
53
|
+
customers=28
|
|
54
|
+
'''Абоненты'''
|
|
55
|
+
keys=29
|
|
56
|
+
'''Ключи'''
|
|
57
|
+
name_inventory=30
|
|
58
|
+
'''Наименования ТМЦ'''
|
|
59
|
+
addresses=40
|
|
60
|
+
'''Адресные единицы'''
|
|
61
|
+
storages=48
|
|
62
|
+
'''Склады'''
|
|
63
|
+
map_objects=102
|
|
64
|
+
'''Объекты на карте'''
|
|
65
|
+
employee=999
|
|
66
|
+
'''Сотрудники'''
|
|
67
|
+
|
|
68
|
+
class In_type_id(IntEnum):
|
|
69
|
+
"""
|
|
70
|
+
Дополнительные поля имеют тип поля (type)
|
|
71
|
+
"""
|
|
72
|
+
text=1
|
|
73
|
+
'''Текст'''
|
|
74
|
+
number=2
|
|
75
|
+
'''Число'''
|
|
76
|
+
flag=3
|
|
77
|
+
'''Флаг'''
|
|
78
|
+
list_once=4
|
|
79
|
+
'''Выбор из списка'''
|
|
80
|
+
text_area=5
|
|
81
|
+
'''Текстовое поле'''
|
|
82
|
+
list_custom_once=6
|
|
83
|
+
'''Выбор из списка (в т.ч. свой вариант)'''
|
|
84
|
+
date=7
|
|
85
|
+
'''Дата'''
|
|
86
|
+
list_custom_multiply=8
|
|
87
|
+
'''Выбор из списка (несколько значений)'''
|
|
88
|
+
|
|
89
|
+
@smart_model
|
|
90
|
+
class Get_list(BaseModel):
|
|
91
|
+
id: int
|
|
92
|
+
name: vStr
|
|
93
|
+
position: int
|
|
94
|
+
type: vStr
|
|
95
|
+
is_required: int
|
|
96
|
+
available_value: Any = None
|
|
97
|
+
|
|
98
|
+
@api_method(Get_list)
|
|
99
|
+
def get_list(self, *, section: In_cat_id | Literal['house','node','task','switch','inventory']) -> ApiRetSData[Get_list]:
|
|
100
|
+
"""Получение списка полей
|
|
101
|
+
|
|
102
|
+
Обязательные параметры:
|
|
103
|
+
section - категория дополнительных полей [house|node|task|switch|inventory|...значения из In_cat_id...]
|
|
104
|
+
"""
|
|
105
|
+
...
|
|
106
|
+
|
|
107
|
+
@api_method(int)
|
|
108
|
+
def add_field(self, *, cat_id: In_cat_id, name: str, type: In_type_id = None, size: int = None, max_size: int = None, is_active: vFlag = None, position: int = None, is_require: vFlag = None) -> ApiRetId:
|
|
109
|
+
"""Добавление дополнительного поля
|
|
110
|
+
|
|
111
|
+
Обязательные параметры:
|
|
112
|
+
cat_id - категория дополнительных полей
|
|
113
|
+
name - наименование
|
|
114
|
+
|
|
115
|
+
Необязательные параметры:
|
|
116
|
+
type - тип поля
|
|
117
|
+
size - размер поля
|
|
118
|
+
max_size - максимальный размер поля
|
|
119
|
+
is_active - флаг - поле включено
|
|
120
|
+
position - позиция поля среди остальных
|
|
121
|
+
is_require - флаг - обязательное к заполнению
|
|
122
|
+
"""
|
|
123
|
+
...
|
|
124
|
+
|
|
125
|
+
@api_method(bool)
|
|
126
|
+
def edit_field(self, *, cat_id: In_cat_id, id: int, type: In_type_id = None, size: int = None, max_size: int = None, is_active: vFlag = None, position: int = None, is_require: vFlag = None, value_list: Any | List = None) -> ApiRetResult:
|
|
127
|
+
"""Редактирование дополнительного поля
|
|
128
|
+
|
|
129
|
+
Обязательные параметры:
|
|
130
|
+
cat_id - категория
|
|
131
|
+
id - id поля
|
|
132
|
+
|
|
133
|
+
Необязательные параметры:
|
|
134
|
+
type - тип поля
|
|
135
|
+
size - размер поля
|
|
136
|
+
max_size - максимальный размер поля
|
|
137
|
+
is_active - флаг - поле включено
|
|
138
|
+
position - позиция поля среди остальных
|
|
139
|
+
is_require - флаг - обязательное к заполнению
|
|
140
|
+
value_list - возможные значения для типа поля "Выбор из списка" (разделитель - вертикальная черта "|")
|
|
141
|
+
"""
|
|
142
|
+
params = locals()
|
|
143
|
+
params.pop('self',None)
|
|
144
|
+
if isinstance(value_list,list):
|
|
145
|
+
params['value_list'] = "|".join(str(x) for x in value_list)
|
|
146
|
+
return params
|
|
147
|
+
|
|
148
|
+
@api_method(bool)
|
|
149
|
+
def delete_field(self, *, cat_id: In_cat_id, id: int) -> ApiRetResult:
|
|
150
|
+
"""Удаление дополнительного поля (удаляется только если нет записей с этим доп.полем)
|
|
151
|
+
|
|
152
|
+
Обязательные параметры:
|
|
153
|
+
cat_id - категория
|
|
154
|
+
id - id поля
|
|
155
|
+
"""
|
|
156
|
+
...
|
|
157
|
+
|
|
158
|
+
@smart_model
|
|
159
|
+
class Get_value(BaseModel):
|
|
160
|
+
field_id: int
|
|
161
|
+
object_id: int
|
|
162
|
+
value: vStr
|
|
163
|
+
|
|
164
|
+
@api_method(Get_value)
|
|
165
|
+
def get_value(self, *, field_id: int, cat_id: In_cat_id = None, object_id: int = None, value: str = None) -> ApiRetSData[Get_value]:
|
|
166
|
+
"""Получение значений полей
|
|
167
|
+
|
|
168
|
+
Обязательные параметры:
|
|
169
|
+
field_id - id поля
|
|
170
|
+
|
|
171
|
+
Необязательные параметры:
|
|
172
|
+
cat_id - категория
|
|
173
|
+
object_id - id объекта (по которому значение поля)
|
|
174
|
+
value - значение поля
|
|
175
|
+
"""
|
|
176
|
+
...
|
|
177
|
+
|
|
178
|
+
@api_method(bool)
|
|
179
|
+
def change_value(self, *, cat_id: In_cat_id, field_id: int, object_id: int, value: Any) -> ApiRetResult:
|
|
180
|
+
"""Изменение значения доп.поля
|
|
181
|
+
|
|
182
|
+
В случае отсутствия такого доп.поля у объекта - оно будет создано.
|
|
183
|
+
|
|
184
|
+
Обязательные параметры:
|
|
185
|
+
cat_id - категория
|
|
186
|
+
field_id - id дополнительного поля
|
|
187
|
+
object_id - id объекта
|
|
188
|
+
value - значение
|
|
189
|
+
"""
|
|
190
|
+
...
|
|
191
|
+
|
|
192
|
+
@dataclass
|
|
193
|
+
class In_change_value_mass:
|
|
194
|
+
object_id: int
|
|
195
|
+
value: vStr
|
|
196
|
+
|
|
197
|
+
@api_method(bool)
|
|
198
|
+
def change_value_mass(self, *, cat_id: In_cat_id, field_id: int, data: List[In_change_value_mass] | Dict) -> ApiRetResult:
|
|
199
|
+
"""Массовое изменение значения доп.поля для множества объектов
|
|
200
|
+
|
|
201
|
+
В случае отсутствия такого доп.поля у объекта - оно будет создано.
|
|
202
|
+
|
|
203
|
+
Обязательные параметры:
|
|
204
|
+
cat_id - категория (см.выше справочник)
|
|
205
|
+
field_id - id дополнительного поля
|
|
206
|
+
data[] - id объекта|значение
|
|
207
|
+
data[] - id объекта|значение
|
|
208
|
+
data[] - id объекта|значение
|
|
209
|
+
...
|
|
210
|
+
|
|
211
|
+
Пример параметра data:
|
|
212
|
+
data = {
|
|
213
|
+
'data[333]':'значение для объекта с id=333',
|
|
214
|
+
'data[123]':'значение для объекта с id=123',
|
|
215
|
+
...
|
|
216
|
+
}
|
|
217
|
+
или
|
|
218
|
+
data = [
|
|
219
|
+
Additional_data.In_change_value_mass(object_id=333,value='значение для объекта с id=333'),
|
|
220
|
+
Additional_data.In_change_value_mass(object_id=123,value='значение для объекта с id=123'),
|
|
221
|
+
...
|
|
222
|
+
]
|
|
223
|
+
"""
|
|
224
|
+
v_data:dict = {}
|
|
225
|
+
if isinstance(data,list):
|
|
226
|
+
for v in data: v_data[f"data[{v.object_id}]"]=v.value
|
|
227
|
+
elif isinstance(data,dict):
|
|
228
|
+
for k,v in data.items():
|
|
229
|
+
try: v_data[f"data[{int(k)}]"]=v
|
|
230
|
+
except: v_data[k]=v
|
|
231
|
+
elif isinstance(data,str):
|
|
232
|
+
v_data = {data}
|
|
233
|
+
return {'cat_id':cat_id,'field_id':field_id} | v_data
|