]> git.openstreetmap.org Git - osqa.git/blob - forum/models/meta.py
allow only AJAX requests for post votes, otherwise it makes CSRF possible
[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
28 class Badge(BaseModel):
29     GOLD = 1
30     SILVER = 2
31     BRONZE = 3
32
33     type        = models.SmallIntegerField()
34     cls         = models.CharField(max_length=50, null=True)
35     awarded_count = models.PositiveIntegerField(default=0)
36     
37     awarded_to    = models.ManyToManyField(User, through='Award', related_name='badges')
38
39     def get_handler(self):
40         from forum.badges import BadgesMeta
41         return BadgesMeta.by_id.get(self.id, None)
42
43     @property
44     def name(self):
45         cls = self.get_handler()
46         return cls and cls.name or _("Unknown")
47
48     @property
49     def description(self):
50         cls = self.get_handler()
51         return cls and cls.description or _("No description available")
52
53     @models.permalink
54     def get_absolute_url(self):
55         return ('badge', [], {'id': self.id, 'slug': slugify(self.name)})
56
57     def save(self, *args, **kwargs):
58         if isinstance(self.awarded_count, models.expressions.ExpressionNode):
59             super(Badge, self).save(*args, **kwargs)
60             self.awarded_count = self.__class__.objects.filter(id=self.id).values_list('awarded_count', flat=True)[0]
61         else:
62             super(Badge, self).save(*args, **kwargs)
63
64
65     class Meta:
66         app_label = 'forum'
67
68
69 class Award(models.Model):
70     user = models.ForeignKey(User)
71     badge = models.ForeignKey('Badge', related_name="awards")
72     node = models.ForeignKey(Node, null=True)
73
74     awarded_at = models.DateTimeField(default=datetime.datetime.now)
75
76     trigger = models.ForeignKey(Action, related_name="awards", null=True)
77     action = models.OneToOneField(Action, related_name="award")
78
79
80     class Meta:
81         unique_together = ('user', 'badge', 'node')
82         app_label = 'forum'