justquick/django-activity-stream

action_handler should check for actor, verb *and* target

JordanReiter opened this issue · 2 comments

Right now, action_handler uses
activity = Activity.objects.get_or_create(
actor_content_type = ContentType.objects.get_for_model(actor),
actor_object_id = actor.pk,
verb = verb
)[0]
however, this means that if an actor performs the same verb with different targets, only one instance for that actor and verb is saved.

Here's the changes:
diff --git a/actstream/models.py b/actstream/models.py
old mode 100644
new mode 100755
index 17e894f..a04e58e
--- a/actstream/models.py
+++ b/actstream/models.py
@@ -153,14 +153,19 @@ model_stream.doc = Activity.objects.stream_for_model.doc

 def action_handler(verb, target=None, **kwargs):
     actor = kwargs.pop('sender')
-    activity = Activity.objects.get_or_create(
-        actor_content_type = ContentType.objects.get_for_model(actor),
-        actor_object_id = actor.pk,
-        verb = verb
-    )[0]
     if target:
-        activity.target_object_id = target.pk
-        activity.target_content_type = ContentType.objects.get_for_model(target)
-        activity.save()
+        activity = Activity.objects.get_or_create(
+            actor_content_type = ContentType.objects.get_for_model(actor),
+            actor_object_id = actor.pk,
+            target_object_id = target.pk,
+            target_content_type = ContentType.objects.get_for_model(target),
+            verb = verb
+        )[0]
+    else:
+        activity = Activity.objects.get_or_create(
+            actor_content_type = ContentType.objects.get_for_model(actor),
+            actor_object_id = actor.pk,
+            verb = verb
+        )[0]

I confirm that issue. Also I think there is no needs for using get_or_create() on Action. Simply create() call should be fine.

thanks for the patch, this has been fixed in the most recent revision. in the future, please fork and submit a pull request