Skip to content
This repository was archived by the owner on Aug 26, 2024. It is now read-only.

Commit 873cff7

Browse files
Merge pull request #493 from diwash007/bg
Move timeline generation to cron
2 parents 6a5f942 + 5289a88 commit 873cff7

File tree

3 files changed

+178
-75
lines changed

3 files changed

+178
-75
lines changed

Diff for: gsoc/common/utils/build_tasks.py

+67-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import json
22
import uuid
3-
import urllib.parse
43

54
from django.utils import timezone
65
from django.conf import settings
76

8-
from gsoc.models import UserProfile, GsocYear, BlogPostDueDate, Scheduler, ReaddUser
7+
from gsoc.models import (Event, Timeline, UserProfile, GsocYear,
8+
BlogPostDueDate, Scheduler, ReaddUser)
99
from gsoc.common.utils.tools import build_send_mail_json
1010

11+
from googleapiclient.discovery import build
12+
from gsoc.common.utils.googleoauth import getCreds
13+
1114

1215
def build_pre_blog_reminders(builder):
1316
try:
@@ -154,3 +157,65 @@ def build_remove_user_details(builder):
154157
Scheduler.objects.create(command="send_email", data=scheduler_data)
155158
except Exception as e:
156159
return str(e)
160+
161+
162+
def build_add_timeline_to_calendar(builder):
163+
data = json.loads(builder.data)
164+
if not data["calendar_id"]:
165+
creds = getCreds()
166+
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
167+
calendar = {"summary": "GSoC @ PSF Calendar", "timezone": "UTC"}
168+
calendar = service.calendars().insert(body=calendar).execute()
169+
timeline = Timeline.objects.get(id=data["timeline_id"])
170+
timeline.calendar_id = calendar.get("id")
171+
timeline.save()
172+
173+
174+
def build_add_bpdd_to_calendar(builder):
175+
data = json.loads(builder.data)
176+
creds = getCreds()
177+
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
178+
event = {
179+
"summary": data["title"],
180+
"start": {"date": data["date"]},
181+
"end": {"date": data["date"]},
182+
}
183+
cal_id = builder.timeline.calendar_id if builder.timeline else "primary"
184+
if not data["event_id"]:
185+
event = (
186+
service.events()
187+
.insert(calendarId=cal_id, body=event)
188+
.execute()
189+
)
190+
item = BlogPostDueDate.objects.get(id=data["id"])
191+
item.event_id = event.get("id")
192+
item.save()
193+
else:
194+
service.events().update(
195+
calendarId=cal_id, eventId=data["event_id"], body=event
196+
).execute()
197+
198+
199+
def build_add_event_to_calendar(builder):
200+
data = json.loads(builder.data)
201+
creds = getCreds()
202+
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
203+
event = {
204+
"summary": data["title"],
205+
"start": {"date": data["start_date"]},
206+
"end": {"date": data["end_date"]},
207+
}
208+
cal_id = builder.timeline.calendar_id if builder.timeline else "primary"
209+
item = Event.objects.get(id=data["id"])
210+
if not data["event_id"]:
211+
event = (
212+
service.events()
213+
.insert(calendarId=cal_id, body=event)
214+
.execute()
215+
)
216+
item.event_id = event.get("id")
217+
item.save()
218+
else:
219+
service.events().update(
220+
calendarId=cal_id, eventId=item.event_id, body=event
221+
).execute()

Diff for: gsoc/common/utils/googleoauth.py

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import os
2+
3+
from gsoc.settings import BASE_DIR
4+
5+
from google.auth.transport.requests import Request
6+
from google.oauth2.credentials import Credentials
7+
from google_auth_oauthlib.flow import InstalledAppFlow
8+
9+
SCOPES = ['https://www.googleapis.com/auth/calendar']
10+
11+
12+
def getCreds():
13+
creds = None
14+
if os.path.exists(os.path.join(BASE_DIR, 'token.json')):
15+
creds = Credentials.from_authorized_user_file(
16+
os.path.join(BASE_DIR, 'token.json'),
17+
SCOPES
18+
)
19+
if not creds or not creds.valid:
20+
if creds and creds.expired and creds.refresh_token:
21+
creds.refresh(Request())
22+
else:
23+
flow = InstalledAppFlow.from_client_secrets_file(
24+
os.path.join(BASE_DIR, 'credentials.json'),
25+
SCOPES
26+
)
27+
creds = flow.run_local_server(port=0)
28+
with open(os.path.join(BASE_DIR, 'token.json'), 'w') as token:
29+
token.write(creds.to_json())
30+
return creds

