nsarchive 3.0.0a7__py3-none-any.whl → 3.0.0b1__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.
@@ -8,14 +8,12 @@ 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
- self.append: bool
16
- self.manage: bool
17
- self.edit: bool
18
- self.read: bool
13
+ self.append: bool = False
14
+ self.manage: bool = False
15
+ self.edit: bool = False
16
+ self.read: bool = False
19
17
 
20
18
  self.load(initial)
21
19
 
@@ -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 = 'inconnu') -> None:
74
- self.name: str = "Inconnue"
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 = default_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 de l'entité
118
+ Identifiant NSID
107
119
  - name: `str`\n
108
- Nom d'usage de l'entité
109
- - registerDate: `int`\n
110
- Date d'enregistrement de l'entité
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 légale de l'entité
126
+ Position civile
113
127
  - additional: `dict`\n
114
- Infos supplémentaires exploitables par les bots
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 GET
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.registerDate: int = 0
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 = default_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 = default_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,16 +190,15 @@ 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 = default_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
165
197
  else:
166
- print(res.text)
167
198
  res.raise_for_status()
168
199
 
169
200
  def unlink(self, key: str) -> None:
170
- res = requests.post(f"{self._url}/remove_link?link={urllib.parse.quote(key)}", headers = default_headers)
201
+ res = requests.post(f"{self._url}/remove_link?link={urllib.parse.quote(key)}", headers = self._headers)
171
202
 
172
203
  if res.status_code == 200:
173
204
  del self.additional[key]
@@ -195,7 +226,22 @@ class User(Entity):
195
226
  self.boosts: dict[str, int] = {}
196
227
  self.votes: list[NSID] = []
197
228
 
198
- def _load(self, _data: dict):
229
+ def _load(self, _data: dict, url: str, headers: dict):
230
+ self._url = url + '/model/individuals/' + _data['id']
231
+ self._headers = headers
232
+
233
+ self.id = NSID(_data['id'])
234
+ self.name = _data['name']
235
+ self.register_date = _data['register_date']
236
+ self.zone = _data['zone']
237
+ self.position._load(_data['position'], url, headers)
238
+
239
+ for key, value in _data.get('additional', {}).items():
240
+ if isinstance(value, str) and value.startswith('\n'):
241
+ self.additional[key] = int(value[1:])
242
+ else:
243
+ self.additional[key] = value
244
+
199
245
  self.xp = _data['xp']
200
246
  self.boosts = _data['boosts']
201
247
 
@@ -210,7 +256,7 @@ class User(Entity):
210
256
 
211
257
  def add_xp(self, amount: int) -> None:
212
258
  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 = default_headers)
259
+ res = requests.post(f"{self._url}/add_xp?amount={amount * boost}", headers = self._headers)
214
260
 
215
261
  if res.status_code == 200:
216
262
  self.xp += amount * boost
@@ -218,7 +264,7 @@ class User(Entity):
218
264
  res.raise_for_status()
219
265
 
220
266
  def edit_boost(self, name: str, multiplier: int = -1) -> None:
221
- res = requests.post(f"{self._url}/edit_boost?boost={name}&multiplier={multiplier}", headers = default_headers)
267
+ res = requests.post(f"{self._url}/edit_boost?boost={name}&multiplier={multiplier}", headers = self._headers)
222
268
 
223
269
  if res.status_code == 200:
224
270
  if multiplier >= 0:
@@ -228,14 +274,32 @@ class User(Entity):
228
274
  else:
229
275
  res.raise_for_status()
230
276
 
231
- class MemberPermissions:
277
+ def get_groups(self) -> list[Entity]:
278
+ res = requests.get(f"{self._url}/groups", headers = self._headers)
279
+
280
+ if res.status_code == 200:
281
+ data = res.json()
282
+ groups = []
283
+
284
+ for grp in data:
285
+ if grp is None: continue
286
+
287
+ group = Organization(grp["id"])
288
+ group._load(grp, self.url, self._headers)
289
+
290
+ groups.append(group)
291
+
292
+ return groups
293
+ else:
294
+ return []
295
+
296
+ class GroupPermissions:
232
297
  """
233
- Permissions d'un utilisateur à l'échelle d'un groupe
298
+ Permissions d'un membre à l'échelle d'un groupe
234
299
  """
235
300
 
236
301
  def __init__(self) -> None:
237
302
  self.manage_organization = False # Renommer l'organisation, changer le logo
238
- self.manage_shares = False # Revaloriser les actions
239
303
  self.manage_roles = False # Changer les rôles des membres
240
304
  self.manage_members = False # Virer quelqu'un d'une entreprise, l'y inviter
241
305
 
@@ -248,41 +312,13 @@ class GroupMember:
248
312
  Membre au sein d'une entité collective
249
313
 
250
314
  ## Attributs
