glpi-python-client 0.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.
- glpi_python_client/__init__.py +36 -0
- glpi_python_client/auth/__init__.py +11 -0
- glpi_python_client/auth/auth.py +310 -0
- glpi_python_client/auth/tests/test_auth.py +189 -0
- glpi_python_client/clients/__init__.py +18 -0
- glpi_python_client/clients/api_v1_session.py +460 -0
- glpi_python_client/clients/api_v2_client.py +317 -0
- glpi_python_client/clients/async_api_v2_client.py +236 -0
- glpi_python_client/clients/tests/__init__.py +5 -0
- glpi_python_client/clients/tests/test_api_v1_session.py +85 -0
- glpi_python_client/clients/tests/test_api_v2_client.py +349 -0
- glpi_python_client/clients/tests/test_async_api_v2_client.py +257 -0
- glpi_python_client/clients/v2/__init__.py +8 -0
- glpi_python_client/clients/v2/async_/__init__.py +12 -0
- glpi_python_client/clients/v2/async_/api.py +29 -0
- glpi_python_client/clients/v2/async_/directory.py +88 -0
- glpi_python_client/clients/v2/async_/documents.py +144 -0
- glpi_python_client/clients/v2/async_/team.py +125 -0
- glpi_python_client/clients/v2/async_/tests/__init__.py +5 -0
- glpi_python_client/clients/v2/async_/tests/test_directory.py +43 -0
- glpi_python_client/clients/v2/async_/tests/test_documents.py +41 -0
- glpi_python_client/clients/v2/async_/tests/test_team.py +44 -0
- glpi_python_client/clients/v2/async_/tests/test_tickets.py +174 -0
- glpi_python_client/clients/v2/async_/tests/test_timeline.py +126 -0
- glpi_python_client/clients/v2/async_/tickets.py +312 -0
- glpi_python_client/clients/v2/async_/timeline.py +312 -0
- glpi_python_client/clients/v2/async_/transport.py +251 -0
- glpi_python_client/clients/v2/common/__init__.py +6 -0
- glpi_python_client/clients/v2/common/client_config.py +219 -0
- glpi_python_client/clients/v2/common/constants.py +45 -0
- glpi_python_client/clients/v2/common/errors.py +23 -0
- glpi_python_client/clients/v2/common/filters.py +30 -0
- glpi_python_client/clients/v2/common/payloads.py +57 -0
- glpi_python_client/clients/v2/common/request_http.py +195 -0
- glpi_python_client/clients/v2/common/response_payloads.py +76 -0
- glpi_python_client/clients/v2/common/ticket_search.py +113 -0
- glpi_python_client/clients/v2/sync/__init__.py +12 -0
- glpi_python_client/clients/v2/sync/api.py +29 -0
- glpi_python_client/clients/v2/sync/directory.py +90 -0
- glpi_python_client/clients/v2/sync/documents.py +144 -0
- glpi_python_client/clients/v2/sync/team.py +125 -0
- glpi_python_client/clients/v2/sync/tests/__init__.py +5 -0
- glpi_python_client/clients/v2/sync/tests/test_directory.py +57 -0
- glpi_python_client/clients/v2/sync/tests/test_documents.py +99 -0
- glpi_python_client/clients/v2/sync/tests/test_team.py +64 -0
- glpi_python_client/clients/v2/sync/tests/test_tickets.py +430 -0
- glpi_python_client/clients/v2/sync/tests/test_timeline.py +77 -0
- glpi_python_client/clients/v2/sync/tests/test_transport.py +89 -0
- glpi_python_client/clients/v2/sync/tickets.py +312 -0
- glpi_python_client/clients/v2/sync/timeline.py +308 -0
- glpi_python_client/clients/v2/sync/transport.py +246 -0
- glpi_python_client/content/__init__.py +11 -0
- glpi_python_client/content/conversion.py +58 -0
- glpi_python_client/content/records/__init__.py +84 -0
- glpi_python_client/content/records/core/__init__.py +6 -0
- glpi_python_client/content/records/core/document_links.py +100 -0
- glpi_python_client/content/records/core/normalization.py +53 -0
- glpi_python_client/content/records/core/references.py +98 -0
- glpi_python_client/content/records/core/scalars.py +83 -0
- glpi_python_client/content/records/parsers/__init__.py +6 -0
- glpi_python_client/content/records/parsers/directory.py +62 -0
- glpi_python_client/content/records/parsers/documents.py +49 -0
- glpi_python_client/content/records/parsers/team.py +58 -0
- glpi_python_client/content/records/parsers/tests/__init__.py +5 -0
- glpi_python_client/content/records/parsers/tests/test_tickets.py +35 -0
- glpi_python_client/content/records/parsers/tests/test_timeline.py +20 -0
- glpi_python_client/content/records/parsers/tickets.py +96 -0
- glpi_python_client/content/records/parsers/timeline.py +119 -0
- glpi_python_client/content/tests/__init__.py +5 -0
- glpi_python_client/content/tests/test_conversion.py +13 -0
- glpi_python_client/models/__init__.py +30 -0
- glpi_python_client/models/_base.py +22 -0
- glpi_python_client/models/_payload.py +79 -0
- glpi_python_client/models/_shared.py +37 -0
- glpi_python_client/models/glpi/__init__.py +27 -0
- glpi_python_client/models/glpi/_document.py +59 -0
- glpi_python_client/models/glpi/_followup.py +77 -0
- glpi_python_client/models/glpi/_location.py +53 -0
- glpi_python_client/models/glpi/_solution.py +57 -0
- glpi_python_client/models/glpi/_task.py +41 -0
- glpi_python_client/models/glpi/_team_member.py +33 -0
- glpi_python_client/models/glpi/_ticket.py +303 -0
- glpi_python_client/models/glpi/_user.py +92 -0
- glpi_python_client/models/glpi/tests/__init__.py +5 -0
- glpi_python_client/models/glpi/tests/test__document.py +12 -0
- glpi_python_client/models/glpi/tests/test__followup.py +31 -0
- glpi_python_client/models/glpi/tests/test__location.py +12 -0
- glpi_python_client/models/glpi/tests/test__solution.py +11 -0
- glpi_python_client/models/glpi/tests/test__ticket.py +59 -0
- glpi_python_client/models/glpi/tests/test__user.py +29 -0
- glpi_python_client/py.typed +0 -0
- glpi_python_client/testing/__init__.py +27 -0
- glpi_python_client/testing/fixtures.py +52 -0
- glpi_python_client/testing/utils.py +149 -0
- glpi_python_client-0.1.0.dist-info/METADATA +144 -0
- glpi_python_client-0.1.0.dist-info/RECORD +98 -0
- glpi_python_client-0.1.0.dist-info/WHEEL +4 -0
- glpi_python_client-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"""Reusable test utility builders for glpi_python_client.
|
|
2
|
+
|
|
3
|
+
This module keeps fake responses and representative payload builders in one
|
|
4
|
+
place so unit tests can share realistic fixtures without repeating setup.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from glpi_python_client import GlpiClient
|
|
12
|
+
|
|
13
|
+
_DEFAULT_CLIENT_CONFIG: dict[str, object] = {
|
|
14
|
+
"glpi_api_url": "https://glpi.example.test/api.php/",
|
|
15
|
+
"client_id": "client-id",
|
|
16
|
+
"client_secret": "client-secret",
|
|
17
|
+
"username": "api-user",
|
|
18
|
+
"password": "api-password",
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class FakeResponse:
|
|
23
|
+
"""Small ``requests.Response`` stand-in for unit tests.
|
|
24
|
+
|
|
25
|
+
The fake object implements only the attributes and ``json()`` behavior used
|
|
26
|
+
by the package's tests.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
status_code: int = 201,
|
|
32
|
+
payload: object | None = None,
|
|
33
|
+
*,
|
|
34
|
+
headers: dict[str, str] | None = None,
|
|
35
|
+
text: str | None = None,
|
|
36
|
+
content: bytes | None = None,
|
|
37
|
+
) -> None:
|
|
38
|
+
self.status_code = status_code
|
|
39
|
+
self._payload = {"id": "321"} if payload is None else payload
|
|
40
|
+
self.headers = headers or {}
|
|
41
|
+
self.text = str(self._payload) if text is None else text
|
|
42
|
+
self.content = self.text.encode() if content is None else content
|
|
43
|
+
|
|
44
|
+
def json(self) -> Any:
|
|
45
|
+
return self._payload
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class SearchResponse(FakeResponse):
|
|
49
|
+
"""Fake GLPI list or search response used by tests.
|
|
50
|
+
|
|
51
|
+
This specialization mainly exists to make test intent clearer at call
|
|
52
|
+
sites.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
payload: list[dict[str, Any]],
|
|
58
|
+
*,
|
|
59
|
+
status_code: int = 200,
|
|
60
|
+
headers: dict[str, str] | None = None,
|
|
61
|
+
) -> None:
|
|
62
|
+
super().__init__(status_code=status_code, payload=payload, headers=headers)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class TicketResponse(FakeResponse):
|
|
66
|
+
"""Fake GLPI single-ticket response used by tests.
|
|
67
|
+
|
|
68
|
+
The subclass documents that the payload shape represents one ticket record
|
|
69
|
+
rather than a list response.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def __init__(
|
|
73
|
+
self,
|
|
74
|
+
payload: dict[str, Any],
|
|
75
|
+
*,
|
|
76
|
+
status_code: int = 200,
|
|
77
|
+
) -> None:
|
|
78
|
+
super().__init__(status_code=status_code, payload=payload)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class TokenResponse(FakeResponse):
|
|
82
|
+
"""Fake OAuth token response used by tests.
|
|
83
|
+
|
|
84
|
+
By default it returns a minimal successful token payload suitable for token
|
|
85
|
+
acquisition and refresh tests.
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
def __init__(
|
|
89
|
+
self,
|
|
90
|
+
status_code: int = 200,
|
|
91
|
+
payload: dict[str, Any] | None = None,
|
|
92
|
+
) -> None:
|
|
93
|
+
super().__init__(
|
|
94
|
+
status_code=status_code,
|
|
95
|
+
payload=payload or {"access_token": "token", "expires_in": 3600},
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def make_client(**overrides: object) -> GlpiClient:
|
|
100
|
+
"""Return a test client configured with sensible defaults.
|
|
101
|
+
|
|
102
|
+
Callers can override any constructor keyword while reusing the shared base
|
|
103
|
+
configuration needed by most tests.
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
config = dict(_DEFAULT_CLIENT_CONFIG)
|
|
107
|
+
config.update(overrides)
|
|
108
|
+
return GlpiClient(**config) # type: ignore[arg-type]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def make_followup_record(**overrides: object) -> dict[str, Any]:
|
|
112
|
+
"""Return a representative raw GLPI followup payload.
|
|
113
|
+
|
|
114
|
+
The payload includes attachment references so content and document-link
|
|
115
|
+
parsing tests can exercise both code paths.
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
payload: dict[str, Any] = {
|
|
119
|
+
"id": 12,
|
|
120
|
+
"content": (
|
|
121
|
+
"<p>Hello</p>"
|
|
122
|
+
'<a href="/front/document.send.php?docid=45">attachment</a>'
|
|
123
|
+
'<img src="/front/document.send.php?docid=46" />'
|
|
124
|
+
),
|
|
125
|
+
"users_id": 5,
|
|
126
|
+
"is_private": "1",
|
|
127
|
+
}
|
|
128
|
+
payload.update(overrides)
|
|
129
|
+
return payload
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def make_ticket_record(**overrides: object) -> dict[str, Any]:
|
|
133
|
+
"""Return a representative raw GLPI ticket payload.
|
|
134
|
+
|
|
135
|
+
The payload captures the common ticket fields needed by parsing and client
|
|
136
|
+
behavior tests while still allowing targeted overrides.
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
payload: dict[str, Any] = {
|
|
140
|
+
"id": 123,
|
|
141
|
+
"name": "Need help",
|
|
142
|
+
"content": "<p>Body with <strong>formatting</strong></p>",
|
|
143
|
+
"status": {"id": 2, "name": "Processing"},
|
|
144
|
+
"entity": {"id": 7, "name": "Root"},
|
|
145
|
+
"location": {"id": 8, "name": "Paris"},
|
|
146
|
+
"user_recipient": {"id": 9, "name": "Requester"},
|
|
147
|
+
}
|
|
148
|
+
payload.update(overrides)
|
|
149
|
+
return payload
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: glpi-python-client
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A typed Python client for GLPI ITSM APIs.
|
|
5
|
+
Project-URL: Homepage, https://github.com/baraline/glpi_python_client
|
|
6
|
+
Project-URL: Documentation, https://glpi-python-client.readthedocs.io/en/latest/
|
|
7
|
+
Project-URL: Issues, https://github.com/baraline/glpi_python_client/issues
|
|
8
|
+
Project-URL: Source, https://github.com/baraline/glpi_python_client
|
|
9
|
+
Author: glpi-python-client contributors
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: api,client,glpi,itsm
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
|
+
Classifier: Typing :: Typed
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
|
+
Requires-Dist: beautifulsoup4>=4.12
|
|
27
|
+
Requires-Dist: lxml>=4.9
|
|
28
|
+
Requires-Dist: markdown>=3.6
|
|
29
|
+
Requires-Dist: markdownify>=0.13
|
|
30
|
+
Requires-Dist: pydantic>=2.8
|
|
31
|
+
Requires-Dist: requests>=2.31
|
|
32
|
+
Requires-Dist: tenacity>=8.2
|
|
33
|
+
Requires-Dist: urllib3>=2.0
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
36
|
+
Requires-Dist: mypy>=1.11; extra == 'dev'
|
|
37
|
+
Requires-Dist: numpydoc>=1.8; extra == 'dev'
|
|
38
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
39
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
40
|
+
Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'dev'
|
|
41
|
+
Requires-Dist: sphinx<8.2,>=7.2; extra == 'dev'
|
|
42
|
+
Requires-Dist: tomli>=2.0; (python_version < '3.11') and extra == 'dev'
|
|
43
|
+
Requires-Dist: twine>=5.1; extra == 'dev'
|
|
44
|
+
Requires-Dist: types-requests>=2.32; extra == 'dev'
|
|
45
|
+
Requires-Dist: vulture>=2.11; extra == 'dev'
|
|
46
|
+
Provides-Extra: docs
|
|
47
|
+
Requires-Dist: numpydoc>=1.8; extra == 'docs'
|
|
48
|
+
Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'docs'
|
|
49
|
+
Requires-Dist: sphinx<8.2,>=7.2; extra == 'docs'
|
|
50
|
+
Requires-Dist: tomli>=2.0; (python_version < '3.11') and extra == 'docs'
|
|
51
|
+
Description-Content-Type: text/markdown
|
|
52
|
+
|
|
53
|
+
# glpi-python-client
|
|
54
|
+
|
|
55
|
+
[](https://github.com/baraline/glpi_python_client/actions/workflows/ci.yml)
|
|
56
|
+
[](LICENSE)
|
|
57
|
+
[](https://github.com/baraline/glpi_python_client)
|
|
58
|
+
[](https://glpi-python-client.readthedocs.io/en/latest/)
|
|
59
|
+
|
|
60
|
+
`glpi-python-client` is a typed Python client for GLPI ITSM APIs.
|
|
61
|
+
|
|
62
|
+
The goal is to let GLPI integrations work with domain objects instead of raw
|
|
63
|
+
JSON payloads. The package exposes Pydantic models for tickets, users,
|
|
64
|
+
followups, documents, locations, and related records, while converting GLPI
|
|
65
|
+
HTML content into Markdown for Python-side workflows and rendering Markdown
|
|
66
|
+
back to HTML for outgoing payloads.
|
|
67
|
+
|
|
68
|
+
It currently focuses on ticket-centric workflows and exposes matching sync and
|
|
69
|
+
async high-level clients.
|
|
70
|
+
|
|
71
|
+
## Installation
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install glpi-python-client
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
For local development:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
python -m pip install -e .[dev]
|
|
81
|
+
python -m pytest
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Quick Start
|
|
85
|
+
|
|
86
|
+
Create a client with your GLPI API URL and at least one complete auth pair:
|
|
87
|
+
|
|
88
|
+
- `client_id` and `client_secret`
|
|
89
|
+
- `username` and `password`
|
|
90
|
+
- both pairs together
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
from glpi_python_client import GlpiClient, GlpiTicket
|
|
94
|
+
|
|
95
|
+
with GlpiClient(
|
|
96
|
+
glpi_api_url="https://glpi.example.com/api.php",
|
|
97
|
+
client_id="oauth-client-id",
|
|
98
|
+
client_secret="oauth-client-secret",
|
|
99
|
+
username="api-user",
|
|
100
|
+
password="api-password",
|
|
101
|
+
) as glpi:
|
|
102
|
+
ticket_id = glpi.create_ticket(
|
|
103
|
+
GlpiTicket(
|
|
104
|
+
name="Printer issue",
|
|
105
|
+
content="The printer is not reachable from the office network.",
|
|
106
|
+
urgency=3,
|
|
107
|
+
impact=3,
|
|
108
|
+
)
|
|
109
|
+
)
|
|
110
|
+
ticket = glpi.get_ticket_record(ticket_id)
|
|
111
|
+
|
|
112
|
+
print(ticket.id)
|
|
113
|
+
print(ticket.content)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Async code uses the same model layer and nearly the same API surface:
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
from glpi_python_client import AsyncGlpiClient
|
|
120
|
+
|
|
121
|
+
async with AsyncGlpiClient(
|
|
122
|
+
glpi_api_url="https://glpi.example.com/api.php",
|
|
123
|
+
client_id="oauth-client-id",
|
|
124
|
+
client_secret="oauth-client-secret",
|
|
125
|
+
) as glpi:
|
|
126
|
+
tickets = await glpi.search_ticket_records(query='status.id=in=(1,2)')
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
If your application already provides `GLPI_` environment variables,
|
|
130
|
+
`GlpiClient.from_env()` and `AsyncGlpiClient.from_env()` are also available.
|
|
131
|
+
|
|
132
|
+
## Documentation
|
|
133
|
+
|
|
134
|
+
- [Hosted documentation](https://glpi-python-client.readthedocs.io/en/latest/)
|
|
135
|
+
- [API reference](https://glpi-python-client.readthedocs.io/en/latest/api_reference.html)
|
|
136
|
+
- [Installation guide](https://glpi-python-client.readthedocs.io/en/latest/installation.html)
|
|
137
|
+
- [Development guide](https://glpi-python-client.readthedocs.io/en/latest/development_rtd.html)
|
|
138
|
+
|
|
139
|
+
To build the Sphinx documentation locally:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
python -m pip install -e .[docs]
|
|
143
|
+
python -m sphinx -b html docs docs/_build/html
|
|
144
|
+
```
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
glpi_python_client/__init__.py,sha256=e6o4PUSnkgZL-QOIn4enVG9c6SWulbkT1m4_49wHEro,779
|
|
2
|
+
glpi_python_client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
glpi_python_client/auth/__init__.py,sha256=KjIoBRnelLjeOboDuGJISPdlfMITLRBJMIy6P0gWfFY,345
|
|
4
|
+
glpi_python_client/auth/auth.py,sha256=0LsZDVE1gNv8hCv50TjU5BxIX5Nl5jGh_D_lK9p7G6A,10471
|
|
5
|
+
glpi_python_client/auth/tests/test_auth.py,sha256=hMyRwtL-A-mpOGz8OHEOZJCdzuOXMRS_rpDoqhdeEdg,6044
|
|
6
|
+
glpi_python_client/clients/__init__.py,sha256=W9-tNPJNDGlcQxN8J5rYtVhLQeDhMyBESOR8sy3aLxc,564
|
|
7
|
+
glpi_python_client/clients/api_v1_session.py,sha256=R2clMk9lXqyipd2P6N5iJh_AL7PuZwJAePTnMM5g8GY,13801
|
|
8
|
+
glpi_python_client/clients/api_v2_client.py,sha256=F0d1RxW0Tfsqh6MrMxLqwI0RgzirtuofJqVJD6u-WRU,10883
|
|
9
|
+
glpi_python_client/clients/async_api_v2_client.py,sha256=JAHbInlbxuEAsc7ll6hp2WQPJldyJ9obgWk5gXg--e4,7714
|
|
10
|
+
glpi_python_client/clients/tests/__init__.py,sha256=lk2hzstOPqFtsx0IoLPxGPOwDTq9-iR8eJykNJtC-Tw,212
|
|
11
|
+
glpi_python_client/clients/tests/test_api_v1_session.py,sha256=gcwp01ny5XVJhJzx9dPG5d9t8T3O_fX9LgL49RAOZdc,2336
|
|
12
|
+
glpi_python_client/clients/tests/test_api_v2_client.py,sha256=4cmdqIQqpeGqbqazmKO93iZvTlutFgmaNWag-aMYibI,10872
|
|
13
|
+
glpi_python_client/clients/tests/test_async_api_v2_client.py,sha256=Ee3SKTsTh1e8LTK1BJWauiL5YLtYMENB6y0xWnS16s4,8506
|
|
14
|
+
glpi_python_client/clients/v2/__init__.py,sha256=D0NHFjd4WTqRG19y9yV3JQ3LxuNDVBSSJYob3qfg5nA,261
|
|
15
|
+
glpi_python_client/clients/v2/async_/__init__.py,sha256=G7tHeB5sDEe4e5rODcAkHaJCTy0J_Y-lfvpy1621h6o,360
|
|
16
|
+
glpi_python_client/clients/v2/async_/api.py,sha256=rjIXltHy1SYpdXhZXdMYZEcSFb05rdsQ9f7r_OkFSBI,825
|
|
17
|
+
glpi_python_client/clients/v2/async_/directory.py,sha256=5mfd7nP-zmWVdJywbTreHab-nHf62gzDmwnVD_Kiw9Q,3020
|
|
18
|
+
glpi_python_client/clients/v2/async_/documents.py,sha256=SMGyZN00NKsBhF-uhe-4VA6sBECxgvxORfZqvlS2D-Y,5244
|
|
19
|
+
glpi_python_client/clients/v2/async_/team.py,sha256=BdSrMSKxsrt7BCOg-65eoE-dkRGakokbv_36inx0vBI,4220
|
|
20
|
+
glpi_python_client/clients/v2/async_/tickets.py,sha256=S4H9zDXtZrSyYgxCwPuFKv271JxwFBBtHDjxyZpXIyc,10482
|
|
21
|
+
glpi_python_client/clients/v2/async_/timeline.py,sha256=kNiia7P9wh6onh9HAqvloavYKBiFo0Xfk3rXAiLbp_U,11066
|
|
22
|
+
glpi_python_client/clients/v2/async_/transport.py,sha256=eB3TX3oWw1WvKs-Nr1xincyyPSa50qMCF0-TiVcRfbA,7897
|
|
23
|
+
glpi_python_client/clients/v2/async_/tests/__init__.py,sha256=ZlT4PuHociuJHMuYpESFOZELcGlbLx_NtO9DVtLGdDM,217
|
|
24
|
+
glpi_python_client/clients/v2/async_/tests/test_directory.py,sha256=VXvpuXSGvTNru9Cvre68Zvr-PZWUU-KJMknK-Km7QXQ,1300
|
|
25
|
+
glpi_python_client/clients/v2/async_/tests/test_documents.py,sha256=baPVTMtu4Uw1QA4eFkGRV3sPE_jsYsyNwdOoAMnIT9E,1172
|
|
26
|
+
glpi_python_client/clients/v2/async_/tests/test_team.py,sha256=qyd64byyPpIz_ZKSLXPQIqFza10r-6bwtWKjuduOEqs,1346
|
|
27
|
+
glpi_python_client/clients/v2/async_/tests/test_tickets.py,sha256=qJ-vmxqAKUnXQZApYuX6iqcWgC-JISyElA5iOQaupjQ,5429
|
|
28
|
+
glpi_python_client/clients/v2/async_/tests/test_timeline.py,sha256=0h7x_Mfp93SMkUgZbzli8mJEDN2MveI3sBAGzclc-ag,3943
|
|
29
|
+
glpi_python_client/clients/v2/common/__init__.py,sha256=F-S8xh0bzkIHZr_0NFE0i6xBYHwd6JRVRb2wDjmu5j0,267
|
|
30
|
+
glpi_python_client/clients/v2/common/client_config.py,sha256=GYkcrL9yfnMNBAOkSx-opltFkTPjwS6QRIvqaMSaaTQ,7057
|
|
31
|
+
glpi_python_client/clients/v2/common/constants.py,sha256=kGs9rvAQG9GGWAGBdel4VhEBv83M9Pw5t4svH5YFqOA,1037
|
|
32
|
+
glpi_python_client/clients/v2/common/errors.py,sha256=oH_ztJjF6zt7OuF21DE3JCeC3mKSPgDsx0ihPJ4hPbs,759
|
|
33
|
+
glpi_python_client/clients/v2/common/filters.py,sha256=lQXoZRTeGAEmIRe7OeYpZQOCR89l0J3WFj4eNcEB_qU,1004
|
|
34
|
+
glpi_python_client/clients/v2/common/payloads.py,sha256=guVkDAOeuHY1PoDrJSOFBRl8RwzN2c_8xsiILgtyFVw,1727
|
|
35
|
+
glpi_python_client/clients/v2/common/request_http.py,sha256=I89A7NVq1MZKqQIAK-iRb8-RvYe_mc-lB0bJ-ObkSUQ,6041
|
|
36
|
+
glpi_python_client/clients/v2/common/response_payloads.py,sha256=THJzwBTQLK8Dbdt6lLQ184r1xqQeeSCV_Qb18iC-ZKM,2285
|
|
37
|
+
glpi_python_client/clients/v2/common/ticket_search.py,sha256=WGoKSw19fIgUTsfl8B6RjxpsGaF_4fAg4IS79_yrcW0,3527
|
|
38
|
+
glpi_python_client/clients/v2/sync/__init__.py,sha256=GvGYb4T4ArFAxu5dgoVaLBtL-MwBpzZKWNFMbARlDuY,347
|
|
39
|
+
glpi_python_client/clients/v2/sync/api.py,sha256=GqdvXeQUWxslGUcONyoRpCTO8Rfc0hX3pomYGDs9Y0Q,828
|
|
40
|
+
glpi_python_client/clients/v2/sync/directory.py,sha256=lHzsWoV3pAwx6WVnOcPRU8xIhhMpa28p3Bdm2ZnSYEo,3111
|
|
41
|
+
glpi_python_client/clients/v2/sync/documents.py,sha256=3MuRjj3KMVBE8vnLlCz-OtiGIpij7PCRDBQ-FIJcte4,5210
|
|
42
|
+
glpi_python_client/clients/v2/sync/team.py,sha256=HtMmhdX7o-uJm7v6HDanThRqjOD3T6RuWkdWYSq53BI,4159
|
|
43
|
+
glpi_python_client/clients/v2/sync/tickets.py,sha256=Jl3V3LFX6mnl2zOxECLXNlGYOVzT7gkUfWxkJaP793s,10325
|
|
44
|
+
glpi_python_client/clients/v2/sync/timeline.py,sha256=4N9sZJsvuGkdh5_IxsOzipDlfEAvKCyeM02TEt4K9mE,10818
|
|
45
|
+
glpi_python_client/clients/v2/sync/transport.py,sha256=ykJZqNzDZYN2N_1hefoOUuNOHbpNevfEc0kVMsz-w4w,7597
|
|
46
|
+
glpi_python_client/clients/v2/sync/tests/__init__.py,sha256=wYz86iX0qRmE4JsogEszfRKhVrzrucYMPgkReAUQ8Jk,199
|
|
47
|
+
glpi_python_client/clients/v2/sync/tests/test_directory.py,sha256=7-RRXYiOwAYf4pEYZBEYhkBIGLFt6ZwOFwQj8XSD-Ek,1627
|
|
48
|
+
glpi_python_client/clients/v2/sync/tests/test_documents.py,sha256=rvkxjV89W3rSNj30WPVtazkVEWX1RayfJ1knZjhvNOc,3262
|
|
49
|
+
glpi_python_client/clients/v2/sync/tests/test_team.py,sha256=2mMU1uqbczNyhqUvJV1l3sJgYQqGB_7bOCPJjRIcEtk,1866
|
|
50
|
+
glpi_python_client/clients/v2/sync/tests/test_tickets.py,sha256=LV1TaLR1pPR2Jhqlz_EPkwTxfXVRT8EZrwUIjsfCkP0,12924
|
|
51
|
+
glpi_python_client/clients/v2/sync/tests/test_timeline.py,sha256=e5I44VInNWuaqAtxeQpeKQr0Z6rg-B1t5e4Pjfsxumg,2235
|
|
52
|
+
glpi_python_client/clients/v2/sync/tests/test_transport.py,sha256=aGq7Nr0XGeFTKzouk72L3neo-iK7xwHkXDmDGG69cjo,2852
|
|
53
|
+
glpi_python_client/content/__init__.py,sha256=3H4IbrNhgFO0BJrc0xLoeXrFHUE1nqOaDlNgi2MtK9k,365
|
|
54
|
+
glpi_python_client/content/conversion.py,sha256=iqmiy0m9yyUD9Bw9to5AEMe0WO5LiIzbWuOEcCRXjyU,1852
|
|
55
|
+
glpi_python_client/content/records/__init__.py,sha256=iDHsvtvZdOknlcSUfOPRp7Ob5xSrOfOahu3gpuMUuw4,2462
|
|
56
|
+
glpi_python_client/content/records/core/__init__.py,sha256=jx4NnwYVJhM5AID6KKPczKs8_bcwggRSqwbaETzqx7o,220
|
|
57
|
+
glpi_python_client/content/records/core/document_links.py,sha256=697XIJYpLCB7eCx6dH27ldClDdeAuEilwk6Js1ijSnY,3740
|
|
58
|
+
glpi_python_client/content/records/core/normalization.py,sha256=knCtaOUUBtOXrGiulucLptO9DJb8_p7-b5ptF3WyUZM,1667
|
|
59
|
+
glpi_python_client/content/records/core/references.py,sha256=V-AmOTs73_JXPNUXkP3LzVRMptekBDVE09cXNBRAS7o,3116
|
|
60
|
+
glpi_python_client/content/records/core/scalars.py,sha256=EOyVl3qpJsp35iHiOc7ls4utC7yUixsUSIQ1UEqHoUE,2386
|
|
61
|
+
glpi_python_client/content/records/parsers/__init__.py,sha256=mWydfj2qLc6nYcZBABUX_wbGABmWXXEbxXNZ6d01Iqk,224
|
|
62
|
+
glpi_python_client/content/records/parsers/directory.py,sha256=egsf0gvU7ujEpOa4CseHKwyrq5tYrxvOU52GhsDa9ZU,2221
|
|
63
|
+
glpi_python_client/content/records/parsers/documents.py,sha256=zURfvAIP-Cd4Xqtd9nwhjxpjjU2CzZ5PSmtxMoBlB9Y,1676
|
|
64
|
+
glpi_python_client/content/records/parsers/team.py,sha256=a2C1GoboZi7Ii2gw1DhggVEC81lWwYzkkmMlM9WAd7U,2002
|
|
65
|
+
glpi_python_client/content/records/parsers/tickets.py,sha256=1FkLon1rqsDbzmtzYloBd8SKEMY6g7Q8P3GF2an-4aQ,3626
|
|
66
|
+
glpi_python_client/content/records/parsers/timeline.py,sha256=42_inUv38I70jpa_z76LxhsOxcg5tRClZFEMVdYsdkA,4715
|
|
67
|
+
glpi_python_client/content/records/parsers/tests/__init__.py,sha256=QEVA2HGrIodHyGIfN8LYwjscLrvujw2GyKg5WMZFIGY,190
|
|
68
|
+
glpi_python_client/content/records/parsers/tests/test_tickets.py,sha256=hnE1T-rMueLmdhdrGT_K_hlhiH2hpHaSwq-n0sw_bII,1073
|
|
69
|
+
glpi_python_client/content/records/parsers/tests/test_timeline.py,sha256=vUNHOgiLZAjNNpHTJCaEhMsqNUesqZk8aHZ2TgTXfNA,685
|
|
70
|
+
glpi_python_client/content/tests/__init__.py,sha256=JdUxM9egC0BznEOiBqbd_3lX415EodrRx6-5_pzEx6k,202
|
|
71
|
+
glpi_python_client/content/tests/test_conversion.py,sha256=bsO8aqOMLahkv3eYJxQIigTy6aIcs-9euZt6ZhNBY4c,456
|
|
72
|
+
glpi_python_client/models/__init__.py,sha256=a7OnNfX4wYfRW8pqu-XStPJmCvfL2LcTDMuGtM5uvq4,606
|
|
73
|
+
glpi_python_client/models/_base.py,sha256=gf9iXJ1rYVG6Cit_AXi_5HxNQ7XuNrk2wUhHeXnbung,621
|
|
74
|
+
glpi_python_client/models/_payload.py,sha256=p5LeaiWEgFWF7EFvMY4YsEF9RI5NINxKE_1Mq6e8oGU,2428
|
|
75
|
+
glpi_python_client/models/_shared.py,sha256=szmScMXIVHycJ9z5sLQ_ph_7zv-Qr_5LnISwwK7pHHI,918
|
|
76
|
+
glpi_python_client/models/glpi/__init__.py,sha256=fJDrq-W8nGTIScGIdgko4Ws8l3k5G8sepCvqfA00c1Q,916
|
|
77
|
+
glpi_python_client/models/glpi/_document.py,sha256=XA1Wdqq4XDx0nrtAJZIKlbIm4Rs5x3OJGEtw2GmLIKI,1806
|
|
78
|
+
glpi_python_client/models/glpi/_followup.py,sha256=VwrSqv65sl1xKQRoq5RGXtYSqiaxz4FulGXN1BXV5ks,2591
|
|
79
|
+
glpi_python_client/models/glpi/_location.py,sha256=45PtXEv3YyJPrB2u64c2wwL95Bc96kZmHFE_A9Fqiug,1318
|
|
80
|
+
glpi_python_client/models/glpi/_solution.py,sha256=cltVqyx6bymgLKiGbe1qJ0Im8ePs5ofWa8OWHrsh8Us,1718
|
|
81
|
+
glpi_python_client/models/glpi/_task.py,sha256=NTFMzx9C2UHGQPyaMtwOtz75PoI95Q46bfk9LCb6dFE,1104
|
|
82
|
+
glpi_python_client/models/glpi/_team_member.py,sha256=2JeC1M4S4jiZoMObQwIcAA_6odCI712rYu0T-PFpns8,826
|
|
83
|
+
glpi_python_client/models/glpi/_ticket.py,sha256=JjPSlJvWWbJGl-cmXftKkqHBAGXKN7Bzhuf06eohsqQ,10993
|
|
84
|
+
glpi_python_client/models/glpi/_user.py,sha256=Wsk9ru30-UUlfkRkID2q87HnWmlWGnsTE-P4eKT2wQM,2847
|
|
85
|
+
glpi_python_client/models/glpi/tests/__init__.py,sha256=WH59nDuhzrecSqvnvojtpeHgujwX-iBHaEAjPjGJjvM,194
|
|
86
|
+
glpi_python_client/models/glpi/tests/test__document.py,sha256=mkAVDvWY-R8G9OEEPiA8bHMKYb7aec1RS6iuoVlSWpA,374
|
|
87
|
+
glpi_python_client/models/glpi/tests/test__followup.py,sha256=JcSHlSyPQtiBRkZ-rH62WUaXJIW-u0uowrCswotpwPY,934
|
|
88
|
+
glpi_python_client/models/glpi/tests/test__location.py,sha256=jxw293UIIZRDaoD8Gg3Q-jJu_8MxN8YUlAObYCf8OXI,322
|
|
89
|
+
glpi_python_client/models/glpi/tests/test__solution.py,sha256=CJkl6hSt8aPkBygOLOqe_NJW3fp1jk9meFNMWt0aPR0,327
|
|
90
|
+
glpi_python_client/models/glpi/tests/test__ticket.py,sha256=PraCBnoixeqjIncoRSNsKOeWPe44u8TqGokl6BKBH4w,1541
|
|
91
|
+
glpi_python_client/models/glpi/tests/test__user.py,sha256=84MXB2cy1FKg-N7UFJ_QsXGn_XtMglm5fWPhcaJ5Kdk,826
|
|
92
|
+
glpi_python_client/testing/__init__.py,sha256=1xZyq7u_JKmo2_2WLajpQKSVx1akiA5nBXdrpROC5zM,616
|
|
93
|
+
glpi_python_client/testing/fixtures.py,sha256=HdFNQJrxaB0K8sUWVSFNHMR2_TZnYbqCZg-XZLBI5M0,1375
|
|
94
|
+
glpi_python_client/testing/utils.py,sha256=vD6t0j9OEbu_UjkrH9L-Z5UfppPS0VkfViwsk9jlKTs,4338
|
|
95
|
+
glpi_python_client-0.1.0.dist-info/METADATA,sha256=dAz4QRoSwkwP8_hlhDTwpj_tEGdLSip4TsxoV0X6Bjk,5195
|
|
96
|
+
glpi_python_client-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
97
|
+
glpi_python_client-0.1.0.dist-info/licenses/LICENSE,sha256=nL8re-TIKkxCoL7OkSBja6EB4NsQR1HoOJgxv_MEhtc,1088
|
|
98
|
+
glpi_python_client-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 glpi-python-client contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|