3 # Copyright (C) 2012 FinalsClub Foundation
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.
13 from django.db import models
14 from django.template import defaultfilters
16 class School(models.Model):
17 """ A grouping that contains many courses """
18 name = models.CharField(max_length=255)
19 slug = models.SlugField(max_length=150, null=True)
20 location = models.CharField(max_length=255, blank=True, null=True)
21 url = models.URLField(max_length=511, blank=True)
22 # Facebook keeps a unique identifier for all schools
23 facebook_id = models.BigIntegerField(blank=True, null=True)
24 # United States Department of Education institution_id
25 usde_id = models.BigIntegerField(blank=True, null=True)
26 file_count = models.IntegerField(default=0)
29 """ Sort School by file_count descending, name abc=> """
30 ordering = ['-file_count', 'name']
33 def __unicode__(self):
36 def save(self, *args, **kwargs):
37 """ Save school and generate a slug if one doesn't exist """
39 self.slug = defaultfilters.slugify(self.name)
40 super(School, self).save(*args, **kwargs)
43 def autocomplete_search_fields():
44 return ("name__icontains",)
46 def update_note_count(self):
47 """ Update the School.file_count by summing the
48 contained course.file_count
50 self.file_count = sum([course.file_count for course in self.course_set.all()])
53 def update_related_note_count(self):
54 """ Runs the update_note_count function on all related course
55 objects, then generates the self.file_count
57 for course in self.course_set.all():
58 course.update_note_count()
59 self.update_note_count()
62 class Course(models.Model):
63 """ First class object that contains many notes.Note objects """
65 name = models.CharField(max_length=255)
66 slug = models.SlugField(max_length=150, null=True)
67 school = models.ForeignKey(School) # Should this be optional ever?
68 file_count = models.IntegerField(default=0)
70 desc = models.TextField(max_length=511, blank=True, null=True)
71 url = models.URLField(max_length=511, blank=True, null=True)
72 academic_year = models.IntegerField(blank=True, null=True,
73 default=datetime.datetime.now().year)
75 instructor_name = models.CharField(max_length=255, blank=True, null=True)
76 instructor_email = models.EmailField(blank=True, null=True)
78 # Save school name redundantly to speed filtering
79 school_name = models.CharField(max_length=255, blank=True, null=True)
81 updated_at = models.DateTimeField(default=datetime.datetime.utcnow)
82 created_at = models.DateTimeField(auto_now_add=True)
86 ordering = ['-file_count', 'school', 'name']
88 def __unicode__(self):
89 return u"{0}: {1}".format(self.name, self.school)
91 def get_absolute_url(self):
92 """ return url based on school slug and self slug """
93 return u"/{0}/{1}".format(self.school.slug, self.slug)
95 def save(self, *args, **kwargs):
96 """ Save school and generate a slug if one doesn't exist """
97 if self.school_name != self.school.name:
98 self.school_name = self.school.name
99 super(Course, self).save(*args, **kwargs) # generate a self.id
101 self.slug = defaultfilters.slugify("%s %s" % (self.name, self.id))
102 super(Course, self).save(*args, **kwargs) # Save the slug
104 def get_updated_at_string(self):
105 """ return the formatted style for datetime strings """
106 return self.updated_at.strftime("%I%p // %a %b %d %Y")
109 def autocomplete_search_fields():
110 return ("name__icontains",)
112 def update_note_count(self):
113 """ Update self.file_count by summing the note_set """
114 self.file_count = self.note_set.count()