X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/6739afe99e21df2a3c4cf7768f967fcf72b4e514..b25ea1aa5c57245fbc66dbb802fb228f0f724870:/forum/models/action.py diff --git a/forum/models/action.py b/forum/models/action.py index ca6b96e..7fd2e6f 100644 --- a/forum/models/action.py +++ b/forum/models/action.py @@ -15,8 +15,13 @@ class ActionQuerySet(CachedQuerySet): else: return super(ActionQuerySet, self).obj_from_datadict(datadict) - def get(self, *args, **kwargs): - return super(ActionQuerySet, self).get(*args, **kwargs).leaf() + def get(self, *args, **kwargs): + action = super(ActionQuerySet, self).get(*args, **kwargs).leaf() + + if not isinstance(action, self.model): + raise self.model.DoesNotExist() + + return action class ActionManager(CachedManager): use_for_related_fields = True @@ -36,6 +41,7 @@ class ActionManager(CachedManager): class Action(BaseModel): user = models.ForeignKey('User', related_name="actions") + real_user = models.ForeignKey('User', related_name="proxied_actions", null=True) ip = models.CharField(max_length=16) node = models.ForeignKey('Node', null=True, related_name="actions") action_type = models.CharField(max_length=16) @@ -111,7 +117,7 @@ class Action(BaseModel): def get_type(cls): return re.sub(r'action$', '', cls.__name__.lower()) - def save(self, data=None, *args, **kwargs): + def save(self, data=None, threaded=True, *args, **kwargs): isnew = False if not self.id: @@ -127,7 +133,7 @@ class Action(BaseModel): if (self.node is None) or (not self.node.nis.wiki): self.repute_users() self.process_action() - self.trigger_hooks(True) + self.trigger_hooks(threaded, True) return self @@ -167,15 +173,18 @@ class Action(BaseModel): Action.hooks[cls].append(fn) - def trigger_hooks(self, new=True): - thread = Thread(target=trigger_hooks_threaded, args=[self, Action.hooks, new]) - thread.setDaemon(True) - thread.start() + def trigger_hooks(self, threaded, new=True): + if threaded: + thread = Thread(target=trigger_hooks, args=[self, Action.hooks, new]) + thread.setDaemon(True) + thread.start() + else: + trigger_hooks(self, Action.hooks, new) class Meta: app_label = 'forum' -def trigger_hooks_threaded(action, hooks, new): +def trigger_hooks(action, hooks, new): for cls, hooklist in hooks.items(): if isinstance(action, cls): for hook in hooklist: @@ -228,6 +237,9 @@ class ActionProxy(Action): 'node_desc': node_desc, } + def affected_links(self, viewer): + return ", ".join([self.hyperlink(u.get_profile_url(), self.friendly_username(viewer, u)) for u in set([r.user for r in self.reputes.all()])]) + class Meta: proxy = True