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