flespi-sdk 0.1.2__tar.gz → 0.1.4__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.
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/PKG-INFO +1 -1
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/pyproject.toml +1 -1
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/account.py +13 -2
- flespi_sdk-0.1.4/src/flespi_sdk/exception.py +15 -0
- flespi_sdk-0.1.4/src/flespi_sdk/modules/devices/__init__.py +41 -0
- flespi_sdk-0.1.4/src/flespi_sdk/modules/devices/device.py +21 -0
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/modules/flespi_session.py +8 -1
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/modules/item_with_metadata.py +22 -3
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/modules/metadata/__init__.py +18 -7
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/modules/realms/__init__.py +16 -5
- flespi_sdk-0.1.4/src/flespi_sdk/modules/realms/realm.py +37 -0
- flespi_sdk-0.1.4/src/flespi_sdk/modules/realms/realm_home.py +50 -0
- flespi_sdk-0.1.4/src/flespi_sdk/modules/realms/realm_token_params.py +82 -0
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/modules/realms/users/__init__.py +22 -5
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/modules/realms/users/user.py +9 -6
- flespi_sdk-0.1.4/uv.lock +513 -0
- flespi_sdk-0.1.2/src/flespi_sdk/modules/realms/realm.py +0 -21
- flespi_sdk-0.1.2/uv.lock +0 -462
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/.gitignore +0 -0
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/.python-version +0 -0
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/README.md +0 -0
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/__init__.py +0 -0
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/cli.py +0 -0
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/modules/__init__.py +0 -0
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/modules/items_container.py +0 -0
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/modules/mqtt/__init__.py +0 -0
- {flespi_sdk-0.1.2 → flespi_sdk-0.1.4}/src/flespi_sdk/modules/subaccounts/__init__.py +0 -0
@@ -1,5 +1,7 @@
|
|
1
1
|
from aiohttp import ClientSession
|
2
2
|
|
3
|
+
from flespi_sdk.exception import FlespiException
|
4
|
+
from flespi_sdk.modules.devices import Devices
|
3
5
|
from flespi_sdk.modules.metadata import Metadata
|
4
6
|
from flespi_sdk.modules.mqtt import MQTT
|
5
7
|
from flespi_sdk.modules.realms import Realms
|
@@ -60,7 +62,10 @@ class Account:
|
|
60
62
|
"/platform/customer", headers=dict(Authorization=f"FlespiToken {token}")
|
61
63
|
) as response:
|
62
64
|
if response.status != 200:
|
63
|
-
raise
|
65
|
+
raise FlespiException(
|
66
|
+
status_code=response.status,
|
67
|
+
errors=(await response.json())["errors"],
|
68
|
+
)
|
64
69
|
response_json = await response.json()
|
65
70
|
result = response_json["result"]
|
66
71
|
id = result[0]["id"]
|
@@ -71,7 +76,13 @@ class Account:
|
|
71
76
|
self._init_modules()
|
72
77
|
|
73
78
|
def _init_modules(self):
|
74
|
-
self.metadata = Metadata(
|
79
|
+
self.metadata = Metadata(
|
80
|
+
item_path="platform/customer",
|
81
|
+
metadata=None,
|
82
|
+
session=self.session,
|
83
|
+
cid=self.id,
|
84
|
+
)
|
75
85
|
self.subaccounts = Subaccounts(self.session, self.id)
|
76
86
|
self.realms = Realms(self.session, self.id)
|
77
87
|
self.mqtt = MQTT(self.session, self.id)
|
88
|
+
self.devices = Devices(self.session, self.id)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from dataclasses import dataclass
|
2
|
+
|
3
|
+
|
4
|
+
@dataclass
|
5
|
+
class FlespiError:
|
6
|
+
code: int
|
7
|
+
reason: str
|
8
|
+
id: int | None = None
|
9
|
+
selector: str | None = None
|
10
|
+
|
11
|
+
|
12
|
+
class FlespiException(Exception):
|
13
|
+
def __init__(self, status_code: int, errors: list[dict]):
|
14
|
+
self.status_code = status_code
|
15
|
+
self.errors = [FlespiError(**error) for error in errors]
|
@@ -0,0 +1,41 @@
|
|
1
|
+
from aiohttp import ClientSession
|
2
|
+
from flespi_sdk.modules.devices.device import Device
|
3
|
+
from flespi_sdk.modules.flespi_session import FlespiSession
|
4
|
+
|
5
|
+
|
6
|
+
class Devices(FlespiSession):
|
7
|
+
def __init__(self, session: ClientSession, cid: int | None = None):
|
8
|
+
super().__init__(session=session, cid=cid)
|
9
|
+
|
10
|
+
async def get(self, id: int, fields: list[str] = []):
|
11
|
+
async with self.session.get(
|
12
|
+
f"/gw/devices/{id}",
|
13
|
+
params=dict(fields=super().prepare_fields(fields)),
|
14
|
+
headers=self.get_headers(),
|
15
|
+
) as response:
|
16
|
+
result = await self.get_result(response)
|
17
|
+
device = result[0]
|
18
|
+
return Device(
|
19
|
+
id=device["id"],
|
20
|
+
metadata=device["metadata"],
|
21
|
+
fields={field: device[field] for field in fields},
|
22
|
+
session=self.session,
|
23
|
+
cid=self.cid,
|
24
|
+
)
|
25
|
+
|
26
|
+
async def list(self, selector: str = "all", fields: list[str] = []):
|
27
|
+
async with self.session.get(
|
28
|
+
f"/gw/devices/{selector}",
|
29
|
+
headers=self.get_headers(),
|
30
|
+
params=dict(fields=super().prepare_fields(fields)),
|
31
|
+
) as response:
|
32
|
+
return [
|
33
|
+
Device(
|
34
|
+
id=device["id"],
|
35
|
+
metadata=device["metadata"],
|
36
|
+
fields={field: device[field] for field in fields},
|
37
|
+
session=self.session,
|
38
|
+
cid=self.cid,
|
39
|
+
)
|
40
|
+
for device in await self.get_result(response)
|
41
|
+
]
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from aiohttp import ClientSession
|
2
|
+
from flespi_sdk.modules.item_with_metadata import ItemWithMetadata
|
3
|
+
|
4
|
+
|
5
|
+
class Device(ItemWithMetadata):
|
6
|
+
def __init__(
|
7
|
+
self,
|
8
|
+
id: int,
|
9
|
+
metadata: dict,
|
10
|
+
fields: dict,
|
11
|
+
session: ClientSession,
|
12
|
+
cid: int | None,
|
13
|
+
):
|
14
|
+
super().__init__(
|
15
|
+
id=id,
|
16
|
+
metadata=metadata,
|
17
|
+
fields=fields,
|
18
|
+
item_path=f"gw/devices/{id}",
|
19
|
+
session=session,
|
20
|
+
cid=cid,
|
21
|
+
)
|
@@ -1,5 +1,7 @@
|
|
1
1
|
from aiohttp import ClientSession
|
2
2
|
|
3
|
+
from flespi_sdk.exception import FlespiException
|
4
|
+
|
3
5
|
|
4
6
|
class FlespiSession:
|
5
7
|
def __init__(self, session: ClientSession, cid: int | None = None):
|
@@ -16,7 +18,12 @@ class FlespiSession:
|
|
16
18
|
|
17
19
|
async def get_result(self, response):
|
18
20
|
if response.status != 200:
|
19
|
-
raise
|
21
|
+
raise FlespiException(
|
22
|
+
status_code=response.status, errors=(await response.json())["errors"]
|
23
|
+
)
|
20
24
|
response_json = await response.json()
|
21
25
|
result = response_json["result"]
|
22
26
|
return result
|
27
|
+
|
28
|
+
def prepare_fields(self, fields: list[str] = []):
|
29
|
+
return ",".join(list(set(["id", "metadata"] + fields)))
|
@@ -6,17 +6,20 @@ from flespi_sdk.modules.metadata import Metadata
|
|
6
6
|
class ItemWithMetadata(FlespiSession):
|
7
7
|
def __init__(
|
8
8
|
self,
|
9
|
-
parent_id: int | None,
|
10
9
|
id: int,
|
11
10
|
item_path: str,
|
12
11
|
session: ClientSession,
|
12
|
+
metadata: dict | None = None,
|
13
|
+
fields: dict = {},
|
13
14
|
cid: int | None = None,
|
14
15
|
):
|
15
16
|
super().__init__(session, cid)
|
16
|
-
self.parent_id = parent_id
|
17
17
|
self.id = id
|
18
18
|
self.item_path = item_path
|
19
|
-
self.
|
19
|
+
self.initial_fields = fields
|
20
|
+
self.metadata = Metadata(
|
21
|
+
item_path=item_path, metadata=metadata, session=session, cid=cid
|
22
|
+
)
|
20
23
|
|
21
24
|
async def get_name(self) -> str:
|
22
25
|
"""
|
@@ -29,3 +32,19 @@ class ItemWithMetadata(FlespiSession):
|
|
29
32
|
) as response:
|
30
33
|
result = await self.get_result(response)
|
31
34
|
return result[0]["name"]
|
35
|
+
|
36
|
+
def get_initial_fields(self):
|
37
|
+
return self.initial_fields
|
38
|
+
|
39
|
+
async def get_fields(self, fields: list[str]) -> dict:
|
40
|
+
"""
|
41
|
+
Get fields for the current device.
|
42
|
+
:return: Dictionary with fields.
|
43
|
+
"""
|
44
|
+
async with self.session.get(
|
45
|
+
self.item_path,
|
46
|
+
params=dict(fields=fields),
|
47
|
+
headers=self.get_headers(),
|
48
|
+
) as response:
|
49
|
+
result = await self.get_result(response)
|
50
|
+
return result[0]
|
@@ -5,28 +5,39 @@ from flespi_sdk.modules.flespi_session import FlespiSession
|
|
5
5
|
|
6
6
|
class Metadata(FlespiSession):
|
7
7
|
def __init__(
|
8
|
-
self,
|
8
|
+
self,
|
9
|
+
item_path,
|
10
|
+
metadata: dict | None,
|
11
|
+
session: aiohttp.ClientSession,
|
12
|
+
cid: int | None,
|
9
13
|
):
|
10
14
|
super().__init__(session, cid)
|
11
15
|
self.item_path = item_path
|
16
|
+
self.metadata_cache = metadata
|
12
17
|
|
13
|
-
async def get(self) -> dict:
|
18
|
+
async def get(self, use_cache: bool = True) -> dict:
|
14
19
|
"""
|
15
20
|
Get metadata for the current account.
|
16
21
|
:return: Metadata as a dictionary.
|
17
22
|
"""
|
23
|
+
if self.metadata_cache and use_cache:
|
24
|
+
return self.metadata_cache
|
25
|
+
|
18
26
|
params = {"fields": "metadata"}
|
19
27
|
async with self.session.get(
|
20
28
|
self.item_path, params=params, headers=self.get_headers()
|
21
29
|
) as response:
|
22
30
|
result = await self.get_result(response)
|
23
|
-
|
31
|
+
metadata = result[0]["metadata"]
|
32
|
+
self.metadata_cache = metadata
|
33
|
+
return metadata
|
24
34
|
|
25
35
|
async def set(self, metadata: dict) -> None:
|
26
36
|
""" "
|
27
37
|
"Set metadata for the current account.
|
28
38
|
:param metadata: Metadata as a dictionary.
|
29
39
|
"""
|
40
|
+
self.metadata_cache = None
|
30
41
|
async with self.session.put(
|
31
42
|
self.item_path,
|
32
43
|
json={"metadata": metadata},
|
@@ -34,13 +45,13 @@ class Metadata(FlespiSession):
|
|
34
45
|
) as response:
|
35
46
|
await self.get_result(response)
|
36
47
|
|
37
|
-
async def get_value(self, key_path: str):
|
48
|
+
async def get_value(self, key_path: str, use_cache: bool = True):
|
38
49
|
"""
|
39
50
|
Get a specific value from the metadata.
|
40
51
|
:param key_path: The key path to the value in the metadata.
|
41
52
|
:return: The value from the metadata.
|
42
53
|
"""
|
43
|
-
metadata = await self.get()
|
54
|
+
metadata = await self.get(use_cache=use_cache)
|
44
55
|
if not metadata:
|
45
56
|
return None
|
46
57
|
keys = key_path.split(".")
|
@@ -58,7 +69,7 @@ class Metadata(FlespiSession):
|
|
58
69
|
:param key_path: The key path to the value in the metadata.
|
59
70
|
:param value: The value to set.
|
60
71
|
"""
|
61
|
-
metadata = await self.get() or {}
|
72
|
+
metadata = await self.get(use_cache=False) or {}
|
62
73
|
keys = key_path.split(".")
|
63
74
|
metadata_level = metadata
|
64
75
|
for key in keys[:-1]:
|
@@ -73,7 +84,7 @@ class Metadata(FlespiSession):
|
|
73
84
|
Delete a specific key from the metadata.
|
74
85
|
:param key_path: The key path to the value in the metadata.
|
75
86
|
"""
|
76
|
-
metadata = await self.get()
|
87
|
+
metadata = await self.get(use_cache=False)
|
77
88
|
if not metadata:
|
78
89
|
return
|
79
90
|
keys = key_path.split(".")
|
@@ -8,25 +8,36 @@ class Realms(FlespiSession):
|
|
8
8
|
def __init__(self, session: aiohttp.ClientSession, cid: int | None = None):
|
9
9
|
super().__init__(session, cid)
|
10
10
|
|
11
|
-
async def get(self, id: int):
|
11
|
+
async def get(self, id: int, fields: list[str] = []):
|
12
12
|
async with self.session.get(
|
13
|
-
f"/platform/realms/{id}",
|
13
|
+
f"/platform/realms/{id}",
|
14
|
+
params=dict(fields=super().prepare_fields(fields)),
|
15
|
+
headers=self.get_headers(),
|
14
16
|
) as response:
|
15
17
|
result = await self.get_result(response)
|
16
18
|
realm = result[0]
|
17
19
|
return Realm(
|
18
|
-
|
20
|
+
id=realm["id"],
|
21
|
+
metadata=realm["metadata"],
|
22
|
+
fields={field: realm[field] for field in fields},
|
19
23
|
session=self.session,
|
20
24
|
cid=self.cid,
|
21
25
|
)
|
22
26
|
|
23
|
-
async def list(self, selector: str = "all"):
|
27
|
+
async def list(self, selector: str = "all", fields: list[str] = []):
|
24
28
|
async with self.session.get(
|
25
29
|
f"/platform/realms/{selector}",
|
30
|
+
params=dict(fields=super().prepare_fields(fields)),
|
26
31
|
headers=self.get_headers(),
|
27
32
|
) as response:
|
28
33
|
result = await self.get_result(response)
|
29
34
|
return [
|
30
|
-
Realm(
|
35
|
+
Realm(
|
36
|
+
id=realm["id"],
|
37
|
+
metadata=realm["metadata"],
|
38
|
+
fields={field: realm[field] for field in fields},
|
39
|
+
session=self.session,
|
40
|
+
cid=self.cid,
|
41
|
+
)
|
31
42
|
for realm in result
|
32
43
|
]
|
@@ -0,0 +1,37 @@
|
|
1
|
+
from aiohttp import ClientSession
|
2
|
+
|
3
|
+
from flespi_sdk.modules.realms.realm_home import RealmHome
|
4
|
+
from flespi_sdk.modules.realms.realm_token_params import RealmTokenParams
|
5
|
+
from flespi_sdk.modules.realms.users import Users
|
6
|
+
from flespi_sdk.modules.item_with_metadata import ItemWithMetadata
|
7
|
+
|
8
|
+
|
9
|
+
class Realm(ItemWithMetadata):
|
10
|
+
"""
|
11
|
+
Represents a realm in the Flespi system.
|
12
|
+
"""
|
13
|
+
|
14
|
+
def __init__(
|
15
|
+
self,
|
16
|
+
id: int,
|
17
|
+
metadata: dict,
|
18
|
+
fields: dict,
|
19
|
+
session: ClientSession,
|
20
|
+
cid: int | None = None,
|
21
|
+
):
|
22
|
+
super().__init__(
|
23
|
+
id=id,
|
24
|
+
item_path=f"platform/realms/{id}",
|
25
|
+
metadata=metadata,
|
26
|
+
fields=fields,
|
27
|
+
session=session,
|
28
|
+
cid=cid,
|
29
|
+
)
|
30
|
+
self.users = Users(
|
31
|
+
realm_id=id,
|
32
|
+
client_session=session,
|
33
|
+
cid=cid,
|
34
|
+
)
|
35
|
+
|
36
|
+
self.home = RealmHome(realm_id=id, session=session, cid=cid)
|
37
|
+
self.token_params = RealmTokenParams(realm_id=id, session=session, cid=cid)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
from aiohttp import ClientSession
|
2
|
+
from flespi_sdk.modules.flespi_session import FlespiSession
|
3
|
+
|
4
|
+
|
5
|
+
class RealmHome(FlespiSession):
|
6
|
+
def __init__(
|
7
|
+
self,
|
8
|
+
realm_id: int,
|
9
|
+
session: ClientSession,
|
10
|
+
cid: int | None = None,
|
11
|
+
):
|
12
|
+
super().__init__(session, cid)
|
13
|
+
self.realm_id = realm_id
|
14
|
+
|
15
|
+
async def get(self):
|
16
|
+
params = {"fields": "home"}
|
17
|
+
async with self.session.get(
|
18
|
+
f"/platform/realms/{self.realm_id}",
|
19
|
+
params=params,
|
20
|
+
headers=self.get_headers(),
|
21
|
+
) as response:
|
22
|
+
result = await self.get_result(response)
|
23
|
+
return result[0]["home"]
|
24
|
+
|
25
|
+
async def set(self, data: dict):
|
26
|
+
response = await self.session.put(
|
27
|
+
f"/platform/realms/{self.realm_id}",
|
28
|
+
json={"home": data},
|
29
|
+
headers=self.get_headers(),
|
30
|
+
)
|
31
|
+
return await self.get_result(response)
|
32
|
+
|
33
|
+
async def set_current_subaccount(self):
|
34
|
+
data = {"type": 0}
|
35
|
+
await self.set(data)
|
36
|
+
|
37
|
+
async def set_existing_subaccount(self, subaccount_id: int):
|
38
|
+
data = {"type": 1, "subaccount_id": subaccount_id}
|
39
|
+
await self.set(data)
|
40
|
+
|
41
|
+
async def set_create_new_subaccount(
|
42
|
+
self, subaccount_id: int | None = None, limit_id: int | None = None
|
43
|
+
):
|
44
|
+
data = {"type": 2}
|
45
|
+
if subaccount_id:
|
46
|
+
data["subaccount_id"] = subaccount_id
|
47
|
+
if limit_id:
|
48
|
+
data["limit_id"] = limit_id
|
49
|
+
|
50
|
+
await self.set(data)
|
@@ -0,0 +1,82 @@
|
|
1
|
+
from aiohttp import ClientSession
|
2
|
+
|
3
|
+
from flespi_sdk.modules.flespi_session import FlespiSession
|
4
|
+
|
5
|
+
|
6
|
+
class RealmTokenParams(FlespiSession):
|
7
|
+
def __init__(self, realm_id: int, session: ClientSession, cid: int | None = None):
|
8
|
+
super().__init__(session, cid)
|
9
|
+
self.realm_id = realm_id
|
10
|
+
|
11
|
+
async def get(self):
|
12
|
+
params = {"fields": "token_params"}
|
13
|
+
async with self.session.get(
|
14
|
+
f"platform/realms/{self.realm_id}",
|
15
|
+
params=params,
|
16
|
+
headers=self.get_headers(),
|
17
|
+
) as response:
|
18
|
+
return (await self.get_result(response))[0]["token_params"]
|
19
|
+
|
20
|
+
async def set(self, data: dict):
|
21
|
+
response = await self.session.put(
|
22
|
+
f"platform/realms/{self.realm_id}",
|
23
|
+
json={"token_params": data},
|
24
|
+
headers=self.get_headers(),
|
25
|
+
)
|
26
|
+
return await self.get_result(response)
|
27
|
+
|
28
|
+
async def set_ttl(self, seconds: int):
|
29
|
+
token_params = await self.get()
|
30
|
+
if token_params["ttl"] == seconds:
|
31
|
+
return
|
32
|
+
token_params["ttl"] = seconds
|
33
|
+
await self.set(token_params)
|
34
|
+
|
35
|
+
async def set_ip_addresses(self, ip_addresses: list[str]):
|
36
|
+
token_params = await self.get()
|
37
|
+
ip_addresses_csv = ",".join(ip_addresses)
|
38
|
+
if "ips" in token_params and token_params["ips"] == ip_addresses_csv:
|
39
|
+
return
|
40
|
+
token_params["ips"] = ip_addresses_csv
|
41
|
+
await self.set(token_params)
|
42
|
+
|
43
|
+
async def allow_all_origins(self):
|
44
|
+
token_params = await self.get()
|
45
|
+
if "origins" in token_params and token_params["origins"] == "*":
|
46
|
+
return
|
47
|
+
token_params["origins"] = "*"
|
48
|
+
await self.set(token_params)
|
49
|
+
|
50
|
+
async def set_origins(self, origins: list[str], allow_flespi_origins: bool = False):
|
51
|
+
token_params = await self.get()
|
52
|
+
token_params["origins"] = origins.copy()
|
53
|
+
if allow_flespi_origins:
|
54
|
+
token_params["origins"].append({"preset": "flespi"})
|
55
|
+
await self.set(token_params)
|
56
|
+
|
57
|
+
async def set_standard_access(self):
|
58
|
+
token_params = await self.get()
|
59
|
+
if token_params["access"]["type"] == 0:
|
60
|
+
return
|
61
|
+
token_params["access"] = {"type": 0}
|
62
|
+
await self.set(token_params)
|
63
|
+
|
64
|
+
async def set_master_access(self):
|
65
|
+
token_params = await self.get()
|
66
|
+
if token_params["access"]["type"] == 1:
|
67
|
+
return
|
68
|
+
token_params["access"] = {"type": 1}
|
69
|
+
await self.set(token_params)
|
70
|
+
|
71
|
+
async def set_acl_access(
|
72
|
+
self, acl: list[dict] = [], templating: bool | None = None
|
73
|
+
):
|
74
|
+
token_params = await self.get()
|
75
|
+
access = {
|
76
|
+
"type": 2,
|
77
|
+
"acl": acl,
|
78
|
+
}
|
79
|
+
if templating is not None:
|
80
|
+
access["templating"] = templating
|
81
|
+
token_params["access"] = access
|
82
|
+
await self.set(token_params)
|
@@ -23,20 +23,29 @@ class Users(FlespiSession):
|
|
23
23
|
super().__init__(client_session, cid)
|
24
24
|
self.realm_id = realm_id
|
25
25
|
|
26
|
-
async def get(self,
|
26
|
+
async def get(self, id: int, fields: list[str] = []) -> User:
|
27
27
|
"""
|
28
28
|
Get a user by ID.
|
29
29
|
:param user_id: The ID of the user to retrieve.
|
30
30
|
:return: A User object.
|
31
31
|
"""
|
32
32
|
async with self.session.get(
|
33
|
-
f"/platform/realms/{self.realm_id}/users/{
|
33
|
+
f"/platform/realms/{self.realm_id}/users/{id}",
|
34
|
+
params=dict(fields=super().prepare_fields(fields)),
|
34
35
|
headers=self.get_headers(),
|
35
36
|
) as response:
|
36
37
|
result = await self.get_result(response)
|
37
|
-
|
38
|
+
user = result[0]
|
39
|
+
return User(
|
40
|
+
id=user["id"],
|
41
|
+
realm_id=self.realm_id,
|
42
|
+
metadata=user["metadata"],
|
43
|
+
fields={field: user[field] for field in fields},
|
44
|
+
session=self.session,
|
45
|
+
cid=self.cid,
|
46
|
+
)
|
38
47
|
|
39
|
-
async def list(self, selector: str = "all") -> list[User]:
|
48
|
+
async def list(self, selector: str = "all", fields: list[str] = []) -> list[User]:
|
40
49
|
"""
|
41
50
|
List all users in the realm.
|
42
51
|
:param selector: The selector to filter users.
|
@@ -44,10 +53,18 @@ class Users(FlespiSession):
|
|
44
53
|
"""
|
45
54
|
async with self.session.get(
|
46
55
|
f"/platform/realms/{self.realm_id}/users/{selector}",
|
56
|
+
params=dict(fields=super().prepare_fields(fields)),
|
47
57
|
headers=self.get_headers(),
|
48
58
|
) as response:
|
49
59
|
result = await self.get_result(response)
|
50
60
|
return [
|
51
|
-
User(
|
61
|
+
User(
|
62
|
+
id=user["id"],
|
63
|
+
realm_id=self.realm_id,
|
64
|
+
metadata=user["metadata"],
|
65
|
+
fields={field: user[field] for field in fields},
|
66
|
+
session=self.session,
|
67
|
+
cid=self.cid,
|
68
|
+
)
|
52
69
|
for user in result
|
53
70
|
]
|
@@ -5,8 +5,10 @@ from flespi_sdk.modules.item_with_metadata import ItemWithMetadata
|
|
5
5
|
class User(ItemWithMetadata):
|
6
6
|
def __init__(
|
7
7
|
self,
|
8
|
+
id: int,
|
8
9
|
realm_id: int,
|
9
|
-
|
10
|
+
metadata: dict,
|
11
|
+
fields: dict,
|
10
12
|
session: ClientSession,
|
11
13
|
cid: int | None = None,
|
12
14
|
):
|
@@ -15,11 +17,12 @@ class User(ItemWithMetadata):
|
|
15
17
|
|
16
18
|
:param client: The client instance used to make API requests.
|
17
19
|
"""
|
18
|
-
|
20
|
+
self.realm_id = realm_id
|
19
21
|
super().__init__(
|
20
|
-
|
21
|
-
id
|
22
|
-
|
22
|
+
id=id,
|
23
|
+
item_path=f"platform/realms/{realm_id}/users/{id}",
|
24
|
+
metadata=metadata,
|
25
|
+
fields=fields,
|
23
26
|
session=session,
|
24
27
|
cid=cid,
|
25
28
|
)
|
@@ -37,7 +40,7 @@ class User(ItemWithMetadata):
|
|
37
40
|
raise ValueError("Password must be at least 16 characters long")
|
38
41
|
|
39
42
|
async with self.session.put(
|
40
|
-
|
43
|
+
self.item_path,
|
41
44
|
json={"password": password},
|
42
45
|
headers=self.get_headers(),
|
43
46
|
) as response:
|