From 4727a0291424dba59431171e321c30c2c4d2d9d9 Mon Sep 17 00:00:00 2001 From: Yingtong Li Date: Fri, 25 Jan 2019 11:24:10 +1100 Subject: [PATCH] Remove calendar code, integrate Google Calendar --- requirements.txt | 1 + selfserv/settings.example.py | 3 + ssmain/jinja2/ssmain/splash.html | 2 +- sspromotions/jinja2/sspromotions/base.html | 7 -- sspromotions/models.py | 10 -- sspromotions/urls.py | 4 - sspromotions/views.py | 110 ++++----------------- 7 files changed, 26 insertions(+), 111 deletions(-) diff --git a/requirements.txt b/requirements.txt index e9d576f..4f07ec6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ social-auth-app-django==2.1.0 jsonfield==2.0.2 Pillow==5.4.1 Markdown==3.0.1 +google-api-python-client==1.7.7 diff --git a/selfserv/settings.example.py b/selfserv/settings.example.py index a056aad..6088788 100644 --- a/selfserv/settings.example.py +++ b/selfserv/settings.example.py @@ -125,6 +125,9 @@ SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = None # FIXME SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = None # FIXME #SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = {'hd': 'monash.edu'} # To restrict to a particular domain +GOOGLE_API_KEY = None # FIXME +GOOGLE_CALENDAR_ID = None # FIXME + SOCIAL_AUTH_PIPELINE = ( 'social_core.pipeline.social_auth.social_details', 'social_core.pipeline.social_auth.social_uid', diff --git a/ssmain/jinja2/ssmain/splash.html b/ssmain/jinja2/ssmain/splash.html index 0a52235..53e8223 100644 --- a/ssmain/jinja2/ssmain/splash.html +++ b/ssmain/jinja2/ssmain/splash.html @@ -56,7 +56,7 @@
Promotions Hub
-
Create bulletin items. Add calendar events.
+
Create and manage bulletin items.
diff --git a/sspromotions/jinja2/sspromotions/base.html b/sspromotions/jinja2/sspromotions/base.html index 5e44d67..58c2c59 100644 --- a/sspromotions/jinja2/sspromotions/base.html +++ b/sspromotions/jinja2/sspromotions/base.html @@ -31,13 +31,6 @@ Preview the bulletin
-
- Calendar - -
diff --git a/sspromotions/models.py b/sspromotions/models.py index 54a3748..6cf7eaa 100644 --- a/sspromotions/models.py +++ b/sspromotions/models.py @@ -62,13 +62,3 @@ class BulletinItem(models.Model): if user.email in self.author.delegates: return True return False - -class CalendarItem(models.Model): - group = models.ForeignKey(Group, on_delete=models.CASCADE) - also_limit = JSONField(default=[]) - title = models.CharField(max_length=100) - link = models.CharField(max_length=100, null=True) - date = models.DateField() - - class Meta: - ordering = ['date', 'title', 'id'] diff --git a/sspromotions/urls.py b/sspromotions/urls.py index aaae62b..48aec24 100644 --- a/sspromotions/urls.py +++ b/sspromotions/urls.py @@ -24,9 +24,5 @@ urlpatterns = [ path('bulletin/edit/', views.bulletin_edit, name='bulletin_edit'), path('bulletin/delete/', views.bulletin_delete, name='bulletin_delete'), path('bulletin/preview/', views.bulletin_preview, name='bulletin_preview'), - path('calendar/', views.calendar_list, name='calendar_list'), - path('calendar/new/', views.calendar_new, name='calendar_new'), - path('calendar/edit/', views.calendar_edit, name='calendar_edit'), - path('calendar/delete/', views.calendar_delete, name='calendar_delete'), path('', views.index, name='promotions'), ] diff --git a/sspromotions/views.py b/sspromotions/views.py index 61f3c1b..92e77c0 100644 --- a/sspromotions/views.py +++ b/sspromotions/views.py @@ -14,8 +14,11 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from googleapiclient.discovery import build + from django.contrib.auth.decorators import login_required +from django.conf import settings from django.http import HttpResponse from django.shortcuts import render, redirect from django.urls import reverse @@ -24,11 +27,28 @@ from django.utils import timezone from . import models import datetime +import json @login_required def index(request): return render(request, 'sspromotions/index.html') +def get_calendar_events(calbegin, calend): + service = build('calendar', 'v3', developerKey=settings.GOOGLE_API_KEY) + events = service.events().list( + calendarId=settings.GOOGLE_CALENDAR_ID, + orderBy='startTime', + singleEvents=True, + timeMin=datetime.datetime.combine(calbegin, datetime.time(tzinfo=timezone.get_current_timezone())).isoformat(), + timeMax=datetime.datetime.combine(calend, datetime.time(tzinfo=timezone.get_current_timezone())).isoformat() + ).execute() + for event in events['items']: + yield { + 'date': datetime.datetime.strptime(event['start']['date'], '%Y-%m-%d') if 'date' in event['start'] else datetime.datetime.strptime(event['start']['dateTime'][:-3] + event['start']['dateTime'][-2:], '%Y-%m-%dT%H:%M:%S%z'), + 'title': event['summary'], + 'link': event['htmlLink'] + } + @login_required def bulletin_list(request): items_past = [] @@ -64,7 +84,7 @@ def bulletin_preview(request): bulend = bulbegin + datetime.timedelta(days=7) return render(request, 'sspromotions/email/bulletin.html', { - 'events': models.CalendarItem.objects.filter(date__gte=calbegin).filter(date__lt=calend).all(), + 'events': get_calendar_events(calbegin, calend), 'groups': models.Group.objects.all(), 'more': [], 'bulbegin': bulbegin, @@ -137,91 +157,3 @@ def bulletin_delete(request, id): item.delete() return redirect(reverse('bulletin_list')) - -@login_required -def calendar_list(request): - items_past = [] - items_upcoming = [] - items_future = [] - - dtbegin = timezone.now().date() + datetime.timedelta(days=1) # Start tomorrow for calendar - dtend = dtbegin + datetime.timedelta(days=14) - - for item in models.CalendarItem.objects.all(): - if not item.group.can_user_access(request.user): - continue - - if item.date >= dtbegin and item.date < dtend: - items_upcoming.append(item) - elif item.date >= dtend: - items_future.append(item) - else: - items_past.append(item) - - return render(request, 'sspromotions/calendar_list.html', { - 'items_past': items_past, - 'items_upcoming': items_upcoming, - 'items_future': items_future - }) - -@login_required -def calendar_new(request): - if request.method == 'POST': - item = models.CalendarItem() - item.group = models.Group.objects.get(id=int(request.POST['group'])) - if not item.group.can_user_access(request.user): - return HttpResponse('Unauthorized', status=401) - item.title = request.POST['title'] - item.date = request.POST['date'] - item.link = request.POST['link'] - item.also_limit = [int(k[11:]) for k, v in request.POST.items() if k.startswith('also_limit_') and v] - item.save() - - if request.POST['submit'] == 'Save': - return redirect(reverse('calendar_list')) - else: - return redirect(reverse('calendar_edit', kwargs={'id': item.id})) - else: - item = models.CalendarItem() - item.date = timezone.now() - return render(request, 'sspromotions/calendar_edit.html', { - 'item': item, - 'groups': [group for group in models.Group.objects.all() if group.can_user_access(request.user)], - 'all_groups': models.Group.objects.all() - }) - -@login_required -def calendar_edit(request, id): - if request.method == 'POST': - item = models.CalendarItem.objects.get(id=id) - item.group = models.Group.objects.get(id=int(request.POST['group'])) - if not item.group.can_user_access(request.user): - return HttpResponse('Unauthorized', status=401) - item.title = request.POST['title'] - item.date = request.POST['date'] - item.link = request.POST['link'] - item.also_limit = [int(k[11:]) for k, v in request.POST.items() if k.startswith('also_limit_') and v] - item.save() - - if request.POST['submit'] == 'Save': - return redirect(reverse('calendar_list')) - else: - return redirect(reverse('calendar_edit', kwargs={'id': item.id})) - else: - item = models.CalendarItem.objects.get(id=id) - if not item.group.can_user_access(request.user): - return HttpResponse('Unauthorized', status=401) - return render(request, 'sspromotions/calendar_edit.html', { - 'item': item, - 'groups': [group for group in models.Group.objects.all() if group.can_user_access(request.user)], - 'all_groups': models.Group.objects.all() - }) - -@login_required -def calendar_delete(request, id): - item = models.CalendarItem.objects.get(id=id) - if not item.group.can_user_access(request.user): - return HttpResponse('Unauthorized', status=401) - item.delete() - - return redirect(reverse('calendar_list'))