Merge branch 'master' of github.com:FinalsClub/karmaworld
[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
16 class School(models.Model):
17     """ A grouping that contains many courses """
18     name        = models.CharField(max_length=255)
19     slug        = models.SlugField(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)
27
28     class Meta:
29         """ Sort School by file_count descending, name abc=> """
30         ordering = ['-file_count', 'name']
31
32
33     def __unicode__(self):
34         return self.name
35
36     def save(self, *args, **kwargs):
37         """ Save school and generate a slug if one doesn't exist """
38         if not self.slug:
39             self.slug = defaultfilters.slugify(self.name)
40         super(School, self).save(*args, **kwargs)
41
42     @staticmethod
43     def autocomplete_search_fields():
44         return ("name__icontains",)
45
46     def update_note_count(self):
47         """ Update the School.file_count by summing the 
48             contained course.file_count
49         """
50         self.file_count = sum([course.file_count for course in self.course_set.all()])
51         self.save()
52
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
56         """
57         for course in self.course_set.all():
58             course.update_note_count()
59         self.update_note_count()
60
61
62 class Course(models.Model):
63     """ First class object that contains many notes.Note objects """
64     # Core metadata
65     name        = models.CharField(max_length=255)
66     slug        = models.SlugField(null=True)
67     school      = models.ForeignKey(School) # Should this be optional ever?
68     file_count  = models.IntegerField(default=0)
69
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)
74
75     instructor_name     = models.CharField(max_length=255, blank=True, null=True)
76     instructor_email    = models.EmailField(blank=True, null=True)
77
78     updated_at      = models.DateTimeField(default=datetime.datetime.utcnow)
79
80     created_at      = models.DateTimeField(auto_now_add=True)
81
82
83     class Meta:
84         ordering = ['-file_count', 'school', 'name']
85
86     def __unicode__(self):
87         return u"{0}: {1}".format(self.name, self.school)
88
89     def get_absolute_url(self):
90         """ return url based on school slug and self slug """
91         return u"/{0}/{1}".format(self.school.slug, self.slug)
92
93     def save(self, *args, **kwargs):
94         """ Save school and generate a slug if one doesn't exist """
95         super(Course, self).save(*args, **kwargs) # generate a self.id
96         if not self.slug:
97             self.slug = defaultfilters.slugify("%s %s" % (self.name, self.id))
98             super(Course, self).save(*args, **kwargs) # Save the slug
99
100     def update_note_count(self):
101         """ Update self.file_count by summing the note_set """
102         self.file_count = self.note_set.count()
103         self.save()