Adding Paypal IPN integration.

This commit is contained in:
Samuel Clay 2010-10-16 18:52:52 -04:00
parent 6cccd70eb4
commit 00d42abb47
7 changed files with 74 additions and 23 deletions

View file

@ -2,6 +2,7 @@ import datetime
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from paypal.standard.ipn.signals import subscription_signup
class Profile(models.Model):
user = models.OneToOneField(User, unique=True, related_name="profile")
@ -17,4 +18,21 @@ def create_profile(sender, instance, created, **kwargs):
Profile.objects.create(user=instance)
else:
Profile.objects.get_or_create(user=instance)
post_save.connect(create_profile, sender=User)
post_save.connect(create_profile, sender=User)
def paypal_signup(sender, **kwargs):
ipn_obj = sender
# Undertake some action depending upon `ipn_obj`.
if ipn_obj.custom == "subscription_signup":
user = User.objects.get(username=ipn_obj.username)
user.profile.is_premium = True
user.profile.save()
from apps.rss_feeds.models import UserSubscription
subs = UserSubscription.objects.filter(user=user)
for sub in subs:
sub.active = True
sub.save()
sub.feed.setup_feed_for_premium_subscribers()
subscription_signup.connect(paypal_signup)

View file

@ -7,4 +7,6 @@ urlpatterns = patterns('',
(r'^get_view_setting/?', views.get_view_setting),
(r'^set_view_setting/?', views.set_view_setting),
(r'^set_collapsed_folders/?', views.set_collapsed_folders),
(r'^paypal_form/?', views.paypal_form),
(r'^paypal_ipn/?', include('paypal.standard.ipn.urls')),
)

View file

@ -1,10 +1,10 @@
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST
from django.http import HttpResponseRedirect
from django.http import HttpResponse, HttpResponseRedirect
from django.core.urlresolvers import reverse
from apps.reader.models import UserSubscription
from utils import json
from paypal.standard.forms import PayPalPaymentsForm
from utils.user_functions import ajax_login_required
@login_required
@require_POST
@ -71,14 +71,30 @@ def set_collapsed_folders(request):
response = dict(code=code)
return response
@ajax_login_required
def paypal_form(request):
paypal_dict = {
"cmd": "_xclick-subscriptions",
"business": "samuel@ofbrooklyn.com",
"a3": "12.00", # price
"p3": 1, # duration of each unit (depends on unit)
"t3": "Y", # duration unit ("M for Month")
"src": "1", # make payments recur
"sra": "1", # reattempt payment on payment error
"no_note": "1", # remove extra notes (optional)
"item_name": "NewsBlur Premium Account",
"notify_url": "http://www.newsblur.com/profile/paypal_ipn/?username=%s" % request.user.username,
"return_url": "http://www.newsblur.com/profile/paypal_return/?username=%s" % request.user.username,
"cancel_return": "http://www.newsblur.com/profile/paypal_cancel/?username=%s" % request.user.username,
}
# Create the instance.
form = PayPalPaymentsForm(initial=paypal_dict, button_type="subscribe")
# Output the button.
return HttpResponse(form.render(), mimetype='text/html')
@login_required
def activate_premium(request):
request.user.profile.is_premium = True
request.user.profile.save()
subs = UserSubscription.objects.filter(user=request.user)
for sub in subs:
sub.feed.setup_feed_for_premium_subscribers()
return HttpResponseRedirect(reverse('index'))

View file

