3 # Copyright (C) 2012 FinalsClub Foundation
6 Models for the notes django app.
7 Contains only the minimum for handling files and their representation
11 from django.template import defaultfilters
12 from django.db import models
13 from taggit.managers import TaggableManager
14 from oauth2client.client import Credentials
16 from karmaworld.apps.courses.models import Course
19 from secrets.drive import GOOGLE_USER
21 GOOGLE_USER = u'admin@karmanotes.org'
23 class Note(models.Model):
24 """ A django model representing an uploaded file and associated metadata.
28 ('doc', 'MS Word compatible file (.doc, .docx, .rtf, .odf)'),
29 ('img', 'Scan or picture of notes'),
31 (UNKNOWN_FILE, 'Unknown file'),
34 course = models.ForeignKey(Course)
36 tags = TaggableManager(blank=True)
38 name = models.CharField(max_length=255, blank=True, null=True)
39 slug = models.SlugField(null=True)
40 desc = models.TextField(max_length=511, blank=True, null=True)
41 uploaded_at = models.DateTimeField(null=True, default=datetime.datetime.utcnow)
43 file_type = models.CharField(max_length=15, blank=True, null=True, choices=FILE_TYPE_CHOICES, default=UNKNOWN_FILE)
44 # Upload files to MEDIA_ROOT/notes/YEAR/MONTH/DAY, 2012/10/30/filename
45 note_file = models.FileField(upload_to="notes/%Y/%m/%j/", blank=True, null=True)
47 ## post gdrive conversion data
48 embed_url = models.URLField(max_length=1024, blank=True, null=True)
49 download_url = models.URLField(max_length=1024, blank=True, null=True)
50 # for word processor documents
51 html = models.TextField(blank=True, null=True)
52 text = models.TextField(blank=True, null=True)
54 # FIXME: Not Implemented
55 #uploader = models.ForeignKey(User, blank=True, null=True, related_name='notes')
56 #course = models.ForeignKey(Course, blank=True, null=True, related_name="files")
57 #school = models.ForeignKey(School, blank=True, null=True)
60 """ Sort files by most recent first """
61 ordering = ['-uploaded_at']
64 def __unicode__(self):
65 return u"{0}: {1} -- {2}".format(self.file_type, self.name, self.uploaded_at)
68 def save(self, *args, **kwargs):
69 """ override built-in save to ensure contextual self.name """
70 # TODO: If self.name isn't set, generate one based on uploaded_name
71 # if we fail to set the Note.name earlier than this, use the saved filename
74 self.slug = defaultfilters.slugify(self.name)
75 super(Note, self).save(*args, **kwargs)
78 def get_absolute_url(self):
79 """ Resolve note url, use 'note' route and slug if slug
83 # return a url ending in slug
84 return u"/{0}/{1}/{2}".format(self.course.school.slug, self.course.slug, self.slug)
86 # return a url ending in id
87 return u"/{0}/{1}/{2}".format(self.course.school.slug, self.course.slug, self.id)
90 class DriveAuth(models.Model):
91 """ stored google drive authentication and refresh token
92 used for interacting with google drive """
94 email = models.EmailField(default=GOOGLE_USER)
95 credentials = models.TextField() # JSON of Oauth2Credential object
96 stored_at = models.DateTimeField(auto_now=True)
100 def get(email=GOOGLE_USER):
101 """ Staticmethod for getting the singleton DriveAuth object """
102 # FIXME: this is untested
103 return DriveAuth.objects.filter(email=email).reverse()[0]
106 def store(self, creds):
107 """ Transform an existing credentials object to a db serialized """
108 self.email = creds.id_token['email']
109 self.credentials = creds.to_json()
113 def transform_to_cred(self):
114 """ take stored credentials and produce a Credentials object """
115 return Credentials.new_from_json(self.credentials)
118 def __unicode__(self):
119 return u'Gdrive auth for %s created/updated at %s' % \
120 (self.email, self.stored_at)