4
4
5
5
from typing import TYPE_CHECKING , ClassVar
6
6
7
+ from ._event_template import _EVENT_TEMPLATE
7
8
from .base import _SpondBase
8
9
9
10
if TYPE_CHECKING :
14
15
15
16
class Spond (_SpondBase ):
16
17
17
- DT_FORMAT = "%Y-%m-%dT00:00:00.000Z"
18
-
18
+ _API_BASE_URL : ClassVar = "https://api.spond.com/core/v1/"
19
+ _DT_FORMAT : ClassVar = "%Y-%m-%dT00:00:00.000Z"
20
+ _EVENT_TEMPLATE : ClassVar = _EVENT_TEMPLATE
19
21
_EVENT : ClassVar = "event"
20
22
_GROUP : ClassVar = "group"
21
23
22
24
def __init__ (self , username : str , password : str ) -> None :
23
- super ().__init__ (username , password , "https://api.spond.com/core/v1/" )
25
+ super ().__init__ (username , password , self . _API_BASE_URL )
24
26
self ._chat_url = None
25
27
self ._auth = None
26
28
self .groups : list [JSONDict ] | None = None
@@ -98,29 +100,24 @@ async def get_person(self, user: str) -> JSONDict:
98
100
await self .get_groups ()
99
101
for group in self .groups :
100
102
for member in group ["members" ]:
101
- if (
102
- member ["id" ] == user
103
- or ("email" in member and member ["email" ]) == user
104
- or member ["firstName" ] + " " + member ["lastName" ] == user
105
- or ("profile" in member and member ["profile" ]["id" ] == user )
106
- ):
103
+ if self ._match_person (member , user ):
107
104
return member
108
105
if "guardians" in member :
109
106
for guardian in member ["guardians" ]:
110
- if (
111
- guardian ["id" ] == user
112
- or ("email" in guardian and guardian ["email" ]) == user
113
- or guardian ["firstName" ] + " " + guardian ["lastName" ]
114
- == user
115
- or (
116
- "profile" in guardian
117
- and guardian ["profile" ]["id" ] == user
118
- )
119
- ):
107
+ if self ._match_person (guardian , user ):
120
108
return guardian
121
109
errmsg = f"No person matched with identifier '{ user } '."
122
110
raise KeyError (errmsg )
123
111
112
+ @staticmethod
113
+ def _match_person (person : JSONDict , match_str : str ) -> bool :
114
+ return (
115
+ person ["id" ] == match_str
116
+ or ("email" in person and person ["email" ]) == match_str
117
+ or person ["firstName" ] + " " + person ["lastName" ] == match_str
118
+ or ("profile" in person and person ["profile" ]["id" ] == match_str )
119
+ )
120
+
124
121
@_SpondBase .require_authentication
125
122
async def get_messages (self , max_chats : int = 100 ) -> list [JSONDict ] | None :
126
123
"""
@@ -213,7 +210,7 @@ async def send_message(
213
210
214
211
if chat_id is not None :
215
212
return self ._continue_chat (chat_id , text )
216
- elif group_uid is None or user is None :
213
+ if group_uid is None or user is None :
217
214
return {
218
215
"error" : "wrong usage, group_id and user_id needed or continue chat with chat_id"
219
216
}
@@ -293,13 +290,13 @@ async def get_events(
293
290
"scheduled" : str (include_scheduled ),
294
291
}
295
292
if max_end :
296
- params ["maxEndTimestamp" ] = max_end .strftime (self .DT_FORMAT )
293
+ params ["maxEndTimestamp" ] = max_end .strftime (self ._DT_FORMAT )
297
294
if max_start :
298
- params ["maxStartTimestamp" ] = max_start .strftime (self .DT_FORMAT )
295
+ params ["maxStartTimestamp" ] = max_start .strftime (self ._DT_FORMAT )
299
296
if min_end :
300
- params ["minEndTimestamp" ] = min_end .strftime (self .DT_FORMAT )
297
+ params ["minEndTimestamp" ] = min_end .strftime (self ._DT_FORMAT )
301
298
if min_start :
302
- params ["minStartTimestamp" ] = min_start .strftime (self .DT_FORMAT )
299
+ params ["minStartTimestamp" ] = min_start .strftime (self ._DT_FORMAT )
303
300
if group_id :
304
301
params ["groupId" ] = group_id
305
302
if subgroup_id :
@@ -353,54 +350,15 @@ async def update_event(self, uid: str, updates: JSONDict):
353
350
event = await self ._get_entity (self ._EVENT , uid )
354
351
url = f"{ self .api_url } sponds/{ uid } "
355
352
356
- base_event : JSONDict = {
357
- "heading" : None ,
358
- "description" : None ,
359
- "spondType" : "EVENT" ,
360
- "startTimestamp" : None ,
361
- "endTimestamp" : None ,
362
- "commentsDisabled" : False ,
363
- "maxAccepted" : 0 ,
364
- "rsvpDate" : None ,
365
- "location" : {
366
- "id" : None ,
367
- "feature" : None ,
368
- "address" : None ,
369
- "latitude" : None ,
370
- "longitude" : None ,
371
- },
372
- "owners" : [{"id" : None }],
373
- "visibility" : "INVITEES" ,
374
- "participantsHidden" : False ,
375
- "autoReminderType" : "DISABLED" ,
376
- "autoAccept" : False ,
377
- "payment" : {},
378
- "attachments" : [],
379
- "id" : None ,
380
- "tasks" : {
381
- "openTasks" : [],
382
- "assignedTasks" : [
383
- {
384
- "name" : None ,
385
- "description" : "" ,
386
- "type" : "ASSIGNED" ,
387
- "id" : None ,
388
- "adultsOnly" : True ,
389
- "assignments" : {"memberIds" : [], "profiles" : [], "remove" : []},
390
- }
391
- ],
392
- },
393
- }
394
-
353
+ base_event = self ._EVENT_TEMPLATE .copy ()
395
354
for key in base_event :
396
355
if event .get (key ) is not None and not updates .get (key ):
397
356
base_event [key ] = event [key ]
398
357
elif updates .get (key ) is not None :
399
358
base_event [key ] = updates [key ]
400
359
401
- data = dict (base_event )
402
360
async with self .clientsession .post (
403
- url , json = data , headers = self .auth_headers
361
+ url , json = base_event , headers = self .auth_headers
404
362
) as r :
405
363
self .events_update = await r .json ()
406
364
return self .events
@@ -421,8 +379,7 @@ async def get_event_attendance_xlsx(self, uid: str) -> bytes:
421
379
"""
422
380
url = f"{ self .api_url } sponds/{ uid } /export"
423
381
async with self .clientsession .get (url , headers = self .auth_headers ) as r :
424
- output_data = await r .read ()
425
- return output_data
382
+ return await r .read ()
426
383
427
384
@_SpondBase .require_authentication
428
385
async def change_response (self , uid : str , user : str , payload : JSONDict ) -> JSONDict :
0 commit comments