models.py 5.72 KB
Newer Older
Dudás Ádám committed
1 2 3 4
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User
from django.db.models.signals import post_save
5 6
from django.core.exceptions import ValidationError
from datetime import datetime
7
from django.conf import settings
tarokkk committed
8
import one.models
9 10 11 12


LANGUAGE_CODE = settings.LANGUAGE_CODE
LANGUAGE_CHOICES = (('hu', _('Hungarian')), ('en', _('English')))
Dudás Ádám committed
13 14 15

def create_user_profile(sender, instance, created, **kwargs):
    if created:
16
        try:
Őry Máté committed
17 18 19
            p = Person.objects.get(code=instance.username)
        except Exception:
            p = Person.objects.create(code=instance.username)
20
        except:
Őry Máté committed
21 22 23
            return
        p.code = instance.username
        p.save()
Dudás Ádám committed
24 25 26
post_save.connect(create_user_profile, sender=User)

class Person(models.Model):
Őry Máté committed
27
    user = models.ForeignKey(User, null=True, blank=True, unique=True)
28 29
    language = models.CharField(verbose_name=_('language'), blank=False, max_length=10,
            choices=LANGUAGE_CHOICES, default=LANGUAGE_CODE)
Őry Máté committed
30
    code = models.CharField(_('code'), max_length=30, unique=True)
31

32 33 34
    def get_owned_shares(self):
        return one.models.Share.objects.filter(group__in=self.owned_groups.all())

tarokkk committed
35 36 37
    def get_shares(self):
        return one.models.Share.objects.filter(group__in=self.course_groups.all())

38
    def short_name(self):
39 40
        if self.user.last_name:
            return self.user.last_name
41
        else:
42
            return self.user.username
43

Dudás Ádám committed
44
    def __unicode__(self):
45 46 47 48
        u = self.user
        if not u:
            return unicode(_("(none)"))
        if u.last_name and u.first_name:
49
            # TRANSLATORS: full name format used in enumerations
50 51
            return _("%(first)s %(last)s") % {'first': u.first_name,
                                             'last': u.last_name}
52
        else:
53
            return u.username
Dudás Ádám committed
54

55 56 57 58
    class Meta:
        verbose_name = _('person')
        verbose_name_plural = _('persons')

59
class Course(models.Model):
60 61 62 63 64 65
    code = models.CharField(max_length=20, unique=True,
            verbose_name=_('course code'))
    name = models.CharField(max_length=80, null=True, blank=True,
            verbose_name=_('name'))
    short_name = models.CharField(max_length=10, null=True, blank=True,
            verbose_name=_('name'))
66
    default_group = models.ForeignKey('Group', null=True, blank=True,
67 68 69 70 71 72 73 74 75
            related_name='default_group_of', verbose_name=_('default group'),
            help_text=_('New users will automatically get to this group.'))
    owners = models.ManyToManyField(Person, blank=True, null=True,
            verbose_name=_('owners'))

    class Meta:
        verbose_name = _('course')
        verbose_name_plural = _('courses')

76
    def get_or_create_default_group(self):
77 78 79
        if self.default_group:
            return self.default_group
        else:
80
            default_group = Group(name=_("%s (auto)") % self.short(),
81 82 83 84 85
                    semester=Semester.get_current(), course=self)
            default_group.save()
            self.default_group_id = default_group.id
            self.save()
            return default_group
86

87 88 89 90 91 92
    def save(self, *args, **kwargs):
        if self.default_group:
            self.default_group.course = self
            self.default_group.save()
        self.full_clean()
        super(Course, self).save(*args, **kwargs)
Dudás Ádám committed
93

Őry Máté committed
94
    def __unicode__(self):
95
        if self.name:
Őry Máté committed
96 97 98
            return u"%s (%s)" % (self.code, self.name)
        else:
            return self.code
99

Őry Máté committed
100 101 102 103 104
    def short(self):
        if self.short_name:
            return self.short_name
        else:
            return self.code
105 106
    short.verbose_name = _('short name')

Őry Máté committed
107
    def owner_list(self):
108
        if self.owners and self.owners.count() > 0:
109
            return ", ".join([p.short_name() for p in self.owners.all()])
Őry Máté committed
110
        else:
111 112
            return _("(none)")
    owner_list.verbose_name = _('owners')
Őry Máté committed
113

Dudás Ádám committed
114

115
class Semester(models.Model):
116 117 118 119 120 121 122 123
    name = models.CharField(max_length=20, unique=True, null=False,
            verbose_name=_('name'))
    start = models.DateField(verbose_name=_('start'))
    end = models.DateField(verbose_name=_('end'))

    class Meta:
        verbose_name = _('semester')
        verbose_name_plural = _('semesters')
Dudás Ádám committed
124

125 126
    def is_on(self, time):
        return self.start <= time.date() and self.end >= time.date()
127
    is_on.boolean = True
Dudás Ádám committed
128

129 130 131 132 133 134 135 136
    @classmethod
    def get_current(cls):
        n = datetime.now()
        current = [s for s in Semester.objects.all() if s.is_on(n)]
        try:
            return current[0]
        except:
            raise ValidationError(_('There is no current semester.'))
Dudás Ádám committed
137

Őry Máté committed
138 139 140 141
    def __unicode__(self):
        return self.name


142
class Group(models.Model):
143
    name = models.CharField(max_length=80, verbose_name=_('name'))
144 145 146 147
    course = models.ForeignKey('Course', null=True, blank=True, verbose_name=_('course'))
    semester = models.ForeignKey('Semester', null=False, blank=False, verbose_name=_('semester'))
    owners = models.ManyToManyField(Person, blank=True, null=True, related_name='owned_groups', verbose_name=_('owners'))
    members = models.ManyToManyField(Person, blank=True, null=True, related_name='course_groups', verbose_name=_('members'))
Dudás Ádám committed
148

149 150
    class Meta:
        unique_together = (('name', 'course', 'semester', ), )
151 152
        verbose_name = _('group')
        verbose_name_plural = _('groups')
Őry Máté committed
153

154 155
    def owner_list(self):
        if self.owners:
156
            return ", ".join([p.short_name() for p in self.owners.all()])
157 158
        else:
            return _("n/a")
159
    owner_list.verbose_name = _('owners')
160 161 162 163

    def member_count(self):
        return self.members.count()

Őry Máté committed
164 165 166 167
    def __unicode__(self):
        if self.course:
            return "%s (%s)" % (self.name, self.course.short())
        else:
168
            return "%s (%s)" % (self.name, self.owner_list())