X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/58f020d4fab8251103edb89bfc4cf5d5d389d1ad..c6c2f8819fc57f538764f3bccc7580bc6d94e25b:/forum/models/node.py diff --git a/forum/models/node.py b/forum/models/node.py index f2086fc..6d8a483 100644 --- a/forum/models/node.py +++ b/forum/models/node.py @@ -7,6 +7,7 @@ from django.utils.translation import ugettext as _ from django.utils.safestring import mark_safe from django.utils.html import strip_tags from forum.utils.html import sanitize_html +from utils import PickledObjectField class NodeContent(models.Model): title = models.CharField(max_length=300) @@ -22,8 +23,18 @@ class NodeContent(models.Model): def html(self): return self.as_markdown() + @classmethod + def _as_markdown(cls, content, *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 mark_safe(sanitize_html(markdown.markdown(self.body, extensions=extensions))) + return self._as_markdown(self.body, *extensions) @property def headline(self): @@ -57,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): @@ -90,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 @@ -166,7 +185,6 @@ class NodeStateQuery(object): return "(%s)" % name in node.state_string - class Node(BaseModel, NodeContent): __metaclass__ = NodeMetaClass @@ -186,6 +204,7 @@ class Node(BaseModel, NodeContent): tags = models.ManyToManyField('Tag', related_name='%(class)ss') active_revision = models.OneToOneField('NodeRevision', related_name='active', null=True) + extra = PickledObjectField() extra_ref = models.ForeignKey('Node', null=True) extra_count = models.IntegerField(default=0) @@ -202,8 +221,8 @@ class Node(BaseModel, NodeContent): return self.headline @classmethod - def cache_key(cls, pk): - return '%s:node:%s' % (settings.APP_URL, pk) + def _generate_cache_key(cls, key, group="node"): + return super(Node, cls)._generate_cache_key(key, group) @classmethod def get_type(cls): @@ -244,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 @@ -303,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 @@ -322,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 @@ -344,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: