X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/08dbd720394d897a295fd610d30990b9fad26a04..c4fa700661c2b69ae02eb282b25bb11d5ebc30f4:/forum/models/node.py diff --git a/forum/models/node.py b/forum/models/node.py index dc292fb..6f4e12b 100644 --- a/forum/models/node.py +++ b/forum/models/node.py @@ -1,4 +1,3 @@ -from forum.akismet import * from base import * from tag import Tag @@ -31,12 +30,13 @@ class NodeContent(models.Model): def tagname_list(self): if self.tagnames: - return [name for name in self.tagnames.split(u' ')] + t = [name.strip() for name in self.tagnames.split(u' ') if name] + return [name.strip() for name in self.tagnames.split(u' ') if name] else: return [] def tagname_meta_generator(self): - return u','.join([unicode(tag) for tag in self.tagname_list()]) + return u','.join([tag for tag in self.tagname_list()]) class Meta: abstract = True @@ -78,25 +78,27 @@ class NodeMetaClass(BaseMetaClass): Node.add_to_class(name, property(parent)) +class NodeQuerySet(CachedQuerySet): + def get(self, *args, **kwargs): + node = super(NodeQuerySet, self).get(*args, **kwargs) + cls = NodeMetaClass.types.get(node.node_type, None) + + if cls and (node.__class__ is not cls): + return node.leaf + return node + + class NodeManager(CachedManager): use_for_related_fields = True def get_query_set(self): - qs = super(NodeManager, self).get_query_set() + qs = NodeQuerySet(self.model) if self.model is not Node: return qs.filter(node_type=self.model.get_type()) else: return qs - def get(self, *args, **kwargs): - node = super(NodeManager, self).get(*args, **kwargs) - cls = NodeMetaClass.types.get(node.node_type, None) - - if cls and node.__class__ is not cls: - return node.leaf - return node - def get_for_types(self, types, *args, **kwargs): kwargs['node_type__in'] = [t.get_type() for t in types] return self.get(*args, **kwargs) @@ -201,45 +203,70 @@ class Node(BaseModel, NodeContent): self.save() - def get_tag_list_if_changed(self): + def _list_changes_in_tags(self): dirty = self.get_dirty_fields() - active_user = self.last_edited and self.last_edited.by or self.author - - if 'tagnames' in dirty: - new_tags = self.tagname_list() - old_tags = dirty['tagnames'] - if old_tags is None or not old_tags: - old_tags = [] + if not 'tagnames' in dirty: + return None + else: + if dirty['tagnames']: + old_tags = set(name for name in dirty['tagnames'].split(u' ')) else: - old_tags = [name for name in dirty['tagnames'].split(u' ')] + old_tags = set() + 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) + ) - tag_list = [] + def _last_active_user(self): + return self.last_edited and self.last_edited.by or self.author - for name in new_tags: + def _process_changes_in_tags(self): + tag_changes = self._list_changes_in_tags() + + if tag_changes is not None: + for name in tag_changes['added']: try: tag = Tag.objects.get(name=name) except: - tag = Tag.objects.create(name=name, created_by=active_user or self.author) - - tag_list.append(tag) + tag = Tag.objects.create(name=name, created_by=self._last_active_user()) - if not name in old_tags: - tag.used_count = tag.used_count + 1 - if tag.deleted: - tag.unmark_deleted() + if not self.deleted: + tag.used_count = models.F('used_count') + 1 tag.save() - for name in [n for n in old_tags if not n in new_tags]: - tag = Tag.objects.get(name=name) - tag.used_count = tag.used_count - 1 - if tag.used_count == 0: - tag.mark_deleted(active_user) - tag.save() + if not self.deleted: + for name in tag_changes['removed']: + try: + tag = Tag.objects.get(name=name) + tag.used_count = models.F('used_count') - 1 + tag.save() + if tag.used_count == 0: + tag.mark_deleted(self._last_active_user()) + except: + pass - return tag_list + return True + + return False + + def mark_deleted(self, action): + self.deleted = action + self.save() - return None + if action: + for tag in self.tags.all(): + tag.used_count = models.F('used_count') - 1 + tag.save() + if tag.used_count == 0: + tag.mark_deleted(self._last_active_user()) + else: + for tag in Tag.objects.filter(name__in=self.tagname_list()): + tag.used_count = models.F('used_count') + 1 + tag.save() def save(self, *args, **kwargs): if not self.id: @@ -250,25 +277,11 @@ class Node(BaseModel, NodeContent): if self.parent_id and not self.abs_parent_id: self.abs_parent = self.parent.absolute_parent - - tags = self.get_tag_list_if_changed() - super(Node, self).save(*args, **kwargs) - if tags is not None: self.tags = tags - - @staticmethod - def isSpam(comment, data): - #api = Akismet() - - #if not api.key: - # return False - #else: - # if api.comment_check(comment, data): - # return True - # else: - # return False - # return data - return False + tags_changed = self._process_changes_in_tags() + + super(Node, self).save(*args, **kwargs) + if tags_changed: self.tags = list(Tag.objects.filter(name__in=self.tagname_list())) class Meta: app_label = 'forum'