flespi-sdk 0.1.1__tar.gz → 0.1.3__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 (24) hide show
  1. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/PKG-INFO +2 -1
  2. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/README.md +1 -0
  3. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/pyproject.toml +4 -11
  4. flespi_sdk-0.1.3/src/flespi_sdk/exception.py +15 -0
  5. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/flespi_session.py +5 -1
  6. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/realms/realm.py +7 -0
  7. flespi_sdk-0.1.3/src/flespi_sdk/modules/realms/realm_home.py +50 -0
  8. flespi_sdk-0.1.3/src/flespi_sdk/modules/realms/realm_token_params.py +82 -0
  9. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/realms/users/user.py +19 -0
  10. flespi_sdk-0.1.3/uv.lock +513 -0
  11. flespi_sdk-0.1.1/uv.lock +0 -462
  12. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/.gitignore +0 -0
  13. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/.python-version +0 -0
  14. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/__init__.py +0 -0
  15. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/account.py +0 -0
  16. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/cli.py +0 -0
  17. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/__init__.py +0 -0
  18. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/item_with_metadata.py +0 -0
  19. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/items_container.py +0 -0
  20. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/metadata/__init__.py +0 -0
  21. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/mqtt/__init__.py +0 -0
  22. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/realms/__init__.py +0 -0
  23. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/realms/users/__init__.py +0 -0
  24. {flespi_sdk-0.1.1 → flespi_sdk-0.1.3}/src/flespi_sdk/modules/subaccounts/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flespi-sdk
3
- Version: 0.1.1
3
+ Version: 0.1.3
4
4
  Summary: Add your description here
5
5
  Author-email: Sergey Shevchik <sergey.shevchik@gmail.com>
6
6
  Requires-Python: >=3.11
@@ -84,4 +84,5 @@ await user.metadata.set_value("test-metadata-key", "123")
84
84
  print(await user.metadata.get())
85
85
  await user.metadata.delete_value("test-metadata-key")
86
86
  print(await user.metadata.get())
87
+ await user.update_password("newpassword123456789")
87
88
  ```
@@ -75,4 +75,5 @@ await user.metadata.set_value("test-metadata-key", "123")
75
75
  print(await user.metadata.get())
76
76
  await user.metadata.delete_value("test-metadata-key")
77
77
  print(await user.metadata.get())
78
+ await user.update_password("newpassword123456789")
78
79
  ```
@@ -1,22 +1,15 @@
1
1
  [project]
2
2
  name = "flespi-sdk"
3
- version = "0.1.1"
3
+ version = "0.1.3"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
- authors = [
7
- { name = "Sergey Shevchik", email = "sergey.shevchik@gmail.com" }
8
- ]
6
+ authors = [{ name = "Sergey Shevchik", email = "sergey.shevchik@gmail.com" }]
9
7
  requires-python = ">=3.11"
10
- dependencies = [
11
- "aiohttp>=3.11.15",
12
- ]
8
+ dependencies = ["aiohttp>=3.11.15"]
13
9
 
14
10
  [build-system]
15
11
  requires = ["hatchling"]
16
12
  build-backend = "hatchling.build"
17
13
 
18
14
  [dependency-groups]
19
- dev = [
20
- "mypy>=1.15.0",
21
- "ruff>=0.11.2",
22
- ]
15
+ dev = ["mypy>=1.15.0", "ruff>=0.11.2"]
@@ -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]
@@ -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,9 @@ class FlespiSession:
16
18
 
17
19
  async def get_result(self, response):
18
20
  if response.status != 200:
19
- raise Exception("Status code: " + str(response.status))
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
@@ -1,5 +1,7 @@
1
1
  from aiohttp import ClientSession
2
2
 
3
+ from flespi_sdk.modules.realms.realm_home import RealmHome
4
+ from flespi_sdk.modules.realms.realm_token_params import RealmTokenParams
3
5
  from flespi_sdk.modules.realms.users import Users
4
6
  from flespi_sdk.modules.item_with_metadata import ItemWithMetadata
5
7
 
@@ -19,3 +21,8 @@ class Realm(ItemWithMetadata):
19
21
  client_session=session,
20
22
  cid=cid,
21
23
  )
24
+
25
+ self.home = RealmHome(realm_id=realm_id, session=session, cid=cid)
26
+ self.token_params = RealmTokenParams(
27
+ realm_id=realm_id, session=session, cid=cid
28
+ )
@@ -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,3 +23,22 @@ class User(ItemWithMetadata):
23
23
  session=session,
24
24
  cid=cid,
25
25
  )
26
+
27
+ async def update_password(
28
+ self,
29
+ password: str,
30
+ ) -> None:
31
+ """
32
+ Updates the password of the user.
33
+
34
+ :param password: The new password for the user.
35
+ """
36
+ if len(password) < 16:
37
+ raise ValueError("Password must be at least 16 characters long")
38
+
39
+ async with self.session.put(
40
+ f"/platform/realms/{self.parent_id}/users/{self.id}",
41
+ json={"password": password},
42
+ headers=self.get_headers(),
43
+ ) as response:
44
+ await self.get_result(response)