flespi-sdk 0.1.0__tar.gz → 0.1.1__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.
@@ -0,0 +1,87 @@
1
+ Metadata-Version: 2.4
2
+ Name: flespi-sdk
3
+ Version: 0.1.1
4
+ Summary: Add your description here
5
+ Author-email: Sergey Shevchik <sergey.shevchik@gmail.com>
6
+ Requires-Python: >=3.11
7
+ Requires-Dist: aiohttp>=3.11.15
8
+ Description-Content-Type: text/markdown
9
+
10
+ # Install
11
+
12
+ ```
13
+ pip install flespi-sdk
14
+
15
+ ```
16
+
17
+ # Usage
18
+
19
+ ```python
20
+ from flespi_sdk.account import Account
21
+
22
+ # log into account
23
+ account = Account()
24
+ await account.set_token("<flespi-token>")
25
+ # or
26
+ # await account.realm_login("<realm-public-id>", "<realm-username>", "<realm-password>")
27
+
28
+ # use account
29
+
30
+ print("Metadata", await account.metadata.get())
31
+ print("Direct subaccount IDs", [subaccount.id for subaccount in await account.subaccounts.list()])
32
+ print("Flespi API counters", await account.mqtt.list("flespi/state/platform/customer/counters/api/#"))
33
+
34
+ ```
35
+
36
+ # Examples
37
+
38
+ ### Read emails from MQTT for all subaccounts (master token required)
39
+
40
+ ```python
41
+ from flespi_sdk.cli import get_account
42
+
43
+
44
+ async def main():
45
+ account = None
46
+ try:
47
+ account = await get_account()
48
+ subaccounts = await account.subaccounts.list()
49
+ for subaccount in subaccounts:
50
+ name = await subaccount.metadata.get_value("sys_user_config.title")
51
+ mqtt_msg = await subaccount.mqtt.get("flespi/state/platform/customer/email")
52
+ email = mqtt_msg["payload"]
53
+ print(f"Subaccount ID: {subaccount.id}, Name: {name}, Email: {email}")
54
+ except Exception as e:
55
+ print("Error:", e)
56
+ finally:
57
+ if account:
58
+ await account.stop()
59
+
60
+
61
+ if __name__ == "__main__":
62
+ import asyncio
63
+
64
+ asyncio.run(main())
65
+
66
+ ```
67
+
68
+ ### Manipulate realms and users
69
+
70
+ ```python
71
+ acc = Account()
72
+ await acc.set_token(acc_token)
73
+
74
+ realms = await acc.realms.list(selector="all")
75
+ for realm in realms:
76
+ print(realm.id, await realm.get_name(), await realm.metadata.get())
77
+ users = await realm.users.list()
78
+ for user in users:
79
+ print(user.id, await user.get_name(), await user.metadata.get())
80
+
81
+ realm = await acc.realms.get(22644)
82
+ user = await realm.users.get(90287)
83
+ await user.metadata.set_value("test-metadata-key", "123")
84
+ print(await user.metadata.get())
85
+ await user.metadata.delete_value("test-metadata-key")
86
+ print(await user.metadata.get())
87
+ ```
@@ -0,0 +1,78 @@
1
+ # Install
2
+
3
+ ```
4
+ pip install flespi-sdk
5
+
6
+ ```
7
+
8
+ # Usage
9
+
10
+ ```python
11
+ from flespi_sdk.account import Account
12
+
13
+ # log into account
14
+ account = Account()
15
+ await account.set_token("<flespi-token>")
16
+ # or
17
+ # await account.realm_login("<realm-public-id>", "<realm-username>", "<realm-password>")
18
+
19
+ # use account
20
+
21
+ print("Metadata", await account.metadata.get())
22
+ print("Direct subaccount IDs", [subaccount.id for subaccount in await account.subaccounts.list()])
23
+ print("Flespi API counters", await account.mqtt.list("flespi/state/platform/customer/counters/api/#"))
24
+
25
+ ```
26
+
27
+ # Examples
28
+
29
+ ### Read emails from MQTT for all subaccounts (master token required)
30
+
31
+ ```python
32
+ from flespi_sdk.cli import get_account
33
+
34
+
35
+ async def main():
36
+ account = None
37
+ try:
38
+ account = await get_account()
39
+ subaccounts = await account.subaccounts.list()
40
+ for subaccount in subaccounts:
41
+ name = await subaccount.metadata.get_value("sys_user_config.title")
42
+ mqtt_msg = await subaccount.mqtt.get("flespi/state/platform/customer/email")
43
+ email = mqtt_msg["payload"]
44
+ print(f"Subaccount ID: {subaccount.id}, Name: {name}, Email: {email}")
45
+ except Exception as e:
46
+ print("Error:", e)
47
+ finally:
48
+ if account:
49
+ await account.stop()
50
+
51
+
52
+ if __name__ == "__main__":
53
+ import asyncio
54
+
55
+ asyncio.run(main())
56
+
57
+ ```
58
+
59
+ ### Manipulate realms and users
60
+
61
+ ```python
62
+ acc = Account()
63
+ await acc.set_token(acc_token)
64
+
65
+ realms = await acc.realms.list(selector="all")
66
+ for realm in realms:
67
+ print(realm.id, await realm.get_name(), await realm.metadata.get())
68
+ users = await realm.users.list()
69
+ for user in users:
70
+ print(user.id, await user.get_name(), await user.metadata.get())
71
+
72
+ realm = await acc.realms.get(22644)
73
+ user = await realm.users.get(90287)
74
+ await user.metadata.set_value("test-metadata-key", "123")
75
+ print(await user.metadata.get())
76
+ await user.metadata.delete_value("test-metadata-key")
77
+ print(await user.metadata.get())
78
+ ```
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "flespi-sdk"
3
- version = "0.1.0"
3
+ version = "0.1.1"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -2,6 +2,7 @@ from aiohttp import ClientSession
2
2
 
