Am 13.02.2010 um 13:18 schrieb Brian Rosner:

> Hey all —
> 
> I've been doing some thinking lately about how we handle events in Pinax. Let
> me first define an event. An event is an occurrence of a voluntarily action.
> Examples of these include:
> 
> * user A joined project B
> * user A updated their avatar
> * user A became friends with user B
> 
> Currently, we have blurred the line between an occurrence and action taken
> from the occurrence. This is called django-notification. There is overlap
> between the way we are handling this and something like an activity stream.
> We have on-site notifications which try to emulate an activity stream, but
> in my opinion fails horribly at it. Notifications must be sent to users. This
> becomes problematic when the action you want to take is to notify an IRC
> channel for example.
> 
> I'd like to propose a change. At this point this change won't be in
> django-notification. Just replace its use as the event emitter. It had been
> discussed in the past to use signals. I think this is a good use-case for
> using them.

Full ack. Let's do this.

> I see two direct benefits from this approach:
> 
> * don't need to enforce apps to optionally support django-notification
> * listener code is project-level which can depend on anything the project does
>  (solves cases like when avatar is updated let all friends of the user know
>  they've updated their avatar)
> 
> To demostrate (code style below designed for brevity):
> 
>    # django-avatar signals.py
>    import django.dispatch
>    avatar_updated = django.dispatch.Signal(providing_args=["user", "avatar"])
> 
>    # django-avatar views.py
>    from avatar import signals
>    def change(request, ...):
>        ... code that handles request and makes Avatar object
>        signals.avatar_updated.send(sender=request, user=request.user, 
> avatar=avatar)
>        ... rest of view ...
> 
>    # project-level app (no name decided yet, but working name is 
> request_events)
>    # handlers.py
>    from notification import models as notification
>    from friends.models import Friendship
>    def avatar_updated(sender, **kwargs):
>        request = sender
>        ctx = {
>            "user": kwargs.get("user"),
>            "avatar": kwargs.get("avatar"),
>        }
>        notification.send([request.user], "avatar_updated", ctx)
>        friends = f["friend"] for f in 
> Friendship.objects.friends_for_user(request.user)
>        notification.send(friends, "avatar_friend_updated", ctx)
>    # models.py
>    import avatar.signals
>    from request_events import handlers
>    avatar.signals.avatar_updated.connect(handlers.avatar_changed)
> 
> I'd like to gather thoughts from people. Based on the advantages
> above this seems like a win to me. If we are in agreement with the direction
> of this change I plan to integrate this at PyCon for 0.9 alpha.

Maby we should also switch notification.models.send from being a custom 
implementation to a signal itself, e.g.:

# notification/signals.py
notification = django.dispatch.Signal(providing_args=["user", "extra_context", 
"on_site", "queue", "now"])

# notification/models.py
from notification import signals

def send_handler(sender, *args, **kwargs):
    queue_flag = kwargs.pop("queue", False)
    now_flag = kwargs.pop("now", False)
    assert not (queue_flag and now_flag), "'queue' and 'now' cannot both be 
True."
    if queue_flag:
        return queue(*args, **kwargs)
    elif now_flag:
        return send_now(*args, **kwargs)
    else:
        if QUEUE_ALL:
            return queue(*args, **kwargs)
        else:
            return send_now(*args, **kwargs)

signals.notification.connect(send_handler)

def send(*args, **kwargs):
    """
    Backwards compatible, lalalala
    """
    users, label = args
    kwargs["users"] = users
    signals.notification.send(sender=label, **kwargs)


-- 
You received this message because you are subscribed to the Google Groups 
"Pinax Core Development" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/pinax-core-dev?hl=en.

Reply via email to