d18e7d65a8ee86572568f560727ea28d3e6a7a59
[oweals/karmaworld.git] / karmaworld / apps / courses / models.py
1 #!/usr/bin/env python
2 # -*- coding:utf8 -*-
3 # Copyright (C) 2012  FinalsClub Foundation
4
5 """
6     Models for the courses django app.
7     Handles courses, and their related models
8     Courses are the first class object, they contain notes.
9     Courses have a manytoone relation to schools.
10 """
11 import datetime
12
13 from django.db import models
14 from django.template import defaultfilters
15 from karmaworld.settings.manual_unique_together import auto_add_check_unique_together
16
17
18 class School(models.Model):
19     """ A grouping that contains many courses """
20     name        = models.CharField(max_length=255)
21     slug        = models.SlugField(max_length=150, null=True)
22     location    = models.CharField(max_length=255, blank=True, null=True)
23     url         = models.URLField(max_length=511, blank=True)
24     # Facebook keeps a unique identifier for all schools
25     facebook_id = models.BigIntegerField(blank=True, null=True)
26     # United States Department of Education institution_id
27     usde_id     = models.BigIntegerField(blank=True, null=True)
28     file_count  = models.IntegerField(default=0)
29     priority    = models.BooleanField(default=0)
30     alias       = models.CharField(max_length=255, null=True, blank=True)
31     hashtag     = models.CharField(max_length=16, null=True, blank=True, help_text='School abbreviation without #')
32
33     class Meta:
34         """ Sort School by file_count descending, name abc=> """
35         ordering = ['-file_count','-priority', 'name']
36
37
38     def __unicode__(self):
39         return self.name
40
41     def save(self, *args, **kwargs):
42         """ Save school and generate a slug if one doesn't exist """
43         if not self.slug:
44             self.slug = defaultfilters.slugify(self.name)
45         super(School, self).save(*args, **kwargs)
46
47     @staticmethod
48     def autocomplete_search_fields():
49         return ("name__icontains",)
50
51     def update_note_count(self):
52         """ Update the School.file_count by summing the
53             contained course.file_count
54         """
55         self.file_count = sum([course.file_count for course in self.course_set.all()])
56         self.save()
57
58
59 class Course(models.Model):
60     """ First class object that contains many notes.Note objects """
61     # Core metadata
62     name        = models.CharField(max_length=255)
63     slug        = models.SlugField(max_length=150, null=True)
64     school      = models.ForeignKey(School) # Should this be optional ever?
65     file_count  = models.IntegerField(default=0)
66
67     desc        = models.TextField(max_length=511, blank=True, null=True)
68     url         = models.URLField(max_length=511, blank=True, null=True)
69     academic_year   = models.IntegerField(blank=True, null=True, 
70                         default=datetime.datetime.now().year)
71
72     instructor_name     = models.CharField(max_length=255, blank=True, null=True)
73     instructor_email    = models.EmailField(blank=True, null=True)
74
75     updated_at      = models.DateTimeField(default=datetime.datetime.utcnow)
76
77     created_at      = models.DateTimeField(auto_now_add=True)
78
79     # Number of times this course has been flagged as abusive/spam.
80     flags           = models.IntegerField(default=0,null=False)
81
82
83     class Meta:
84         ordering = ['-file_count', 'school', 'name']
85         unique_together = ('school', 'name', 'instructor_name')
86         verbose_name = 'course'
87         verbose_name_plural = 'courses'
88
89     def __unicode__(self):
90         return u"{0}: {1}".format(self.name, self.school)
91
92     def get_absolute_url(self):
93         """ return url based on school slug and self slug """
94         return u"/{0}/{1}".format(self.school.slug, self.slug)
95
96     def save(self, *args, **kwargs):
97         """ Save school and generate a slug if one doesn't exist """
98         super(Course, self).save(*args, **kwargs) # generate a self.id
99         if not self.slug:
100             self.slug = defaultfilters.slugify("%s %s" % (self.name, self.id))
101             self.save() # Save the slug
102
103     def get_updated_at_string(self):
104         """ return the formatted style for datetime strings """
105         return self.updated_at.strftime("%I%p // %a %b %d %Y")
106
107     @staticmethod
108     def autocomplete_search_fields():
109         return ("name__icontains",)
110
111     def update_note_count(self):
112         """ Update self.file_count by summing the note_set """
113         self.file_count = self.note_set.count()
114         self.save()
115
116
117 # Enforce unique constraints even when we're using a database like
118 # SQLite that doesn't understand them
119 auto_add_check_unique_together(Course)
120