mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-09-18 21:50:56 +00:00
Adding Paypal IPN integration.
This commit is contained in:
parent
6cccd70eb4
commit
00d42abb47
7 changed files with 74 additions and 23 deletions
|
@ -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)
|
|
@ -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')),
|
||||
)
|
||||
|
|
|
@ -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'))
|
|
@ -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);
|
||||
}
|
||||
|
|
15
settings.py
15
settings.py
|
@ -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
|
||||
|
|
|
@ -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
1
utils/paypal
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 0c8aeec1c319a08ce1bfdf828534d01b69b8fa27
|
Loading…
Add table
Reference in a new issue