Mercurial > public > sg101
diff gpp/gcalendar/admin.py @ 451:345825e6dcae
Working on #220. Can't test locally, so committing in increments.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Thu, 30 Jun 2011 01:57:17 +0000 |
parents | 3fa61786abf1 |
children | 5b2114cec3e3 |
line wrap: on
line diff
--- a/gpp/gcalendar/admin.py Sun Jun 26 00:15:36 2011 +0000 +++ b/gpp/gcalendar/admin.py Thu Jun 30 01:57:17 2011 +0000 @@ -1,15 +1,31 @@ """ This file contains the automatic admin site definitions for the gcalendar application. + """ +from django.conf import settings +from django.conf.urls.defaults import * from django.contrib import admin +from django.contrib import messages +from django.core.urlresolvers import reverse from django.http import HttpResponse -from django.conf.urls.defaults import * +from django.http import HttpResponseRedirect +from django.shortcuts import render_to_response +from django.template import RequestContext + +import gdata.client from gcalendar.models import Event -from gcalendar.admin_views import google_sync +from gcalendar.forms import PasswordForm +from gcalendar.calendar import Calendar +from gcalendar.calendar import CalendarError +from gcalendar import oauth + import bio.badges +SCOPES = ['https://www.google.com/calendar/feeds/'] + + class EventAdmin(admin.ModelAdmin): list_display = ('what', 'user', 'start_date', 'where', 'date_submitted', 'status', 'is_approved', 'google_html') @@ -30,9 +46,15 @@ def get_urls(self): urls = super(EventAdmin, self).get_urls() my_urls = patterns('', - url(r'^google_sync/$', - self.admin_site.admin_view(google_sync), - name="gcalendar-google_sync") + url(r'^google_sync/$', + self.admin_site.admin_view(self.google_sync), + name="gcalendar-google_sync"), + url(r'^fetch_auth/$', + self.admin_site.admin_view(self.fetch_auth), + name="gcalendar-fetch_auth"), + url(r'^get_access_token/$', + self.admin_site.admin_view(self.get_access_token), + name="gcalendar-get_access_token"), ) return my_urls + urls @@ -57,6 +79,72 @@ approve_events.short_description = "Approve selected events" + def google_sync(self, request): + """View to synchronize approved event changes with Google calendar.""" + events = Event.pending_events.all() + messages = [] + err_msg = '' + if request.method == 'POST': + form = PasswordForm(request.POST) + if form.is_valid(): + try: + cal = Calendar(settings.GCAL_EMAIL, + form.cleaned_data['password'], + settings.GCAL_CALENDAR_ID) + cal.sync_events(events) + except CalendarError, e: + err_msg = e.msg + events = Event.pending_events.all() + form = PasswordForm() + else: + messages.append('All events processed successfully.') + events = Event.objects.none() + form = PasswordForm() + + else: + form = PasswordForm() + + return render_to_response('gcalendar/google_sync.html', { + 'current_app': self.admin_site.name, + 'messages': messages, + 'err_msg': err_msg, + 'events': events, + 'form': form, + }, + context_instance=RequestContext(request)) + + def fetch_auth(self, request): + """ + This view fetches a request token and then redirects the user to + authorize it. + + """ + callback_url = reverse('admin:gcalendar-get_access_token') + try: + auth_url = oauth.fetch_auth(request, SCOPES, callback_url) + except gdata.client.Error, e: + messages.error(request, str(e)) + return HttpResponseRedirect(reverse('admin:gcalendar-google_sync')) + else: + return HttpResponseRedirect(auth_url) + + def get_access_token(self, request): + """ + This view is called by Google after the user has authorized us access to + their data. We call into the oauth module to upgrade the oauth token to + an access token. We then save the access token in the database and + redirect back to our admin Google sync view. + + """ + try: + access_token = oauth.get_access_token(request) + except gdata.client.Error, e: + messages.error(request, str(e)) + else: + # TODO: save access token + pass + + return HttpResponseRedirect(reverse('admin:gcalendar-google_sync')) + admin.site.register(Event, EventAdmin) -