3
3
  from flespi_sdk.modules.metadata import Metadata
4
4
  from flespi_sdk.modules.mqtt import MQTT
5
+ from flespi_sdk.modules.realms import Realms
5
6
  from flespi_sdk.modules.subaccounts import Subaccounts
6
7
 
7
8
 
@@ -70,6 +71,7 @@ class Account:
70
71
  self._init_modules()
71
72
 
72
73
  def _init_modules(self):
73
- self.metadata = Metadata(self.session, self.id)
74
+ self.metadata = Metadata("platform/customer", self.session, self.id)
74
75
  self.subaccounts = Subaccounts(self.session, self.id)
76
+ self.realms = Realms(self.session, self.id)
75
77
  self.mqtt = MQTT(self.session, self.id)
@@ -1,7 +1,7 @@
1
1
  from aiohttp import ClientSession
2
2
 
3
3
 
4
- class Module:
4
+ class FlespiSession:
5
5
  def __init__(self, session: ClientSession, cid: int | None = None):
6
6
  self.cid = cid
7
7
  self.session = session
@@ -0,0 +1,31 @@
1
+ from aiohttp import ClientSession
2
+ from flespi_sdk.modules.flespi_session import FlespiSession
3
+ from flespi_sdk.modules.metadata import Metadata
4
+
5
+
6
+ class ItemWithMetadata(FlespiSession):
7
+ def __init__(
8
+ self,
9
+ parent_id: int | None,
10
+ id: int,
11
+ item_path: str,
12
+ session: ClientSession,
13
+ cid: int | None = None,
14
+ ):
15
+ super().__init__(session, cid)
16
+ self.parent_id = parent_id
17
+ self.id = id
18
+ self.item_path = item_path
19
+ self.metadata = Metadata(item_path, session, cid)
20
+
21
+ async def get_name(self) -> str:
22
+ """
23
+ Get the name of the item.
24
+ :return: The name of the item.
25
+ """
26
+ async with self.session.get(
27
+ f"/{self.item_path}",
28
+ headers=self.get_headers(),
29
+ ) as response:
30
+ result = await self.get_result(response)
31
+ return result[0]["name"]
@@ -0,0 +1,42 @@
1
+ # from aiohttp import ClientSession
2
+ # from flespi_sdk.modules.realms.users.user import User
3
+ # from flespi_sdk.modules.flespi_session import FlespiSession
4
+
5
+
6
+ # class ItemsContainer(FlespiSession):
7
+ # """
8
+ # The RealmUsers class provides methods to manage users in a specific realm.
9
+ # It allows for the retrieval of user information and the management of user roles.
10
+ # """
11
+
12
+ # def __init__(
13
+ # self,
14
+ # items_path: str,
15
+ # item_class: type,
16
+ # client_session: ClientSession,
17
+ # cid: int | None = None,
18
+ # ):
19
+ # """
20
+ # Initializes the RealmUsers class with a client instance.
21
+
22
+ # :param client: The client instance used to make API requests.
23
+ # """
24
+ # super().__init__(client_session, cid)
25
+ # self.items_path = items_path
26
+ # self.itemClass = item_class
27
+
28
+ # async def list(self, selector: str = "all"):
29
+ # """
30
+ # List all users in the realm.
31
+ # :param selector: The selector to filter users.
32
+ # :return: A list of User objects.
33
+ # """
34
+ # async with self.session.get(
35
+ # f"{self.items_path}/{selector}",
36
+ # headers=self.get_headers(),
37
+ # ) as response:
38
+ # result = await self.get_result(response)
39
+ # return [
40
+ # self.itemClass(self.realm_id, user["id"], self.session, self.cid)
41
+ # for user in result
42
+ # ]
@@ -1,11 +1,14 @@
1
1
  import aiohttp
