2012-02-27 21:46:34 -08:00
|
|
|
import stripe
|
2010-06-11 20:55:38 -04:00
|
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
from django.views.decorators.http import require_POST
|
2010-10-16 18:52:52 -04:00
|
|
|
from django.http import HttpResponse, HttpResponseRedirect
|
2010-10-23 11:13:44 -04:00
|
|
|
from django.contrib.sites.models import Site
|
2011-07-27 22:17:34 -07:00
|
|
|
from django.contrib.auth.models import User
|
2010-10-06 10:21:14 -04:00
|
|
|
from django.core.urlresolvers import reverse
|
2010-10-19 19:09:08 -04:00
|
|
|
from django.template import RequestContext
|
|
|
|
from django.shortcuts import render_to_response
|
2010-10-23 10:40:25 -04:00
|
|
|
from django.core.mail import mail_admins
|
2012-02-27 21:46:34 -08:00
|
|
|
from django.conf import settings
|
2010-11-08 12:09:55 -05:00
|
|
|
from apps.profile.models import Profile, change_password
|
2010-10-29 12:28:05 -04:00
|
|
|
from apps.reader.models import UserSubscription
|
2012-02-29 12:15:01 -08:00
|
|
|
from apps.profile.forms import StripePlusPaymentForm, PLANS
|
2012-03-07 16:32:02 -08:00
|
|
|
from apps.social.models import MSocialServices
|
2012-02-27 21:46:34 -08:00
|
|
|
from utils import json_functions as json
|
|
|
|
from utils.user_functions import ajax_login_required
|
|
|
|
from vendor.paypal.standard.forms import PayPalPaymentsForm
|
2010-06-11 20:55:38 -04:00
|
|
|
|
2011-12-24 00:30:37 -08:00
|
|
|
SINGLE_FIELD_PREFS = ('timezone','feed_pane_size','tutorial_finished','hide_mobile','send_emails',
|
|
|
|
'has_trained_intelligence', 'hide_find_friends', 'hide_getting_started',)
|
2012-03-07 16:32:02 -08:00
|
|
|
SPECIAL_PREFERENCES = ('old_password', 'new_password', 'autofollow_friends')
|
2010-10-31 16:03:50 -04:00
|
|
|
|
2010-11-05 10:35:52 -04:00
|
|
|
@ajax_login_required
|
2010-06-11 20:55:38 -04:00
|
|
|
@require_POST
|
|
|
|
@json.json_view
|
|
|
|
def set_preference(request):
|
2010-09-05 18:08:08 -07:00
|
|
|
code = 1
|
2010-11-08 12:09:55 -05:00
|
|
|
message = ''
|
2010-10-30 00:27:52 -04:00
|
|
|
new_preferences = request.POST
|
2010-06-11 20:55:38 -04:00
|
|
|
|
2010-07-06 14:57:32 -04:00
|
|
|
preferences = json.decode(request.user.profile.preferences)
|
2010-10-30 00:27:52 -04:00
|
|
|
for preference_name, preference_value in new_preferences.items():
|
2011-05-13 10:15:56 -04:00
|
|
|
if preference_value in ['true','false']: preference_value = True if preference_value == 'true' else False
|
2010-10-31 16:03:50 -04:00
|
|
|
if preference_name in SINGLE_FIELD_PREFS:
|
|
|
|
setattr(request.user.profile, preference_name, preference_value)
|
2012-03-07 16:32:02 -08:00
|
|
|
elif preference_name in SPECIAL_PREFERENCES:
|
|
|
|
if preference_name == 'autofollow_friends':
|
|
|
|
social_services = MSocialServices.objects.get(user_id=request.user.pk)
|
|
|
|
social_services.autofollow = preference_value
|
|
|
|
print social_services.autofollow
|
|
|
|
social_services.save()
|
2010-10-31 16:03:50 -04:00
|
|
|
else:
|
2011-02-16 20:45:37 -05:00
|
|
|
if preference_value in ["true", "false"]:
|
|
|
|
preference_value = True if preference_value == "true" else False
|
2010-10-31 16:03:50 -04:00
|
|
|
preferences[preference_name] = preference_value
|
2010-10-30 00:27:52 -04:00
|
|
|
|
2010-07-06 14:57:32 -04:00
|
|
|
request.user.profile.preferences = json.encode(preferences)
|
2010-06-11 20:55:38 -04:00
|
|
|
request.user.profile.save()
|
|
|
|
|
2011-03-16 19:24:58 -04:00
|
|
|
response = dict(code=code, message=message, new_preferences=new_preferences)
|
2010-06-11 20:55:38 -04:00
|
|
|
return response
|
|
|
|
|
2010-11-05 10:35:52 -04:00
|
|
|
@ajax_login_required
|
2010-06-11 20:55:38 -04:00
|
|
|
@json.json_view
|
|
|
|
def get_preference(request):
|
2010-09-05 18:08:08 -07:00
|
|
|
code = 1
|
2011-07-27 22:17:34 -07:00
|
|
|
preference_name = request.POST.get('preference')
|
2010-07-06 14:57:32 -04:00
|
|
|
preferences = json.decode(request.user.profile.preferences)
|
|
|
|
|
2011-07-27 22:17:34 -07:00
|
|
|
payload = preferences
|
|
|
|
if preference_name:
|
|
|
|
payload = preferences.get(preference_name)
|
|
|
|
|
|
|
|
response = dict(code=code, payload=payload)
|
2010-07-06 14:57:32 -04:00
|
|
|
return response
|
|
|
|
|
2011-07-27 22:17:34 -07:00
|
|
|
@ajax_login_required
|
|
|
|
@require_POST
|
|
|
|
@json.json_view
|
|
|
|
def set_account_settings(request):
|
|
|
|
code = 1
|
|
|
|
message = ''
|
2012-02-27 21:46:34 -08:00
|
|
|
post_settings = request.POST
|
2011-07-27 22:17:34 -07:00
|
|
|
|
2012-02-27 21:46:34 -08:00
|
|
|
if post_settings['username'] and request.user.username != post_settings['username']:
|
2011-07-27 22:17:34 -07:00
|
|
|
try:
|
2012-02-27 21:46:34 -08:00
|
|
|
User.objects.get(username__iexact=post_settings['username'])
|
2011-07-27 22:17:34 -07:00
|
|
|
except User.DoesNotExist:
|
2012-02-27 21:46:34 -08:00
|
|
|
request.user.username = post_settings['username']
|
2011-07-27 22:17:34 -07:00
|
|
|
request.user.save()
|
|
|
|
else:
|
|
|
|
code = -1
|
|
|
|
message = "This username is already taken. Try something different."
|
|
|
|
|
2012-02-27 21:46:34 -08:00
|
|
|
if request.user.email != post_settings['email']:
|
|
|
|
if not User.objects.filter(email=post_settings['email']).count():
|
|
|
|
request.user.email = post_settings['email']
|
2011-07-27 22:17:34 -07:00
|
|
|
request.user.save()
|
|
|
|
else:
|
|
|
|
code = -2
|
|
|
|
message = "This email is already being used by another account. Try something different."
|
|
|
|
|
2012-02-27 21:46:34 -08:00
|
|
|
if code != -1 and (post_settings['old_password'] or post_settings['new_password']):
|
|
|
|
code = change_password(request.user, post_settings['old_password'], post_settings['new_password'])
|
2011-07-27 22:17:34 -07:00
|
|
|
if code == -3:
|
|
|
|
message = "Your old password is incorrect."
|
|
|
|
|
|
|
|
payload = {
|
|
|
|
"username": request.user.username,
|
|
|
|
"email": request.user.email,
|
|
|
|
}
|
|
|
|
return dict(code=code, message=message, payload=payload)
|
|
|
|
|
2010-11-05 10:35:52 -04:00
|
|
|
@ajax_login_required
|
2010-07-06 14:57:32 -04:00
|
|
|
@require_POST
|
|
|
|
@json.json_view
|
|
|
|
def set_view_setting(request):
|
2010-09-05 18:08:08 -07:00
|
|
|
code = 1
|
2010-07-06 14:57:32 -04:00
|
|
|
feed_id = request.POST['feed_id']
|
|
|
|
feed_view_setting = request.POST['feed_view_setting']
|
|
|
|
|
|
|
|
view_settings = json.decode(request.user.profile.view_settings)
|
|
|
|
view_settings[feed_id] = feed_view_setting
|
|
|
|
request.user.profile.view_settings = json.encode(view_settings)
|
|
|
|
request.user.profile.save()
|
2010-06-11 20:55:38 -04:00
|
|
|
|
2010-07-06 14:57:32 -04:00
|
|
|
response = dict(code=code)
|
|
|
|
return response
|
|
|
|
|
2010-11-05 10:35:52 -04:00
|
|
|
@ajax_login_required
|
2010-07-06 14:57:32 -04:00
|
|
|
@json.json_view
|
|
|
|
def get_view_setting(request):
|
2010-09-05 18:08:08 -07:00
|
|
|
code = 1
|
2010-07-06 14:57:32 -04:00
|
|
|
feed_id = request.POST['feed_id']
|
|
|
|
view_settings = json.decode(request.user.profile.view_settings)
|
2010-06-11 20:55:38 -04:00
|
|
|
|
2010-07-06 14:57:32 -04:00
|
|
|
response = dict(code=code, payload=view_settings.get(feed_id))
|
2010-09-05 18:08:08 -07:00
|
|
|
return response
|
|
|
|
|
|
|
|
|
2010-11-05 10:35:52 -04:00
|
|
|
@ajax_login_required
|
2010-09-05 18:08:08 -07:00
|
|
|
@require_POST
|
|
|
|
@json.json_view
|
|
|
|
def set_collapsed_folders(request):
|
|
|
|
code = 1
|
|
|
|
collapsed_folders = request.POST['collapsed_folders']
|
|
|
|
|
|
|
|
request.user.profile.collapsed_folders = collapsed_folders
|
|
|
|
request.user.profile.save()
|
|
|
|
|
|
|
|
response = dict(code=code)
|
2010-10-06 10:21:14 -04:00
|
|
|
return response
|
2010-10-16 18:52:52 -04:00
|
|
|
|
2010-10-16 20:09:19 -04:00
|
|
|
@ajax_login_required
|
2010-10-16 18:52:52 -04:00
|
|
|
def paypal_form(request):
|
2010-10-23 11:13:44 -04:00
|
|
|
domain = Site.objects.get_current().domain
|
|
|
|
|
2010-10-16 18:52:52 -04:00
|
|
|
paypal_dict = {
|
|
|
|
"cmd": "_xclick-subscriptions",
|
2010-10-23 11:34:11 -04:00
|
|
|
"business": "samuel@ofbrooklyn.com",
|
2010-10-16 18:52:52 -04:00
|
|
|
"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",
|
2010-10-23 11:13:44 -04:00
|
|
|
"notify_url": "http://%s%s" % (domain, reverse('paypal-ipn')),
|
|
|
|
"return_url": "http://%s%s" % (domain, reverse('paypal-return')),
|
|
|
|
"cancel_return": "http://%s%s" % (domain, reverse('index')),
|
2010-10-16 23:23:15 -04:00
|
|
|
"custom": request.user.username,
|
2010-10-16 18:52:52 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
# Create the instance.
|
|
|
|
form = PayPalPaymentsForm(initial=paypal_dict, button_type="subscribe")
|
|
|
|
|
|
|
|
# Output the button.
|
2010-10-23 11:34:11 -04:00
|
|
|
return HttpResponse(form.render(), mimetype='text/html')
|
2010-10-19 19:09:08 -04:00
|
|
|
|
|
|
|
def paypal_return(request):
|
|
|
|
|
|
|
|
return render_to_response('reader/paypal_return.xhtml', {
|
|
|
|
}, context_instance=RequestContext(request))
|
2010-10-06 10:21:14 -04:00
|
|
|
|
|
|
|
@login_required
|
|
|
|
def activate_premium(request):
|
2010-10-22 10:22:19 -04:00
|
|
|
return HttpResponseRedirect(reverse('index'))
|
|
|
|
|
|
|
|
@ajax_login_required
|
|
|
|
@json.json_view
|
|
|
|
def profile_is_premium(request):
|
|
|
|
# Check tries
|
2010-10-23 10:40:25 -04:00
|
|
|
code = 0
|
2010-10-23 10:46:35 -04:00
|
|
|
retries = int(request.GET['retries'])
|
2010-10-23 10:40:25 -04:00
|
|
|
profile = Profile.objects.get(user=request.user)
|
|
|
|
|
2010-10-29 12:28:05 -04:00
|
|
|
subs = UserSubscription.objects.filter(user=request.user)
|
|
|
|
total_subs = subs.count()
|
|
|
|
activated_subs = subs.filter(active=True).count()
|
|
|
|
|
2011-10-19 18:14:56 -07:00
|
|
|
if retries >= 30:
|
2011-02-05 15:34:43 -05:00
|
|
|
subject = "Premium activation failed: %s (%s/%s)" % (request.user, activated_subs, total_subs)
|
2012-01-26 09:54:48 -08:00
|
|
|
message = """User: %s (%s) -- Email: %s""" % (request.user.username, request.user.pk, request.user.email)
|
2010-10-23 10:40:25 -04:00
|
|
|
mail_admins(subject, message, fail_silently=True)
|
|
|
|
code = -1
|
2010-10-29 12:28:05 -04:00
|
|
|
request.user.profile.is_premium = True
|
|
|
|
request.user.profile.save()
|
2010-10-23 10:40:25 -04:00
|
|
|
|
|
|
|
return {
|
|
|
|
'is_premium': profile.is_premium,
|
|
|
|
'code': code,
|
2010-10-29 12:28:05 -04:00
|
|
|
'activated_subs': activated_subs,
|
|
|
|
'total_subs': total_subs,
|
2010-10-23 10:40:25 -04:00
|
|
|
}
|
2012-02-27 21:46:34 -08:00
|
|
|
|
|
|
|
@login_required
|
|
|
|
def stripe_form(request):
|
|
|
|
user = request.user
|
|
|
|
success_updating = False
|
|
|
|
stripe.api_key = settings.STRIPE_SECRET
|
2012-02-29 12:15:01 -08:00
|
|
|
plan = int(request.GET.get('plan', 2))
|
|
|
|
plan = PLANS[plan-1][0]
|
2012-02-27 21:46:34 -08:00
|
|
|
|
|
|
|
if request.method == 'POST':
|
2012-02-28 17:37:01 -08:00
|
|
|
zebra_form = StripePlusPaymentForm(request.POST, email=user.email)
|
2012-02-27 21:46:34 -08:00
|
|
|
if zebra_form.is_valid():
|
2012-02-28 17:37:01 -08:00
|
|
|
user.email = zebra_form.cleaned_data['email']
|
|
|
|
user.save()
|
|
|
|
|
2012-02-27 21:46:34 -08:00
|
|
|
customer = stripe.Customer.create(**{
|
|
|
|
'card': zebra_form.cleaned_data['stripe_token'],
|
2012-02-29 12:15:01 -08:00
|
|
|
'plan': zebra_form.cleaned_data['plan'],
|
2012-02-27 21:46:34 -08:00
|
|
|
'email': user.email,
|
2012-02-28 17:37:01 -08:00
|
|
|
'description': user.username,
|
2012-02-27 21:46:34 -08:00
|
|
|
})
|
|
|
|
|
|
|
|
user.profile.strip_4_digits = zebra_form.cleaned_data['last_4_digits']
|
|
|
|
user.profile.stripe_id = customer.id
|
|
|
|
user.profile.save()
|
|
|
|
|
|
|
|
success_updating = True
|
|
|
|
|
|
|
|
else:
|
2012-02-28 17:37:01 -08:00
|
|
|
zebra_form = StripePlusPaymentForm(email=user.email, plan=plan)
|
2012-02-27 21:46:34 -08:00
|
|
|
|
|
|
|
if success_updating:
|
|
|
|
return render_to_response('reader/paypal_return.xhtml',
|
|
|
|
{}, context_instance=RequestContext(request))
|
|
|
|
|
|
|
|
return render_to_response('profile/stripe_form.xhtml',
|
|
|
|
{
|
|
|
|
'zebra_form': zebra_form,
|
|
|
|
'publishable': settings.STRIPE_PUBLISHABLE,
|
|
|
|
'success_updating': success_updating,
|
|
|
|
},
|
|
|
|
context_instance=RequestContext(request)
|
|
|
|
)
|