invert notes defaute sorting
[oweals/karmaworld.git] / karmaworld / apps / notes / models.py
1 #!/usr/bin/env python
2 # -*- coding:utf8 -*-
3 # Copyright (C) 2012  FinalsClub Foundation
4
5 """
6     Models for the notes django app.
7     Contains only the minimum for handling files and their representation
8 """
9 import datetime
10
11 from django.template import defaultfilters
12 from django.db import models
13 from taggit.managers import TaggableManager
14 from oauth2client.client import Credentials
15
16 from karmaworld.apps.courses.models import Course
17
18 try:
19     from secrets.drive import GOOGLE_USER
20 except:
21     GOOGLE_USER = u'admin@karmanotes.org'
22
23 class Note(models.Model):
24     """ A django model representing an uploaded file and associated metadata.
25     """
26     UNKNOWN_FILE = '???'
27     FILE_TYPE_CHOICES = (
28         ('doc', 'MS Word compatible file (.doc, .docx, .rtf, .odf)'),
29         ('img', 'Scan or picture of notes'),
30         ('pdf', 'PDF file'),
31         (UNKNOWN_FILE, 'Unknown file'),
32     )
33
34     course          = models.ForeignKey(Course)
35     # Tagging system
36     tags            = TaggableManager(blank=True)
37
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)
42
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)
46
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)
53
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)
58
59     class Meta:
60         """ Sort files by most recent first """
61         ordering = ['-uploaded_at']
62
63
64     def __unicode__(self):
65         return u"{0}: {1} -- {2}".format(self.file_type, self.name, self.uploaded_at)
66
67
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
72
73         if not self.slug:
74             self.slug = defaultfilters.slugify(self.name)
75         super(Note, self).save(*args, **kwargs)
76
77
78     def get_absolute_url(self):
79         """ Resolve note url, use 'note' route and slug if slug
80             otherwise use note.id
81         """
82         if self.slug == None:
83             # return a url ending in slug
84             return u"/{0}/{1}/{2}".format(self.course.school.slug, self.course.slug, self.slug)
85         else:
86             # return a url ending in id
87             return u"/{0}/{1}/{2}".format(self.course.school.slug, self.course.slug, self.id)
88
89
90 class DriveAuth(models.Model):
91     """ stored google drive authentication and refresh token
92         used for interacting with google drive """
93
94     email = models.EmailField(default=GOOGLE_USER)
95     credentials = models.TextField() # JSON of Oauth2Credential object
96     stored_at = models.DateTimeField(auto_now=True)
97
98
99     @staticmethod
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]
104
105
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()
110         self.save()
111
112
113     def transform_to_cred(self):
114         """ take stored credentials and produce a Credentials object """
115         return Credentials.new_from_json(self.credentials)
116
117
118     def __unicode__(self):
119         return u'Gdrive auth for %s created/updated at %s' % \
120                     (self.email, self.stored_at)