X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/e945778bce1d0af9091f7be2503b06756298b905..c917b62b3f5772efe422bea6bad19af33b1528f6:/forum/models/action.py diff --git a/forum/models/action.py b/forum/models/action.py index 90c61f8..7f9a7c1 100644 --- a/forum/models/action.py +++ b/forum/models/action.py @@ -4,30 +4,36 @@ from threading import Thread from base import * import re -class ActionManager(models.Manager): +class ActionQuerySet(CachedQuerySet): + def obj_from_datadict(self, datadict): + cls = ActionProxyMetaClass.types.get(datadict['action_type'], None) + if cls: + obj = cls() + obj.__dict__.update(datadict) + return obj + else: + return super(ActionQuerySet, self).obj_from_datadict(datadict) + + def get(self, *args, **kwargs): + return super(ActionQuerySet, self).get(*args, **kwargs).leaf() + +class ActionManager(CachedManager): use_for_related_fields = True def get_query_set(self): - qs = super(ActionManager, self).get_query_set().filter(canceled=False) + qs = ActionQuerySet(self.model) if self.model is not Action: return qs.filter(action_type=self.model.get_type()) else: return qs - def get(self, *args, **kwargs): - action = super(ActionManager, self).get(*args, **kwargs) - if self.model == Action: - return action.leaf() - return action - def get_for_types(self, types, *args, **kwargs): kwargs['action_type__in'] = [t.get_type() for t in types] return self.get(*args, **kwargs) - -class Action(models.Model): +class Action(BaseModel): user = models.ForeignKey('User', related_name="actions") ip = models.CharField(max_length=16) node = models.ForeignKey('Node', null=True, related_name="actions") @@ -70,7 +76,7 @@ class Action(models.Model): return "" def describe(self, viewer=None): - return "" + return self.__class__.__name__ def get_absolute_url(self): if self.node: @@ -95,7 +101,9 @@ class Action(models.Model): return self leaf = leaf_cls() - leaf.__dict__ = self.__dict__ + d = self._as_dict() + leaf.__dict__.update(self._as_dict()) + l = leaf._as_dict() return leaf @classmethod @@ -115,16 +123,16 @@ class Action(models.Model): super(Action, self).save(*args, **kwargs) if isnew: - if (self.node is None) or (not self.node.wiki): + if (self.node is None) or (not self.node.nis.wiki): self.repute_users() self.process_action() self.trigger_hooks(True) return self - def delete(self): + def delete(self, *args, **kwargs): self.cancel_action() - super(Action, self).delete() + super(Action, self).delete(*args, **kwargs) def cancel(self, user=None, ip=None): if not self.canceled: @@ -175,7 +183,7 @@ def trigger_hooks_threaded(action, hooks, new): except Exception, e: logging.error("Error in %s hook: %s" % (cls.__name__, str(e))) -class ActionProxyMetaClass(models.Model.__metaclass__): +class ActionProxyMetaClass(BaseMetaClass): types = {} def __new__(cls, *args, **kwargs): @@ -230,6 +238,9 @@ class DummyActionProxy(object): hooks = [] + def __init__(self, ip=None): + self.ip = ip + def process_data(self, **data): pass @@ -274,11 +285,11 @@ class ActionRepute(models.Model): def save(self, *args, **kwargs): super(ActionRepute, self).save(*args, **kwargs) - self.user.reputation = models.F('reputation') + self.value + self.user.reputation += self.value self.user.save() def delete(self): - self.user.reputation = models.F('reputation') - self.value + self.user.reputation -= self.value self.user.save() super(ActionRepute, self).delete()