creating signal for pledge_modified and moving you_have_pledged to signals framework so they interact properly -- at most one sent

pull/1/head
Andromeda Yelton 2012-05-29 08:54:57 -04:00
parent 7f0f147b9f
commit 2563dda3e5
4 changed files with 56 additions and 11 deletions

View File

@ -14,7 +14,7 @@ from social_auth.signals import pre_update
from social_auth.backends.facebook import FacebookBackend
from tastypie.models import create_api_key
from regluit.payment.signals import transaction_charged
from regluit.payment.signals import transaction_charged, pledge_modified, pledge_created
import registration.signals
import django.dispatch
@ -130,6 +130,7 @@ def notify_successful_campaign(campaign, **kwargs):
# successful_campaign -> send notices
successful_campaign.connect(notify_successful_campaign)
from regluit.core.tasks import emit_notifications
def handle_transaction_charged(sender,transaction=None, **kwargs):
if transaction==None:
@ -139,11 +140,37 @@ def handle_transaction_charged(sender,transaction=None, **kwargs):
'transaction':transaction,
'payment_processor':settings.PAYMENT_PROCESSOR
}, True)
from regluit.core.tasks import emit_notifications
emit_notifications.delay()
transaction_charged.connect(handle_transaction_charged)
def handle_pledge_modified(sender, transaction=None, status=None, **kwargs):
if transaction==None or status==None:
return
notification.queue([transaction.user], "pledge_status_change", {
'site':Site.objects.get_current(),
'transaction': transaction,
'payment_processor':settings.PAYMENT_PROCESSOR,
'status': status
}, True)
emit_notifications.delay()
pledge_modified.connect(handle_pledge_modified)
def handle_you_have_pledged(sender, transaction=None, **kwargs):
if transaction==None:
return
notification.queue([transaction.user], "pledge_you_have_pledged", {
'site':Site.objects.get_current(),
'transaction': transaction,
'campaign': transaction.campaign,
'work': transaction.campaign.work,
'payment_processor':settings.PAYMENT_PROCESSOR,
}, True)
emit_notifications.delay()
pledge_created.connect(handle_you_have_pledged)
# The notification templates need some context; I'm making a note of that here
# This can be removed as the relevant functions are written
# PLEDGE_CHANGE_STATUS:

View File

@ -760,8 +760,10 @@ class PledgeModifyView(FormView):
elif status and url is None:
# let's use the pledge_complete template for now and maybe look into customizing it.
return HttpResponseRedirect("{0}?tid={1}".format(reverse('pledge_complete'), transaction.id))
from regluit.payment.signals import pledge_modified
pledge_modified.send(sender=self, transaction=transaction, status="increased")
else:
return HttpResponse("No modication made")
return HttpResponse("No modification made")
class PledgeCompleteView(TemplateView):
@ -850,10 +852,6 @@ class PledgeCompleteView(TemplateView):
context["works2"] = works2
context["site"] = Site.objects.get_current()
# generate notices with same context used for user page
notification.queue([transaction.user], "pledge_you_have_pledged", {'transaction': transaction, 'campaign': campaign, 'site': context['site'], 'work': work}, True)
emit_notifications.delay()
return context

View File

@ -5,7 +5,7 @@ from django.core.urlresolvers import reverse
from django.conf import settings
from regluit.payment.parameters import *
from regluit.payment.paypal import IPN_SENDER_STATUS_COMPLETED
from regluit.payment.signals import transaction_charged
from regluit.payment.signals import transaction_charged, pledge_modified, pledge_created
if settings.PAYMENT_PROCESSOR == 'paypal':
from regluit.payment.paypal import Pay, Finish, Preapproval, ProcessIPN, CancelPreapproval, PaymentDetails, PreapprovalDetails, RefundPayment
@ -549,7 +549,7 @@ class PaymentManager( object ):
def authorize(self, currency, target, amount, expiry=None, campaign=None, list=None, user=None,
return_url=None, nevermind_url=None, anonymous=False, premium=None,
paymentReason="unglue.it Pledge"):
paymentReason="unglue.it Pledge", modification=False):
'''
authorize
@ -619,6 +619,17 @@ class PaymentManager( object ):
url = p.next_url()
logger.info("Authorize Success: " + url)
# modification and initial pledge use different notification templates --
# decide which to send
# we fire notifications here because it's the first point at which we are sure
# that the transaction has successfully completed; triggering notifications
# when the transaction is initiated risks sending notifications on transactions
# that for whatever reason fail. will need other housekeeping to handle those.
if modification==True:
pledge_modified.send(sender=self, transaction=transaction, status="increased")
else:
pledge_created.send(sender=self, transaction=transaction)
return t, url
@ -681,16 +692,22 @@ class PaymentManager( object ):
nevermind_url,
transaction.anonymous,
premium,
paymentReason)
paymentReason,
True)
if t and url:
# Need to re-direct to approve the transaction
logger.info("New authorization needed, redirection to url %s" % url)
self.cancel_transaction(transaction)
self.cancel_transaction(transaction)
# while it would seem to make sense to send a pledge notification change here
# if we do, we will also send notifications when we initiate but do not
# successfully complete a pledge modification
return True, url
else:
# a problem in authorize
logger.info("Error, unable to start a new authorization")
# should we send a pledge_modified signal with state="failed" and a
# corresponding notification to the user? that would go here.
return False, None
elif amount <= transaction.max_amount:
@ -701,6 +718,7 @@ class PaymentManager( object ):
transaction.save()
logger.info("Updated amount of transaction to %f" % amount)
pledge_modified.send(sender=self, transaction=transaction, status="decreased")
return True, None
else:
# this shouldn't happen

View File

@ -1,3 +1,5 @@
from django.dispatch import Signal
transaction_charged = Signal(providing_args=["transaction"])
pledge_created = Signal(providing_args=["transaction"])
pledge_modified = Signal(providing_args=["transaction", "status"])