]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/models/node.py
Wraps the markdowner call with a try except block, and logs the possible errors.
[osqa.git] / forum / models / node.py
index bebd07c6cd4df75b57c06f446001f79e1bb3e2ce..6d8a4834f3a6a5a244a65dae748173fb26a09775 100644 (file)
@@ -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)
@@ -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
@@ -349,7 +363,7 @@ class Node(BaseModel, NodeContent):
 
         if action:
             for tag in self.tags.all():
-                tag.tag.add_to_usage_count(-1)
+                tag.add_to_usage_count(-1)
                 tag.save()
         else:
             for tag in Tag.objects.filter(name__in=self.tagname_list()):