Skip to content
This repository was archived by the owner on Aug 26, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 67 additions & 2 deletions gsoc/common/utils/build_tasks.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import json
import uuid
import urllib.parse

from django.utils import timezone
from django.conf import settings

from gsoc.models import UserProfile, GsocYear, BlogPostDueDate, Scheduler, ReaddUser
from gsoc.models import (Event, Timeline, UserProfile, GsocYear,
BlogPostDueDate, Scheduler, ReaddUser)
from gsoc.common.utils.tools import build_send_mail_json

from googleapiclient.discovery import build
from gsoc.common.utils.googleoauth import getCreds


def build_pre_blog_reminders(builder):
try:
Expand Down Expand Up @@ -154,3 +157,65 @@ def build_remove_user_details(builder):
Scheduler.objects.create(command="send_email", data=scheduler_data)
except Exception as e:
return str(e)


def build_add_timeline_to_calendar(builder):
data = json.loads(builder.data)
if not data["calendar_id"]:
creds = getCreds()
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
calendar = {"summary": "GSoC @ PSF Calendar", "timezone": "UTC"}
calendar = service.calendars().insert(body=calendar).execute()
timeline = Timeline.objects.get(id=data["timeline_id"])
timeline.calendar_id = calendar.get("id")
timeline.save()


def build_add_bpdd_to_calendar(builder):
data = json.loads(builder.data)
creds = getCreds()
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
event = {
"summary": data["title"],
"start": {"date": data["date"]},
"end": {"date": data["date"]},
}
cal_id = builder.timeline.calendar_id if builder.timeline else "primary"
if not data["event_id"]:
event = (
service.events()
.insert(calendarId=cal_id, body=event)
.execute()
)
item = BlogPostDueDate.objects.get(id=data["id"])
item.event_id = event.get("id")
item.save()
else:
service.events().update(
calendarId=cal_id, eventId=data["event_id"], body=event
).execute()


def build_add_event_to_calendar(builder):
data = json.loads(builder.data)
creds = getCreds()
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
event = {
"summary": data["title"],
"start": {"date": data["start_date"]},
"end": {"date": data["end_date"]},
}
cal_id = builder.timeline.calendar_id if builder.timeline else "primary"
item = Event.objects.get(id=data["id"])
if not data["event_id"]:
event = (
service.events()
.insert(calendarId=cal_id, body=event)
.execute()
)
item.event_id = event.get("id")
item.save()
else:
service.events().update(
calendarId=cal_id, eventId=item.event_id, body=event
).execute()
30 changes: 30 additions & 0 deletions gsoc/common/utils/googleoauth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import os

from gsoc.settings import BASE_DIR

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow

SCOPES = ['https://www.googleapis.com/auth/calendar']


def getCreds():
creds = None
if os.path.exists(os.path.join(BASE_DIR, 'token.json')):
creds = Credentials.from_authorized_user_file(
os.path.join(BASE_DIR, 'token.json'),
SCOPES
)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
os.path.join(BASE_DIR, 'credentials.json'),
SCOPES
)
creds = flow.run_local_server(port=0)
with open(os.path.join(BASE_DIR, 'token.json'), 'w') as token:
token.write(creds.to_json())
return creds
154 changes: 81 additions & 73 deletions gsoc/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,8 @@
from gsoc.common.utils.tools import build_send_reminder_json
from gsoc.settings import PROPOSALS_PATH, BASE_DIR
from settings_local import ADMINS
from gsoc.common.utils.googleoauth import getCreds

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow

SCOPES = ['https://www.googleapis.com/auth/calendar']

# Util Functions

Expand All @@ -66,27 +62,6 @@ def validate_date(value):
except GsocEndDate.DoesNotExist:
pass


def getCreds():
creds = None
if os.path.exists(os.path.join(BASE_DIR, 'token.json')):
creds = Credentials.from_authorized_user_file(
os.path.join(BASE_DIR, 'token.json'),
SCOPES
)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
os.path.join(BASE_DIR, 'credentials.json'),
SCOPES
)
creds = flow.run_local_server(port=0)
with open(os.path.join(BASE_DIR, 'token.json'), 'w') as token:
token.write(creds.to_json())
return creds


# Patching

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

def add_calendar(self):
if not self.calendar_id:
creds = getCreds()
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
calendar = {"summary": "GSoC @ PSF Calendar", "timezone": "UTC"}
calendar = service.calendars().insert(body=calendar).execute()
self.calendar_id = calendar.get("id")
self.save()
builder_data = json.dumps({
"timeline_id": self.id,
"calendar_id": self.calendar_id
})
try:
builder = Builder.objects.get(
category="build_add_timeline_to_calendar",
timeline=self
)
builder.activation_date = datetime.datetime.now()
builder.calendar_id = self.calendar_id
builder.save()
except Builder.DoesNotExist:
Builder.objects.create(
category="build_add_timeline_to_calendar",
activation_date=datetime.datetime.now(),
data=builder_data,
timeline=self
)


class Builder(models.Model):
Expand All @@ -611,15 +598,28 @@ class Builder(models.Model):
("build_post_blog_reminders", "build_post_blog_reminders"),
("build_revoke_student_perms", "build_revoke_student_perms"),
("build_remove_user_details", "build_remove_user_details"),
("build_add_timeline_to_calendar", "build_add_timeline_to_calendar"),
("build_add_bpdd_to_calendar", "build_add_bpdd_to_calendar"),
("build_add_event_to_calendar", "build_add_event_to_calendar")
)

category = models.CharField(max_length=40, choices=categories)
activation_date = models.DateTimeField(null=True, blank=True)
built = models.BooleanField(default=None, null=True)
data = models.TextField()
last_error = models.TextField(null=True, default=None, blank=True)
timeline = models.ForeignKey(
Timeline, on_delete=models.CASCADE, null=True, blank=True
timeline = models.ForeignKey(Timeline, on_delete=models.CASCADE)
bpdd = models.ForeignKey(
'BlogPostDueDate',
on_delete=models.CASCADE,
null=True,
blank=True
)
event = models.ForeignKey(
'Event',
on_delete=models.CASCADE,
null=True,
blank=True
)

def __str__(self):
Expand Down Expand Up @@ -649,26 +649,30 @@ def calendar_link(self):
return None

def add_to_calendar(self):
creds = getCreds()
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
event = {
"summary": self.title,
"start": {"date": self.start_date.strftime("%Y-%m-%d")},
"end": {"date": self.end_date.strftime("%Y-%m-%d")},
}
cal_id = self.timeline.calendar_id if self.timeline else "primary"
if not self.event_id:
event = (
service.events()
.insert(calendarId=cal_id, body=event)
.execute()
builder_data = json.dumps({
"id": self.id,
"title": self.title,
"start_date": str(self.start_date.strftime('%Y-%m-%d')),
"end_date": str(self.end_date.strftime('%Y-%m-%d')),
"event_id": self.event_id
})
try:
builder = Builder.objects.get(
category="build_add_event_to_calendar",
timeline=self.timeline,
event=self
)
builder.activation_date = datetime.datetime.now()
builder.built = None
builder.data = builder_data
builder.save()
except Builder.DoesNotExist:
Builder.objects.create(
category="build_add_event_to_calendar",
activation_date=datetime.datetime.now(),
data=builder_data,
timeline=self.timeline,
)
self.event_id = event.get("id")
self.save()
else:
service.events().update(
calendarId=cal_id, eventId=self.event_id, body=event
).execute()

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

def add_to_calendar(self):
creds = getCreds()
service = build("calendar", "v3", credentials=creds, cache_discovery=False)
event = {
"summary": self.title,
"start": {"date": self.date.strftime("%Y-%m-%d")},
"end": {"date": self.date.strftime("%Y-%m-%d")},
}
cal_id = self.timeline.calendar_id if self.timeline else "primary"
if not self.event_id:
event = (
service.events()
.insert(calendarId=cal_id, body=event)
.execute()
builder_data = json.dumps({
"id": self.id,
"title": self.title,
"date": str(self.date.strftime('%Y-%m-%d')),
"event_id": self.event_id
})
try:
builder = Builder.objects.get(
category="build_add_bpdd_to_calendar",
timeline=self.timeline,
bpdd=self
)
builder.activation_date = datetime.datetime.now()
builder.built = None
builder.data = builder_data
builder.save()
except Builder.DoesNotExist:
Builder.objects.create(
category="build_add_bpdd_to_calendar",
activation_date=datetime.datetime.now(),
data=builder_data,
timeline=self.timeline,
bpdd=self
)
self.event_id = event.get("id")
self.save()
else:
service.events().update(
calendarId=cal_id, eventId=self.event_id, body=event
).execute()

def delete_from_calendar(self):
if self.event_id:
Expand Down