]> git.openstreetmap.org Git - osqa.git/blob - forum/models/meta.py
Fixes some weird threading problems with modules.
[osqa.git] / forum / models / meta.py
1 from django.utils.translation import ugettext as _
2 from base import *
3
4 class Vote(models.Model):
5     user = models.ForeignKey(User, related_name="votes")
6     node = models.ForeignKey(Node, related_name="votes")
7     value = models.SmallIntegerField()
8     action = models.OneToOneField(Action, related_name="vote")
9     voted_at = models.DateTimeField(default=datetime.datetime.now)
10
11     class Meta:
12         app_label = 'forum'
13         unique_together = ('user', 'node')
14
15
16 class Flag(models.Model):
17     user = models.ForeignKey(User, related_name="flags")
18     node = models.ForeignKey(Node, related_name="flags")
19     reason = models.CharField(max_length=300)
20     action = models.OneToOneField(Action, related_name="flag")
21     flagged_at = models.DateTimeField(default=datetime.datetime.now)
22
23     class Meta:
24         app_label = 'forum'
25         unique_together = ('user', 'node')
26
27 class BadgesQuerySet(models.query.QuerySet):
28     def get(self, *args, **kwargs):
29         try:
30             pk = [v for (k,v) in kwargs.items() if k in ('pk', 'pk__exact', 'id', 'id__exact')][0]
31         except:
32             return super(BadgesQuerySet, self).get(*args, **kwargs)
33
34         from forum.badges.base import BadgesMeta
35         badge = BadgesMeta.by_id.get(int(pk), None)
36         if not badge:
37             return super(BadgesQuerySet, self).get(*args, **kwargs)
38         return badge.ondb
39
40
41 class BadgeManager(models.Manager):
42     use_for_related_fields = True
43
44     def get_query_set(self):
45         return BadgesQuerySet(self.model)
46
47 class Badge(models.Model):
48     GOLD = 1
49     SILVER = 2
50     BRONZE = 3
51
52     type        = models.SmallIntegerField()
53     cls         = models.CharField(max_length=50, null=True)
54     awarded_count = models.PositiveIntegerField(default=0)
55     
56     awarded_to    = models.ManyToManyField(User, through='Award', related_name='badges')
57
58     objects = BadgeManager()
59
60     @property
61     def name(self):
62         cls = self.__dict__.get('_class', None)
63         return cls and cls.name or _("Unknown")
64
65     @property
66     def description(self):
67         cls = self.__dict__.get('_class', None)
68         return cls and cls.description or _("No description available")
69
70     @models.permalink
71     def get_absolute_url(self):
72         return ('badge', [], {'id': self.id, 'slug': slugify(self.name)})
73
74     def save(self, *args, **kwargs):
75         if isinstance(self.awarded_count, models.expressions.ExpressionNode):
76             super(Badge, self).save(*args, **kwargs)
77             self.awarded_count = self.__class__.objects.filter(id=self.id).values_list('awarded_count', flat=True)[0]
78         else:
79             super(Badge, self).save(*args, **kwargs)
80
81
82     class Meta:
83         app_label = 'forum'
84
85
86 class Award(models.Model):
87     user = models.ForeignKey(User)
88     badge = models.ForeignKey('Badge', related_name="awards")
89     node = models.ForeignKey(Node, null=True)
90
91     awarded_at = models.DateTimeField(default=datetime.datetime.now)
92
93     trigger = models.ForeignKey(Action, related_name="awards", null=True)
94     action = models.OneToOneField(Action, related_name="award")
95
96
97     class Meta:
98         unique_together = ('user', 'badge', 'node')
99         app_label = 'forum'