X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/133a8f939cdfa69dd6a7caeafed158aa38d20092..596fa1bf821c572f45c16ba92cb0e65211f6a3ae:/forum/models/node.py?ds=sidebyside diff --git a/forum/models/node.py b/forum/models/node.py index 530981b..00cbbd0 100644 --- a/forum/models/node.py +++ b/forum/models/node.py @@ -77,23 +77,25 @@ class NodeMetaClass(models.Model.__metaclass__): node_create = django.dispatch.Signal(providing_args=['instance']) +node_edit = django.dispatch.Signal(providing_args=['instance']) class Node(BaseModel, NodeContent, DeletableContent): __metaclass__ = NodeMetaClass node_type = models.CharField(max_length=16, default='node') parent = models.ForeignKey('Node', related_name='children', null=True) + abs_parent = models.ForeignKey('Node', related_name='all_children', null=True) added_at = models.DateTimeField(default=datetime.datetime.now) tags = models.ManyToManyField('Tag', related_name='%(class)ss') - score = models.IntegerField(default=0) - vote_up_count = models.IntegerField(default=0) + score = DenormalizedField(default=0) + vote_up_count = DenormalizedField(default=0) vote_down_count = models.IntegerField(default=0) - comment_count = models.PositiveIntegerField(default=0) - offensive_flag_count = models.SmallIntegerField(default=0) + comment_count = DenormalizedField(default=0) + offensive_flag_count = DenormalizedField(default=0) last_edited_at = models.DateTimeField(null=True, blank=True) last_edited_by = models.ForeignKey(User, null=True, blank=True, related_name='last_edited_%(class)ss') @@ -104,6 +106,13 @@ class Node(BaseModel, NodeContent, DeletableContent): def leaf(self): return NodeMetaClass.types[self.node_type].objects.get(id=self.id) + @property + def absolute_parent(self): + if not self.abs_parent_id: + return self.leaf + + return self.abs_parent.leaf + @property def summary(self): return strip_tags(self.html)[:300] @@ -128,14 +137,17 @@ class Node(BaseModel, NodeContent, DeletableContent): self.body = revision.body old_revision = self.active_revision - self.active_revision = revision - self.save() if not old_revision: + signal = node_create + else: self.last_edited_at = datetime.datetime.now() self.last_edited_by = user - node_create.send(sender=self.__class__, instance=self) + signal = node_edit + + self.save() + signal.send(sender=self.__class__, instance=self) def get_tag_list_if_changed(self): dirty = self.get_dirty_fields() @@ -179,6 +191,11 @@ class Node(BaseModel, NodeContent, DeletableContent): def save(self, *args, **kwargs): if not self.id: self.node_type = self.__class__.__name__.lower() + + if self.parent_id and not self.abs_parent_id: + self.abs_parent = self.parent.absolute_parent + + self.__dict__['score'] = self.__dict__['vote_up_count'] - self.__dict__['vote_down_count'] tags = self.get_tag_list_if_changed() super(Node, self).save(*args, **kwargs) @@ -188,7 +205,7 @@ class Node(BaseModel, NodeContent, DeletableContent): app_label = 'forum' -class NodeRevision(NodeContent): +class NodeRevision(BaseModel, NodeContent): node = models.ForeignKey(Node, related_name='revisions') summary = models.CharField(max_length=300) revision = models.PositiveIntegerField()