251
- - permission_level: `dict[str, int]`\n
252
- Niveau d'accréditation du membre (0 = salarié, 4 = administrateur)
315
+ - permissions: `.GroupPermissions`\n
316
+ Permissions du membre au sein du groupe
253
317
  """
254
318
 
255
319
  def __init__(self, id: NSID) -> None:
256
320
  self.id = id
257
- self.permission_level: dict = { # Échelle de permissions selon le groupe de travail
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
321
+ self.permissions: GroupPermissions = GroupPermissions()
286
322
 
287
323
  class Organization(Entity):
288
324
  """
@@ -310,10 +346,33 @@ class Organization(Entity):
310
346
 
311
347
  self.certifications: dict = {}
312
348
  self.members: list[GroupMember] = []
313
- self.invites: dict[GroupInvite] = []
314
349
 
315
- def _load(self, _data: dict):
316
- self.avatar_url = self._url + '/avatar'
350
+ def _load(self, _data: dict, url: str, headers: dict):
351
+ self._url = url + '/model/organizations/' + _data['id']
352
+ self._headers = headers
353
+
354
+ self.id = NSID(_data['id'])
355
+ self.name = _data['name']
356
+ self.register_date = _data['register_date']
357
+ self.zone = _data['zone']
358
+ self.position._load(_data['position'], url, headers)
359
+
360
+ for key, value in _data.get('additional', {}).items():
361
+ if isinstance(value, str) and value.startswith('\n'):
362
+ self.additional[key] = int(value[1:])
363
+ else:
364
+ self.additional[key] = value
365
+
366
+ _owner = _data['owner']
367
+
368
+ if _owner['_class'] == 'individuals':
369
+ self.owner = User(_owner['id'])
370
+ elif _owner['_class'] == 'organizations':
371
+ self.owner = Organization(_owner['id'])
372
+ else:
373
+ self.owner = Entity(_owner['id'])
374
+
375
+ self.owner._load(_owner, url, headers)
317
376
 
318
377
  for _member in _data['members']:
319
378
  member = GroupMember(_member['id'])
@@ -324,7 +383,7 @@ class Organization(Entity):
324
383
  self.certifications = _data['certifications']
325
384
 
326
385
  def add_certification(self, certification: str, __expires: int = 2419200) -> None:
327
- res = requests.post(f"{self._url}/add_certification?name={certification}&duration={__expires}", headers = default_headers)
386
+ res = requests.post(f"{self._url}/add_certification?name={certification}&duration={__expires}", headers = self._headers)
328
387
 
329
388
  if res.status_code == 200:
330
389
  self.certifications[certification] = int(round(time.time()) + __expires)
@@ -335,39 +394,46 @@ class Organization(Entity):
335
394
  return certification in self.certifications.keys()
336
395
 
337
396
  def remove_certification(self, certification: str) -> None:
338
- res = requests.post(f"{self._url}/remove_certification?name={certification}", headers = default_headers)
397
+ res = requests.post(f"{self._url}/remove_certification?name={certification}", headers = self._headers)
339
398
 
340
399
  if res.status_code == 200:
341
400
  del self.certifications[certification]
342
401
  else:
343
402
  res.raise_for_status()
344
403
 
345
- def invite_member(self, member: NSID, level: int = 0, team: str = "general") -> None:
404
+ def add_member(self, member: NSID, permissions: GroupPermissions = GroupPermissions()) -> None:
346
405
  if not isinstance(member, NSID):
347
406
  raise TypeError("L'entrée membre doit être de type NSID")
348
407
 
349
- res = requests.post(f"{self._url}/invite_member?id={member}&level={level}&team={team}", headers = default_headers)
408
+ res = requests.post(f"{self._url}/add_member?id={member}", headers = self._headers, json = {
409
+ "permissions": permissions.__dict__
410
+ })
350
411
 
351
412
  if res.status_code == 200:
352
- invite = GroupInvite(member)
353
- invite.team = team
354
- invite.level = level
413
+ member = GroupMember(member)
414
+ member.permissions = permissions
355
415
 
356
- self.invites.append(invite)
416
+ self.members.append(member)
357
417
  else:
358
418
  res.raise_for_status()
359
419
 
360
420
  def remove_member(self, member: GroupMember) -> None:
421
+ requests.post(f"{self._url}/remove_member?id={member.id}", headers = self._headers)
422
+
361
423
  for _member in self.members:
362
424
  if _member.id == member.id:
363
425
  self.members.remove(_member)
364
426
 
365
- def remove(self, member: GroupMember) -> None:
366
- self.remove_member(member)
367
-
368
427
  def set_owner(self, member: User) -> None:
369
428
  self.owner = member
370
429
 
430
+ def get_member(self, id: NSID) -> GroupMember:
431
+ for member in self.members:
432
+ if member.id == id:
433
+ return member
434
+ else:
435
+ return
436
+
371
437
  def get_members_by_attr(self, attribute: str = "id") -> list[str]:
372
438
  return [ member.__getattribute__(attribute) for member in self.members ]
373
439
 
