Mercurial > public > sg101
diff gcalendar/admin.py @ 581:ee87ea74d46b
For Django 1.4, rearranged project structure for new manage.py.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Sat, 05 May 2012 17:10:48 -0500 |
parents | gpp/gcalendar/admin.py@ddd69a8e07c7 |
children | 8743c566f712 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcalendar/admin.py Sat May 05 17:10:48 2012 -0500 @@ -0,0 +1,152 @@ +""" +This file contains the automatic admin site definitions for the gcalendar application. + +""" +from django.conf import settings +from django.conf.urls import patterns, url +from django.contrib import admin +from django.contrib import messages +from django.contrib.sites.models import Site +from django.core.urlresolvers import reverse +from django.http import HttpResponseRedirect +from django.shortcuts import render + +import gdata.client + +from gcalendar.models import Event, AccessToken +from gcalendar.calendar import Calendar, 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') + list_filter = ('start_date', 'status') + date_hierarchy = 'start_date' + search_fields = ('what', 'where', 'description') + raw_id_fields = ('user', ) + exclude = ('html', 'google_id', 'google_url') + save_on_top = True + actions = ('approve_events', ) + + pending_states = { + Event.NEW: Event.NEW_APRV, + Event.EDIT_REQ: Event.EDIT_APRV, + Event.DEL_REQ: Event.DEL_APRV, + } + + def get_urls(self): + urls = super(EventAdmin, self).get_urls() + my_urls = patterns('', + 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 + + def approve_events(self, request, qs): + """ + Ratchets the selected events forward to the approved state. + Ignores events that aren't in the proper state. + """ + count = 0 + for event in qs: + if event.status in self.pending_states: + event.status = self.pending_states[event.status] + event.save() + count += 1 + + if event.status == Event.NEW_APRV: + bio.badges.award_badge(bio.badges.CALENDAR_PIN, event.user) + + msg = "1 event was" if count == 1 else "%d events were" % count + msg += " approved." + self.message_user(request, msg) + + approve_events.short_description = "Approve selected events" + + def google_sync(self, request): + """ + View to synchronize approved event changes with Google calendar. + + """ + # Get pending events + events = Event.pending_events.all() + + # Attempt to get saved access token to the Google calendar + access_token = AccessToken.objects.get_token().access_token() + + messages = [] + err_msg = '' + if request.method == 'POST': + if access_token: + try: + cal = Calendar(source=oauth.USER_AGENT, + calendar_id=settings.GCAL_CALENDAR_ID, + access_token=access_token) + cal.sync_events(events) + except CalendarError, e: + err_msg = e.msg + events = Event.pending_events.all() + else: + messages.append('All events processed successfully.') + events = Event.objects.none() + + return render(request, 'gcalendar/google_sync.html', { + 'current_app': self.admin_site.name, + 'access_token': access_token, + 'messages': messages, + 'err_msg': err_msg, + 'events': events, + }) + + def fetch_auth(self, request): + """ + This view fetches a request token and then redirects the user to + authorize it. + + """ + site = Site.objects.get_current() + callback_url = 'http://%s%s' % (site.domain, + 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: + token = AccessToken.objects.get_token() + token.update(access_token) + token.save() + + return HttpResponseRedirect(reverse('admin:gcalendar-google_sync')) + + +admin.site.register(Event, EventAdmin) +admin.site.register(AccessToken)