nsarchive 3.0.0a6__py3-none-any.whl → 3.0.0a8__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 +15 -10
- nsarchive/{instances → interfaces}/_economy.py +15 -30
- nsarchive/interfaces/_entities.py +206 -0
- nsarchive/interfaces/_justice.py +50 -0
- nsarchive/interfaces/_state.py +142 -0
- nsarchive/mandate.py +50 -0
- nsarchive/{cls → models}/base.py +23 -5
- nsarchive/{cls → models}/economy.py +34 -13
- nsarchive/{cls → models}/entities.py +139 -72
- nsarchive/models/justice.py +108 -0
- nsarchive/models/republic.py +125 -0
- nsarchive/models/scale.py +23 -0
- nsarchive/models/state.py +59 -0
- {nsarchive-3.0.0a6.dist-info → nsarchive-3.0.0a8.dist-info}/METADATA +3 -2
- nsarchive-3.0.0a8.dist-info/RECORD +19 -0
- {nsarchive-3.0.0a6.dist-info → nsarchive-3.0.0a8.dist-info}/WHEEL +1 -1
- nsarchive/cls/archives.py +0 -93
- nsarchive/cls/republic.py +0 -149
- nsarchive/instances/_entities.py +0 -269
- nsarchive/instances/_republic.py +0 -339
- nsarchive-3.0.0a6.dist-info/RECORD +0 -15
- {nsarchive-3.0.0a6.dist-info → nsarchive-3.0.0a8.dist-info}/LICENSE +0 -0
@@ -4,7 +4,6 @@ import urllib
|
|
4
4
|
|
5
5
|
from .base import NSID
|
6
6
|
|
7
|
-
default_headers = {}
|
8
7
|
|
9
8
|
class BankAccount:
|
10
9
|
"""
|
@@ -27,6 +26,7 @@ class BankAccount:
|
|
27
26
|
|
28
27
|
def __init__(self, owner_id: NSID) -> None:
|
29
28
|
self._url: str = ""
|
29
|
+
self._headers: dict = {}
|
30
30
|
|
31
31
|
self.id: NSID = NSID(owner_id)
|
32
32
|
self.owner_id: NSID = NSID(owner_id)
|
@@ -40,7 +40,12 @@ class BankAccount:
|
|
40
40
|
self.frozen: bool = False
|
41
41
|
self.flagged: bool = False
|
42
42
|
|
43
|
-
def _load(self, _data: dict):
|
43
|
+
def _load(self, _data: dict, url: str, headers: dict) -> None:
|
44
|
+
self._url = url + '/bank/accounts/' + _data['id']
|
45
|
+
self._headers = headers
|
46
|
+
|
47
|
+
self.id = NSID(_data['id'])
|
48
|
+
|
44
49
|
self.owner_id = NSID(_data['owner_id'])
|
45
50
|
self.register_date = _data['register_date']
|
46
51
|
self.tag = _data['tag']
|
@@ -53,7 +58,7 @@ class BankAccount:
|
|
53
58
|
self.flagged = _data['flagged']
|
54
59
|
|
55
60
|
def freeze(self, frozen: bool = True, reason: str = None) -> None:
|
56
|
-
res = requests.post(f"{self._url}/freeze?frozen={str(frozen).lower()}", headers =
|
61
|
+
res = requests.post(f"{self._url}/freeze?frozen={str(frozen).lower()}", headers = self._headers, json = {
|
57
62
|
"reason": reason
|
58
63
|
})
|
59
64
|
|
@@ -64,7 +69,7 @@ class BankAccount:
|
|
64
69
|
res.raise_for_status()
|
65
70
|
|
66
71
|
def flag(self, flagged: bool = True, reason: str = None) -> None:
|
67
|
-
res = requests.post(f"{self._url}/flag?flagged={str(flagged).lower()}", headers =
|
72
|
+
res = requests.post(f"{self._url}/flag?flagged={str(flagged).lower()}", headers = self._headers, json = {
|
68
73
|
"reason": reason
|
69
74
|
})
|
70
75
|
|
@@ -77,7 +82,7 @@ class BankAccount:
|
|
77
82
|
_target_query = f"&target={target}"
|
78
83
|
_loan_query = f"&loan_id={loan}"
|
79
84
|
|
80
|
-
res = requests.post(f"{self._url}/debit?amount={amount}{_target_query if target else ''}{_loan_query if loan else ''}", headers =
|
85
|
+
res = requests.post(f"{self._url}/debit?amount={amount}{_target_query if target else ''}{_loan_query if loan else ''}", headers = self._headers, json = {
|
81
86
|
"reason": reason,
|
82
87
|
"digicode": digicode
|
83
88
|
})
|
@@ -88,7 +93,7 @@ class BankAccount:
|
|
88
93
|
res.raise_for_status()
|
89
94
|
|
90
95
|
def deposit(self, amount: int, reason: str = None) -> None:
|
91
|
-
res = requests.post(f"{self._url}/deposit?amount={amount}", headers =
|
96
|
+
res = requests.post(f"{self._url}/deposit?amount={amount}", headers = self._headers, json = {
|
92
97
|
"reason": reason,
|
93
98
|
})
|
94
99
|
|
@@ -111,20 +116,28 @@ class Item:
|
|
111
116
|
"""
|
112
117
|
|
113
118
|
def __init__(self) -> None:
|
119
|
+
self._url: str = ""
|
120
|
+
self._headers: dict = {}
|
121
|
+
|
114
122
|
self.id: NSID = NSID(round(time.time()))
|
115
123
|
self.name: str = "Unknown Object"
|
116
124
|
self.emoji: str = ":light_bulb:"
|
117
125
|
self.category: str = "common"
|
118
126
|
self.craft: dict = {}
|
119
127
|
|
120
|
-
def _load(self, _data: dict):
|
128
|
+
def _load(self, _data: dict, url: str, headers: dict) -> None:
|
129
|
+
self._url = url + '/marketplace/items/' + _data['id']
|
130
|
+
self._headers = headers
|
131
|
+
|
132
|
+
self.id = NSID(_data['id'])
|
133
|
+
|
121
134
|
self.name = _data['name']
|
122
135
|
self.emoji = _data['emoji']
|
123
136
|
self.category = _data['category']
|
124
137
|
self.craft = _data['craft']
|
125
138
|
|
126
139
|
def rename(self, new_name: str):
|
127
|
-
res = requests.post(f"{self._url}/rename?name={new_name}", headers =
|
140
|
+
res = requests.post(f"{self._url}/rename?name={new_name}", headers = self._headers)
|
128
141
|
|
129
142
|
if res.status_code == 200:
|
130
143
|
self.name = new_name
|
@@ -150,6 +163,7 @@ class Sale:
|
|
150
163
|
|
151
164
|
def __init__(self, item: Item) -> None:
|
152
165
|
self._url: str = ""
|
166
|
+
self._headers: dict = {}
|
153
167
|
|
154
168
|
self.id: NSID = NSID(round(time.time()))
|
155
169
|
self.open: bool = True
|
@@ -159,8 +173,11 @@ class Sale:
|
|
159
173
|
self.quantity: int = 1
|
160
174
|
self.price: int = 0
|
161
175
|
|
162
|
-
def _load(self, _data: dict):
|
163
|
-
self.
|
176
|
+
def _load(self, _data: dict, url: str, headers: dict) -> None:
|
177
|
+
self._url = url + '/marketplace/sales/' + _data['id']
|
178
|
+
self._headers = headers
|
179
|
+
|
180
|
+
self.id = _data['id']
|
164
181
|
self.open = _data['open']
|
165
182
|
self.seller_id = NSID(_data['seller_id'])
|
166
183
|
|
@@ -187,6 +204,7 @@ class Inventory:
|
|
187
204
|
|
188
205
|
def __init__(self, owner_id: NSID) -> None:
|
189
206
|
self._url: str = ""
|
207
|
+
self._headers: dict = {}
|
190
208
|
|
191
209
|
self.id: NSID = NSID(owner_id)
|
192
210
|
self.owner_id: NSID = NSID(owner_id)
|
@@ -196,7 +214,10 @@ class Inventory:
|
|
196
214
|
|
197
215
|
self.items: dict[NSID, int] = {}
|
198
216
|
|
199
|
-
def _load(self, _data: dict):
|
217
|
+
def _load(self, _data: dict, url: str, headers: dict):
|
218
|
+
self._url = url + '/bank/inventories/' + _data['id']
|
219
|
+
self._headers = headers
|
220
|
+
|
200
221
|
self.id = NSID(_data['id'])
|
201
222
|
self.owner_id = NSID(_data['owner_id'])
|
202
223
|
|
@@ -206,7 +227,7 @@ class Inventory:
|
|
206
227
|
self.items = _data['items']
|
207
228
|
|
208
229
|
def deposit_item(self, item: Item, giver: NSID = None, quantity: int = 1, digicode: str = None):
|
209
|
-
res = requests.post(f"{self._url}/deposit?item={item.id}&amount={quantity}", headers =
|
230
|
+
res = requests.post(f"{self._url}/deposit?item={item.id}&amount={quantity}", headers = self._headers, json = {
|
210
231
|
"giver": giver,
|
211
232
|
"digicode": digicode
|
212
233
|
})
|
@@ -220,7 +241,7 @@ class Inventory:
|
|
220
241
|
res.raise_for_status()
|
221
242
|
|
222
243
|
def sell_item(self, item: Item, price: int, quantity: int = 1, digicode: str = None) -> NSID:
|
223
|
-
res = requests.post(f"{self._url}/sell_item?item={item.id}&quantity={quantity}&price={price}", headers =
|
244
|
+
res = requests.post(f"{self._url}/sell_item?item={item.id}&quantity={quantity}&price={price}", headers = self._headers, json = {
|
224
245
|
"digicode": digicode
|
225
246
|
})
|
226
247
|
|
@@ -8,8 +8,6 @@ from .base import NSID
|
|
8
8
|
|
9
9
|
from .. import utils
|
10
10
|
|
11
|
-
default_headers = {}
|
12
|
-
|
13
11
|
class Permission:
|
14
12
|
def __init__(self, initial: str = "----"):
|
15
13
|
self.append: bool
|
@@ -31,7 +29,9 @@ class PositionPermissions:
|
|
31
29
|
"""
|
32
30
|
|
33
31
|
def __init__(self) -> None:
|
32
|
+
self.aliases = Permission() # APPEND = faire une requête au nom d'une autre entité, MANAGE = /, EDIT = /, READ = /
|
34
33
|
self.bots = Permission() # APPEND = /, MANAGE = proposer d'héberger un bot, EDIT = changer les paramètres d'un bot, READ = /
|
34
|
+
self.candidacies = Permission() # APPEND = se présenter à une élection, MANAGE = gérer les candidatures d'une élection, EDIT = modifier une candidature, READ = /
|
35
35
|
self.constitution = Permission() # APPEND = /, MANAGE = /, EDIT = modifier la constitution, READ = /
|
36
36
|
self.database = Permission() # APPEND = créer des sous-bases de données, MANAGE = gérer la base de données, EDIT = modifier les éléments, READ = avoir accès à toutes les données sans exception
|
37
37
|
self.inventories = Permission("a---") # APPEND = ouvrir un ou plusieurs comptes/inventaires, MANAGE = voir les infos globales concernant les comptes en banque ou inventaires, EDIT = gérer des comptes en banque (ou inventaires), READ = voir les infos d'un compte en banque ou inventaire
|
@@ -45,6 +45,7 @@ class PositionPermissions:
|
|
45
45
|
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
|
46
46
|
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
|
47
47
|
self.sales = Permission("---r") # APPEND = vendre, MANAGE = gérer les ventes, EDIT = modifier des ventes, READ = accéder au marketplace
|
48
|
+
self.sanctions = Permission() # APPEND = sanctionner un membre, MANAGE = gérer les sanctions d'un membre, EDIT = modifier une sanction, READ = accéder au casier d'un membre
|
48
49
|
self.state_budgets = Permission() # APPEND = débloquer un nouveau budget, MANAGE = gérer les budjets, EDIT = gérer les sommes pour chaque budjet, READ = accéder aux infos concernant les budgets
|
49
50
|
self.votes = Permission() # APPEND = déclencher un vote, MANAGE = fermer un vote, EDIT = /, READ = lire les propriétés d'un vote avant sa fermeture
|
50
51
|
|
@@ -62,21 +63,28 @@ class Position:
|
|
62
63
|
Position légale d'une entité
|
63
64
|
|
64
65
|
## Attributs
|
65
|
-
- name: `str`\n
|
66
|
-
Titre de la position
|
67
66
|
- id: `str`\n
|
68
67
|
Identifiant de la position
|
68
|
+
- name: `str`\n
|
69
|
+
Titre de la position
|
70
|
+
- is_global_scope: `str`\n
|
71
|
+
Permet de savoir si la position a des permissions en dehors de sa zone
|
69
72
|
- permissions: `.PositionPermissions`\n
|
70
73
|
Permissions accordées à l'utilisateur
|
74
|
+
- manager_permissions: `.PositionPermissions`\n
|
75
|
+
Permissions nécessaires pour gérer la position
|
71
76
|
"""
|
72
77
|
|
73
|
-
def __init__(self, id: str = '
|
74
|
-
self.
|
78
|
+
def __init__(self, id: str = 'member') -> None:
|
79
|
+
self._url: str = ""
|
80
|
+
self._headers: dict = {}
|
81
|
+
|
75
82
|
self.id = id
|
83
|
+
self.name: str = "Membre"
|
84
|
+
self.is_global_scope: bool = True
|
76
85
|
self.permissions: PositionPermissions = PositionPermissions()
|
77
86
|
self.manager_permissions: PositionPermissions = PositionPermissions()
|
78
87
|
|
79
|
-
self._url: str = ""
|
80
88
|
|
81
89
|
def __repr__(self):
|
82
90
|
return self.id
|
@@ -84,16 +92,20 @@ class Position:
|
|
84
92
|
def update_permisions(self, **permissions: str):
|
85
93
|
query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in permissions.items())
|
86
94
|
|
87
|
-
res = requests.post(f"{self._url}/update_permissions?{query}", headers =
|
95
|
+
res = requests.post(f"{self._url}/update_permissions?{query}", headers = self._headers)
|
88
96
|
|
89
97
|
if res.status_code == 200:
|
90
98
|
self.permissions.merge(permissions)
|
91
99
|
else:
|
92
100
|
res.raise_for_status()
|
93
101
|
|
94
|
-
def _load(self, _data: dict):
|
102
|
+
def _load(self, _data: dict, url: str, headers: dict) -> None:
|
103
|
+
self._url = url + '/model/positions/' + _data['id']
|
104
|
+
self._headers = headers
|
105
|
+
|
95
106
|
self.id = _data['id']
|
96
107
|
self.name = _data['name']
|
108
|
+
self.is_global_scope = _data['is_global_scope']
|
97
109
|
self.permissions.merge(_data['permissions'])
|
98
110
|
self.manager_permissions.merge(_data['manager_permissions'])
|
99
111
|
|
@@ -103,31 +115,51 @@ class Entity:
|
|
103
115
|
|
104
116
|
## Attributs
|
105
117
|
- id: `NSID`\n
|
106
|
-
Identifiant
|
118
|
+
Identifiant NSID
|
107
119
|
- name: `str`\n
|
108
|
-
Nom d'usage
|
109
|
-
-
|
110
|
-
Date d'enregistrement
|
120
|
+
Nom d'usage
|
121
|
+
- register_date: `int`\n
|
122
|
+
Date d'enregistrement
|
123
|
+
- zone: `int`:\n
|
124
|
+
Zone civile
|
111
125
|
- position: `.Position`\n
|
112
|
-
Position
|
126
|
+
Position civile
|
113
127
|
- additional: `dict`\n
|
114
|
-
Infos supplémentaires exploitables par
|
128
|
+
Infos supplémentaires exploitables par différents services
|
115
129
|
"""
|
116
130
|
|
117
131
|
def __init__(self, id: NSID) -> None:
|
118
|
-
self._url = "" # URL de l'entité pour une requête
|
132
|
+
self._url: str = "" # URL de l'entité pour une requête
|
133
|
+
self._headers: dict = {}
|
119
134
|
|
120
135
|
self.id: NSID = NSID(id) # ID hexadécimal de l'entité
|
121
136
|
self.name: str = "Entité Inconnue"
|
122
|
-
self.
|
137
|
+
self.register_date: int = 0
|
138
|
+
self.zone: int = 20 # 10 = Serveur test, 20 = Serveur principal, 30 = Serveur de patientage
|
123
139
|
self.position: Position = Position()
|
124
140
|
self.additional: dict = {}
|
125
141
|
|
142
|
+
def _load(self, _data: dict, url: str, headers: dict):
|
143
|
+
self._url = url + '/model/' + _data['_class'] + '/' + _data['id']
|
144
|
+
self._headers = headers
|
145
|
+
|
146
|
+
self.id = NSID(_data['id'])
|
147
|
+
self.name = _data['name']
|
148
|
+
self.register_date = _data['register_date']
|
149
|
+
self.zone = _data['zone']
|
150
|
+
self.position._load(_data['position'], url, headers)
|
151
|
+
|
152
|
+
for key, value in _data.get('additional', {}).items():
|
153
|
+
if isinstance(value, str) and value.startswith('\n'):
|
154
|
+
self.additional[key] = int(value[1:])
|
155
|
+
else:
|
156
|
+
self.additional[key] = value
|
157
|
+
|
126
158
|
def set_name(self, new_name: str) -> None:
|
127
159
|
if len(new_name) > 32:
|
128
160
|
raise ValueError(f"Name length mustn't exceed 32 characters.")
|
129
161
|
|
130
|
-
res = requests.post(f"{self._url}/rename?name={new_name}", headers =
|
162
|
+
res = requests.post(f"{self._url}/rename?name={new_name}", headers = self._headers)
|
131
163
|
|
132
164
|
if res.status_code == 200:
|
133
165
|
self.name = new_name
|
@@ -135,7 +167,7 @@ class Entity:
|
|
135
167
|
res.raise_for_status()
|
136
168
|
|
137
169
|
def set_position(self, position: Position) -> None:
|
138
|
-
res = requests.post(f"{self._url}/change_position?position={position.id}", headers =
|
170
|
+
res = requests.post(f"{self._url}/change_position?position={position.id}", headers = self._headers)
|
139
171
|
|
140
172
|
if res.status_code == 200:
|
141
173
|
self.position = position
|
@@ -158,7 +190,7 @@ class Entity:
|
|
158
190
|
|
159
191
|
query = "&".join(f"{k}={ urllib.parse.quote(v) }" for k, v in params.items())
|
160
192
|
|
161
|
-
res = requests.post(f"{self._url}/add_link?{query}", headers =
|
193
|
+
res = requests.post(f"{self._url}/add_link?{query}", headers = self._headers)
|
162
194
|
|
163
195
|
if res.status_code == 200:
|
164
196
|
self.additional[key] = value
|
@@ -167,7 +199,7 @@ class Entity:
|
|
167
199
|
res.raise_for_status()
|
168
200
|
|
169
201
|
def unlink(self, key: str) -> None:
|
170
|
-
res = requests.post(f"{self._url}/remove_link?link={urllib.parse.quote(key)}", headers =
|
202
|
+
res = requests.post(f"{self._url}/remove_link?link={urllib.parse.quote(key)}", headers = self._headers)
|
171
203
|
|
172
204
|
if res.status_code == 200:
|
173
205
|
del self.additional[key]
|
@@ -195,7 +227,22 @@ class User(Entity):
|
|
195
227
|
self.boosts: dict[str, int] = {}
|
196
228
|
self.votes: list[NSID] = []
|
197
229
|
|
198
|
-
def _load(self, _data: dict):
|
230
|
+
def _load(self, _data: dict, url: str, headers: dict):
|
231
|
+
self._url = url + '/model/individuals/' + _data['id']
|
232
|
+
self._headers = headers
|
233
|
+
|
234
|
+
self.id = NSID(_data['id'])
|
235
|
+
self.name = _data['name']
|
236
|
+
self.register_date = _data['register_date']
|
237
|
+
self.zone = _data['zone']
|
238
|
+
self.position._load(_data['position'], url, headers)
|
239
|
+
|
240
|
+
for key, value in _data.get('additional', {}).items():
|
241
|
+
if isinstance(value, str) and value.startswith('\n'):
|
242
|
+
self.additional[key] = int(value[1:])
|
243
|
+
else:
|
244
|
+
self.additional[key] = value
|
245
|
+
|
199
246
|
self.xp = _data['xp']
|
200
247
|
self.boosts = _data['boosts']
|
201
248
|
|
@@ -210,7 +257,7 @@ class User(Entity):
|
|
210
257
|
|
211
258
|
def add_xp(self, amount: int) -> None:
|
212
259
|
boost = 0 if 0 in self.boosts.values() or amount <= 0 else max(list(self.boosts.values()) + [ 1 ])
|
213
|
-
res = requests.post(f"{self._url}/add_xp?amount={amount * boost}", headers =
|
260
|
+
res = requests.post(f"{self._url}/add_xp?amount={amount * boost}", headers = self._headers)
|
214
261
|
|
215
262
|
if res.status_code == 200:
|
216
263
|
self.xp += amount * boost
|
@@ -218,7 +265,7 @@ class User(Entity):
|
|
218
265
|
res.raise_for_status()
|
219
266
|
|
220
267
|
def edit_boost(self, name: str, multiplier: int = -1) -> None:
|
221
|
-
res = requests.post(f"{self._url}/edit_boost?boost={name}&multiplier={multiplier}", headers =
|
268
|
+
res = requests.post(f"{self._url}/edit_boost?boost={name}&multiplier={multiplier}", headers = self._headers)
|
222
269
|
|
223
270
|
if res.status_code == 200:
|
224
271
|
if multiplier >= 0:
|
@@ -228,14 +275,32 @@ class User(Entity):
|
|
228
275
|
else:
|
229
276
|
res.raise_for_status()
|
230
277
|
|
231
|
-
|
278
|
+
def get_groups(self) -> list[Entity]:
|
279
|
+
res = requests.get(f"{self._url}/groups", headers = self._headers)
|
280
|
+
|
281
|
+
if res.status_code == 200:
|
282
|
+
data = res.json()
|
283
|
+
groups = []
|
284
|
+
|
285
|
+
for grp in data:
|
286
|
+
if grp is None: continue
|
287
|
+
|
288
|
+
group = Organization(grp["id"])
|
289
|
+
group._load(grp, self.url, self._headers)
|
290
|
+
|
291
|
+
groups.append(group)
|
292
|
+
|
293
|
+
return groups
|
294
|
+
else:
|
295
|
+
return []
|
296
|
+
|
297
|
+
class GroupPermissions:
|
232
298
|
"""
|
233
|
-
Permissions d'un
|
299
|
+
Permissions d'un membre à l'échelle d'un groupe
|
234
300
|
"""
|
235
301
|
|
236
302
|
def __init__(self) -> None:
|
237
303
|
self.manage_organization = False # Renommer l'organisation, changer le logo
|
238
|
-
self.manage_shares = False # Revaloriser les actions
|
239
304
|
self.manage_roles = False # Changer les rôles des membres
|
240
305
|
self.manage_members = False # Virer quelqu'un d'une entreprise, l'y inviter
|
241
306
|
|
@@ -248,41 +313,13 @@ class GroupMember:
|
|
248
313
|
Membre au sein d'une entité collective
|
249
314
|
|
250
315
|
## Attributs
|
251
|
-
-
|
252
|
-
|
316
|
+
- permissions: `.GroupPermissions`\n
|
317
|
+
Permissions du membre au sein du groupe
|
253
318
|
"""
|
254
319
|
|
255
320
|
def __init__(self, id: NSID) -> None:
|
256
321
|
self.id = id
|
257
|
-
self.
|
258
|
-
"general": 0
|
259
|
-
}
|
260
|
-
|
261
|
-
def group_permissions(self, team: str = "general") -> MemberPermissions:
|
262
|
-
p = MemberPermissions()
|
263
|
-
team_perms = self.permission_level[team]
|
264
|
-
|
265
|
-
if team_perms >= 1: # Responsable
|
266
|
-
p.manage_members = True
|
267
|
-
|
268
|
-
if team_perms >= 2: # Superviseur
|
269
|
-
p.manage_roles = True
|
270
|
-
|
271
|
-
if team_perms >= 3: # Chef d'équipe
|
272
|
-
pass
|
273
|
-
|
274
|
-
if team_perms >= 4: # Directeur
|
275
|
-
p.manage_shares = True
|
276
|
-
p.manage_organization = True
|
277
|
-
|
278
|
-
return p
|
279
|
-
|
280
|
-
class GroupInvite:
|
281
|
-
def __init__(self, id: NSID):
|
282
|
-
self.id: NSID = id
|
283
|
-
self.team: str = "general"
|
284
|
-
self.level: str = 0
|
285
|
-
self._expires: int = round(time.time()) + 604800
|
322
|
+
self.permissions: GroupPermissions = GroupPermissions()
|
286
323
|
|
287
324
|
class Organization(Entity):
|
288
325
|
"""
|
@@ -310,10 +347,33 @@ class Organization(Entity):
|
|
310
347
|
|
311
348
|
self.certifications: dict = {}
|
312
349
|
self.members: list[GroupMember] = []
|
313
|
-
self.invites: dict[GroupInvite] = []
|
314
350
|
|
315
|
-
def _load(self, _data: dict):
|
316
|
-
self.
|
351
|
+
def _load(self, _data: dict, url: str, headers: dict):
|
352
|
+
self._url = url + '/model/organizations/' + _data['id']
|
353
|
+
self._headers = headers
|
354
|
+
|
355
|
+
self.id = NSID(_data['id'])
|
356
|
+
self.name = _data['name']
|
357
|
+
self.register_date = _data['register_date']
|
358
|
+
self.zone = _data['zone']
|
359
|
+
self.position._load(_data['position'], url, headers)
|
360
|
+
|
361
|
+
for key, value in _data.get('additional', {}).items():
|
362
|
+
if isinstance(value, str) and value.startswith('\n'):
|
363
|
+
self.additional[key] = int(value[1:])
|
364
|
+
else:
|
365
|
+
self.additional[key] = value
|
366
|
+
|
367
|
+
_owner = _data['owner']
|
368
|
+
|
369
|
+
if _owner['_class'] == 'individuals':
|
370
|
+
self.owner = User(_owner['id'])
|
371
|
+
elif _owner['_class'] == 'organizations':
|
372
|
+
self.owner = Organization(_owner['id'])
|
373
|
+
else:
|
374
|
+
self.owner = Entity(_owner['id'])
|
375
|
+
|
376
|
+
self.owner._load(_owner, url, headers)
|
317
377
|
|
318
378
|
for _member in _data['members']:
|
319
379
|
member = GroupMember(_member['id'])
|
@@ -324,7 +384,7 @@ class Organization(Entity):
|
|
324
384
|
self.certifications = _data['certifications']
|
325
385
|
|
326
386
|
def add_certification(self, certification: str, __expires: int = 2419200) -> None:
|
327
|
-
res = requests.post(f"{self._url}/add_certification?name={certification}&duration={__expires}", headers =
|
387
|
+
res = requests.post(f"{self._url}/add_certification?name={certification}&duration={__expires}", headers = self._headers)
|
328
388
|
|
329
389
|
if res.status_code == 200:
|
330
390
|
self.certifications[certification] = int(round(time.time()) + __expires)
|
@@ -335,39 +395,46 @@ class Organization(Entity):
|
|
335
395
|
return certification in self.certifications.keys()
|
336
396
|
|
337
397
|
def remove_certification(self, certification: str) -> None:
|
338
|
-
res = requests.post(f"{self._url}/remove_certification?name={certification}", headers =
|
398
|
+
res = requests.post(f"{self._url}/remove_certification?name={certification}", headers = self._headers)
|
339
399
|
|
340
400
|
if res.status_code == 200:
|
341
401
|
del self.certifications[certification]
|
342
402
|
else:
|
343
403
|
res.raise_for_status()
|
344
404
|
|
345
|
-
def
|
405
|
+
def add_member(self, member: NSID, permissions: GroupPermissions = GroupPermissions()) -> None:
|
346
406
|
if not isinstance(member, NSID):
|
347
407
|
raise TypeError("L'entrée membre doit être de type NSID")
|
348
408
|
|
349
|
-
res = requests.post(f"{self._url}/
|
409
|
+
res = requests.post(f"{self._url}/add_member?id={member}", headers = self._headers, json = {
|
410
|
+
"permissions": permissions.__dict__
|
411
|
+
})
|
350
412
|
|
351
413
|
if res.status_code == 200:
|
352
|
-
|
353
|
-
|
354
|
-
invite.level = level
|
414
|
+
member = GroupMember(member)
|
415
|
+
member.permissions = permissions
|
355
416
|
|
356
|
-
self.
|
417
|
+
self.members.append(member)
|
357
418
|
else:
|
358
419
|
res.raise_for_status()
|
359
420
|
|
360
421
|
def remove_member(self, member: GroupMember) -> None:
|
422
|
+
requests.post(f"{self._url}/remove_member?id={member.id}", headers = self._headers)
|
423
|
+
|
361
424
|
for _member in self.members:
|
362
425
|
if _member.id == member.id:
|
363
426
|
self.members.remove(_member)
|
364
427
|
|
365
|
-
def remove(self, member: GroupMember) -> None:
|
366
|
-
self.remove_member(member)
|
367
|
-
|
368
428
|
def set_owner(self, member: User) -> None:
|
369
429
|
self.owner = member
|
370
430
|
|
431
|
+
def get_member(self, id: NSID) -> GroupMember:
|
432
|
+
for member in self.members:
|
433
|
+
if member.id == id:
|
434
|
+
return member
|
435
|
+
else:
|
436
|
+
return
|
437
|
+
|
371
438
|
def get_members_by_attr(self, attribute: str = "id") -> list[str]:
|
372
439
|
return [ member.__getattribute__(attribute) for member in self.members ]
|
373
440
|
|
@@ -0,0 +1,108 @@
|
|
1
|
+
import requests
|
2
|
+
import time
|
3
|
+
|
4
|
+
from .base import NSID
|
5
|
+
|
6
|
+
class Report:
|
7
|
+
def __init__(self, id: NSID):
|
8
|
+
self._url: str = ""
|
9
|
+
self._headers: dict = {}
|
10
|
+
|
11
|
+
self.id: NSID = id
|
12
|
+
self.author: NSID = NSID('0')
|
13
|
+
self.target: NSID = NSID('0')
|
14
|
+
self.date: int = round(time.time())
|
15
|
+
self.status: int = 0 # 0: En attente, 1: Accepté, 2: Rejeté
|
16
|
+
self.reason: str = None # Raison proposée par le bot
|
17
|
+
self.details:str = None # Description des faits
|
18
|
+
|
19
|
+
def _load(self, _data: dict, url: str, headers: str) -> None:
|
20
|
+
self._url = url
|
21
|
+
self._headers = headers
|
22
|
+
|
23
|
+
self.id = NSID(_data['id'])
|
24
|
+
self.author = NSID(_data['author'])
|
25
|
+
self.target = NSID(_data['target'])
|
26
|
+
self.date = _data['date']
|
27
|
+
self.status = _data['status']
|
28
|
+
self.reason = _data.get('reason', None)
|
29
|
+
self.details = _data.get('details', None)
|
30
|
+
|
31
|
+
def update(self, status: str | int):
|
32
|
+
__statuses = [
|
33
|
+
'pending',
|
34
|
+
'accepted',
|
35
|
+
'rejected'
|
36
|
+
]
|
37
|
+
|
38
|
+
if status not in __statuses:
|
39
|
+
if isinstance(status, int) and 0 <= status <= 2:
|
40
|
+
status = __statuses[status]
|
41
|
+
|
42
|
+
else:
|
43
|
+
raise ValueError(f"Invalid status: {status}. Must be one of {__statuses} or an integer between 0 and 2.")
|
44
|
+
|
45
|
+
res = requests.post(f"{self._url}/update?status={status}", headers = self._headers)
|
46
|
+
|
47
|
+
if res.status_code == 200:
|
48
|
+
self.status = status
|
49
|
+
else:
|
50
|
+
res.raise_for_status()
|
51
|
+
|
52
|
+
class Sanction:
|
53
|
+
def __init__(self, id: NSID):
|
54
|
+
self._url: str = ""
|
55
|
+
self._headers: dict = {}
|
56
|
+
|
57
|
+
self.id: NSID = id
|
58
|
+
self.target: NSID = NSID('0')
|
59
|
+
self.type: str = None
|
60
|
+
self.date: int = round(time.time())
|
61
|
+
self.duration: int = 0
|
62
|
+
self.title: str = None
|
63
|
+
self.case: NSID = NSID('0')
|
64
|
+
|
65
|
+
def _load(self, _data: dict, url: str, headers: dict) -> None:
|
66
|
+
self._url = url
|
67
|
+
self._headers = headers
|
68
|
+
|
69
|
+
self.id = NSID(_data['id'])
|
70
|
+
self.target = NSID(_data['target'])
|
71
|
+
self.type = _data['type']
|
72
|
+
self.date = _data['date']
|
73
|
+
self.duration = _data['duration']
|
74
|
+
self.title = _data['title']
|
75
|
+
self.case = NSID(_data['case'])
|
76
|
+
|
77
|
+
class Lawsuit:
|
78
|
+
def __init__(self, id: NSID):
|
79
|
+
self._url: str = ""
|
80
|
+
self._headers: dict = {}
|
81
|
+
|
82
|
+
self.id: NSID = id
|
83
|
+
self.target: NSID = NSID('0')
|
84
|
+
self.judge: NSID = NSID('0')
|
85
|
+
self.title: str = None
|
86
|
+
self.date: int = round(time.time())
|
87
|
+
self.report: NSID = NSID('0')
|
88
|
+
self.is_private: bool = False
|
89
|
+
self.is_open: bool = False
|
90
|
+
|
91
|
+
def _load(self, _data: dict, url: str, headers: dict) -> None:
|
92
|
+
self._url = url
|
93
|
+
self._headers = headers
|
94
|
+
|
95
|
+
self._url = url
|
96
|
+
self._headers = headers
|
97
|
+
|
98
|
+
self.id = NSID(_data['id'])
|
99
|
+
self.target = NSID(_data['target'])
|
100
|
+
self.judge = NSID(_data['judge'])
|
101
|
+
self.title = _data.get('title')
|
102
|
+
self.date = _data.get('date', round(time.time()))
|
103
|
+
|
104
|
+
report = _data.get('report')
|
105
|
+
self.report = NSID(report) if report else NSID('0')
|
106
|
+
|
107
|
+
self.is_private = bool(_data.get('private', 0))
|
108
|
+
self.is_open = _data.get('status', 0) == 0
|