2
2
 
3
- from flespi_sdk.modules.subsystem import Module
3
+ from flespi_sdk.modules.flespi_session import FlespiSession
4
4
 
5
5
 
6
- class Metadata(Module):
7
- def __init__(self, session: aiohttp.ClientSession, cid: int | None = None):
6
+ class Metadata(FlespiSession):
7
+ def __init__(
8
+ self, item_path, session: aiohttp.ClientSession, cid: int | None = None
9
+ ):
8
10
  super().__init__(session, cid)
11
+ self.item_path = item_path
9
12
 
10
13
  async def get(self) -> dict:
11
14
  """
@@ -14,7 +17,7 @@ class Metadata(Module):
14
17
  """
15
18
  params = {"fields": "metadata"}
16
19
  async with self.session.get(
17
- "platform/customer", params=params, headers=self.get_headers()
20
+ self.item_path, params=params, headers=self.get_headers()
18
21
  ) as response:
19
22
  result = await self.get_result(response)
20
23
  return result[0]["metadata"]
@@ -25,7 +28,7 @@ class Metadata(Module):
25
28
  :param metadata: Metadata as a dictionary.
26
29
  """
27
30
  async with self.session.put(
28
- "platform/customer",
31
+ self.item_path,
29
32
  json={"metadata": metadata},
30
33
  headers=self.get_headers(),
31
34
  ) as response:
@@ -38,6 +41,8 @@ class Metadata(Module):
38
41
  :return: The value from the metadata.
39
42
  """
40
43
  metadata = await self.get()
44
+ if not metadata:
45
+ return None
41
46
  keys = key_path.split(".")
42
47
  value = metadata
43
48
  for key in keys:
@@ -53,14 +58,14 @@ class Metadata(Module):
53
58
  :param key_path: The key path to the value in the metadata.
54
59
  :param value: The value to set.
55
60
  """
56
- metadata = await self.get()
61
+ metadata = await self.get() or {}
57
62
  keys = key_path.split(".")
58
- d = metadata
63
+ metadata_level = metadata
59
64
  for key in keys[:-1]:
60
- if key not in d:
61
- d[key] = {}
62
- d = d[key]
63
- d[keys[-1]] = value
65
+ if key not in metadata_level:
66
+ metadata_level[key] = {}
67
+ metadata_level = metadata_level[key]
68
+ metadata_level[keys[-1]] = value
64
69
  await self.set(metadata)
65
70
 
66
71
  async def delete_value(self, key_path: str) -> None:
@@ -69,12 +74,14 @@ class Metadata(Module):
69
74
  :param key_path: The key path to the value in the metadata.
70
75
  """
71
76
  metadata = await self.get()
77
+ if not metadata:
78
+ return
72
79
  keys = key_path.split(".")
73
- value = metadata
80
+ metadata_level = metadata
74
81
  for key in keys[:-1]:
75
- if key in value:
76
- value = value[key]
82
+ if key in metadata_level:
83
+ metadata_level = metadata_level[key]
77
84
  else:
78
85
  return None
79
- del value[keys[-1]]
86
+ del metadata_level[keys[-1]]
80
87
  await self.set(metadata)
@@ -1,10 +1,10 @@
1
1
  import urllib.parse
2
2
 
3
3
  import aiohttp
4
- from flespi_sdk.modules.subsystem import Module
4
+ from flespi_sdk.modules.flespi_session import FlespiSession
5
5
 
6
6
 
7
- class MQTT(Module):
7
+ class MQTT(FlespiSession):
8
8
  def __init__(self, session: aiohttp.ClientSession, cid: int | None = None):
9
9
  super().__init__(session, cid)
10
10
 
