1
+ from datetime import datetime , timedelta
1
2
import json
2
3
import uuid
3
-
4
- from django .utils import timezone
5
4
from django .conf import settings
6
5
7
- from gsoc .models import (Event , GsocEndDate , Timeline , UserProfile , GsocYear ,
8
- BlogPostDueDate , Scheduler , ReaddUser )
6
+ from django .utils import timezone
7
+ from gsoc .settings import ADMINS
8
+
9
+ from gsoc .models import (
10
+ DaysConf ,
11
+ Event ,
12
+ GsocEndDate ,
13
+ GsocEndDateDefault ,
14
+ GsocStartDate , Timeline ,
15
+ UserProfile ,
16
+ GsocYear ,
17
+ BlogPostDueDate ,
18
+ Scheduler ,
19
+ ReaddUser
20
+ )
9
21
from gsoc .common .utils .tools import build_send_mail_json
10
22
11
23
from googleapiclient .discovery import build
@@ -17,7 +29,11 @@ def build_pre_blog_reminders(builder):
17
29
data = json .loads (builder .data )
18
30
due_date = BlogPostDueDate .objects .get (pk = data ["due_date_pk" ])
19
31
gsoc_year = GsocYear .objects .first ()
20
- profiles = UserProfile .objects .filter (gsoc_year = gsoc_year , role = 3 ).all ()
32
+ profiles = UserProfile .objects .filter (
33
+ gsoc_year = gsoc_year ,
34
+ role = 3 ,
35
+ gsoc_end__gte = due_date .date
36
+ ).all ()
21
37
categories = ((0 , "Weekly Check-In" ), (1 , "Blog Post" ))
22
38
category = categories [due_date .category ][1 ]
23
39
for profile in profiles :
@@ -57,7 +73,11 @@ def build_post_blog_reminders(builder):
57
73
category = categories [due_date .category ][1 ]
58
74
59
75
gsoc_year = GsocYear .objects .first ()
60
- profiles = UserProfile .objects .filter (gsoc_year = gsoc_year , role = 3 ).all ()
76
+ profiles = UserProfile .objects .filter (
77
+ gsoc_year = gsoc_year ,
78
+ role = 3 ,
79
+ gsoc_end__gte = due_date .date
80
+ ).all ()
61
81
for profile in profiles :
62
82
if profile .current_blog_count > blogs_count and not (
63
83
profile .hidden or profile .reminder_disabled
@@ -67,13 +87,19 @@ def build_post_blog_reminders(builder):
67
87
suborg_admins = UserProfile .objects .filter (
68
88
suborg_full_name = suborg , role = 1
69
89
)
90
+ POST_BLOG_REMINDER_FIRST = DaysConf .objects .get (title = "POST_BLOG_REMINDER_FIRST" )
91
+ POST_BLOG_REMINDER_SECOND = DaysConf .objects .get (title = "POST_BLOG_REMINDER_SECOND" )
70
92
71
93
activation_date = builder .activation_date .date ()
72
94
73
- if activation_date - due_date .date == timezone .timedelta (days = 1 ):
95
+ if activation_date - due_date .date == timezone .timedelta (
96
+ days = POST_BLOG_REMINDER_FIRST .days
97
+ ):
74
98
student_template = "first_post_blog_reminder_student.html"
75
99
76
- elif activation_date - due_date .date == timezone .timedelta (days = 3 ):
100
+ elif activation_date - due_date .date == timezone .timedelta (
101
+ days = POST_BLOG_REMINDER_SECOND .days
102
+ ):
77
103
student_template = "second_post_blog_reminder_student.html"
78
104
79
105
mentors_emails = [
"[email protected] " ]
@@ -250,33 +276,189 @@ def build_add_event_to_calendar(builder):
250
276
251
277
def build_add_end_to_calendar (builder ):
252
278
data = json .loads (builder .data )
253
- try :
254
- creds = getCreds ()
255
- if creds :
256
- service = build ("calendar" , "v3" , credentials = creds , cache_discovery = False )
257
- event = {
258
- "summary" : data ["title" ],
259
- "start" : {"date" : data ["date" ]},
260
- "end" : {"date" : data ["date" ]},
261
- }
262
- cal_id = builder .timeline .calendar_id if builder .timeline else "primary"
263
- if not data ["event_id" ]:
264
- event = (
265
- service .events ()
266
- .insert (calendarId = cal_id , body = event )
267
- .execute ()
268
- )
269
- item = GsocEndDate .objects .get (id = data ["id" ])
270
- item .event_id = event .get ("id" )
271
- item .save ()
272
- else :
273
- service .events ().update (
274
- calendarId = cal_id , eventId = data ["event_id" ], body = event
275
- ).execute ()
279
+ creds = getCreds ()
280
+ if creds :
281
+ service = build ("calendar" , "v3" , credentials = creds , cache_discovery = False )
282
+ event = {
283
+ "summary" : data ["title" ],
284
+ "start" : {"date" : data ["date" ]},
285
+ "end" : {"date" : data ["date" ]},
286
+ }
287
+ cal_id = builder .timeline .calendar_id if builder .timeline else "primary"
288
+ if not data ["event_id" ]:
289
+ event = (
290
+ service .events ()
291
+ .insert (calendarId = cal_id , body = event )
292
+ .execute ()
293
+ )
294
+ item = GsocEndDate .objects .get (id = data ["id" ])
295
+ item .event_id = event .get ("id" )
296
+ item .save ()
276
297
else :
277
- raise Exception (
278
- f"Please get the Access Token: " +
279
- f"{ settings .OAUTH_REDIRECT_URI + 'authorize' } "
298
+ service .events ().update (
299
+ calendarId = cal_id , eventId = data ["event_id" ], body = event
300
+ ).execute ()
301
+ else :
302
+ raise Exception (
303
+ f"Please get the Access Token: " +
304
+ f"{ settings .OAUTH_REDIRECT_URI + 'authorize' } "
305
+ )
306
+
307
+
308
+ def build_add_start_to_calendar (builder ):
309
+ data = json .loads (builder .data )
310
+ creds = getCreds ()
311
+ if creds :
312
+ service = build ("calendar" , "v3" , credentials = creds , cache_discovery = False )
313
+ event = {
314
+ "summary" : data ["title" ],
315
+ "start" : {"date" : data ["date" ]},
316
+ "end" : {"date" : data ["date" ]},
317
+ }
318
+ cal_id = builder .timeline .calendar_id if builder .timeline else "primary"
319
+ if not data ["event_id" ]:
320
+ event = (
321
+ service .events ()
322
+ .insert (calendarId = cal_id , body = event )
323
+ .execute ()
280
324
)
281
- except Exception as e :
282
- return str (e )
325
+ item = GsocStartDate .objects .get (id = data ["id" ])
326
+ item .event_id = event .get ("id" )
327
+ item .save ()
328
+ else :
329
+ service .events ().update (
330
+ calendarId = cal_id , eventId = data ["event_id" ], body = event
331
+ ).execute ()
332
+ else :
333
+ raise Exception (
334
+ f"Please get the Access Token: " +
335
+ f"{ settings .OAUTH_REDIRECT_URI + 'authorize' } "
336
+ )
337
+
338
+
339
+ def build_add_end_standard_to_calendar (builder ):
340
+ data = json .loads (builder .data )
341
+ creds = getCreds ()
342
+ if creds :
343
+ service = build ("calendar" , "v3" , credentials = creds , cache_discovery = False )
344
+ event = {
345
+ "summary" : data ["title" ],
346
+ "start" : {"date" : data ["date" ]},
347
+ "end" : {"date" : data ["date" ]},
348
+ }
349
+ cal_id = builder .timeline .calendar_id if builder .timeline else "primary"
350
+ if not data ["event_id" ]:
351
+ event = (
352
+ service .events ()
353
+ .insert (calendarId = cal_id , body = event )
354
+ .execute ()
355
+ )
356
+ item = GsocEndDateDefault .objects .get (id = data ["id" ])
357
+ item .event_id = event .get ("id" )
358
+ item .save ()
359
+ else :
360
+ service .events ().update (
361
+ calendarId = cal_id , eventId = data ["event_id" ], body = event
362
+ ).execute ()
363
+ else :
364
+ raise Exception (
365
+ f"Please get the Access Token: " +
366
+ f"{ settings .OAUTH_REDIRECT_URI + 'authorize' } "
367
+ )
368
+
369
+
370
+ def build_evaluation_reminder (builder ):
371
+ data = json .loads (builder .data )
372
+ gsoc_year = GsocYear .objects .latest ('gsoc_year' )
373
+ start_date = GsocStartDate .objects .latest ('date' )
374
+ start_date = start_date .date
375
+ exam_date = datetime .strptime (data ["exam_date" ], "%Y-%m-%d" ).date ()
376
+ is_midterm = data ["Midterm" ]
377
+
378
+ gsoc_end = exam_date
379
+ if is_midterm :
380
+ gsoc_end = start_date + 2 * (exam_date - start_date ) + timedelta (days = 7 - 1 )
381
+
382
+ # 4 days before
383
+ notify_date = exam_date - timedelta (days = 4 )
384
+
385
+ tl_users = UserProfile .objects .filter (
386
+ gsoc_year = gsoc_year ,
387
+ role = 3 ,
388
+ gsoc_end = gsoc_end
389
+ ).all ()
390
+
391
+ tl_suborg = [user .suborg_full_name for user in tl_users ]
392
+
393
+ profiles = UserProfile .objects .filter (
394
+ suborg_full_name__in = tl_suborg ,
395
+ role__in = [1 , 2 ]
396
+ )
397
+
398
+ for profile in profiles :
399
+ template_data = {
400
+ "date" : str (exam_date ),
401
+ }
402
+
403
+ scheduler_data = build_send_mail_json (
404
+ profile .user .email ,
405
+ template = "exam_reminder.html" ,
406
+ subject = f"Evaluation Due Reminder" ,
407
+ template_data = template_data ,
408
+ )
409
+
410
+ Scheduler .objects .create (
411
+ command = "send_email" ,
412
+ data = scheduler_data ,
413
+ activation_date = notify_date
414
+ )
415
+
416
+ # 2 days before
417
+ notify_date = exam_date - timedelta (days = 2 )
418
+
419
+ tl_users = UserProfile .objects .filter (
420
+ gsoc_year = gsoc_year ,
421
+ role = 3 ,
422
+ gsoc_end = gsoc_end
423
+ ).all ()
424
+
425
+ tl_suborg = [user .suborg_full_name for user in tl_users ]
426
+
427
+ profiles = UserProfile .objects .filter (
428
+ suborg_full_name__in = tl_suborg ,
429
+ role__in = [1 , 2 ]
430
+ )
431
+
432
+ for profile in profiles :
433
+ template_data = {
434
+ "date" : str (exam_date ),
435
+ }
436
+
437
+ scheduler_data = build_send_mail_json (
438
+ profile .user .email ,
439
+ template = "exam_reminder.html" ,
440
+ subject = f"Evaluation Due Reminder" ,
441
+ template_data = template_data ,
442
+ )
443
+
444
+ Scheduler .objects .create (
445
+ command = "send_email" ,
446
+ data = scheduler_data ,
447
+ activation_date = notify_date
448
+ )
449
+
450
+ template_data = {
451
+ "date" : str (exam_date ),
452
+ }
453
+
454
+ scheduler_data = build_send_mail_json (
455
+ ADMINS ,
456
+ template = "exam_reminder.html" ,
457
+ subject = "Evaluation Due Reminder" ,
458
+ template_data = template_data ,
459
+ )
460
+ Scheduler .objects .create (
461
+ command = "send_email" ,
462
+ data = scheduler_data ,
463
+ activation_date = notify_date
464
+ )
0 commit comments