Diff for: gsoc/models.py

+81-73
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,8 @@
4141
from gsoc.common.utils.tools import build_send_reminder_json
4242
from gsoc.settings import PROPOSALS_PATH, BASE_DIR
4343
from settings_local import ADMINS
44+
from gsoc.common.utils.googleoauth import getCreds
4445

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']
5046

5147
# Util Functions
5248

@@ -66,27 +62,6 @@ def validate_date(value):
6662
except GsocEndDate.DoesNotExist:
6763
pass
6864

69-
70-
def getCreds():
71-
creds = None
72-
if os.path.exists(os.path.join(BASE_DIR, 'token.json')):
73-
creds = Credentials.from_authorized_user_file(
74-
os.path.join(BASE_DIR, 'token.json'),
75-
SCOPES
76-
)
77-
if not creds or not creds.valid:
78-
if creds and creds.expired and creds.refresh_token:
79-
creds.refresh(Request())
80-
else:
81-
flow = InstalledAppFlow.from_client_secrets_file(
82-
os.path.join(BASE_DIR, 'credentials.json'),
83-
SCOPES
84-
)
85-
creds = flow.run_local_server(port=0)
86-
with open(os.path.join(BASE_DIR, 'token.json'), 'w') as token:
87-
token.write(creds.to_json())
88-
return creds
89-
9065

9166
# Patching
9267

@@ -596,13 +571,25 @@ class Timeline(models.Model):
596571
calendar_id = models.CharField(max_length=255, null=True, blank=True)
597572

598573
def add_calendar(self):
599-
if not self.calendar_id:
600-
creds = getCreds()
601-
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
602-
calendar = {"summary": "GSoC @ PSF Calendar", "timezone": "UTC"}
603-
calendar = service.calendars().insert(body=calendar).execute()
604-
self.calendar_id = calendar.get("id")
605-
self.save()
574+
builder_data = json.dumps({
575+
"timeline_id": self.id,
576+
"calendar_id": self.calendar_id
577+
})
578+
try:
579+
builder = Builder.objects.get(
580+
category="build_add_timeline_to_calendar",
581+
timeline=self
582+
)
583+
builder.activation_date = datetime.datetime.now()
584+
builder.calendar_id = self.calendar_id
585+
builder.save()
586+
except Builder.DoesNotExist:
587+
Builder.objects.create(
588+
category="build_add_timeline_to_calendar",
589+
activation_date=datetime.datetime.now(),
590+
data=builder_data,
591+
timeline=self
592+
)
606593

607594

608595
class Builder(models.Model):
@@ -611,15 +598,28 @@ class Builder(models.Model):
611598
("build_post_blog_reminders", "build_post_blog_reminders"),
612599
("build_revoke_student_perms", "build_revoke_student_perms"),
613600
("build_remove_user_details", "build_remove_user_details"),
601+
("build_add_timeline_to_calendar", "build_add_timeline_to_calendar"),
602+
("build_add_bpdd_to_calendar", "build_add_bpdd_to_calendar"),
603+
("build_add_event_to_calendar", "build_add_event_to_calendar")
614604
)
615605

