X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/9308d78c7f1e4d2a4faf3b98d1b24c262f3b6287..eee8a70aabdda52352e90b6470e150c919b9ae83:/forum/models/node.py diff --git a/forum/models/node.py b/forum/models/node.py index b0f5361..6d8a483 100644 --- a/forum/models/node.py +++ b/forum/models/node.py @@ -25,7 +25,13 @@ class NodeContent(models.Model): @classmethod def _as_markdown(cls, content, *extensions): - return mark_safe(sanitize_html(markdown.markdown(content, extensions=extensions))) + try: + return mark_safe(sanitize_html(markdown.markdown(content, extensions=extensions))) + except Exception, e: + import traceback + logging.error("Caught exception %s in markdown parser rendering %s %s:\s %s" % ( + str(e), cls.__name__, str(e), traceback.format_exc())) + return '' def as_markdown(self, *extensions): return self._as_markdown(self.body, *extensions) @@ -62,7 +68,7 @@ class NodeMetaClass(BaseMetaClass): @classmethod def setup_relations(cls): for node_cls in NodeMetaClass.types.values(): - NodeMetaClass.setup_relation(node_cls) + NodeMetaClass.setup_relation(node_cls) @classmethod def setup_relation(cls, node_cls): @@ -95,12 +101,20 @@ class NodeQuerySet(CachedQuerySet): return super(NodeQuerySet, self).obj_from_datadict(datadict) def get(self, *args, **kwargs): - return super(NodeQuerySet, self).get(*args, **kwargs).leaf + node = super(NodeQuerySet, self).get(*args, **kwargs).leaf + + if not isinstance(node, self.model): + raise self.model.DoesNotExist() + + return node def filter_state(self, **kwargs): apply_bool = lambda q, b: b and q or ~q return self.filter(*[apply_bool(models.Q(state_string__contains="(%s)" % s), b) for s, b in kwargs.items()]) + def children_count(self, child_type): + return NodeMetaClass.types[child_type].objects.filter_state(deleted=False).filter(parent__in=self).count() + class NodeManager(CachedManager): use_for_related_fields = True @@ -171,7 +185,6 @@ class NodeStateQuery(object): return "(%s)" % name in node.state_string - class Node(BaseModel, NodeContent): __metaclass__ = NodeMetaClass @@ -250,7 +263,7 @@ class Node(BaseModel, NodeContent): def deleted(self): return self.nis.deleted - @property + @property def absolute_parent(self): if not self.abs_parent_id: return self @@ -309,10 +322,10 @@ class Node(BaseModel, NodeContent): new_tags = set(name for name in self.tagnames.split(u' ') if name) return dict( - current=list(new_tags), - added=list(new_tags - old_tags), - removed=list(old_tags - new_tags) - ) + current=list(new_tags), + added=list(new_tags - old_tags), + removed=list(old_tags - new_tags) + ) def _last_active_user(self): return self.last_edited and self.last_edited.by or self.author @@ -328,14 +341,14 @@ class Node(BaseModel, NodeContent): tag = Tag.objects.create(name=name, created_by=self._last_active_user()) if not self.nis.deleted: - tag.used_count = models.F('used_count') + 1 + tag.add_to_usage_count(1) tag.save() if not self.nis.deleted: for name in tag_changes['removed']: try: tag = Tag.objects.get(name=name) - tag.used_count = models.F('used_count') - 1 + tag.add_to_usage_count(-1) tag.save() except: pass @@ -350,20 +363,21 @@ class Node(BaseModel, NodeContent): if action: for tag in self.tags.all(): - tag.used_count = models.F('used_count') - 1 + tag.add_to_usage_count(-1) tag.save() else: for tag in Tag.objects.filter(name__in=self.tagname_list()): - tag.used_count = models.F('used_count') + 1 + tag.add_to_usage_count(1) tag.save() def save(self, *args, **kwargs): tags_changed = self._process_changes_in_tags() - + if not self.id: self.node_type = self.get_type() super(BaseModel, self).save(*args, **kwargs) - self.active_revision = self._create_revision(self.author, 1, title=self.title, tagnames=self.tagnames, body=self.body) + self.active_revision = self._create_revision(self.author, 1, title=self.title, tagnames=self.tagnames, + body=self.body) self.update_last_activity(self.author) if self.parent_id and not self.abs_parent_id: