3
3
import datetime
4
4
import uuid
5
5
import json
6
- import pickle
7
6
import bleach
8
7
from urllib .parse import urljoin
9
8
43
42
from gsoc .settings import PROPOSALS_PATH , BASE_DIR
44
43
from settings_local import ADMINS
45
44
45
+ from google .auth .transport .requests import Request
46
+ from google .oauth2 .credentials import Credentials
47
+ from google_auth_oauthlib .flow import InstalledAppFlow
48
+
49
+ SCOPES = ['https://www.googleapis.com/auth/calendar' ]
46
50
47
51
# Util Functions
48
52
@@ -51,6 +55,27 @@ def gen_uuid_str():
51
55
return str (uuid .uuid4 ())
52
56
53
57
58
+ def getCreds ():
59
+ creds = None
60
+ if os .path .exists (os .path .join (BASE_DIR , 'token.json' )):
61
+ creds = Credentials .from_authorized_user_file (
62
+ os .path .join (BASE_DIR , 'token.json' ),
63
+ SCOPES
64
+ )
65
+ if not creds or not creds .valid :
66
+ if creds and creds .expired and creds .refresh_token :
67
+ creds .refresh (Request ())
68
+ else :
69
+ flow = InstalledAppFlow .from_client_secrets_file (
70
+ os .path .join (BASE_DIR , 'credentials.json' ),
71
+ SCOPES
72
+ )
73
+ creds = flow .run_local_server (port = 0 )
74
+ with open (os .path .join (BASE_DIR , 'token.json' ), 'w' ) as token :
75
+ token .write (creds .to_json ())
76
+ return creds
77
+
78
+
54
79
# Patching
55
80
56
81
NewsBlogConfig .__str__ = lambda self : self .app_title
@@ -559,14 +584,12 @@ class Timeline(models.Model):
559
584
560
585
def add_calendar (self ):
561
586
if not self .calendar_id :
562
- tpath = os .path .join (BASE_DIR , "google_api_token.pickle" )
563
- with open (tpath , "rb" ) as token :
564
- creds = pickle .load (token )
565
- service = build ("calendar" , "v3" , credentials = creds )
566
- calendar = {"summary" : "GSoC @ PSF Calendar" , "timezone" : "UTC" }
567
- calendar = service .calendars ().insert (body = calendar ).execute ()
568
- self .calendar_id = calendar .get ("id" )
569
- self .save ()
587
+ creds = getCreds ()
588
+ service = build ("calendar" , "v3" , credentials = creds , cache_discovery = False )
589
+ calendar = {"summary" : "GSoC @ PSF Calendar" , "timezone" : "UTC" }
590
+ calendar = service .calendars ().insert (body = calendar ).execute ()
591
+ self .calendar_id = calendar .get ("id" )
592
+ self .save ()
570
593
571
594
572
595
class Builder (models .Model ):
@@ -602,51 +625,45 @@ class Event(models.Model):
602
625
@property
603
626
def calendar_link (self ):
604
627
if self .event_id :
605
- tpath = os .path .join (BASE_DIR , "google_api_token.pickle" )
606
- with open (tpath , "rb" ) as token :
607
- creds = pickle .load (token )
608
- service = build ("calendar" , "v3" , credentials = creds )
609
- event = (
610
- service .events ()
611
- .get (calendarId = self .timeline .calendar_id , eventId = self .event_id )
612
- .execute ()
613
- )
614
- return event .get ("htmlLink" , None )
628
+ creds = getCreds ()
629
+ service = build ("calendar" , "v3" , credentials = creds , cache_discovery = False )
630
+ event = (
631
+ service .events ()
632
+ .get (calendarId = self .timeline .calendar_id , eventId = self .event_id )
633
+ .execute ()
634
+ )
635
+ return event .get ("htmlLink" , None )
615
636
return None
616
637
617
638
def add_to_calendar (self ):
618
- tpath = os .path .join (BASE_DIR , "google_api_token.pickle" )
619
- with open (tpath , "rb" ) as token :
620
- creds = pickle .load (token )
621
- service = build ("calendar" , "v3" , credentials = creds )
622
- event = {
623
- "summary" : self .title ,
624
- "start" : {"date" : self .start_date .strftime ("%Y-%m-%d" )},
625
- "end" : {"date" : self .end_date .strftime ("%Y-%m-%d" )},
626
- }
627
- cal_id = self .timeline .calendar_id if self .timeline else "primary"
628
- if not self .event_id :
629
- event = (
630
- service .events ()
631
- .insert (calendarId = cal_id , body = event )
632
- .execute ()
633
- )
634
- self .event_id = event .get ("id" )
635
- self .save ()
636
- else :
637
- service .events ().update (
638
- calendarId = cal_id , eventId = self .event_id , body = event
639
- ).execute ()
639
+ creds = getCreds ()
640
+ service = build ("calendar" , "v3" , credentials = creds , cache_discovery = False )
641
+ event = {
642
+ "summary" : self .title ,
643
+ "start" : {"date" : self .start_date .strftime ("%Y-%m-%d" )},
644
+ "end" : {"date" : self .end_date .strftime ("%Y-%m-%d" )},
645
+ }
646
+ cal_id = self .timeline .calendar_id if self .timeline else "primary"
647
+ if not self .event_id :
648
+ event = (
649
+ service .events ()
650
+ .insert (calendarId = cal_id , body = event )
651
+ .execute ()
652
+ )
653
+ self .event_id = event .get ("id" )
654
+ self .save ()
655
+ else :
656
+ service .events ().update (
657
+ calendarId = cal_id , eventId = self .event_id , body = event
658
+ ).execute ()
640
659
641
660
def delete_from_calendar (self ):
642
661
if self .event_id :
643
- tpath = os .path .join (BASE_DIR , "google_api_token.pickle" )
644
- with open (tpath , "rb" ) as token :
645
- creds = pickle .load (token )
646
- service = build ("calendar" , "v3" , credentials = creds )
647
- service .events ().delete (
648
- calendarId = self .timeline .calendar_id , eventId = self .event_id
649
- ).execute ()
662
+ creds = getCreds ()
663
+ service = build ("calendar" , "v3" , credentials = creds , cache_discovery = False )
664
+ service .events ().delete (
665
+ calendarId = self .timeline .calendar_id , eventId = self .event_id
666
+ ).execute ()
650
667
651
668
def save (self , * args , ** kwargs ):
652
669
if not self .end_date :
@@ -666,7 +683,7 @@ class BlogPostDueDate(models.Model):
666
683
class Meta :
667
684
ordering = ["date" ]
668
685
669
- title = models .CharField (max_length = 100 , default = "Weekly Blog Post Due " )
686
+ title = models .CharField (max_length = 100 , default = "Loading... " )
670
687
date = models .DateField ()
671
688
timeline = models .ForeignKey (
672
689
Timeline ,
@@ -692,38 +709,34 @@ class Meta:
692
709
category = models .IntegerField (choices = categories , null = True , blank = True )
693
710
694
711
def add_to_calendar (self ):
695
- tpath = os .path .join (BASE_DIR , "google_api_token.pickle" )
696
- with open (tpath , "rb" ) as token :
697
- creds = pickle .load (token )
698
- service = build ("calendar" , "v3" , credentials = creds )
699
- event = {
700
- "summary" : self .title ,
701
- "start" : {"date" : self .date .strftime ("%Y-%m-%d" )},
702
- "end" : {"date" : self .date .strftime ("%Y-%m-%d" )},
703
- }
704
- cal_id = self .timeline .calendar_id if self .timeline else "primary"
705
- if not self .event_id :
706
- event = (
707
- service .events ()
708
- .insert (calendarId = cal_id , body = event )
709
- .execute ()
710
- )
711
- self .event_id = event .get ("id" )
712
- self .save ()
713
- else :
714
- service .events ().update (
715
- calendarId = cal_id , eventId = self .event_id , body = event
716
- ).execute ()
712
+ creds = getCreds ()
713
+ service = build ("calendar" , "v3" , credentials = creds , cache_discovery = False )
714
+ event = {
715
+ "summary" : self .title ,
716
+ "start" : {"date" : self .date .strftime ("%Y-%m-%d" )},
717
+ "end" : {"date" : self .date .strftime ("%Y-%m-%d" )},
718
+ }
719
+ cal_id = self .timeline .calendar_id if self .timeline else "primary"
720
+ if not self .event_id :
721
+ event = (
722
+ service .events ()
723
+ .insert (calendarId = cal_id , body = event )
724
+ .execute ()
725
+ )
726
+ self .event_id = event .get ("id" )
727
+ self .save ()
728
+ else :
729
+ service .events ().update (
730
+ calendarId = cal_id , eventId = self .event_id , body = event
731
+ ).execute ()
717
732
718
733
def delete_from_calendar (self ):
719
734
if self .event_id :
720
- tpath = os .path .join (BASE_DIR , "google_api_token.pickle" )
721
- with open (tpath , "rb" ) as token :
722
- creds = pickle .load (token )
723
- service = build ("calendar" , "v3" , credentials = creds )
724
- service .events ().delete (
725
- calendarId = self .timeline .calendar_id , eventId = self .event_id
726
- ).execute ()
735
+ creds = getCreds ()
736
+ service = build ("calendar" , "v3" , credentials = creds , cache_discovery = False )
737
+ service .events ().delete (
738
+ calendarId = self .timeline .calendar_id , eventId = self .event_id
739
+ ).execute ()
727
740
728
741
def create_scheduler (self ):
729
742
if not BLOG_POST_DUE_REMINDER .disabled :
@@ -794,6 +807,18 @@ def save(self, *args, **kwargs):
794
807
post2 .save ()
795
808
except Exception :
796
809
pass
810
+
811
+ # update title
812
+ gsoc_year = GsocYear .objects .latest ('gsoc_year' )
813
+ timeline = Timeline .objects .get (gsoc_year = gsoc_year )
814
+ items = BlogPostDueDate .objects .filter (timeline = timeline )
815
+ if self .category == 0 :
816
+ num = sum ([1 for item in items if "Weekly Check-in Due" in item .title ])
817
+ self .title = f"Weekly Check-in Due { num } "
818
+ else :
819
+ num = sum ([1 for item in items if "Weekly Blog Post Due" in item .title ])
820
+ self .title = f"Weekly Blog Post Due { num } "
821
+
797
822
super (BlogPostDueDate , self ).save (* args , ** kwargs )
798
823
799
824
@@ -1530,3 +1555,23 @@ def add_review(sender, instance, **kwargs):
1530
1555
@receiver (models .signals .post_save , sender = Article )
1531
1556
def add_history (sender , instance , ** kwargs ):
1532
1557
BlogPostHistory .objects .create (article = instance , content = instance .lead_in )
1558
+
1559
+
1560
+ # Delete add_blog_counter scheduler when BlopPostDueDate object is deleted
1561
+ @receiver (models .signals .post_delete , sender = BlogPostDueDate )
1562
+ def delete_add_blog_counter_scheduler (sender , instance , ** kwargs ):
1563
+ try :
1564
+ Scheduler .objects .get (id = instance .add_counter_scheduler .id ).delete ()
1565
+ except Scheduler .DoesNotExist :
1566
+ pass
1567
+
1568
+
1569
+ # Update add_blog_counter scheduler when BlopPostDueDate object is changed
1570
+ @receiver (models .signals .post_save , sender = BlogPostDueDate )
1571
+ def update_add_blog_counter_scheduler (sender , instance , ** kwargs ):
1572
+ try :
1573
+ scheduler = Scheduler .objects .get (id = instance .add_counter_scheduler .id )
1574
+ scheduler .activation_date = instance .date + datetime .timedelta (days = - 6 )
1575
+ scheduler .save ()
1576
+ except Scheduler .DoesNotExist :
1577
+ pass
0 commit comments