616606
category = models.CharField(max_length=40, choices=categories)
617607
activation_date = models.DateTimeField(null=True, blank=True)
618608
built = models.BooleanField(default=None, null=True)
619609
data = models.TextField()
620610
last_error = models.TextField(null=True, default=None, blank=True)
621-
timeline = models.ForeignKey(
622-
Timeline, on_delete=models.CASCADE, null=True, blank=True
611+
timeline = models.ForeignKey(Timeline, on_delete=models.CASCADE)
612+
bpdd = models.ForeignKey(
613+
'BlogPostDueDate',
614+
on_delete=models.CASCADE,
615+
null=True,
616+
blank=True
617+
)
618+
event = models.ForeignKey(
619+
'Event',
620+
on_delete=models.CASCADE,
621+
null=True,
622+
blank=True
623623
)
624624

625625
def __str__(self):
@@ -649,26 +649,30 @@ def calendar_link(self):
649649
return None
650650

651651
def add_to_calendar(self):
652-
creds = getCreds()
653-
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
654-
event = {
655-
"summary": self.title,
656-
"start": {"date": self.start_date.strftime("%Y-%m-%d")},
657-
"end": {"date": self.end_date.strftime("%Y-%m-%d")},
658-
}
659-
cal_id = self.timeline.calendar_id if self.timeline else "primary"
660-
if not self.event_id:
661-
event = (
662-
service.events()
663-
.insert(calendarId=cal_id, body=event)
664-
.execute()
652+
builder_data = json.dumps({
653+
"id": self.id,
654+
"title": self.title,
655+
"start_date": str(self.start_date.strftime('%Y-%m-%d')),
656+
"end_date": str(self.end_date.strftime('%Y-%m-%d')),
657+
"event_id": self.event_id
658+
})
659+
try:
660+
builder = Builder.objects.get(
661+
category="build_add_event_to_calendar",
662+
timeline=self.timeline,
663+
event=self
664+
)
665+
builder.activation_date = datetime.datetime.now()
666+
builder.built = None
667+
builder.data = builder_data
668+
builder.save()
669+
except Builder.DoesNotExist:
670+
Builder.objects.create(
671+
category="build_add_event_to_calendar",
672+
activation_date=datetime.datetime.now(),
673+
data=builder_data,
674+
timeline=self.timeline,
665675
)
666-
self.event_id = event.get("id")
667-
self.save()
668-
else:
669-
service.events().update(
670-
calendarId=cal_id, eventId=self.event_id, body=event
671-
).execute()
672676

673677
def delete_from_calendar(self):
674678
if self.event_id:
@@ -722,26 +726,30 @@ class Meta:
722726
category = models.IntegerField(choices=categories, null=True, blank=True)
723727

724728
def add_to_calendar(self):
725-
creds = getCreds()
726-
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
727-
event = {
728-
"summary": self.title,
729-
"start": {"date": self.date.strftime("%Y-%m-%d")},
730-
"end": {"date": self.date.strftime("%Y-%m-%d")},
731-
}
732-
cal_id = self.timeline.calendar_id if self.timeline else "primary"
733-
if not self.event_id:
734-
event = (
735-
service.events()
736-
.insert(calendarId=cal_id, body=event)
737-
.execute()
729+
builder_data = json.dumps({
730+
"id": self.id,
731+
"title": self.title,
732+
"date": str(self.date.strftime('%Y-%m-%d')),
733+
"event_id": self.event_id
734+
})
735+
try:
736+
builder = Builder.objects.get(
737+
category="build_add_bpdd_to_calendar",
738+
timeline=self.timeline,
739+
bpdd=self
740+
)
741+
builder.activation_date = datetime.datetime.now()
742+
builder.built = None
743+
builder.data = builder_data
744+
builder.save()
745+
except Builder.DoesNotExist:
746+
Builder.objects.create(
747+
category="build_add_bpdd_to_calendar",
748+
activation_date=datetime.datetime.now(),
749+
data=builder_data,
750+
timeline=self.timeline,
751+
bpdd=self
738752
)
739-
self.event_id = event.get("id")
740-
self.save()
741-
else:
742-
service.events().update(
743-
calendarId=cal_id, eventId=self.event_id, body=event
744-
).execute()
745753

746754
def delete_from_calendar(self):
747755
if self.event_id:

0 commit comments

Comments
 (0)