@ -13,6 +13,7 @@ NEWSBLUR.ReaderFeedchooser.prototype = {
this.MAX_FEEDS = 40;
this.approve_list = [];
this.make_modal();
this.make_paypal_button();
_.defer(_.bind(function() { this.open_modal(); }, this));
this.find_feeds_in_feed_list();
this.initial_load_feeds();
@ -93,14 +94,22 @@ NEWSBLUR.ReaderFeedchooser.prototype = {
$.make('form', { className: 'NB-feedchooser-form' }, [
$.make('div', { className: 'NB-modal-submit' }, [
// this.make_google_checkout()
$.make('div', { className: 'NB-feedchooser-paypal' })
])
])
])
]);
},
make_google_checkout: function() {
var checkout = '<script type="text/javascript" src="https://images-na.ssl-images-amazon.com/images/G/01/cba/js/jquery.js"></script><script type="text/javascript" src="https://images-na.ssl-images-amazon.com/images/G/01/cba/js/widget/widget.js"></script><form method=POST action="https://payments.amazon.com/checkout/A215TOHXICT770"><input type="hidden" name="order-input" value="type:cba-signed-order/sha1-hmac/1;order:PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48T3JkZXIgeG1sbnM9J2h0dHA6Ly9wYXltZW50cy5hbWF6b24uY29tL2NoZWNrb3V0LzIwMDgtMTEtMzAvJz48Q2FydD48SXRlbXM+PEl0ZW0+PE1lcmNoYW50SWQ+QTIxNVRPSFhJQ1Q3NzA8L01lcmNoYW50SWQ+PFRpdGxlPk5ld3NCbHVyIFByZW1pdW0gLSAxIFllYXI8L1RpdGxlPjxEZXNjcmlwdGlvbj5UaGFuayB5b3UsIHRoYW5rIHlvdSwgdGhhbmsgeW91ITwvRGVzY3JpcHRpb24+PFByaWNlPjxBbW91bnQ+MTI8L0Ftb3VudD48Q3VycmVuY3lDb2RlPlVTRDwvQ3VycmVuY3lDb2RlPjwvUHJpY2U+PFF1YW50aXR5PjE8L1F1YW50aXR5PjxGdWxmaWxsbWVudE5ldHdvcms+TUVSQ0hBTlQ8L0Z1bGZpbGxtZW50TmV0d29yaz48L0l0ZW0+PC9JdGVtcz48L0NhcnQ+PC9PcmRlcj4=;signature:Zfg83JluKTIhItevtaGpspjdbfQ="><input alt="Checkout with Amazon Payments" src="https://payments.amazon.com/gp/cba/button?ie=UTF8&color=tan&background=white&cartOwnerId=A215TOHXICT770&size=large" type="image"></form>';
make_paypal_button: function() {
var $paypal = $('.NB-feedchooser-paypal', this.$modal);
$.get('/profile/paypal_form', function(response) {
$paypal.html(response);
});
},
make_google_button: function() {
var checkout = '<script type="text/javascript" src="https://images-na.ssl-images-amazon.com/images/G/01/cba/js/widget/widget.js"></script><form method=POST action="https://payments.amazon.com/checkout/A215TOHXICT770"><input type="hidden" name="order-input" value="type:cba-signed-order/sha1-hmac/1;order:PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48T3JkZXIgeG1sbnM9J2h0dHA6Ly9wYXltZW50cy5hbWF6b24uY29tL2NoZWNrb3V0LzIwMDgtMTEtMzAvJz48Q2FydD48SXRlbXM+PEl0ZW0+PE1lcmNoYW50SWQ+QTIxNVRPSFhJQ1Q3NzA8L01lcmNoYW50SWQ+PFRpdGxlPk5ld3NCbHVyIFByZW1pdW0gLSAxIFllYXI8L1RpdGxlPjxEZXNjcmlwdGlvbj5UaGFuayB5b3UsIHRoYW5rIHlvdSwgdGhhbmsgeW91ITwvRGVzY3JpcHRpb24+PFByaWNlPjxBbW91bnQ+MTI8L0Ftb3VudD48Q3VycmVuY3lDb2RlPlVTRDwvQ3VycmVuY3lDb2RlPjwvUHJpY2U+PFF1YW50aXR5PjE8L1F1YW50aXR5PjxGdWxmaWxsbWVudE5ldHdvcms+TUVSQ0hBTlQ8L0Z1bGZpbGxtZW50TmV0d29yaz48L0l0ZW0+PC9JdGVtcz48L0NhcnQ+PC9PcmRlcj4=;signature:Zfg83JluKTIhItevtaGpspjdbfQ="><input alt="Checkout with Amazon Payments" src="https://payments.amazon.com/gp/cba/button?ie=UTF8&color=tan&background=white&cartOwnerId=A215TOHXICT770&size=large" type="image"></form>';
var $checkout = $(checkout);
return $checkout;
},
@ -285,7 +294,7 @@ NEWSBLUR.ReaderFeedchooser.prototype = {
var feed_id = $(this).data('feed_id');
if (_.contains(active_feeds, feed_id)) {
self.add_feed_to_approve(feed_id);
self.add_feed_to_decline(feed_id);
} else {
self.add_feed_to_decline(feed_id);
}

View file

@ -30,7 +30,7 @@ ADMINS = (
('Samuel Clay', 'samuel@ofbrooklyn.com'),
)
MANAGERS = ADMINS
PAYPAL_RECEIVER_EMAIL = 'samuel@ofbrooklyn.com'
TIME_ZONE = 'GMT'
LANGUAGE_CODE = 'en-us'
SITE_ID = 1
@ -196,7 +196,6 @@ INSTALLED_APPS = (
'django.contrib.sites',
'django.contrib.admin',
'django_extensions',
'gunicorn',
'djcelery',
'compress',
'apps.rss_feeds',
@ -209,9 +208,15 @@ INSTALLED_APPS = (
# 'test_utils',
'utils',
'utils.typogrify',
'utils.paypal.standard.ipn',
# 'debug_toolbar'
)
if not DEVELOPMENT:
INSTALLED_APPS += [
'gunicorn',
]
DEVSERVER_MODULES = (
'devserver.modules.sql.SQLRealTimeModule',
'devserver.modules.sql.SQLSummaryModule',
@ -268,8 +273,10 @@ CELERY_DISABLE_RATE_LIMITS = True
# ==================
# = Configurations =
# ==================
from gunicorn_conf import *
try:
from gunicorn_conf import *
except ImportError, e:
pass
from local_settings import *
COMPRESS = not DEBUG

View file

@ -185,10 +185,9 @@
</div>
</h5>
</div>
<!--
<div class="NB-module NB-module-features">
<h5 class="NB-module-header">Important information</h5>
<div class="NB-module NB-module-features">
<h5 class="NB-module-header">Intelligence Trainer</h5>
<table class="" cellpadding="0" cellspacing="0">
<tr class="NB-module-feature NB-module-feature-new">
@ -196,8 +195,7 @@
<td class="NB-module-feature-description">I am aware that approximately 20% of all feeds are failing to fetch and parse. The fix will be coming sometime today or tomorrow.</td>
</tr>
</table>
</div>
-->
</div>-->
{% endif %}
<div class="NB-module NB-module-features">

1
utils/paypal Submodule

@ -0,0 +1 @@
Subproject commit 0c8aeec1c319a08ce1bfdf828534d01b69b8fa27