@@ -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.lawsuit: 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.lawsuit = NSID(_data['lawsuit'])
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
@@ -0,0 +1,128 @@
1
+ import json
2
+ import requests
3
+ import time
4
+
5
+ from .base import NSID
6
+
7
+ # Votes
8
+
9
+ class VoteOption:
10
+ """
11
+ Option disponible lors d'un vote
12
+
13
+ ## Attributs
14
+ - id: `str`\n
15
+ Identifiant de l'option
16
+ - title: `str`\n
17
+ Label de l'option
18
+ - count: `int`\n
19
+ Nombre de sympathisants pour cette option
20
+ """
21
+
22
+ def __init__(self, title: str, count: int = 0):
23
+ self.title: str = title
24
+ self.count: int = count
25
+
26
+ def __repr__(self) -> dict:
27
+ return json.dumps({
28
+ 'title': self.title,
29
+ 'count': self.count
30
+ })
31
+
32
+ def _load(self, _data: dict):
33
+ self.title = str(_data['title'])
34
+ self.count = int(_data['count'])
35
+
36
+ class Vote:
37
+ """
38
+ Classe de référence pour les différents votes du serveur
39
+
40
+ ## Attributs
41
+ - id: `NSID`\n
42
+ Identifiant du vote
43
+ - title: `str`\n
44
+ Titre du vote
45
+ - options: dict[str, .VoteOption]\n
46
+ Liste des choix disponibles
47
+ - author: `NSID`\n
48
+ Identifiant de l'auteur du vote
49
+ - startDate: `int`\n
50
+ Date de début du vote
51
+ - endDate: `int`\n
52
+ Date limite pour voter
53
+ """
54
+
55
+ def __init__(self, id: NSID = None) -> None:
56
+ self._url: str
57
+ self._headers: dict
58
+
59
+ self.id: NSID = id if id else NSID(0)
60
+ self.title: str = ''
61
+ self.author: NSID = NSID(0)
62
+
63
+ self.startDate: int = round(time.time())
64
+ self.endDate: int = 0
65
+
66
+ self.options: dict[str, VoteOption] = {}
67
+
68
+ def _load(self, _data: dict, url: str, headers: dict) -> None:
69
+ self._url = url
70
+ self._headers = headers
71
+
72
+ self.id = NSID(_data['id'])
73
+ self.title = _data['title']
74
+ self.author = _data['author']
75
+
76
+ self.startDate = _data['start']
77
+ self.endDate = _data['end']
78
+
79
+ self.options = {}
80
+
81
+ for _opt_id, opt in _data['options'].items():
82
+ option = VoteOption(*tuple(opt.values()))
83
+
84
+ self.options[_opt_id] = option
85
+
86
+ def get(self, id: str) -> VoteOption:
87
+ if id in self.options.keys():
88
+ return self.options[id]
89
+ else:
90
+ raise ValueError(f"Option {id} not found in vote {self.id}")
91
+
92
+ def add_vote(self, id: str):
93
+ """
94
+ Ajoute un vote à l'option spécifiée
95
+ """
96
+
97
+ res = requests.post(f"{self._url}/vote?option={id}", headers = self._headers)
98
+
99
+ if res.status_code == 200:
100
+ self.get(id).count += 1
101
+ else:
102
+ res.raise_for_status()
103
+
104
+ def close(self):
105
+ """
106
+ Ferme le vote
107
+ """
108
+
109
+ res = requests.post(f"{self._url}/close", headers = self._headers)
110
+
111
+ if res.status_code == 200:
112
+ self.endDate = round(time.time())
113
+ else:
114
+ res.raise_for_status()
115
+
116
+ class LawsuitVote(Vote):
117
+ """
118
+ Vote à trois positions pour un procès
119
+ """
120
+
121
+ def __init__(self, id: NSID, title: str) -> None:
122
+ super().__init__(id, title)
123
+
124
+ self.options = [
125
+ VoteOption('guilty', 'Coupable'),
126
+ VoteOption('innocent', 'Innocent'),
127
+ VoteOption('blank', 'Pas d\'avis'),
128
+ ]
@@ -0,0 +1,23 @@
1
+ class Scale:
2
+ def __init__(self):
3
+ self.democratie: float = 0.0
4
+ self.coertition: float = 0.0
5
+ self.liberte: float = 0.0
6
+ self.integration: float = 0.0
7
+ self.revolution: float = 0.0
8
+
9
+ def _load(self, _data: dict):
10
+ self.democratie = _data.get('DEM', 0.0)
11
+ self.coertition = _data.get('SRV', 0.0)
12
+ self.liberte = _data.get('LIB', 0.0)
13
+ self.integration = _data.get('INT', 0.0)
14
+ self.revolution = _data.get('REV', 0.0)
15
+
16
+ def _to_dict(self) -> dict:
17
+ return {
18
+ 'DEM': self.democratie,
19
+ 'SRV': self.coertition,
20
+ 'LIB': self.liberte,
21
+ 'INT': self.integration,
22
+ 'REV': self.revolution
23
+ }