sgnl-api 0.0.3__tar.gz → 0.2.0__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.
Files changed (67) hide show
  1. sgnl_api-0.2.0/.gitignore +164 -0
  2. sgnl_api-0.2.0/PKG-INFO +237 -0
  3. sgnl_api-0.2.0/README.md +220 -0
  4. sgnl_api-0.2.0/example.py +26 -0
  5. sgnl_api-0.2.0/img/logo.svg +4 -0
  6. sgnl_api-0.2.0/pyproject.toml +38 -0
  7. sgnl_api-0.2.0/sgnl_api/__init__.py +23 -0
  8. sgnl_api-0.2.0/sgnl_api/docs_api.py +152 -0
  9. sgnl_api-0.2.0/sgnl_api/exceptions.py +38 -0
  10. sgnl_api-0.2.0/sgnl_api/resources/__init__.py +81 -0
  11. sgnl_api-0.2.0/sgnl_api/resources/acceptance_certificate.py +18 -0
  12. sgnl_api-0.2.0/sgnl_api/resources/application_user.py +31 -0
  13. sgnl_api-0.2.0/sgnl_api/resources/attribute.py +14 -0
  14. sgnl_api-0.2.0/sgnl_api/resources/attribute_type.py +14 -0
  15. sgnl_api-0.2.0/sgnl_api/resources/attribute_value.py +38 -0
  16. sgnl_api-0.2.0/sgnl_api/resources/cades_signature.py +29 -0
  17. sgnl_api-0.2.0/sgnl_api/resources/card_public_link.py +17 -0
  18. sgnl_api-0.2.0/sgnl_api/resources/company.py +38 -0
  19. sgnl_api-0.2.0/sgnl_api/resources/company_user.py +29 -0
  20. sgnl_api-0.2.0/sgnl_api/resources/company_user_custom_role.py +20 -0
  21. sgnl_api-0.2.0/sgnl_api/resources/documents_transfer.py +45 -0
  22. sgnl_api-0.2.0/sgnl_api/resources/documents_transfer_item.py +37 -0
  23. sgnl_api-0.2.0/sgnl_api/resources/documents_transfer_type.py +14 -0
  24. sgnl_api-0.2.0/sgnl_api/resources/embedded_signature.py +31 -0
  25. sgnl_api-0.2.0/sgnl_api/resources/file.py +75 -0
  26. sgnl_api-0.2.0/sgnl_api/resources/folder.py +99 -0
  27. sgnl_api-0.2.0/sgnl_api/resources/folder_items_naming_pattern.py +17 -0
  28. sgnl_api-0.2.0/sgnl_api/resources/forge.py +29 -0
  29. sgnl_api-0.2.0/sgnl_api/resources/issue.py +55 -0
  30. sgnl_api-0.2.0/sgnl_api/resources/issue_accesses.py +14 -0
  31. sgnl_api-0.2.0/sgnl_api/resources/issue_attachment.py +26 -0
  32. sgnl_api-0.2.0/sgnl_api/resources/issue_comment.py +37 -0
  33. sgnl_api-0.2.0/sgnl_api/resources/issue_events.py +25 -0
  34. sgnl_api-0.2.0/sgnl_api/resources/issue_project_settings.py +17 -0
  35. sgnl_api-0.2.0/sgnl_api/resources/issue_type.py +14 -0
  36. sgnl_api-0.2.0/sgnl_api/resources/item.py +207 -0
  37. sgnl_api-0.2.0/sgnl_api/resources/mchd.py +33 -0
  38. sgnl_api-0.2.0/sgnl_api/resources/permissions.py +28 -0
  39. sgnl_api-0.2.0/sgnl_api/resources/project.py +134 -0
  40. sgnl_api-0.2.0/sgnl_api/resources/project_user.py +26 -0
  41. sgnl_api-0.2.0/sgnl_api/resources/project_user_custom_role.py +20 -0
  42. sgnl_api-0.2.0/sgnl_api/resources/review.py +68 -0
  43. sgnl_api-0.2.0/sgnl_api/resources/review_group.py +16 -0
  44. sgnl_api-0.2.0/sgnl_api/resources/review_item.py +20 -0
  45. sgnl_api-0.2.0/sgnl_api/resources/share.py +65 -0
  46. sgnl_api-0.2.0/sgnl_api/resources/storage.py +16 -0
  47. sgnl_api-0.2.0/sgnl_api/resources/tangl.py +19 -0
  48. sgnl_api-0.2.0/sgnl_api/resources/user_log.py +14 -0
  49. sgnl_api-0.2.0/sgnl_api/resources/version.py +90 -0
  50. {sgnl_api-0.0.3 → sgnl_api-0.2.0}/sgnl_api/scopes.py +0 -1
  51. sgnl_api-0.2.0/sgnl_api/transport.py +129 -0
  52. sgnl_api-0.2.0/uv.lock +175 -0
  53. sgnl_api-0.0.3/PKG-INFO +0 -83
  54. sgnl_api-0.0.3/README.md +0 -64
  55. sgnl_api-0.0.3/setup.cfg +0 -4
  56. sgnl_api-0.0.3/setup.py +0 -28
  57. sgnl_api-0.0.3/sgnl_api/__init__.py +0 -1
  58. sgnl_api-0.0.3/sgnl_api/docs_api.py +0 -657
  59. sgnl_api-0.0.3/sgnl_api.egg-info/PKG-INFO +0 -83
  60. sgnl_api-0.0.3/sgnl_api.egg-info/SOURCES.txt +0 -14
  61. sgnl_api-0.0.3/sgnl_api.egg-info/dependency_links.txt +0 -1
  62. sgnl_api-0.0.3/sgnl_api.egg-info/requires.txt +0 -2
  63. sgnl_api-0.0.3/sgnl_api.egg-info/top_level.txt +0 -1
  64. {sgnl_api-0.0.3 → sgnl_api-0.2.0}/LICENSE +0 -0
  65. {sgnl_api-0.0.3 → sgnl_api-0.2.0}/sgnl_api/decorators.py +0 -0
  66. {sgnl_api-0.0.3 → sgnl_api-0.2.0}/sgnl_api/file.py +0 -0
  67. {sgnl_api-0.0.3 → sgnl_api-0.2.0}/sgnl_api/utils.py +0 -0
