-from forum.akismet import *\r
from base import *\r
from tag import Tag\r
\r
\r
def tagname_list(self):\r
if self.tagnames:\r
- return [name for name in self.tagnames.split(u' ')]\r
+ t = [name.strip() for name in self.tagnames.split(u' ') if name]\r
+ return [name.strip() for name in self.tagnames.split(u' ') if name]\r
else:\r
return []\r
\r
def tagname_meta_generator(self):\r
- return u','.join([unicode(tag) for tag in self.tagname_list()])\r
+ return u','.join([tag for tag in self.tagname_list()])\r
\r
class Meta:\r
abstract = True\r
Node.add_to_class(name, property(parent))\r
\r
\r
+class NodeQuerySet(CachedQuerySet):\r
+ def get(self, *args, **kwargs):\r
+ node = super(NodeQuerySet, self).get(*args, **kwargs)\r
+ cls = NodeMetaClass.types.get(node.node_type, None)\r
+\r
+ if cls and (node.__class__ is not cls):\r
+ return node.leaf\r
+ return node\r
+\r
+\r
class NodeManager(CachedManager):\r
use_for_related_fields = True\r
\r
def get_query_set(self):\r
- qs = super(NodeManager, self).get_query_set()\r
+ qs = NodeQuerySet(self.model)\r
\r
if self.model is not Node:\r
return qs.filter(node_type=self.model.get_type())\r
else:\r
return qs\r
\r
- def get(self, *args, **kwargs):\r
- node = super(NodeManager, self).get(*args, **kwargs)\r
- cls = NodeMetaClass.types.get(node.node_type, None)\r
-\r
- if cls and node.__class__ is not cls:\r
- return node.leaf\r
- return node\r
-\r
def get_for_types(self, types, *args, **kwargs):\r
kwargs['node_type__in'] = [t.get_type() for t in types]\r
return self.get(*args, **kwargs)\r
\r
self.save()\r
\r
- def get_tag_list_if_changed(self):\r
+ def _list_changes_in_tags(self):\r
dirty = self.get_dirty_fields()\r
- active_user = self.last_edited and self.last_edited.by or self.author\r
-\r
- if 'tagnames' in dirty:\r
- new_tags = self.tagname_list()\r
- old_tags = dirty['tagnames']\r
\r
- if old_tags is None or not old_tags:\r
- old_tags = []\r
+ if not 'tagnames' in dirty:\r
+ return None\r
+ else:\r
+ if dirty['tagnames']:\r
+ old_tags = set(name for name in dirty['tagnames'].split(u' '))\r
else:\r
- old_tags = [name for name in dirty['tagnames'].split(u' ')]\r
+ old_tags = set()\r
+ new_tags = set(name for name in self.tagnames.split(u' ') if name)\r
\r
- tag_list = []\r
+ return dict(\r
+ current=list(new_tags),\r
+ added=list(new_tags - old_tags),\r
+ removed=list(old_tags - new_tags)\r
+ )\r
\r
- for name in new_tags:\r
+ def _last_active_user(self):\r
+ return self.last_edited and self.last_edited.by or self.author\r
+\r
+ def _process_changes_in_tags(self):\r
+ tag_changes = self._list_changes_in_tags()\r
+\r
+ if tag_changes is not None:\r
+ for name in tag_changes['added']:\r
try:\r
tag = Tag.objects.get(name=name)\r
except:\r
- tag = Tag.objects.create(name=name, created_by=active_user or self.author)\r
+ tag = Tag.objects.create(name=name, created_by=self._last_active_user())\r
\r
- tag_list.append(tag)\r
-\r
- if not name in old_tags:\r
- tag.used_count = tag.used_count + 1\r
- if tag.deleted:\r
- tag.unmark_deleted()\r
+ if not self.deleted:\r
+ tag.used_count = models.F('used_count') + 1\r
tag.save()\r
\r
- for name in [n for n in old_tags if not n in new_tags]:\r
- tag = Tag.objects.get(name=name)\r
- tag.used_count = tag.used_count - 1\r
- if tag.used_count == 0:\r
- tag.mark_deleted(active_user)\r
- tag.save()\r
+ if not self.deleted:\r
+ for name in tag_changes['removed']:\r
+ try:\r
+ tag = Tag.objects.get(name=name)\r
+ tag.used_count = models.F('used_count') - 1\r
+ tag.save()\r
+ if tag.used_count == 0:\r
+ tag.mark_deleted(self._last_active_user())\r
+ except:\r
+ pass\r
+\r
+ return True\r
+\r
+ return False\r
\r
- return tag_list\r
+ def mark_deleted(self, action):\r
+ self.deleted = action\r
+ self.save()\r
\r
- return None\r
+ if action:\r
+ for tag in self.tags.all():\r
+ tag.used_count = models.F('used_count') - 1\r
+ tag.save()\r
+ if tag.used_count == 0:\r
+ tag.mark_deleted(self._last_active_user())\r
+ else:\r
+ for tag in Tag.objects.filter(name__in=self.tagname_list()):\r
+ tag.used_count = models.F('used_count') + 1\r
+ tag.save()\r
\r
def save(self, *args, **kwargs):\r
if not self.id:\r
\r
if self.parent_id and not self.abs_parent_id:\r
self.abs_parent = self.parent.absolute_parent\r
- \r
- tags = self.get_tag_list_if_changed()\r
+\r
+ tags_changed = self._process_changes_in_tags()\r
+\r
super(Node, self).save(*args, **kwargs)\r
- if tags is not None: self.tags = tags\r
-\r
- @staticmethod\r
- def isSpam(comment, data):\r
- if not settings.WORDPRESS_API_KEY:\r
- return False\r
- \r
- api = Akismet(settings.WORDPRESS_API_KEY, settings.APP_URL)\r
- return api.comment_check(comment, data)\r
+ if tags_changed: self.tags = list(Tag.objects.filter(name__in=self.tagname_list()))\r
\r
class Meta:\r
app_label = 'forum'\r