X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/0f2d00f9d7d5d28149707f66c719b28edfe51aed..6f9524a34c490d43db43a1ae4b44b40d77ce691a:/forum/models/node.py diff --git a/forum/models/node.py b/forum/models/node.py index 932452d..9e734d2 100644 --- a/forum/models/node.py +++ b/forum/models/node.py @@ -12,6 +12,10 @@ class NodeContent(models.Model): author = models.ForeignKey(User, related_name='%(class)ss') body = models.TextField() + @property + def user(self): + return self.author + @property def html(self): return mark_safe(sanitize_html(markdown.markdown(self.body))) @@ -20,10 +24,6 @@ class NodeContent(models.Model): def headline(self): return self.title - @property - def summary(self): - return strip_tags(self.html)[:300] - def tagname_list(self): if self.tagnames: return [name for name in self.tagnames.split(u' ')] @@ -58,17 +58,17 @@ class NodeMetaClass(models.Model.__metaclass__): name = node_cls.__name__.lower() def children(self): - return node_cls.objects.filter(parent=self) + if node_cls._meta.proxy: + return node_cls.objects.filter(node_type=name, parent=self) + else: + return node_cls.objects.filter(parent=self) def parent(self): p = self.__dict__.get('_%s_cache' % name, None) - if p is None: - try: - p = self.parent.leaf - self.__dict__['_%s_cache' % name] = p - except Exception, e: - pass + if p is None and (self.parent is not None) and self.parent.node_type == name: + p = self.parent.leaf + self.__dict__['_%s_cache' % name] = p return p @@ -76,11 +76,15 @@ class NodeMetaClass(models.Model.__metaclass__): Node.add_to_class(name, property(parent)) +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) @@ -90,7 +94,7 @@ class Node(BaseModel, NodeContent, DeletableContent): vote_up_count = models.IntegerField(default=0) vote_down_count = models.IntegerField(default=0) - comment_count = models.PositiveIntegerField(default=0) + comment_count = models.PositiveIntegerField(default=0) offensive_flag_count = models.SmallIntegerField(default=0) last_edited_at = models.DateTimeField(null=True, blank=True) @@ -102,6 +106,17 @@ 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] + def create_revision(self, user, **kwargs): revision = NodeRevision(author=user, **kwargs) @@ -120,12 +135,19 @@ class Node(BaseModel, NodeContent, DeletableContent): self.title = revision.title self.tagnames = revision.tagnames self.body = revision.body - - self.last_edited_at = datetime.datetime.now() - self.last_edited_by = user + old_revision = self.active_revision self.active_revision = revision + + if not old_revision: + signal = node_create + else: + self.last_edited_at = datetime.datetime.now() + self.last_edited_by = user + signal = node_edit + self.save() + signal.send(sender=self.__class__, instance=self) def get_tag_list_if_changed(self): dirty = self.get_dirty_fields() @@ -169,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)