nsarchive 3.0.0a2__py3-none-any.whl → 3.0.0a4__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.
- nsarchive/__init__.py +1 -1
- nsarchive/cls/entities.py +40 -60
- nsarchive/instances/_entities.py +81 -42
- {nsarchive-3.0.0a2.dist-info → nsarchive-3.0.0a4.dist-info}/METADATA +1 -1
- {nsarchive-3.0.0a2.dist-info → nsarchive-3.0.0a4.dist-info}/RECORD +7 -7
- {nsarchive-3.0.0a2.dist-info → nsarchive-3.0.0a4.dist-info}/LICENSE +0 -0
- {nsarchive-3.0.0a2.dist-info → nsarchive-3.0.0a4.dist-info}/WHEEL +0 -0
nsarchive/__init__.py
CHANGED
nsarchive/cls/entities.py
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
import requests
|
2
2
|
import time
|
3
3
|
import typing
|
4
|
-
import urllib
|
4
|
+
import urllib
|
5
|
+
import warnings
|
5
6
|
|
6
7
|
from .base import NSID
|
7
8
|
|
@@ -37,6 +38,7 @@ class PositionPermissions:
|
|
37
38
|
self.items = Permission("---r") # APPEND = vendre, MANAGE = gérer des items dont on n'est pas propriétaire (hors marketplace), EDIT = gérer des items dont on n'est pas propriétaire (dans le marketplace), READ = accéder au marketplace
|
38
39
|
self.laws = Permission() # APPEND = proposer un texte de loi, MANAGE = accepter ou refuser une proposition, EDIT = modifier un texte, READ = /
|
39
40
|
self.members = Permission("---r") # APPEND = créer des entités, MANAGE = modérer des entités (hors Discord), EDIT = modifier des entités, READ = voir le profil des entités
|
41
|
+
self.money = Permission("---r") # APPEND = créer des entités, MANAGE = modérer des entités (hors Discord), EDIT = modifier des entités, READ = voir le profil des entités
|
40
42
|
self.national_channel = Permission() # APPEND = prendre la parole sur la chaîne nationale, MANAGE = voir qui peut prendre la parole, EDIT = modifier le planning de la chaîne nationale, READ = /
|
41
43
|
self.organizations = Permission("---r") # APPEND = créer une nouvelle organisation, MANAGE = exécuter des actions administratives sur les organisations, EDIT = modifier des organisations, READ = voir le profil de n'importe quelle organisation
|
42
44
|
self.reports = Permission() # APPEND = déposer plainte, MANAGE = accépter ou refuser une plainte, EDIT = /, READ = accéder à des infos supplémentaires pour une plainte
|
@@ -69,10 +71,28 @@ class Position:
|
|
69
71
|
self.name: str = "Inconnue"
|
70
72
|
self.id = id
|
71
73
|
self.permissions: PositionPermissions = PositionPermissions()
|
74
|
+
self.manager_permissions: PositionPermissions = PositionPermissions()
|
75
|
+
|
76
|
+
self._url: str = ""
|
72
77
|
|
73
78
|
def __repr__(self):
|
74
79
|
return self.id
|
75
80
|
|
81
|
+
def update_permisions(self, **permissions: str):
|
82
|
+
query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in permissions.items())
|
83
|
+
|
84
|
+
res = requests.post(f"{self._url}/update_permissions?{query}", headers = default_headers)
|
85
|
+
|
86
|
+
if res.status_code == 200:
|
87
|
+
self.permissions.merge(permissions)
|
88
|
+
else:
|
89
|
+
res.raise_for_status()
|
90
|
+
|
91
|
+
def _load(self, _data: dict):
|
92
|
+
self.name = _data['name']
|
93
|
+
self.permissions.merge(_data['permissions'])
|
94
|
+
self.manager_permissions.merge(_data['manager_permissions'])
|
95
|
+
|
76
96
|
class Entity:
|
77
97
|
"""
|
78
98
|
Classe de référence pour les entités
|
@@ -170,7 +190,13 @@ class User(Entity):
|
|
170
190
|
|
171
191
|
self.xp: int = 0
|
172
192
|
self.boosts: dict[str, int] = {}
|
173
|
-
self.
|
193
|
+
self.votes: list[NSID] = []
|
194
|
+
|
195
|
+
def _load(self, _data: dict):
|
196
|
+
self.xp = _data['xp']
|
197
|
+
self.boosts = _data['boosts']
|
198
|
+
|
199
|
+
self.votes = [ NSID(vote) for vote in _data['votes'] ]
|
174
200
|
|
175
201
|
def get_level(self) -> None:
|
176
202
|
i = 0
|
@@ -255,37 +281,6 @@ class GroupInvite:
|
|
255
281
|
self.level: str = 0
|
256
282
|
self._expires: int = round(time.time()) + 604800
|
257
283
|
|
258
|
-
class Share:
|
259
|
-
"""
|
260
|
-
Action d'une entreprise
|
261
|
-
|
262
|
-
## Attributs
|
263
|
-
- owner: `NSID`\n
|
264
|
-
Identifiant du titulaire de l'action
|
265
|
-
- price: `int`\n
|
266
|
-
Prix de l'action
|
267
|
-
"""
|
268
|
-
|
269
|
-
def __getstate__(self) -> dict:
|
270
|
-
return {
|
271
|
-
"owner": self.owner,
|
272
|
-
"price": self.price
|
273
|
-
}
|
274
|
-
|
275
|
-
def __setstate__(self, state: dict):
|
276
|
-
self.owner: NSID = state['owner']
|
277
|
-
self.price: int = state['price']
|
278
|
-
|
279
|
-
def __init__(self, owner: NSID = NSID(0x0), price: int = 10):
|
280
|
-
self.owner: NSID = owner
|
281
|
-
self.price: int = price
|
282
|
-
|
283
|
-
def assign_owner(self, owner: NSID):
|
284
|
-
self.owner = owner
|
285
|
-
|
286
|
-
def set_price(self, price: int):
|
287
|
-
self.price = price
|
288
|
-
|
289
284
|
class Organization(Entity):
|
290
285
|
"""
|
291
286
|
Entité collective
|
@@ -308,13 +303,22 @@ class Organization(Entity):
|
|
308
303
|
super().__init__(NSID(id))
|
309
304
|
|
310
305
|
self.owner: Entity = User(NSID(0x0))
|
311
|
-
self.
|
306
|
+
self.avatar_url: str = self._url + '/avatar'
|
312
307
|
|
313
308
|
self.certifications: dict = {}
|
314
309
|
self.members: list[GroupMember] = []
|
315
310
|
self.invites: dict[GroupInvite] = []
|
316
311
|
|
317
|
-
|
312
|
+
def _load(self, _data: dict):
|
313
|
+
self.avatar_url = self._url + '/avatar'
|
314
|
+
|
315
|
+
for _member in _data['members']:
|
316
|
+
member = GroupMember(_member['id'])
|
317
|
+
member.permission_level = _member['level']
|
318
|
+
|
319
|
+
self.members.append(member)
|
320
|
+
|
321
|
+
self.certifications = _data['certifications']
|
318
322
|
|
319
323
|
def add_certification(self, certification: str, __expires: int = 2419200) -> None:
|
320
324
|
res = requests.post(f"{self._url}/add_certification?name={certification}&duration={__expires}", headers = default_headers)
|
@@ -364,29 +368,5 @@ class Organization(Entity):
|
|
364
368
|
def get_members_by_attr(self, attribute: str = "id") -> list[str]:
|
365
369
|
return [ member.__getattribute__(attribute) for member in self.members ]
|
366
370
|
|
367
|
-
def get_shares(self, include_worth: bool = False) -> dict[str, int] | dict[str, dict[str, int]]:
|
368
|
-
shares = {}
|
369
|
-
|
370
|
-
for share in self.parts:
|
371
|
-
if include_worth:
|
372
|
-
if share.owner in shares.keys():
|
373
|
-
shares[share.owner]['count'] += 1
|
374
|
-
shares[share.owner]['worth'] += share.price
|
375
|
-
else:
|
376
|
-
shares[share.owner] = {
|
377
|
-
'count': 1,
|
378
|
-
'worth': share.price
|
379
|
-
}
|
380
|
-
else:
|
381
|
-
if share.owner in shares.keys():
|
382
|
-
shares[share.owner] += 1
|
383
|
-
else:
|
384
|
-
shares[share.owner] = 1
|
385
|
-
|
386
|
-
return shares
|
387
|
-
|
388
371
|
def save_avatar(self, data: bytes = None):
|
389
|
-
|
390
|
-
return
|
391
|
-
|
392
|
-
self.avatar = data
|
372
|
+
pass
|
nsarchive/instances/_entities.py
CHANGED
@@ -51,53 +51,34 @@ class EntityInstance(Instance):
|
|
51
51
|
|
52
52
|
if _data is None: # ID inexistant chez les entités
|
53
53
|
return None
|
54
|
-
elif "xp" in _data.keys():
|
55
|
-
_data['_type'] = 'user'
|
56
|
-
elif "parts" in _data.keys():
|
57
|
-
_data['_type'] = 'organization'
|
58
|
-
else:
|
59
|
-
_data['_type'] = 'entity'
|
60
54
|
|
61
|
-
if _data['
|
55
|
+
if _data['_class'] == 'user':
|
62
56
|
entity = User(id)
|
63
57
|
entity._url = f"{self.url}/model/individuals/{id}"
|
64
58
|
|
65
|
-
entity.
|
66
|
-
|
67
|
-
|
68
|
-
entity.votes = [ NSID(vote) for vote in _data['votes'] ]
|
69
|
-
entity.groups = [ NSID(group) for group in _data['groups'] ]
|
70
|
-
elif _data['_type'] == 'organization':
|
59
|
+
entity._load(_data)
|
60
|
+
elif _data['_class'] == 'organization':
|
71
61
|
entity = Organization(id)
|
72
62
|
entity._url = f"{self.url}/model/organizations/{id}"
|
73
63
|
|
74
|
-
|
64
|
+
_owner = _data['owner']
|
75
65
|
|
76
|
-
if
|
77
|
-
entity.
|
66
|
+
if _owner['_class'] == 'individuals':
|
67
|
+
entity.owner = User(_owner['id'])
|
68
|
+
entity.owner._load(_owner)
|
69
|
+
elif _owner['class'] == 'organizations':
|
70
|
+
entity.owner = Organization(_owner['id'])
|
71
|
+
entity.owner._load(_owner)
|
78
72
|
else:
|
79
|
-
|
80
|
-
|
81
|
-
entity.owner = self.get_entity(NSID(_data['owner_id']))
|
82
|
-
|
83
|
-
for _member in _data['members']:
|
84
|
-
member = GroupMember(_member['id'])
|
85
|
-
member.permission_level = _member['level']
|
86
|
-
|
87
|
-
entity.append(member)
|
88
|
-
|
89
|
-
entity.parts = []
|
90
|
-
|
91
|
-
for attrs in _data['parts']:
|
92
|
-
owner = attrs["owner"]
|
93
|
-
entity.parts.extend(attrs['count'] * [ Share(NSID(owner), attrs['worth'] // attrs['count']) ])
|
73
|
+
entity.owner = self.get_entity(0x0)
|
94
74
|
|
95
|
-
entity.
|
75
|
+
entity._load(_data)
|
96
76
|
else:
|
97
77
|
entity = Entity(id)
|
78
|
+
entity._url = f"{self.url}/model/entities/{id}"
|
98
79
|
|
99
80
|
entity.name = _data['name']
|
100
|
-
entity.position
|
81
|
+
entity.position._load(_data['position']) # Métier si c'est un utilisateur, domaine professionnel si c'est un collectif
|
101
82
|
entity.registerDate = _data['register_date']
|
102
83
|
|
103
84
|
for key, value in _data.get('additional', {}).items():
|
@@ -106,8 +87,20 @@ class EntityInstance(Instance):
|
|
106
87
|
else:
|
107
88
|
entity.additional[key] = value
|
108
89
|
|
90
|
+
entity.position._url = f"{self.url}/positions/{id}"
|
91
|
+
|
109
92
|
return entity
|
110
93
|
|
94
|
+
def get_entity_groups(self, entity: User) -> list[Organization]:
|
95
|
+
print(entity._url)
|
96
|
+
res = requests.get(f"{entity._url}/groups", headers = self.default_headers)
|
97
|
+
|
98
|
+
if res.status_code == 200:
|
99
|
+
return res.json()
|
100
|
+
else:
|
101
|
+
res.raise_for_status()
|
102
|
+
return []
|
103
|
+
|
111
104
|
def save_entity(self, entity: Entity):
|
112
105
|
"""
|
113
106
|
Fonction permettant de créer ou modifier une entité.
|
@@ -137,7 +130,6 @@ class EntityInstance(Instance):
|
|
137
130
|
_data['owner_id'] = NSID(entity.owner.id) if entity.owner else NSID("0")
|
138
131
|
_data['members'] = []
|
139
132
|
_data['certifications'] = entity.certifications
|
140
|
-
_data['parts'] = entity.get_shares(True)
|
141
133
|
|
142
134
|
for member in entity.members:
|
143
135
|
_member = {
|
@@ -151,7 +143,7 @@ class EntityInstance(Instance):
|
|
151
143
|
elif type(entity) == User:
|
152
144
|
_data['xp'] = entity.xp
|
153
145
|
_data['boosts'] = entity.boosts
|
154
|
-
|
146
|
+
_data['votes'] = [ NSID(vote) for vote in entity.votes]
|
155
147
|
else:
|
156
148
|
return
|
157
149
|
|
@@ -191,20 +183,65 @@ class EntityInstance(Instance):
|
|
191
183
|
- `list[.Entity | .User | .Organization]`
|
192
184
|
"""
|
193
185
|
|
194
|
-
if "
|
195
|
-
if query["
|
196
|
-
del query["
|
186
|
+
if "_class" in query.keys():
|
187
|
+
if query["_class"] == "individuals":
|
188
|
+
del query["_class"]
|
197
189
|
_res = self.fetch('individuals', **query)
|
198
|
-
elif query["
|
199
|
-
del query["
|
190
|
+
elif query["_class"] == "organizations":
|
191
|
+
del query["_class"]
|
200
192
|
_res = self.fetch('organizations', **query)
|
201
193
|
else:
|
202
|
-
del query["
|
194
|
+
del query["_class"]
|
203
195
|
_res = self.fetch('entities', **query)
|
204
196
|
else:
|
205
197
|
_res = self.fetch('entities', **query)
|
206
198
|
|
207
|
-
|
199
|
+
res = []
|
200
|
+
|
201
|
+
for _entity in _res:
|
202
|
+
if _entity is None: continue
|
203
|
+
|
204
|
+
if _entity['_class'] == 'individuals':
|
205
|
+
entity = User(_entity["id"])
|
206
|
+
entity._url = f"{self.url}/model/individuals/{_entity['id']}"
|
207
|
+
|
208
|
+
entity._load(_entity)
|
209
|
+
elif _entity['_class'] == 'organizations':
|
210
|
+
entity = Organization(_entity["id"])
|
211
|
+
entity._url = f"{self.url}/model/organizations/{_entity['id']}"
|
212
|
+
|
213
|
+
_owner = _entity['owner']
|
214
|
+
if _owner['_class'] == 'individuals':
|
215
|
+
entity.owner = User(_owner['id'])
|
216
|
+
entity.owner._load(_owner)
|
217
|
+
elif _owner['class'] == 'organizations':
|
218
|
+
entity.owner = Organization(_owner['id'])
|
219
|
+
entity.owner._load(_owner)
|
220
|
+
else:
|
221
|
+
entity.owner = self.get_entity(0x0)
|
222
|
+
|
223
|
+
entity._load(_entity)
|
224
|
+
else:
|
225
|
+
entity = Entity(_entity["id"])
|
226
|
+
entity._url = f"{self.url}/model/organizations/{_entity['id']}"
|
227
|
+
|
228
|
+
entity.name = _entity['name']
|
229
|
+
entity.position._load(_entity['position'])
|
230
|
+
entity.registerDate = _entity['register_date']
|
231
|
+
|
232
|
+
for key, value in _entity.get('additional', {}).items():
|
233
|
+
if isinstance(value, str) and value.startswith('\n'):
|
234
|
+
entity.additional[key] = int(value[1:])
|
235
|
+
else:
|
236
|
+
entity.additional[key] = value
|
237
|
+
|
238
|
+
entity.position._url = f"{self.url}/positions/{_entity['id']}"
|
239
|
+
|
240
|
+
res.append(entity)
|
241
|
+
|
242
|
+
return res
|
243
|
+
|
244
|
+
|
208
245
|
|
209
246
|
def get_position(self, id: str) -> Position:
|
210
247
|
"""
|
@@ -224,7 +261,9 @@ class EntityInstance(Instance):
|
|
224
261
|
return None
|
225
262
|
|
226
263
|
position = Position(id)
|
264
|
+
position._url = f"{self.url}/positions/{id}"
|
227
265
|
position.name = _data['name']
|
228
266
|
position.permissions.merge(_data['permissions'])
|
267
|
+
position.manager_permissions.merge(_data['manager_permissions'])
|
229
268
|
|
230
269
|
return position
|
@@ -1,15 +1,15 @@
|
|
1
|
-
nsarchive/__init__.py,sha256=
|
1
|
+
nsarchive/__init__.py,sha256=_IK4p7rSwTN9GahaxnL4gkgXOCCkT0vMgBXbJY_MXVA,656
|
2
2
|
nsarchive/assets/default_avatar.png,sha256=n-4vG_WPke8LvbY3ZU6oA-H-OtRoIu7woKnRq9DCIlI,51764
|
3
3
|
nsarchive/cls/archives.py,sha256=3vyGOBZUE-B-G_QMJXRIPD0d-1O5z4wqv-2MRf5AQdA,2506
|
4
4
|
nsarchive/cls/base.py,sha256=R6ZD2_DVOvjTO6VZ0HteFWVmdW9fieyIpGF9P0PqYk4,7424
|
5
5
|
nsarchive/cls/economy.py,sha256=soe3ATrtQem-u80vz8nXfsn_3TqMdhpolyTxRenH2C0,2742
|
6
|
-
nsarchive/cls/entities.py,sha256=
|
6
|
+
nsarchive/cls/entities.py,sha256=cc76FSkigUm_ryT_tzLNIDj-TDIAOLtleXy9xutLvnc,14072
|
7
7
|
nsarchive/cls/republic.py,sha256=16NFNCkJxOeVRd6BoJ68AlrTESQgRfZ5FSFlNWTEdK0,4103
|
8
8
|
nsarchive/instances/_economy.py,sha256=kVIbsCIrctV5yA3nlnSEYkJ8Cuh74YnQKtntIXTqOY0,8892
|
9
|
-
nsarchive/instances/_entities.py,sha256=
|
9
|
+
nsarchive/instances/_entities.py,sha256=6diGZVdtCBgw3ybnx09nBMfLrA1zpNM0DZT7grxKHCo,9319
|
10
10
|
nsarchive/instances/_republic.py,sha256=M8k2rZJvQGzOyZlmqRDiB-d615hZOqD3kuRrgYP4JqA,12004
|
11
11
|
nsarchive/utils.py,sha256=qpQCZLlbVApOLtCI2ml54QwUld6K8fDxyBfwzofqXzw,610
|
12
|
-
nsarchive-3.0.
|
13
|
-
nsarchive-3.0.
|
14
|
-
nsarchive-3.0.
|
15
|
-
nsarchive-3.0.
|
12
|
+
nsarchive-3.0.0a4.dist-info/LICENSE,sha256=aFLFZg6LEJFpTlNQ8su3__jw4GfV-xWBmC1cePkKZVw,35802
|
13
|
+
nsarchive-3.0.0a4.dist-info/METADATA,sha256=nRgP7-B_I5F4wKUuh5-hWhiBh2euagI7ATpr7T3_NDY,657
|
14
|
+
nsarchive-3.0.0a4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
15
|
+
nsarchive-3.0.0a4.dist-info/RECORD,,
|
File without changes
|
File without changes
|