Action Streams¶
Listings of actions are available for several points of view.
All streams return a QuerySet
of Action
items sorted by -timestamp
.
Using Builtin Streams¶
There are several builtin streams which cover the basics, but you are never limited to them.
They are available as simple functions you can import from actstream.models
.
Some are also available on any instance of a registered model using a GenericRelatedObjectManager
behind the scenes.
The examples below show you all ways of accessing them.
User Streams¶
User streams are the most important, like your News Feed on github. Basically you follow anyone (or anything) on your site and their actions show up here.
These streams take one argument which is a User
instance which is the one doing the following (usually request.user
).
If optional parameter with_user_activity
is passed as True
, the stream will include user’s own activity like Twitter. Default is False
from actstream.models import user_stream
user_stream(request.user, with_user_activity=True)
Generates a stream of Actions
from objects that request.user
follows
Actor Streams¶
Actor streams show you what a particular actor object has done. Helpful for viewing “My Activities”.
from actstream.models import actor_stream
actor_stream(request.user)
# OR
request.user.actor_actions.all()
Generates a stream of Actions
where the request.user
was the actor
Action Object Streams¶
Action object streams show you what actions a particular instance was used as the action_object
from actstream.models import action_object_stream
action_object_stream(comment)
# OR
comment.action_object_actions.all()
Generates a stream of Actions
where the comment
was generated as the action_object
Target Streams¶
Target streams show you what actions a particular instance was used as the target
from actstream.models import target_stream
target_stream(group)
# OR
group.target_actions.all()
Generates a stream of Actions
where the group
was generated as the target
Model Streams¶
Model streams offer a much broader scope showing ALL Actions
from any particular model.
Argument may be a class or instance of the model.
from actstream.models import model_stream
model_stream(request.user)
Generates a stream of Actions
from all User
instances.
Any Streams¶
Any streams shows you what actions a particular object was involved in either acting as the actor
, target
or action_object
.
from actstream.models import any_stream
any_stream(request.user)
Generates a stream of Actions
where request.user
was involved in any part.
Writing Custom Streams¶
You can override and extend the Action manager Action.objects
to add your own streams.
The setting ACTSTREAM_SETTINGS['MANAGER']
tells the app which manager to import and use.
The builtin streams are defined in actstream/managers.py
and you should check out how they are written.
Streams must use the @stream
decorator.
They must take at least one argument which is a model instance to be used for reference when creating streams.
Streams may return:
dict
-Action
queryset parameters to be AND’d together
tuple
ofdicts
- tuple ofAction
queryset parameter dicts to be OR’d together
QuerySet
- raw queryset ofAction
objects
When returning a queryset, you do NOT need to call fetch_generic_relations()
or select_related(..)
.
Example¶
To start writing your custom stream module, create a file in your app called myapp/managers.py
# myapp/managers.py
from datetime import datetime
from django.contrib.contenttypes.models import ContentType
from actstream.managers import ActionManager, stream
class MyActionManager(ActionManager):
@stream
def mystream(self, obj, verb='posted', time=None):
if time is None:
time = datetime.now()
return obj.actor_actions.filter(verb = verb, timestamp__lte = time)
If you haven’t done so already, configure this manager to be your default Action
manager by setting the MANAGER setting.
This example defines a manager with one custom stream which filters for ‘posted’ actions by verb and timestamp.
Now that stream is available directly on the Action
manager through Action.objects.mystream
or from the GenericRelation
on any actionable model instance.
from django.contrib.auth.models import User
from actstream.models import Action
user_instance = User.objects.all()[0]
Action.objects.mystream(user_instance, 'commented')
# OR
user_instance.actor_actions.mystream('commented')