@@ -0,0 +1,164 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ .pypirc
6
+
7
+ # C extensions
8
+ *.so
9
+
10
+ # Distribution / packaging
11
+ .Python
12
+ build/
13
+ develop-eggs/
14
+ dist/
15
+ downloads/
16
+ eggs/
17
+ .eggs/
18
+ lib/
19
+ lib64/
20
+ parts/
21
+ sdist/
22
+ var/
23
+ wheels/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+ *.xlsx
30
+
31
+ # PyInstaller
32
+ # Usually these files are written by a python script from a template
33
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
34
+ *.manifest
35
+ *.spec
36
+
37
+ # Installer logs
38
+ pip-log.txt
39
+ pip-delete-this-directory.txt
40
+
41
+ # Unit test / coverage reports
42
+ htmlcov/
43
+ .tox/
44
+ .nox/
45
+ .coverage
46
+ .coverage.*
47
+ .cache
48
+ nosetests.xml
49
+ coverage.xml
50
+ *.cover
51
+ *.py,cover
52
+ .hypothesis/
53
+ .pytest_cache/
54
+ cover/
55
+ test.py
56
+
57
+ # Translations
58
+ *.mo
59
+ *.pot
60
+
61
+ # Django stuff:
62
+ *.log
63
+ local_settings.py
64
+ db.sqlite3
65
+ db.sqlite3-journal
66
+
67
+ # Flask stuff:
68
+ instance/
69
+ .webassets-cache
70
+
71
+ # Scrapy stuff:
72
+ .scrapy
73
+
74
+ # Sphinx documentation
75
+ docs/_build/
76
+
77
+ # PyBuilder
78
+ .pybuilder/
79
+ target/
80
+
81
+ # Jupyter Notebook
82
+ .ipynb_checkpoints
83
+
84
+ # IPython
85
+ profile_default/
86
+ ipython_config.py
87
+
88
+ # pyenv
89
+ # For a library or package, you might want to ignore these files since the code is
90
+ # intended to run in multiple environments; otherwise, check them in:
91
+ # .python-version
92
+
93
+ # pipenv
94
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
95
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
96
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
97
+ # install all needed dependencies.
98
+ #Pipfile.lock
99
+
100
+ # poetry
101
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
102
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
103
+ # commonly ignored for libraries.
104
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
105
+ #poetry.lock
106
+
107
+ # pdm
108
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
109
+ #pdm.lock
110
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
111
+ # in version control.
112
+ # https://pdm.fming.dev/#use-with-ide
113
+ .pdm.toml
114
+
115
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
116
+ __pypackages__/
117
+
118
+ # Celery stuff
119
+ celerybeat-schedule
120
+ celerybeat.pid
121
+
122
+ # SageMath parsed files
123
+ *.sage.py
124
+
125
+ # Environments
126
+ .env
127
+ .venv
128
+ env/
129
+ venv/
130
+ ENV/
131
+ env.bak/
132
+ venv.bak/
133
+
134
+ # Spyder project settings
135
+ .spyderproject
136
+ .spyproject
137
+
138
+ # Rope project settings
139
+ .ropeproject
140
+
141
+ # mkdocs documentation
142
+ /site
143
+
144
+ # mypy
145
+ .mypy_cache/
146
+ .dmypy.json
147
+ dmypy.json
148
+
149
+ # Pyre type checker
150
+ .pyre/
151
+
152
+ # pytype static type analyzer
153
+ .pytype/
154
+
155
+ # Cython debug symbols
156
+ cython_debug/
157
+
158
+ # PyCharm
159
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
160
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
161
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
162
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
163
+ .idea/
164
+ .vscode/
@@ -0,0 +1,237 @@
1
+ Metadata-Version: 2.4
2
+ Name: sgnl-api
3
+ Version: 0.2.0
4
+ Summary: Asynchronous python wrapper over API sgnl.pro
5
+ Project-URL: GitHub, https://github.com/gritsyuk/sgnl-api
6
+ Author-email: Igor Gritsyuk <gritsyuk.igor@gmail.com>
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Keywords: api,building management,constarctionsite,construction,docs,inspections,operation,sgnl,signal,supervision
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Requires-Python: >=3.9
14
+ Requires-Dist: aiofiles>=24.1.0
15
+ Requires-Dist: httpx>=0.27.2
16
+ Description-Content-Type: text/markdown
17
+
18
+ # <img src="./img/logo.svg"> SIGNAL API
19
+
20
+ ![PyPI - Version](https://img.shields.io/pypi/v/sgnl-api) [![Telegram chat](https://img.shields.io/badge/Просто_о_BIM-join-blue?logo=telegram)](https://t.me/prostobim)
21
+ ## Обертка над API Signal
22
+ Официальная документация [https://api.sgnl.pro/openapi/swagger/index.html](https://api.sgnl.pro/openapi/swagger/index.html)
23
+ ## Установка
24
+ ```bash
25
+ pip install -U sgnl-api
26
+ ```
27
+
28
+ ## Пример
29
+ ```python
30
+ import asyncio
31
+ import os
32
+ from sgnl_api import DocsApi
33
+ from dotenv import load_dotenv
34
+
35
+ load_dotenv()
36
+ CLIENT_ID = os.getenv("CLIENT_ID")
37
+ SECRET_ID = os.getenv("SECRET_ID")
38
+
39
+
40
+ async def main():
41
+
42
+ async with await DocsApi.create(
43
+ client_id=CLIENT_ID,
44
+ client_secret=SECRET_ID
45
+ ) as docs:
46
+ projects = await docs.project.get_list()
47
+ for project in projects:
48
+ print(project)
49
+
50
+
51
+ if __name__ == "__main__":
52
+ asyncio.run(main())
53
+ ```
54
+
55
+ Клиент можно использовать и без `async with` — тогда после завершения работы стоит вызвать `await docs.aclose()`, чтобы закрыть пул соединений.
56
+
57
+ ## Обработка ошибок
58
+ При ошибке API методы бросают исключение, а не возвращают `dict` с ключом `error` — проверять каждый ответ вручную не нужно.
59
+
60
+ ```python
61
+ from sgnl_api import DocsApi, SgnlApiError, SgnlNotFoundError
62
+
63
+ try:
64
+ project = await docs.project.info(project_id)
65
+ except SgnlNotFoundError:
66
+ ...
67
+ except SgnlApiError as e:
68
+ print(e.status_code, e.message)
69
+ ```
70
+
71
+ Иерархия исключений: `SgnlApiError` (базовое) → `SgnlRequestError` (сетевые ошибки/таймауты), `SgnlAuthenticationError` (401), `SgnlBadRequestError` (400), `SgnlForbiddenError` (403), `SgnlNotFoundError` (404), `SgnlQuotaExceededError` (450), `SgnlServerError` (5xx).
72
+
73
+ ## Методы
74
+ Обертка покрывает весь официальный API ([swagger](https://api.sgnl.pro/openapi/swagger/index.html)). Методы сгруппированы по ресурсам ровно как в спецификации (по тегам).
75
+
76
+ ### item
77
+ | Метод | Описание | Возвращает |
78
+ |-------------------------|-------------------------------------------------------------------|--------------------|
79
+ | `item.get_list` | Список файлов в директории | `list[dict]` |
80
+ | `item.count` | Количество файлов в директории | `int` |
81
+ | `item.search` | Поиск вложенных элементов в директории | `list[dict]` |
82
+ | `item.create_file` | Создает новый файл с версией | `UUID` |
83
+ | `item.create_link` | Создает новую ссылку | `UUID` |
84
+ | `item.get_link` | Получает ссылку для загрузки файла | `dict` |
85
+ | `item.get_item_version` | Возвращает версию элемента по UUID | `dict` |
86
+ | `item.add_version` | Добавляет новую версию к существующему файлу | `None` |
87
+ | `item.update` | Обновляет элемент (имя/ссылку) | `None` |
88
+ | `item.update_version` | Обновляет комментарий версии элемента | `None` |
89
+ | `item.delete` | Перемещает элемент в корзину | `None` |
90
+
91
+ ### folder
92
+ | Метод | Описание | Возвращает |
93
+ |-------------------------|-------------------------------------------------------------------|--------------------|
94
+ | `folder.get_list` | Список дочерних папок | `list[dict]` |
95
+ | `folder.create` | Создает новую папку | `UUID` |
96
+ | `folder.update` | Обновляет имя и/или цвет папки | `None` |
97
+ | `folder.rename` | Переименовывает папку | `None` |
98
+ | `folder.delete` | Перемещает папку в корзину | `None` |
99
+ | `folder.get_project_tree`| Дерево папок проекта с правами пользователя | `dict` |
100
+
101
+ ### project / project_user / project_user_custom_role
102
+ | Метод | Описание | Возвращает |
103
+ |-------------------------|-------------------------------------------------------------------|--------------------|
104
+ | `project.root_folder` | Информация о корневой папке проекта | `dict` |
105
+ | `project.root_folder_id`| UUID корневой папки проекта | `UUID` |
106
+ | `project.get_storage_id`| UUID хранилища, назначенного проекту | `UUID` |
107
+ | `project.get_list` | Список проектов | `list[dict]` |
108
+ | `project.info` | Информация о проекте | `dict` |
109
+ | `project.users` | Список пользователей проекта | `list[dict]` |
110
+ | `project.roles` | Список ролей проекта | `list[dict]` |
111
+ | `project.users_permissions` | Права пользователя в проекте | `list[str]` |
112
+ | `project_user.add` | Добавляет пользователей в проекты | `None` |
113
+ | `project_user.delete` | Удаляет пользователей из проектов | `None` |
114
+ | `project_user_custom_role.set` | Назначает кастомные роли пользователю в проекте | `None` |
115
+
116
+ ### company / company_user / company_user_custom_role
117
+ | Метод | Описание | Возвращает |
118
+ |-------------------------|-------------------------------------------------------------------|--------------------|
119
+ | `company.users_list` | Список пользователей компании | `list[dict]` |
120
+ | `company.roles_list` | Список ролей компании | `list[dict]` |
121
+ | `company_user.get_id_by_telegram_id` | UUID пользователя по Telegram id | `UUID` |
122
+ | `company_user.add` | Приглашает/добавляет пользователей в компанию | `list[dict]` |
123
+ | `company_user.delete` | Удаляет пользователей из компании | `None` |
124
+ | `company_user_custom_role.set` | Назначает кастомные роли пользователю в компании | `None` |
125
+
126
+ ### version
127
+ | Метод | Описание | Возвращает |
128
+ |-------------------------|-------------------------------------------------------------------|--------------------|
129
+ | `version.get_list` | Список версий файла | `list[dict]` |
130
+ | `version.count` | Количество версий файла | `int` |
131
+ | `version.find_batch` | Версии для пакета элементов | `list[dict]` |
132
+ | `version.create` | Создает новую версию объекта | `UUID` |
133
+
134
+ ### file (Object)
135
+ | Метод | Описание | Возвращает |
136
+ |-------------------------|-------------------------------------------------------------------|--------------------|
137
+ | `file.get_object_upload`| Получает тикет на загрузку объекта | `dict` |
138
+ | `file.commit_uploading` | Завершает загрузку объекта | `None` |
139
+ | `file.upload` | Загружает файл целиком (upload + commit) | `dict` или `None` |
140
+
141
+ ### attribute / attribute_type / attribute_value
142
+ | Метод | Описание | Возвращает |
143
+ |-----------------------------------|--------------------------------------------------------|--------------|
144
+ | `attribute.get_list` | Список атрибутов по фильтру | `list[dict]` |
145
+ | `attribute_type.get_list` | Список типов атрибутов по фильтру | `list[dict]` |
146
+ | `attribute_value.list_issues` | Значения атрибутов замечаний | `list[dict]` |
147
+ | `attribute_value.list_items` | Значения атрибутов элементов | `list[dict]` |
148
+ | `attribute_value.list_folders` | Значения атрибутов папок | `list[dict]` |
149
+ | `attribute_value.set` | Устанавливает значения атрибутов | `None` |
150
+
151
+ ### issue и связанные (issue_type, issue_accesses, issue_comment, issue_attachment, issue_events, issue_project_settings)
152
+ | Метод | Описание | Возвращает |
153
+ |--------------------------------------------|------------------------------------------------------|--------------|
154
+ | `issue.get_list` | Список замечаний по фильтру | `list[dict]` |
155
+ | `issue.update` | Пакетное обновление замечаний (до 25 шт.) | `None` |
156
+ | `issue.count` | Количество замечаний по фильтру | `int` |
157
+ | `issue.item_issues_count` | Количество замечаний по элементам | `list[dict]` |
158
+ | `issue_type.get_list` | Список типов замечаний | `list[dict]` |
159
+ | `issue_accesses.get_list` | Правила доступа к замечаниям | `list[dict]` |
160
+ | `issue_comment.get_list` | Список комментариев замечания | `list[dict]` |
161
+ | `issue_comment.create` | Создает комментарий | `UUID` |
162
+ | `issue_comment.count` | Количество комментариев | `int` |
163
+ | `issue_attachment.get_list` | Список вложений замечания | `list[dict]` |
164
+ | `issue_attachment.download_object` | Тикет на загрузку вложения | `dict` |
165
+ | `issue_events.get_list` | История событий замечания | `list[dict]` |
166
+ | `issue_events.count` | Количество событий | `int` |
167
+ | `issue_project_settings.get` | Настройки замечаний проекта | `dict` |
168
+
169
+ ### review и связанные (review_group, review_item)
170
+ | Метод | Описание | Возвращает |
171
+ |------------------------------------------------------------|--------------------------------------------------|--------------|
172
+ | `review.get_list` | Список согласований проекта | `list[dict]` |
173
+ | `review.update` | Обновляет основную информацию согласования | `None` |
174
+ | `review.count` | Количество согласований | `int` |
175
+ | `review.get_versions` | Версии согласований по id | `list[dict]` |
176
+ | `review.find_item_version_ids_by_review_version_ids` | Версии элементов по версиям согласования | `dict` |
177
+ | `review_group.get_list` | Список групп согласований | `list[dict]` |
178
+ | `review_item.get_statuses` | Статусы согласования для версий элементов | `list[dict]` |
179
+
180
+ ### share / storage
181
+ | Метод | Описание | Возвращает |
182
+ |---------------------|--------------------------------------------|--------------|
183
+ | `share.get_list` | Список ссылок общего доступа по фильтру | `list[dict]` |
184
+ | `share.create` | Создает ссылку общего доступа | `UUID` |
185
+ | `share.update` | Обновляет ссылку общего доступа | `None` |
186
+ | `share.delete` | Помечает ссылку удаленной/восстановленной | `None` |
187
+ | `share.count` | Количество ссылок по фильтру | `int` |
188
+ | `storage.get_list` | Список хранилищ документов | `list[dict]` |
189
+
190
+ ### подписание (cades_signature, embedded_signature, mchd) и card_public_link
191
+ | Метод | Описание | Возвращает |
192
+ |----------------------------------------|------------------------------------------------------|--------------|
193
+ | `cades_signature.get_list` | Список подписей CAdES версии | `list[dict]` |
194
+ | `cades_signature.create` | Создает подпись CAdES | `None` |
195
+ | `embedded_signature.get_list` | Список встроенных подписей элемента | `list[dict]` |
196
+ | `embedded_signature.create` | Создает встроенную подпись | `None` |
197
+ | `mchd.company_documents` | UUID доверенностей компании | `list[UUID]` |
198
+ | `mchd.attached_documents` | Доверенности, привязанные к подписи | `list[dict]` |
199
+ | `mchd.download` | Тикет на загрузку доверенности | `dict` |
200
+ | `card_public_link.regenerate` | Перегенерирует публичную ссылку карточки дашборда | `dict` |
201
+
202
+ ### documents_transfer / documents_transfer_item / documents_transfer_type / acceptance_certificate
203
+ | Метод | Описание | Возвращает |
204
+ |---------------------------------------------------|-----------------------------------------------------|--------------|
205
+ | `documents_transfer.get_list` | Список передач документов по фильтру | `list[dict]` |
206
+ | `documents_transfer.get` | Данные передачи документов по id | `dict` |
207
+ | `documents_transfer.count` | Количество передач по фильтру | `int` |
208
+ | `documents_transfer.accesses` | Правила доступа для типов передач | `list[dict]` |
209
+ | `documents_transfer_item.get_list` | Список элементов передачи | `list[dict]` |
210
+ | `documents_transfer_item.count` | Количество элементов передачи | `int` |
211
+ | `documents_transfer_item.download` | Тикет на загрузку элемента передачи | `dict` |
212
+ | `documents_transfer_type.get_list` | Список типов передач документов | `list[dict]` |
213
+ | `acceptance_certificate.download` | Тикет на загрузку акта приема-передачи | `dict` |
214
+
215
+ ### permissions / application_user
216
+ | Метод | Описание | Возвращает |
217
+ |----------------------------------|------------------------------------------------------|--------------|
218
+ | `permissions.upsert_batch` | Устанавливает права пользователей/ролей на папку | `None` |
219
+ | `permissions.get_tree` | Дерево папок проекта с правами | `dict` |
220
+ | `application_user.upsert` | Назначает роли пользователям в приложениях | `None` |
221
+ | `application_user.delete` | Отзывает доступ пользователей в приложениях | `None` |
222
+
223
+ ### forge / tangl / folder_items_naming_pattern
224
+ | Метод | Описание | Возвращает |
225
+ |-------------------------------------------------|--------------------------------------------------|--------------|
226
+ | `forge.convert` | Запускает конвертацию модели через Forge | `None` |
227
+ | `forge.get_viewers_data` | Токен и URN для Forge Viewer | `dict` |
228
+ | `tangl.convert` | Запускает конвертацию модели через Tangl | `None` |
229
+ | `folder_items_naming_pattern.find` | Шаблоны именования файлов папки | `dict` |
230
+
231
+ ### user_log
232
+ | Метод | Описание | Возвращает |
233
+ |---------------------|--------------------------------------|--------------|
234
+ | `user_log.get_list`| Журнал действий пользователей | `list[dict]` |
235
+
236
+ Для методов, принимающих `filter`/`find`/`values`/`items` как `dict`, структура соответствует одноимённой схеме в [спецификации API](https://api.sgnl.pro/openapi/swagger/index.html) — ключи передаются в camelCase, как в JSON-теле запроса (например `{"projectId": "...", "issueIds": [...]}`).
237
+
@@ -0,0 +1,220 @@
1
+ # <img src="./img/logo.svg"> SIGNAL API
2
+
3
+ ![PyPI - Version](https://img.shields.io/pypi/v/sgnl-api) [![Telegram chat](https://img.shields.io/badge/Просто_о_BIM-join-blue?logo=telegram)](https://t.me/prostobim)
4
+ ## Обертка над API Signal
5
+ Официальная документация [https://api.sgnl.pro/openapi/swagger/index.html](https://api.sgnl.pro/openapi/swagger/index.html)
6
+ ## Установка
7
+ ```bash
8
+ pip install -U sgnl-api
9
+ ```
10
+
11
+ ## Пример
12
+ ```python
13
+ import asyncio
14
+ import os
15
+ from sgnl_api import DocsApi
16
+ from dotenv import load_dotenv
17
+
18
+ load_dotenv()
19
+ CLIENT_ID = os.getenv("CLIENT_ID")
20
+ SECRET_ID = os.getenv("SECRET_ID")
21
+
22
+
23
+ async def main():
24
+
25
+ async with await DocsApi.create(
26
+ client_id=CLIENT_ID,
27
+ client_secret=SECRET_ID
28
+ ) as docs:
29
+ projects = await docs.project.get_list()
30
+ for project in projects:
31
+ print(project)
32
+
33
+
34
+ if __name__ == "__main__":
35
+ asyncio.run(main())
36
+ ```
37
+
38
+ Клиент можно использовать и без `async with` — тогда после завершения работы стоит вызвать `await docs.aclose()`, чтобы закрыть пул соединений.
39
+
40
+ ## Обработка ошибок
41
+ При ошибке API методы бросают исключение, а не возвращают `dict` с ключом `error` — проверять каждый ответ вручную не нужно.
42
+
43
+ ```python
44
+ from sgnl_api import DocsApi, SgnlApiError, SgnlNotFoundError
45
+
46
+ try:
47
+ project = await docs.project.info(project_id)
48
+ except SgnlNotFoundError:
49
+ ...
50
+ except SgnlApiError as e:
51
+ print(e.status_code, e.message)
52
+ ```
53
+
54
+ Иерархия исключений: `SgnlApiError` (базовое) → `SgnlRequestError` (сетевые ошибки/таймауты), `SgnlAuthenticationError` (401), `SgnlBadRequestError` (400), `SgnlForbiddenError` (403), `SgnlNotFoundError` (404), `SgnlQuotaExceededError` (450), `SgnlServerError` (5xx).
55
+
56
+ ## Методы
57
+ Обертка покрывает весь официальный API ([swagger](https://api.sgnl.pro/openapi/swagger/index.html)). Методы сгруппированы по ресурсам ровно как в спецификации (по тегам).
58
+
59
+ ### item
60
+ | Метод | Описание | Возвращает |
61
+ |-------------------------|-------------------------------------------------------------------|--------------------|
62
+ | `item.get_list` | Список файлов в директории | `list[dict]` |
63
+ | `item.count` | Количество файлов в директории | `int` |
64
+ | `item.search` | Поиск вложенных элементов в директории | `list[dict]` |
65
+ | `item.create_file` | Создает новый файл с версией | `UUID` |
66
+ | `item.create_link` | Создает новую ссылку | `UUID` |
67
+ | `item.get_link` | Получает ссылку для загрузки файла | `dict` |
68
+ | `item.get_item_version` | Возвращает версию элемента по UUID | `dict` |
69
+ | `item.add_version` | Добавляет новую версию к существующему файлу | `None` |
70
+ | `item.update` | Обновляет элемент (имя/ссылку) | `None` |
71
+ | `item.update_version` | Обновляет комментарий версии элемента | `None` |
72
+ | `item.delete` | Перемещает элемент в корзину | `None` |
73
+
74
+ ### folder
75
+ | Метод | Описание | Возвращает |
76
+ |-------------------------|-------------------------------------------------------------------|--------------------|
77
+ | `folder.get_list` | Список дочерних папок | `list[dict]` |
78
+ | `folder.create` | Создает новую папку | `UUID` |
79
+ | `folder.update` | Обновляет имя и/или цвет папки | `None` |
80
+ | `folder.rename` | Переименовывает папку | `None` |
81
+ | `folder.delete` | Перемещает папку в корзину | `None` |
82
+ | `folder.get_project_tree`| Дерево папок проекта с правами пользователя | `dict` |
83
+
84
+ ### project / project_user / project_user_custom_role
85
+ | Метод | Описание | Возвращает |
86
+ |-------------------------|-------------------------------------------------------------------|--------------------|
87
+ | `project.root_folder` | Информация о корневой папке проекта | `dict` |
88
+ | `project.root_folder_id`| UUID корневой папки проекта | `UUID` |
89
+ | `project.get_storage_id`| UUID хранилища, назначенного проекту | `UUID` |
90
+ | `project.get_list` | Список проектов | `list[dict]` |
91
+ | `project.info` | Информация о проекте | `dict` |
92
+ | `project.users` | Список пользователей проекта | `list[dict]` |
93
+ | `project.roles` | Список ролей проекта | `list[dict]` |
94
+ | `project.users_permissions` | Права пользователя в проекте | `list[str]` |
95
+ | `project_user.add` | Добавляет пользователей в проекты | `None` |
96
+ | `project_user.delete` | Удаляет пользователей из проектов | `None` |
97
+ | `project_user_custom_role.set` | Назначает кастомные роли пользователю в проекте | `None` |
98
+
99
+ ### company / company_user / company_user_custom_role
100
+ | Метод | Описание | Возвращает |
101
+ |-------------------------|-------------------------------------------------------------------|--------------------|
102
+ | `company.users_list` | Список пользователей компании | `list[dict]` |
103
+ | `company.roles_list` | Список ролей компании | `list[dict]` |
104
+ | `company_user.get_id_by_telegram_id` | UUID пользователя по Telegram id | `UUID` |
105
+ | `company_user.add` | Приглашает/добавляет пользователей в компанию | `list[dict]` |
106
+ | `company_user.delete` | Удаляет пользователей из компании | `None` |
107
+ | `company_user_custom_role.set` | Назначает кастомные роли пользователю в компании | `None` |
108
+
109
+ ### version
110
+ | Метод | Описание | Возвращает |
111
+ |-------------------------|-------------------------------------------------------------------|--------------------|
112
+ | `version.get_list` | Список версий файла | `list[dict]` |
113
+ | `version.count` | Количество версий файла | `int` |
114
+ | `version.find_batch` | Версии для пакета элементов | `list[dict]` |
115
+ | `version.create` | Создает новую версию объекта | `UUID` |
116
+
117
+ ### file (Object)
118
+ | Метод | Описание | Возвращает |
119
+ |-------------------------|-------------------------------------------------------------------|--------------------|
120
+ | `file.get_object_upload`| Получает тикет на загрузку объекта | `dict` |
121
+ | `file.commit_uploading` | Завершает загрузку объекта | `None` |
122
+ | `file.upload` | Загружает файл целиком (upload + commit) | `dict` или `None` |
123
+
124
+ ### attribute / attribute_type / attribute_value
125
+ | Метод | Описание | Возвращает |
126
+ |-----------------------------------|--------------------------------------------------------|--------------|
127
+ | `attribute.get_list` | Список атрибутов по фильтру | `list[dict]` |
128
+ | `attribute_type.get_list` | Список типов атрибутов по фильтру | `list[dict]` |
129
+ | `attribute_value.list_issues` | Значения атрибутов замечаний | `list[dict]` |
130
+ | `attribute_value.list_items` | Значения атрибутов элементов | `list[dict]` |
131
+ | `attribute_value.list_folders` | Значения атрибутов папок | `list[dict]` |
132
+ | `attribute_value.set` | Устанавливает значения атрибутов | `None` |
133
+
134
+ ### issue и связанные (issue_type, issue_accesses, issue_comment, issue_attachment, issue_events, issue_project_settings)
135
+ | Метод | Описание | Возвращает |
136
+ |--------------------------------------------|------------------------------------------------------|--------------|
137
+ | `issue.get_list` | Список замечаний по фильтру | `list[dict]` |
138
+ | `issue.update` | Пакетное обновление замечаний (до 25 шт.) | `None` |
139
+ | `issue.count` | Количество замечаний по фильтру | `int` |
140
+ | `issue.item_issues_count` | Количество замечаний по элементам | `list[dict]` |
141
+ | `issue_type.get_list` | Список типов замечаний | `list[dict]` |
142
+ | `issue_accesses.get_list` | Правила доступа к замечаниям | `list[dict]` |
143
+ | `issue_comment.get_list` | Список комментариев замечания | `list[dict]` |
144
+ | `issue_comment.create` | Создает комментарий | `UUID` |
145
+ | `issue_comment.count` | Количество комментариев | `int` |
146
+ | `issue_attachment.get_list` | Список вложений замечания | `list[dict]` |
147
+ | `issue_attachment.download_object` | Тикет на загрузку вложения | `dict` |
148
+ | `issue_events.get_list` | История событий замечания | `list[dict]` |
149
+ | `issue_events.count` | Количество событий | `int` |
150
+ | `issue_project_settings.get` | Настройки замечаний проекта | `dict` |
151
+
152
+ ### review и связанные (review_group, review_item)
153
+ | Метод | Описание | Возвращает |
154
+ |------------------------------------------------------------|--------------------------------------------------|--------------|
155
+ | `review.get_list` | Список согласований проекта | `list[dict]` |
156
+ | `review.update` | Обновляет основную информацию согласования | `None` |
157
+ | `review.count` | Количество согласований | `int` |
158
+ | `review.get_versions` | Версии согласований по id | `list[dict]` |
159
+ | `review.find_item_version_ids_by_review_version_ids` | Версии элементов по версиям согласования | `dict` |
160
+ | `review_group.get_list` | Список групп согласований | `list[dict]` |
161
+ | `review_item.get_statuses` | Статусы согласования для версий элементов | `list[dict]` |
162
+
163
+ ### share / storage
164
+ | Метод | Описание | Возвращает |
165
+ |---------------------|--------------------------------------------|--------------|
166
+ | `share.get_list` | Список ссылок общего доступа по фильтру | `list[dict]` |
167
+ | `share.create` | Создает ссылку общего доступа | `UUID` |
168
+ | `share.update` | Обновляет ссылку общего доступа | `None` |
169
+ | `share.delete` | Помечает ссылку удаленной/восстановленной | `None` |
170
+ | `share.count` | Количество ссылок по фильтру | `int` |
171
+ | `storage.get_list` | Список хранилищ документов | `list[dict]` |
172
+
173
+ ### подписание (cades_signature, embedded_signature, mchd) и card_public_link
174
+ | Метод | Описание | Возвращает |
175
+ |----------------------------------------|------------------------------------------------------|--------------|
176
+ | `cades_signature.get_list` | Список подписей CAdES версии | `list[dict]` |
177
+ | `cades_signature.create` | Создает подпись CAdES | `None` |
178
+ | `embedded_signature.get_list` | Список встроенных подписей элемента | `list[dict]` |
179
+ | `embedded_signature.create` | Создает встроенную подпись | `None` |
180
+ | `mchd.company_documents` | UUID доверенностей компании | `list[UUID]` |
181
+ | `mchd.attached_documents` | Доверенности, привязанные к подписи | `list[dict]` |
182
+ | `mchd.download` | Тикет на загрузку доверенности | `dict` |
183
+ | `card_public_link.regenerate` | Перегенерирует публичную ссылку карточки дашборда | `dict` |
184
+
185
+ ### documents_transfer / documents_transfer_item / documents_transfer_type / acceptance_certificate
186
+ | Метод | Описание | Возвращает |
187
+ |---------------------------------------------------|-----------------------------------------------------|--------------|
188
+ | `documents_transfer.get_list` | Список передач документов по фильтру | `list[dict]` |
189
+ | `documents_transfer.get` | Данные передачи документов по id | `dict` |
190
+ | `documents_transfer.count` | Количество передач по фильтру | `int` |
191
+ | `documents_transfer.accesses` | Правила доступа для типов передач | `list[dict]` |
192
+ | `documents_transfer_item.get_list` | Список элементов передачи | `list[dict]` |
193
+ | `documents_transfer_item.count` | Количество элементов передачи | `int` |
194
+ | `documents_transfer_item.download` | Тикет на загрузку элемента передачи | `dict` |
195
+ | `documents_transfer_type.get_list` | Список типов передач документов | `list[dict]` |
196
+ | `acceptance_certificate.download` | Тикет на загрузку акта приема-передачи | `dict` |
197
+
198
+ ### permissions / application_user
199
+ | Метод | Описание | Возвращает |
200
+ |----------------------------------|------------------------------------------------------|--------------|
201
+ | `permissions.upsert_batch` | Устанавливает права пользователей/ролей на папку | `None` |
202
+ | `permissions.get_tree` | Дерево папок проекта с правами | `dict` |
203
+ | `application_user.upsert` | Назначает роли пользователям в приложениях | `None` |
204
+ | `application_user.delete` | Отзывает доступ пользователей в приложениях | `None` |
205
+
206
+ ### forge / tangl / folder_items_naming_pattern
207
+ | Метод | Описание | Возвращает |
208
+ |-------------------------------------------------|--------------------------------------------------|--------------|
209
+ | `forge.convert` | Запускает конвертацию модели через Forge | `None` |
210
+ | `forge.get_viewers_data` | Токен и URN для Forge Viewer | `dict` |
211
+ | `tangl.convert` | Запускает конвертацию модели через Tangl | `None` |
212
+ | `folder_items_naming_pattern.find` | Шаблоны именования файлов папки | `dict` |
213
+
214
+ ### user_log
215
+ | Метод | Описание | Возвращает |
216
+ |---------------------|--------------------------------------|--------------|
217
+ | `user_log.get_list`| Журнал действий пользователей | `list[dict]` |
218
+
219
+ Для методов, принимающих `filter`/`find`/`values`/`items` как `dict`, структура соответствует одноимённой схеме в [спецификации API](https://api.sgnl.pro/openapi/swagger/index.html) — ключи передаются в camelCase, как в JSON-теле запроса (например `{"projectId": "...", "issueIds": [...]}`).
220
+