add slug and get_absolute_url method for the Note model
[oweals/karmaworld.git] / karmaworld / apps / notes / models.py
1 #!/usr/bin/python2.7
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.db import models
12 from taggit.managers import TaggableManager
13 from oauth2client.client import Credentials
14
15 from karmaworld.apps.courses.models import Course
16
17 class Note(models.Model):
18     """ A django model representing an uploaded file and associated metadata.
19     """
20     UNKNOWN_FILE = '???'
21     FILE_TYPE_CHOICES = (
22         ('doc', 'MS Word compatible file (.doc, .docx, .rtf, .odf)'),
23         ('img', 'Scan or picture of notes'),
24         ('pdf', 'PDF file'),
25         (UNKNOWN_FILE, 'Unknown file'),
26     )
27
28     course          = models.ForeignKey(Course)
29     # Tagging system
30     tags            = TaggableManager()
31
32     name            = models.CharField(max_length=255, blank=True, null=True)
33     slug            = models.SlugField(null=True)
34     desc            = models.TextField(max_length=511, blank=True, null=True)
35     uploaded_at     = models.DateTimeField(null=True, default=datetime.datetime.utcnow)
36
37     file_type   = models.CharField(max_length=15, blank=True, null=True, choices=FILE_TYPE_CHOICES, default=UNKNOWN_FILE)
38     # Upload files to MEDIA_ROOT/notes/YEAR/MONTH/DAY, 2012/10/30/filename
39     note_file   = models.FileField(upload_to="notes/%Y/%m/%j/", blank=True, null=True)
40
41     ## post gdrive conversion data
42     embed_url   = models.URLField(max_length=1024, blank=True, null=True)
43     download_url = models.URLField(max_length=1024, blank=True, null=True)
44     # for word processor documents
45     html        = models.TextField(blank=True, null=True)
46     text        = models.TextField(blank=True, null=True)
47
48     # FIXME: Not Implemented
49     #uploader    = models.ForeignKey(User, blank=True, null=True, related_name='notes')
50     #course      = models.ForeignKey(Course, blank=True, null=True, related_name="files")
51     #school      = models.ForeignKey(School, blank=True, null=True)
52
53     def __unicode__(self):
54         return u"{0}: {1} -- {2}".format(self.file_type, self.name, self.uploaded_at)
55
56     def save(self, *args, **kwargs):
57         """ override built-in save to ensure contextual self.name """
58         # TODO: If self.name isn't set, generate one based on uploaded_name
59         # if we fail to set the Note.name earlier than this, use the saved filename
60
61         if not self.slug:
62             self.slug = defaultfilters.slugify(self.name)
63         super(Note, self).save(*args, **kwargs)
64
65     @models.permalink
66     def get_absolute_url(self):
67         """ Resolve note url, use 'note' route and slug if slug
68             otherwise use note and id
69         """
70         if self.slug:
71             return ('note_detail', [unicode(self.slug)])
72         else:
73             return ('note_detail', [self.id])
74
75
76 # FIXME: replace the following GOOGLE_USER in a settings.py
77 GOOGLE_USER = 'seth.woodworth@gmail.com'
78
79 class DriveAuth(models.Model):
80     """ stored google drive authentication and refresh token
81         used for interacting with google drive """
82
83     email = models.EmailField(default=GOOGLE_USER)
84     credentials = models.TextField() # JSON of Oauth2Credential object
85     stored_at = models.DateTimeField(auto_now=True)
86
87
88     @staticmethod
89     def get(email=GOOGLE_USER):
90         """ Staticmethod for getting the singleton DriveAuth object """
91         # FIXME: this is untested
92         return DriveAuth.objects.filter(email=email).reverse()[0]
93
94
95     def store(self, creds):
96         """ Transform an existing credentials object to a db serialized """
97         self.email = creds.id_token['email']
98         self.credentials = creds.to_json()
99         self.save()
100
101
102     def transform_to_cred(self):
103         """ take stored credentials and produce a Credentials object """
104         return Credentials.new_from_json(self.credentials)
105
106
107     def __unicode__(self):
108         return u'Gdrive auth for %s created/updated at %s' % \
109                     (self.email, self.stored_at)