diff gcalendar/models.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/models.py@368d731af479
children 3e1905e523be
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcalendar/models.py	Sat May 05 17:10:48 2012 -0500
@@ -0,0 +1,159 @@
+"""
+Models for the gcalendar application.
+
+"""
+import datetime
+
+from django.db import models
+from django.db.models import Q
+from django.contrib.auth.models import User
+
+from core.markup import site_markup
+import forums.tools
+from gcalendar.oauth import serialize_token, deserialize_token
+
+
+GIG_FORUM_SLUG = "gigs"
+
+class PendingEventManager(models.Manager):
+    """A manager for pending events."""
+
+    def get_query_set(self):
+        """Returns a queryset of events that have been approved to update
+        the Google calendar."""
+        return super(PendingEventManager, self).get_query_set().filter(
+                Q(status=Event.NEW_APRV) |
+                Q(status=Event.EDIT_APRV) |
+                Q(status=Event.DEL_APRV)
+            )
+
+
+class Event(models.Model):
+    """Model to represent calendar events."""
+
+    # Event status codes:
+    (NEW, NEW_APRV, EDIT_REQ, EDIT_APRV, DEL_REQ, DEL_APRV, ON_CAL) = range(7)
+
+    STATUS_CHOICES = (
+        (NEW, 'New'),
+        (NEW_APRV, 'New Approved'),
+        (EDIT_REQ, 'Edit Request'),
+        (EDIT_APRV, 'Edit Approved'),
+        (DEL_REQ, 'Delete Request'),
+        (DEL_APRV, 'Delete Approved'),
+        (ON_CAL, 'On Calendar'),
+    )
+
+    user = models.ForeignKey(User)
+    what = models.CharField(max_length=255)
+    start_date = models.DateField()
+    start_time = models.TimeField(null=True, blank=True)
+    end_date = models.DateField()
+    end_time = models.TimeField(null=True, blank=True)
+    time_zone = models.CharField(max_length=64, blank=True)
+    all_day = models.BooleanField(default=False)
+    where = models.CharField(max_length=255, blank=True)
+    description = models.TextField(blank=True)
+    html = models.TextField(blank=True)
+    date_submitted = models.DateTimeField(auto_now_add=True)
+    google_id = models.CharField(max_length=255, blank=True)
+    google_url = models.URLField(max_length=255, blank=True)
+    status = models.SmallIntegerField(choices=STATUS_CHOICES, default=NEW,
+            db_index=True)
+    create_forum_thread = models.BooleanField(default=False)
+
+    objects = models.Manager()
+    pending_events = PendingEventManager()
+
+    def __unicode__(self):
+        return self.what
+
+    class Meta:
+        ordering = ('-date_submitted', )
+
+    def save(self, *args, **kwargs):
+        self.html = site_markup(self.description)
+        super(Event, self).save(*args, **kwargs)
+
+    def is_approved(self):
+        return self.status not in (self.NEW, self.EDIT_REQ, self.DEL_REQ)
+    is_approved.boolean = True
+
+    def google_html(self):
+        """Returns a HTML <a> tag to the event if it exits."""
+        if self.google_url:
+            return u'<a href="%s">On Google</a>' % self.google_url
+        return u''
+    google_html.allow_tags = True
+    google_html.short_description = 'Google Link'
+
+    def notify_on_calendar(self):
+        """
+        This function should be called when the event has been added to the
+        Google calendar for the first time. This gives us a chance to perform
+        any first-time processing, like creating a forum thread.
+        """
+        if self.create_forum_thread:
+            topic_name = '%s: %s' % (self.start_date.strftime('%m/%d/%Y'),
+                    self.what)
+            post_body = "%s\n\n[Link to event on Google Calendar](%s)" % (
+                    self.description, self.google_url)
+
+            forums.tools.create_topic(
+                forum_slug=GIG_FORUM_SLUG,
+                user=self.user,
+                topic_name=topic_name,
+                post_body=post_body)
+
+            self.create_forum_thread = False
+            self.save()
+
+
+class AccessTokenManager(models.Manager):
+    """
+    A manager for the AccessToken table. Only one access token is saved in the
+    database. This manager provides a convenience method to either return that
+    access token or a brand new one.
+
+    """
+    def get_token(self):
+        try:
+            token = self.get(pk=1)
+        except AccessToken.DoesNotExist:
+            token = AccessToken()
+
+        return token
+
+
+class AccessToken(models.Model):
+    """
+    This model represents serialized OAuth access tokens for reading and
+    updating the Google Calendar.
+
+    """
+    auth_date = models.DateTimeField()
+    token = models.TextField()
+
+    objects = AccessTokenManager()
+
+    def __unicode__(self):
+        return u'Access token created on ' + unicode(self.auth_date)
+
+    def update(self, access_token, auth_date=None):
+        """
+        This function updates the AccessToken object with the input parameters:
+            access_token - an access token from Google's OAuth dance
+            auth_date - a datetime or None. If None, now() is used.
+
+        """
+        self.auth_date = auth_date if auth_date else datetime.datetime.now()
+        self.token = serialize_token(access_token)
+
+    def access_token(self):
+        """
+        This function returns a Google OAuth access token by deserializing the
+        token field from the database.
+        If the token attribute is empty, None is returned.
+
+        """
+        return deserialize_token(self.token) if self.token else None