2011-09-12 05:53:54 +00:00
from django . db . models import get_model
from django . db . utils import DatabaseError
2012-04-02 23:10:56 +00:00
from django . db . models import signals
2011-09-12 05:53:54 +00:00
from django . db . models . signals import post_save
from django . contrib . auth . models import User
2012-04-02 23:10:56 +00:00
from django . dispatch import Signal
from django . contrib . sites . models import Site
from django . conf import settings
from django . utils . translation import ugettext_noop as _
from notification import models as notification
2011-09-12 05:53:54 +00:00
2011-09-06 03:50:38 +00:00
from social_auth . signals import pre_update
from social_auth . backends . facebook import FacebookBackend
2011-09-16 02:53:44 +00:00
from tastypie . models import create_api_key
2011-09-06 03:50:38 +00:00
2011-12-29 04:11:13 +00:00
import registration . signals
2012-04-03 14:54:31 +00:00
import django . dispatch
2011-12-29 04:11:13 +00:00
2012-04-02 23:10:56 +00:00
import itertools
2011-12-01 18:59:34 +00:00
import logging
logger = logging . getLogger ( __name__ )
2011-09-12 05:53:54 +00:00
2011-12-01 18:59:34 +00:00
# get email from Facebook registration
2011-09-06 03:50:38 +00:00
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 )
2011-09-12 05:53:54 +00:00
2011-12-01 18:59:34 +00:00
# create Wishlist and UserProfile to associate with User
2011-10-24 17:36:26 +00:00
def create_user_objects ( sender , created , instance , * * kwargs ) :
2011-09-12 05:53:54 +00:00
# use get_model to avoid circular import problem with models
try :
Wishlist = get_model ( ' core ' , ' Wishlist ' )
2011-10-24 17:36:26 +00:00
UserProfile = get_model ( ' core ' , ' UserProfile ' )
2011-09-12 05:53:54 +00:00
if created :
Wishlist . objects . create ( user = instance )
2011-10-24 17:36:26 +00:00
UserProfile . objects . create ( user = instance )
2011-09-12 05:53:54 +00:00
except DatabaseError :
2011-09-16 02:53:44 +00:00
# this can happen when creating superuser during syncdb since the
# core_wishlist table doesn't exist yet
2011-09-12 05:53:54 +00:00
return
2011-10-24 17:36:26 +00:00
post_save . connect ( create_user_objects , sender = User )
2011-12-01 18:59:34 +00:00
# create API key for new User
2011-09-16 02:53:44 +00:00
post_save . connect ( create_api_key , sender = User )
2011-12-01 18:59:34 +00:00
2011-12-29 04:11:13 +00:00
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 )
2012-03-27 21:53:07 +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 ) :
2012-04-25 14:06:22 +00:00
notification . create_notice_type ( " comment_on_commented " , _ ( " Comment on Commented Work " ) , _ ( " A comment has been received on a book that you ' ve commented on. " ) )
notification . create_notice_type ( " wishlist_comment " , _ ( " Wishlist Comment " ) , _ ( " A comment has been received on one of your wishlist books. " ) , default = 1 )
notification . create_notice_type ( " wishlist_work_claimed " , _ ( " Rights Holder is Active " ) , _ ( " A rights holder has shown up for a book that you want unglued. " ) , default = 1 )
notification . create_notice_type ( " wishlist_active " , _ ( " New Campaign " ) , _ ( " A book you ' ve wishlisted has a newly launched campaign. " ) )
notification . create_notice_type ( " wishlist_near_target " , _ ( " Campaign Near Target " ) , _ ( " A book you want is near its ungluing target. " ) )
notification . create_notice_type ( " wishlist_near_deadline " , _ ( " Campaign Near Deadline " ) , _ ( " A book you want is almost out of time. " ) )
2012-04-27 12:46:54 +00:00
notification . create_notice_type ( " wishlist_premium_limited_supply " , _ ( " Only a Few Premiums Left " ) , _ ( " A limited edition premium is running out on a book you like. " ) )
2012-04-25 14:06:22 +00:00
notification . create_notice_type ( " wishlist_successful " , _ ( " Successful Campaign " ) , _ ( " An ungluing campaign that you have supported or followed has succeeded. " ) )
notification . create_notice_type ( " wishlist_unsuccessful " , _ ( " Unsuccessful Campaign " ) , _ ( " An ungluing campaign that you supported didn ' t succeed this time. " ) )
notification . create_notice_type ( " wishlist_updated " , _ ( " Campaign Updated " ) , _ ( " An ungluing campaign you support has been updated. " ) , default = 1 )
notification . create_notice_type ( " wishlist_message " , _ ( " Campaign Communication " ) , _ ( " There ' s a message about an ungluing campaign you ' re interested in. " ) )
2012-04-27 12:46:54 +00:00
notification . create_notice_type ( " wishlist_price_drop " , _ ( " Campaign Price Drop " ) , _ ( " An ungluing campaign you ' re interested in has a reduced target. " ) , default = 1 )
notification . create_notice_type ( " wishlist_unglued_book_released " , _ ( " Unglued Book! " ) , _ ( " A book you wanted is now available to be downloaded. ' " ) )
2012-04-25 14:06:22 +00:00
notification . create_notice_type ( " pledge_you_have_pledged " , _ ( " Thanks For Your Pledge! " ) , _ ( " Your ungluing pledge has been entered. " ) )
notification . create_notice_type ( " pledge_status_change " , _ ( " Your Pledge Has Been Modified " ) , _ ( " Your ungluing plegde has been modified. " ) )
notification . create_notice_type ( " pledge_charged " , _ ( " Your Pledge has been Executed " ) , _ ( " You have contributed to a successful ungluing campaign. " ) )
2012-04-27 12:46:54 +00:00
notification . create_notice_type ( " rights_holder_created " , _ ( " Agreement Accepted " ) , _ ( " You become a verified Unglue.it rights holder. " ) )
2012-04-25 14:06:22 +00:00
notification . create_notice_type ( " rights_holder_claim_approved " , _ ( " Claim Accepted " ) , _ ( " A claim you ' ve entered has been accepted. " ) )
2012-04-25 02:44:59 +00:00
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
2012-03-27 21:53:07 +00:00
# define the notifications and tie them to corresponding signals
2012-04-02 19:04:51 +00:00
from django . contrib . comments . signals import comment_was_posted
2012-03-30 07:06:57 +00:00
2012-04-25 02:44:59 +00:00
2012-03-27 17:24:16 +00:00
def notify_comment ( comment , request , * * kwargs ) :
2012-03-30 07:06:57 +00:00
logger . info ( ' comment %s notifying ' % comment . pk )
2012-03-29 05:21:37 +00:00
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 )
2012-04-11 17:37:36 +00:00
notification . queue ( other_commenters , " comment_on_commented " , { ' comment ' : comment } , True )
2012-03-29 20:13:36 +00:00
notification . queue ( other_wishers , " wishlist_comment " , { ' comment ' : comment } , True )
2012-04-25 02:44:19 +00:00
from regluit . core . tasks import emit_notifications
emit_notifications . delay ( )
2012-03-30 07:06:57 +00:00
2012-03-27 17:24:16 +00:00
comment_was_posted . connect ( notify_comment )
2012-04-02 23:10:56 +00:00
# Successful campaign signal
# https://code.djangoproject.com/browser/django/tags/releases/1.3.1/django/db/models/signals.py
successful_campaign = Signal ( providing_args = [ " campaign " ] )
def notify_successful_campaign ( campaign , * * kwargs ) :
""" send notification in response to successful campaign """
logger . info ( ' received successful_campaign signal for {0} ' . format ( campaign ) )
# supporters and staff -- though it might be annoying for staff to be getting all these notices!
staff = User . objects . filter ( is_staff = True )
supporters = ( User . objects . get ( id = k ) for k in campaign . supporters ( ) )
site = Site . objects . get_current ( )
2012-04-25 02:44:19 +00:00
notification . queue ( itertools . chain ( staff , supporters ) , " wishlist_successful " , { ' campaign ' : campaign , ' site ' : site } , True )
from regluit . core . tasks import emit_notifications
emit_notifications . delay ( )
2012-04-02 23:10:56 +00:00
# successful_campaign -> send notices
2012-04-18 22:08:16 +00:00
successful_campaign . connect ( notify_successful_campaign )