@@ -0,0 +1,32 @@
1
+ import aiohttp
2
+
3
+ from flespi_sdk.modules.realms.realm import Realm
4
+ from flespi_sdk.modules.flespi_session import FlespiSession
5
+
6
+
7
+ class Realms(FlespiSession):
8
+ def __init__(self, session: aiohttp.ClientSession, cid: int | None = None):
9
+ super().__init__(session, cid)
10
+
11
+ async def get(self, id: int):
12
+ async with self.session.get(
13
+ f"/platform/realms/{id}", headers=self.get_headers()
14
+ ) as response:
15
+ result = await self.get_result(response)
16
+ realm = result[0]
17
+ return Realm(
18
+ realm_id=realm["id"],
19
+ session=self.session,
20
+ cid=self.cid,
21
+ )
22
+
23
+ async def list(self, selector: str = "all"):
24
+ async with self.session.get(
25
+ f"/platform/realms/{selector}",
26
+ headers=self.get_headers(),
27
+ ) as response:
28
+ result = await self.get_result(response)
29
+ return [
30
+ Realm(realm_id=realm["id"], session=self.session, cid=self.cid)
31
+ for realm in result
32
+ ]
@@ -0,0 +1,21 @@
1
+ from aiohttp import ClientSession
2
+
3
+ from flespi_sdk.modules.realms.users import Users
4
+ from flespi_sdk.modules.item_with_metadata import ItemWithMetadata
5
+
6
+
7
+ class Realm(ItemWithMetadata):
8
+ """
9
+ Represents a realm in the Flespi system.
10
+ """
11
+
12
+ def __init__(self, realm_id: int, session: ClientSession, cid: int | None = None):
13
+ item_path = f"platform/realms/{realm_id}"
14
+ super().__init__(
15
+ parent_id=None, id=realm_id, item_path=item_path, session=session, cid=cid
16
+ )
17
+ self.users = Users(
18
+ realm_id=realm_id,
19
+ client_session=session,
20
+ cid=cid,
21
+ )
@@ -0,0 +1,53 @@
1
+ from aiohttp import ClientSession
2
+ from flespi_sdk.modules.realms.users.user import User
3
+ from flespi_sdk.modules.flespi_session import FlespiSession
4
+
5
+
6
+ class Users(FlespiSession):
7
+ """
8
+ The RealmUsers class provides methods to manage users in a specific realm.
9
+ It allows for the retrieval of user information and the management of user roles.
10
+ """
11
+
12
+ def __init__(
13
+ self,
14
+ realm_id: int,
15
+ client_session: ClientSession,
16
+ cid: int | None = None,
17
+ ):
18
+ """
19
+ Initializes the RealmUsers class with a client instance.
20
+
21
+ :param client: The client instance used to make API requests.
22
+ """
23
+ super().__init__(client_session, cid)
24
+ self.realm_id = realm_id
25
+
26
+ async def get(self, user_id: int) -> User:
27
+ """
28
+ Get a user by ID.
29
+ :param user_id: The ID of the user to retrieve.
30
+ :return: A User object.
31
+ """
32
+ async with self.session.get(
33
+ f"/platform/realms/{self.realm_id}/users/{user_id}",
34
+ headers=self.get_headers(),
35
+ ) as response:
36
+ result = await self.get_result(response)
37
+ return User(self.realm_id, result[0]["id"], self.session, self.cid)
38
+
39
+ async def list(self, selector: str = "all") -> list[User]:
40
+ """
41
+ List all users in the realm.
42
+ :param selector: The selector to filter users.
43
+ :return: A list of User objects.
44
+ """
45
+ async with self.session.get(
46
+ f"/platform/realms/{self.realm_id}/users/{selector}",
47
+ headers=self.get_headers(),
48
+ ) as response:
49
+ result = await self.get_result(response)
50
+ return [
51
+ User(self.realm_id, user["id"], self.session, self.cid)
52
+ for user in result
53
+ ]
@@ -0,0 +1,25 @@
1
+ from aiohttp import ClientSession
2
+ from flespi_sdk.modules.item_with_metadata import ItemWithMetadata
3
+
4
+
5
+ class User(ItemWithMetadata):
6
+ def __init__(
7
+ self,
8
+ realm_id: int,
9
+ user_id: int,
10
+ session: ClientSession,
11
+ cid: int | None = None,
12
+ ):
13
+ """
14
+ Initializes the RealmUsers class with a client instance.
15
+
16
+ :param client: The client instance used to make API requests.
17
+ """
18
+ item_path = f"platform/realms/{realm_id}/users/{user_id}"
19
+ super().__init__(
20
+ parent_id=realm_id,
21
+ id=user_id,
22
+ item_path=item_path,
23
+ session=session,
24
+ cid=cid,
25
+ )
@@ -1,13 +1,13 @@
1
1
  import aiohttp
2
2
 
3
- from flespi_sdk.modules.subsystem import Module
3
+ from flespi_sdk.modules.flespi_session import FlespiSession
4
4
 
5
5
 
6
- class Subaccounts(Module):
6
+ class Subaccounts(FlespiSession):
7
7
  def __init__(self, session: aiohttp.ClientSession, cid: int | None = None):
8
8
  super().__init__(session, cid)
9
9
 
10
- async def get_by_id(self, id: str):
10
+ async def get(self, id: str):
11
11
  from flespi_sdk.account import Account
12
12
 
13
13
  async with self.session.get(
flespi_sdk-0.1.0/PKG-INFO DELETED
@@ -1,7 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: flespi-sdk
3
- Version: 0.1.0
4
- Summary: Add your description here
5
- Author-email: Sergey Shevchik <sergey.shevchik@gmail.com>
6
- Requires-Python: >=3.11
7
- Requires-Dist: aiohttp>=3.11.15
File without changes
File without changes
File without changes
File without changes