regluit/core/signals.py

107 lines
4.2 KiB
Python
Raw Normal View History

from django.db.models import get_model
from django.db.utils import DatabaseError
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from social_auth.signals import pre_update
from social_auth.backends.facebook import FacebookBackend
from tastypie.models import create_api_key
import registration.signals
import logging
logger = logging.getLogger(__name__)
# get email from Facebook registration
def facebook_extra_values(sender, user, response, details, **kwargs):
if response.get('email') is not None:
user.email = response.get('email')
return True
pre_update.connect(facebook_extra_values, sender=FacebookBackend)
# create Wishlist and UserProfile to associate with User
def create_user_objects(sender, created, instance, **kwargs):
# use get_model to avoid circular import problem with models
try:
Wishlist = get_model('core', 'Wishlist')
UserProfile = get_model('core', 'UserProfile')
if created:
Wishlist.objects.create(user=instance)
UserProfile.objects.create(user=instance)
except DatabaseError:
# this can happen when creating superuser during syncdb since the
# core_wishlist table doesn't exist yet
return
post_save.connect(create_user_objects, sender=User)
# create API key for new User
post_save.connect(create_api_key, sender=User)
def merge_emails(sender, user, **kwargs):
logger.info('checking %s' % user.username)
try:
old_user=User.objects.exclude(id=user.id).get(email=user.email)
old_user.username=user.username
old_user.password=user.password
user.delete()
old_user.save()
except User.DoesNotExist:
return
2012-03-27 15:52:57 +00:00
registration.signals.user_activated.connect(merge_emails)
from django.conf import settings
from django.utils.translation import ugettext_noop as _
from django.db.models import signals
2012-03-27 15:52:57 +00:00
from notification import models as notification
2012-03-27 15:52:57 +00:00
# create notification types (using django-notification) -- tie to syncdb
2012-03-27 15:52:57 +00:00
def create_notice_types(app, created_models, verbosity, **kwargs):
notification.create_notice_type("wishlist_comment", _("Wishlist Comment"), _("a comment has been received on one of your wishlist books"))
notification.create_notice_type("coment_on_commented", _("Comment on Commented Work"), _("a comment has been received on a book that you've commented on"))
notification.create_notice_type("active_campaign", _("New Campaign"), _("a book you've wishlisted has a newly launched campaign"))
2012-03-27 15:52:57 +00:00
signals.post_syncdb.connect(create_notice_types, sender=notification)
2012-03-27 17:24:16 +00:00
# define the notifications and tie them to corresponding signals
from django.contrib.comments.signals import comment_was_posted
2012-03-27 17:24:16 +00:00
def notify_comment(comment, request, **kwargs):
logger.info('comment %s notifying' % comment.pk)
other_commenters = User.objects.filter(comment_comments__content_type=comment.content_type, comment_comments__object_pk=comment.object_pk).distinct().exclude(id=comment.user.id)
other_wishers = comment.content_object.wished_by().exclude(id=comment.user.id).exclude(id__in=other_commenters)
notification.queue(other_commenters, "coment_on_commented", {'comment':comment}, True)
notification.queue(other_wishers, "wishlist_comment", {'comment':comment}, True)
import regluit.core.tasks as tasks
tasks.emit_notifications.delay()
2012-03-27 17:24:16 +00:00
comment_was_posted.connect(notify_comment)
from regluit.core.models import Campaign
def notify_active_campaign(sender, **kwargs):
# what sort of error handling do I need to do here? any?
# how do I both ensure that the status is active AND that it was just made active?
# do i need to send that with the signal?
# let's do the basic version for now and then ask for guidance on style, error-checking
# logging?
campaign = kwargs.get('instance')
print "i'm in ur function launchin ur "+campaign.name
work = campaign.work
# assumes only one active claim per campaign. safe?
rightsholder = work.claim.filter(status="active")[0].rights_holder.rights_holder_name
# is this distinct?
ungluers = work.wished_by()
notification.queue(ungluers, "active_campaign", {'campaign':campaign, 'work':work, 'rightsholder':rightsholder}, True)
emit_notifications.delay()
2012-04-02 18:17:28 +00:00
signals.post_save.connect(notify_active_campaign, sender=Campaign)