+ def __setattr__(self, name, value):\r
+ current = self.__getattr__(name)\r
+\r
+ if value:\r
+ if current:\r
+ current.action = value\r
+ current.save()\r
+ else:\r
+ node = self.__dict__['_node']\r
+ state = NodeState(node=node, action=value, state_type=name)\r
+ state.save()\r
+ self.__dict__[name] = value\r
+\r
+ if not "(%s)" % name in node.state_string:\r
+ node.state_string = "%s(%s)" % (node.state_string, name)\r
+ node.save()\r
+ else:\r
+ if current:\r
+ node = self.__dict__['_node']\r
+ node.state_string = "".join("(%s)" % s for s in re.findall('\w+', node.state_string) if s != name)\r
+ node.save()\r
+ current.node_state.delete()\r
+ del self.__dict__[name]\r
+\r
+\r
+class NodeStateQuery(object):\r
+ def __init__(self, node):\r
+ self.__dict__['_node'] = node\r
+\r
+ def __getattr__(self, name):\r
+ node = self.__dict__['_node']\r
+ return "(%s)" % name in node.state_string\r
+\r
+\r
+\r
+class Node(BaseModel, NodeContent):\r
+ __metaclass__ = NodeMetaClass\r
+\r
+ node_type = models.CharField(max_length=16, default='node')\r
+ parent = models.ForeignKey('Node', related_name='children', null=True)\r
+ abs_parent = models.ForeignKey('Node', related_name='all_children', null=True)\r
+\r
+ added_at = models.DateTimeField(default=datetime.datetime.now)\r
+ score = models.IntegerField(default=0)\r
+\r
+ state_string = models.TextField(default='')\r
+ last_edited = models.ForeignKey('Action', null=True, unique=True, related_name="edited_node")\r
+\r
+ last_activity_by = models.ForeignKey(User, null=True)\r
+ last_activity_at = models.DateTimeField(null=True, blank=True)\r
+\r
+ tags = models.ManyToManyField('Tag', related_name='%(class)ss')\r