2012-02-27 21:46:34 -08:00
import stripe
2017-12-08 16:43:30 -08:00
import requests
2012-04-21 18:20:49 -07:00
import datetime
2010-06-11 20:55:38 -04:00
from django . contrib . auth . decorators import login_required
from django . views . decorators . http import require_POST
2017-12-08 16:43:30 -08:00
from django . views . decorators . csrf import csrf_protect , csrf_exempt
2013-01-03 10:33:22 -08:00
from django . contrib . auth import logout as logout_user
2014-02-14 15:30:46 -08:00
from django . contrib . auth import login as login_user
2014-04-03 12:44:04 -07:00
from django . db . models . aggregates import Sum
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
2013-05-10 12:05:24 -07:00
from django . contrib . admin . views . decorators import staff_member_required
2010-10-06 10:21:14 -04:00
from django . core . urlresolvers import reverse
2020-06-12 01:27:07 -04:00
from django . shortcuts import render
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
2015-07-09 20:09:35 -07:00
from apps . profile . models import Profile , PaymentHistory , RNewUserQueue , MRedeemedCode , MGiftCode
2014-04-03 12:44:04 -07:00
from apps . reader . models import UserSubscription , UserSubscriptionFolders , RUserStory
2013-01-03 10:33:22 -08:00
from apps . profile . forms import StripePlusPaymentForm , PLANS , DeleteAccountForm
2013-05-06 15:12:18 -07:00
from apps . profile . forms import ForgotPasswordForm , ForgotPasswordReturnForm , AccountSettingsForm
2014-11-06 13:33:34 -08:00
from apps . profile . forms import RedeemCodeForm
2014-04-29 15:24:33 -07:00
from apps . reader . forms import SignupForm , LoginForm
2014-09-29 13:09:46 -07:00
from apps . rss_feeds . models import MStarredStory , MStarredStoryCounts
2012-04-20 08:45:29 -07:00
from apps . social . models import MSocialServices , MActivity , MSocialProfile
2015-06-04 11:27:46 -07:00
from apps . analyzer . models import MClassifierTitle , MClassifierAuthor , MClassifierFeed , MClassifierTag
2012-02-27 21:46:34 -08:00
from utils import json_functions as json
from utils . user_functions import ajax_login_required
2018-05-03 15:38:59 -07:00
from utils . view_functions import render_to , is_true
2012-04-12 11:18:56 -07:00
from utils . user_functions import get_user
2012-07-25 23:57:10 -07:00
from utils import log as logging
2014-09-24 17:00:09 -07:00
from vendor . paypalapi . exceptions import PayPalAPIResponseError
2020-06-24 16:59:43 -04:00
from paypal . standard . forms import PayPalPaymentsForm
2010-06-11 20:55:38 -04:00
2012-03-19 14:15:38 -07:00
SINGLE_FIELD_PREFS = ( ' timezone ' , ' feed_pane_size ' , ' hide_mobile ' , ' send_emails ' ,
' hide_getting_started ' , ' has_setup_feeds ' , ' has_found_friends ' ,
2016-02-26 20:01:41 -08:00
' has_trained_intelligence ' )
2012-04-21 18:20:49 -07:00
SPECIAL_PREFERENCES = ( ' old_password ' , ' new_password ' , ' autofollow_friends ' , ' dashboard_date ' , )
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 ' :
2015-07-20 16:44:50 -07:00
social_services = MSocialServices . get_user ( request . user . pk )
2012-03-07 16:32:02 -08:00
social_services . autofollow = preference_value
social_services . save ( )
2012-04-21 18:20:49 -07:00
elif preference_name == ' dashboard_date ' :
request . user . profile . dashboard_date = datetime . datetime . utcnow ( )
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
2012-07-25 23:57:10 -07:00
if preference_name == ' intro_page ' :
logging . user ( request , " ~FBAdvancing intro to page ~FM~SB %s " % preference_value )
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 ( )
2013-07-18 15:13:39 -07:00
logging . user ( request , " ~FMSaving preference: %s " % new_preferences )
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
2014-02-14 15:30:46 -08:00
2014-04-29 15:24:33 -07:00
@csrf_protect
def login ( request ) :
form = LoginForm ( )
if request . method == " POST " :
form = LoginForm ( data = request . POST )
if form . is_valid ( ) :
login_user ( request , form . get_user ( ) )
logging . user ( form . get_user ( ) , " ~FG~BBOAuth Login~FW " )
return HttpResponseRedirect ( request . POST [ ' next ' ] or reverse ( ' index ' ) )
2020-11-13 21:14:41 -05:00
return render ( request , ' accounts/login.html ' , {
2014-04-29 15:24:33 -07:00
' form ' : form ,
2020-12-07 11:42:23 -05:00
' next ' : request . POST . get ( ' next ' , " " ) or request . GET . get ( ' next ' , " " )
2020-11-13 21:14:41 -05:00
} )
2014-04-29 15:24:33 -07:00
2017-12-08 16:43:30 -08:00
@csrf_exempt
2014-02-14 15:30:46 -08:00
def signup ( request ) :
2017-12-08 16:43:30 -08:00
form = SignupForm ( prefix = " signup " )
recaptcha = request . POST . get ( ' g-recaptcha-response ' , None )
recaptcha_error = None
2020-08-31 22:30:57 -04:00
if settings . ENFORCE_SIGNUP_CAPTCHA :
if not recaptcha :
recaptcha_error = " Please hit the \" I ' m not a robot \" button. "
else :
response = requests . post ( ' https://www.google.com/recaptcha/api/siteverify ' , {
' secret ' : settings . RECAPTCHA_SECRET_KEY ,
' response ' : recaptcha ,
} )
result = response . json ( )
if not result [ ' success ' ] :
recaptcha_error = " Really, please hit the \" I ' m not a robot \" button. "
2014-02-14 15:30:46 -08:00
if request . method == " POST " :
2017-12-08 16:43:30 -08:00
form = SignupForm ( data = request . POST , prefix = " signup " )
if form . is_valid ( ) and not recaptcha_error :
2014-02-14 15:30:46 -08:00
new_user = form . save ( )
login_user ( request , new_user )
2015-06-27 10:59:06 -07:00
logging . user ( new_user , " ~FG~SB~BBNEW SIGNUP: ~FW %s " % new_user . email )
2014-02-14 15:30:46 -08:00
new_user . profile . activate_free ( )
2014-04-29 15:24:33 -07:00
return HttpResponseRedirect ( request . POST [ ' next ' ] or reverse ( ' index ' ) )
2014-02-14 15:30:46 -08:00
2020-06-12 01:27:07 -04:00
return render ( request , ' accounts/signup.html ' , {
2014-02-14 15:30:46 -08:00
' form ' : form ,
2017-12-08 16:43:30 -08:00
' recaptcha_error ' : recaptcha_error ,
2020-06-07 08:04:23 -04:00
' next ' : request . POST . get ( ' next ' , " " )
2020-06-12 01:27:07 -04:00
} )
2014-11-06 13:33:34 -08:00
@login_required
@csrf_protect
def redeem_code ( request ) :
2014-11-06 14:41:55 -08:00
code = request . GET . get ( ' code ' , None )
form = RedeemCodeForm ( initial = { ' gift_code ' : code } )
2014-11-06 13:33:34 -08:00
if request . method == " POST " :
form = RedeemCodeForm ( data = request . POST )
if form . is_valid ( ) :
2014-11-06 14:55:27 -08:00
gift_code = request . POST [ ' gift_code ' ]
2015-06-30 16:05:58 -07:00
MRedeemedCode . redeem ( user = request . user , gift_code = gift_code )
2020-06-12 01:27:07 -04:00
return render ( request , ' reader/paypal_return.xhtml ' )
2014-11-06 13:33:34 -08:00
2020-06-12 01:27:07 -04:00
return render ( request , ' accounts/redeem_code.html ' , {
2014-11-06 13:33:34 -08:00
' form ' : form ,
2020-06-07 08:04:23 -04:00
' code ' : request . POST . get ( ' code ' , " " ) ,
' next ' : request . POST . get ( ' next ' , " " )
2020-06-12 01:27:07 -04:00
} )
2010-07-06 14:57:32 -04:00
2014-11-06 13:33:34 -08:00
2011-07-27 22:17:34 -07:00
@ajax_login_required
@require_POST
@json.json_view
def set_account_settings ( request ) :
2013-05-06 15:12:18 -07:00
code = - 1
message = ' OK '
form = AccountSettingsForm ( user = request . user , data = request . POST )
if form . is_valid ( ) :
form . save ( )
code = 1
else :
2013-05-06 15:21:17 -07:00
message = form . errors [ form . errors . keys ( ) [ 0 ] ] [ 0 ]
2011-07-27 22:17:34 -07:00
payload = {
" username " : request . user . username ,
" email " : request . user . email ,
2012-04-20 08:45:29 -07:00
" social_profile " : MSocialProfile . profile ( request . user . pk )
2011-07-27 22:17:34 -07:00
}
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 ' ]
2012-07-18 20:19:54 -07:00
feed_view_setting = request . POST . get ( ' feed_view_setting ' )
feed_order_setting = request . POST . get ( ' feed_order_setting ' )
feed_read_filter_setting = request . POST . get ( ' feed_read_filter_setting ' )
2015-02-06 13:28:55 -08:00
feed_layout_setting = request . POST . get ( ' feed_layout_setting ' )
2010-07-06 14:57:32 -04:00
view_settings = json . decode ( request . user . profile . view_settings )
2012-07-18 20:19:54 -07:00
setting = view_settings . get ( feed_id , { } )
if isinstance ( setting , basestring ) : setting = { ' v ' : setting }
if feed_view_setting : setting [ ' v ' ] = feed_view_setting
if feed_order_setting : setting [ ' o ' ] = feed_order_setting
if feed_read_filter_setting : setting [ ' r ' ] = feed_read_filter_setting
2015-02-06 13:28:55 -08:00
if feed_layout_setting : setting [ ' l ' ] = feed_layout_setting
2012-07-18 20:19:54 -07:00
view_settings [ feed_id ] = setting
2010-07-06 14:57:32 -04:00
request . user . profile . view_settings = json . encode ( view_settings )
request . user . profile . save ( )
2010-06-11 20:55:38 -04:00
2015-02-06 13:28:55 -08:00
logging . user ( request , " ~FMView settings: %s / %s / %s / %s " % ( feed_view_setting ,
feed_order_setting , feed_read_filter_setting , feed_layout_setting ) )
2010-07-06 14:57:32 -04:00
response = dict ( code = code )
return response
2015-02-10 14:45:03 -08:00
@ajax_login_required
@require_POST
@json.json_view
def clear_view_setting ( request ) :
code = 1
view_setting_type = request . POST . get ( ' view_setting_type ' )
view_settings = json . decode ( request . user . profile . view_settings )
new_view_settings = { }
removed = 0
for feed_id , view_setting in view_settings . items ( ) :
if view_setting_type == ' layout ' and ' l ' in view_setting :
del view_setting [ ' l ' ]
removed + = 1
if view_setting_type == ' view ' and ' v ' in view_setting :
del view_setting [ ' v ' ]
removed + = 1
2015-07-29 17:27:43 -07:00
if view_setting_type == ' order ' and ' o ' in view_setting :
del view_setting [ ' o ' ]
removed + = 1
if view_setting_type == ' order ' and ' r ' in view_setting :
del view_setting [ ' r ' ]
removed + = 1
2015-02-10 14:45:03 -08:00
new_view_settings [ feed_id ] = view_setting
request . user . profile . view_settings = json . encode ( new_view_settings )
request . user . profile . save ( )
logging . user ( request , " ~FMClearing view settings: %s (found %s ) " % ( view_setting_type , removed ) )
response = dict ( code = code , view_settings = view_settings , removed = removed )
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 ( )
2013-07-18 15:13:39 -07:00
logging . user ( request , " ~FMCollapsing folder: %s " % collapsed_folders )
2010-09-05 18:08:08 -07:00
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 " )
2012-07-25 23:57:10 -07:00
logging . user ( request , " ~FBLoading paypal/feedchooser " )
2010-10-16 18:52:52 -04:00
# Output the button.
2020-06-08 00:10:52 -04:00
return HttpResponse ( form . render ( ) , content_type = ' text/html ' )
2010-10-19 19:09:08 -04:00
def paypal_return ( request ) :
2020-06-12 01:27:07 -04:00
return render ( request , ' reader/paypal_return.xhtml ' , {
} )
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 :
2010-10-23 10:40:25 -04:00
code = - 1
2013-03-13 23:07:50 -07:00
if not request . user . profile . is_premium :
subject = " Premium activation failed: %s ( %s / %s ) " % ( request . user , activated_subs , total_subs )
message = """ User: %s ( %s ) -- Email: %s """ % ( request . user . username , request . user . pk , request . user . email )
mail_admins ( subject , message , fail_silently = True )
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
2017-11-10 15:12:54 -08:00
@ajax_login_required
@json.json_view
def save_ios_receipt ( request ) :
2020-06-07 08:04:23 -04:00
receipt = request . POST . get ( ' receipt ' )
2017-11-15 17:26:27 -08:00
product_identifier = request . POST . get ( ' product_identifier ' )
transaction_identifier = request . POST . get ( ' transaction_identifier ' )
2017-11-10 15:12:54 -08:00
2018-02-07 12:46:28 -08:00
logging . user ( request , " ~BM~FBSaving iOS Receipt: %s %s " % ( product_identifier , transaction_identifier ) )
2020-08-25 21:08:27 -04:00
paid = request . user . profile . activate_ios_premium ( transaction_identifier )
2017-11-15 17:26:27 -08:00
if paid :
2019-08-22 20:07:16 -07:00
logging . user ( request , " ~BM~FBSending iOS Receipt email: %s %s " % ( product_identifier , transaction_identifier ) )
2017-11-15 17:26:27 -08:00
subject = " iOS Premium: %s ( %s ) " % ( request . user . profile , product_identifier )
message = """ User: %s ( %s ) -- Email: %s , product: %s , txn: %s , receipt: %s """ % ( request . user . username , request . user . pk , request . user . email , product_identifier , transaction_identifier , receipt )
mail_admins ( subject , message , fail_silently = True )
2019-08-22 20:07:16 -07:00
else :
logging . user ( request , " ~BM~FBNot sending iOS Receipt email, already paid: %s %s " % ( product_identifier , transaction_identifier ) )
2017-11-10 15:12:54 -08:00
2017-11-15 17:26:27 -08:00
return request . user . profile
2017-11-10 15:12:54 -08:00
2020-08-25 21:08:27 -04:00
@ajax_login_required
@json.json_view
def save_android_receipt ( request ) :
order_id = request . POST . get ( ' order_id ' )
product_id = request . POST . get ( ' product_id ' )
logging . user ( request , " ~BM~FBSaving Android Receipt: %s %s " % ( product_id , order_id ) )
paid = request . user . profile . activate_android_premium ( order_id )
if paid :
logging . user ( request , " ~BM~FBSending Android Receipt email: %s %s " % ( product_id , order_id ) )
2020-11-12 10:11:48 -05:00
subject = " Android Premium: %s ( %s ) " % ( request . user . profile , product_id )
message = """ User: %s ( %s ) -- Email: %s , product: %s , order: %s """ % ( request . user . username , request . user . pk , request . user . email , product_id , order_id )
2020-08-25 21:08:27 -04:00
mail_admins ( subject , message , fail_silently = True )
else :
logging . user ( request , " ~BM~FBNot sending Android Receipt email, already paid: %s %s " % ( product_id , order_id ) )
return request . user . profile
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
2020-11-13 21:14:41 -05:00
plan = PLANS [ 0 ] [ 0 ]
2018-05-03 15:38:59 -07:00
renew = is_true ( request . GET . get ( ' renew ' , False ) )
2013-05-24 12:11:52 -07:00
error = None
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 ( )
2018-07-20 11:39:44 -04:00
customer = None
2014-04-04 17:13:20 -07:00
current_premium = ( user . profile . is_premium and
user . profile . premium_expire and
user . profile . premium_expire > datetime . datetime . now ( ) )
2018-07-20 11:39:44 -04:00
2014-04-03 14:59:30 -07:00
# Are they changing their existing card?
2018-07-24 10:47:43 -04:00
if user . profile . stripe_id :
2014-04-03 14:59:30 -07:00
customer = stripe . Customer . retrieve ( user . profile . stripe_id )
try :
2018-07-24 10:54:36 -04:00
card = customer . sources . create ( source = zebra_form . cleaned_data [ ' stripe_token ' ] )
2014-04-03 14:59:30 -07:00
except stripe . CardError :
error = " This card was declined. "
else :
customer . default_card = card . id
customer . save ( )
2018-07-24 10:47:43 -04:00
user . profile . strip_4_digits = zebra_form . cleaned_data [ ' last_4_digits ' ]
user . profile . save ( )
user . profile . activate_premium ( ) # TODO: Remove, because webhooks are slow
2014-04-03 14:59:30 -07:00
success_updating = True
2013-05-24 12:11:52 -07:00
else :
2014-04-03 14:59:30 -07:00
try :
customer = stripe . Customer . create ( * * {
2018-07-24 10:54:36 -04:00
' source ' : zebra_form . cleaned_data [ ' stripe_token ' ] ,
2014-04-03 14:59:30 -07:00
' plan ' : zebra_form . cleaned_data [ ' plan ' ] ,
' email ' : user . email ,
' description ' : user . username ,
} )
except stripe . CardError :
error = " This card was declined. "
else :
user . profile . strip_4_digits = zebra_form . cleaned_data [ ' last_4_digits ' ]
user . profile . stripe_id = customer . id
user . profile . save ( )
user . profile . activate_premium ( ) # TODO: Remove, because webhooks are slow
success_updating = True
2018-07-20 11:39:44 -04:00
2018-07-24 11:27:38 -04:00
# Check subscription to ensure latest plan, otherwise cancel it and subscribe
if success_updating and customer and customer . subscriptions . total_count == 1 :
subscription = customer . subscriptions . data [ 0 ]
if subscription [ ' plan ' ] [ ' id ' ] != " newsblur-premium-36 " :
for sub in customer . subscriptions :
sub . delete ( )
customer = stripe . Customer . retrieve ( user . profile . stripe_id )
2018-07-24 10:58:43 -04:00
if success_updating and customer and customer . subscriptions . total_count == 0 :
2018-07-24 11:07:34 -04:00
params = dict (
2018-07-20 11:39:44 -04:00
customer = customer . id ,
items = [
{
" plan " : " newsblur-premium-36 " ,
} ,
2018-07-24 11:07:34 -04:00
] )
2018-07-24 11:37:46 -04:00
premium_expire = user . profile . premium_expire
if current_premium and premium_expire :
2018-07-24 11:43:16 -04:00
if premium_expire < ( datetime . datetime . now ( ) + datetime . timedelta ( days = 365 ) ) :
params [ ' billing_cycle_anchor ' ] = premium_expire . strftime ( ' %s ' )
params [ ' trial_end ' ] = premium_expire . strftime ( ' %s ' )
2018-07-24 11:07:34 -04:00
stripe . Subscription . create ( * * params )
2012-02-27 21:46:34 -08:00
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 :
2020-06-12 01:27:07 -04:00
return render ( request , ' reader/paypal_return.xhtml ' )
2013-03-14 10:01:38 -07:00
2013-05-13 18:03:17 -07:00
new_user_queue_count = RNewUserQueue . user_count ( )
new_user_queue_position = RNewUserQueue . user_position ( request . user . pk )
new_user_queue_behind = 0
if new_user_queue_position > = 0 :
new_user_queue_behind = new_user_queue_count - new_user_queue_position
2013-05-13 18:20:33 -07:00
new_user_queue_position - = 1
2013-05-13 18:03:17 -07:00
2018-05-03 15:38:59 -07:00
immediate_charge = True
if user . profile . premium_expire and user . profile . premium_expire > datetime . datetime . now ( ) :
immediate_charge = False
2013-03-14 10:01:38 -07:00
logging . user ( request , " ~BM~FBLoading Stripe form " )
2020-06-12 01:27:07 -04:00
return render ( request , ' profile/stripe_form.xhtml ' ,
2012-02-27 21:46:34 -08:00
{
' zebra_form ' : zebra_form ,
' publishable ' : settings . STRIPE_PUBLISHABLE ,
' success_updating ' : success_updating ,
2013-05-13 18:03:17 -07:00
' new_user_queue_count ' : new_user_queue_count - 1 ,
' new_user_queue_position ' : new_user_queue_position ,
' new_user_queue_behind ' : new_user_queue_behind ,
2018-05-03 15:38:59 -07:00
' renew ' : renew ,
' immediate_charge ' : immediate_charge ,
2013-05-24 12:11:52 -07:00
' error ' : error ,
2020-06-12 01:27:07 -04:00
}
2012-02-27 21:46:34 -08:00
)
2012-04-12 11:18:56 -07:00
@render_to ( ' reader/activities_module.xhtml ' )
def load_activities ( request ) :
user = get_user ( request )
2020-06-08 11:24:42 -04:00
page = max ( 1 , int ( request . GET . get ( ' page ' , 1 ) ) )
2012-07-18 23:06:43 -07:00
activities , has_next_page = MActivity . user ( user . pk , page = page )
2012-04-12 11:18:56 -07:00
return {
' activities ' : activities ,
' page ' : page ,
2012-07-18 23:06:43 -07:00
' has_next_page ' : has_next_page ,
2012-04-19 19:18:22 -07:00
' username ' : ' You ' ,
2012-12-03 15:03:47 -08:00
}
@ajax_login_required
@json.json_view
def payment_history ( request ) :
2013-05-10 12:05:24 -07:00
user = request . user
if request . user . is_staff :
2020-06-08 11:24:42 -04:00
user_id = request . GET . get ( ' user_id ' , request . user . pk )
2013-05-10 12:05:24 -07:00
user = User . objects . get ( pk = user_id )
history = PaymentHistory . objects . filter ( user = user )
2014-04-03 12:44:04 -07:00
statistics = {
2015-06-04 11:27:46 -07:00
" created_date " : user . date_joined ,
2014-04-03 12:44:04 -07:00
" last_seen_date " : user . profile . last_seen_on ,
2015-07-21 10:55:17 -07:00
" last_seen_ip " : user . profile . last_seen_ip ,
2014-04-03 12:44:04 -07:00
" timezone " : unicode ( user . profile . timezone ) ,
" stripe_id " : user . profile . stripe_id ,
2017-03-30 11:12:21 -07:00
" paypal_email " : user . profile . latest_paypal_email ,
2014-04-03 12:44:04 -07:00
" profile " : user . profile ,
" feeds " : UserSubscription . objects . filter ( user = user ) . count ( ) ,
" email " : user . email ,
" read_story_count " : RUserStory . read_story_count ( user . pk ) ,
" feed_opens " : UserSubscription . objects . filter ( user = user ) . aggregate ( sum = Sum ( ' feed_opens ' ) ) [ ' sum ' ] ,
2015-06-04 11:27:46 -07:00
" training " : {
2016-03-20 17:16:23 -07:00
' title_ps ' : MClassifierTitle . objects . filter ( user_id = user . pk , score__gt = 0 ) . count ( ) ,
' title_ng ' : MClassifierTitle . objects . filter ( user_id = user . pk , score__lt = 0 ) . count ( ) ,
' tag_ps ' : MClassifierTag . objects . filter ( user_id = user . pk , score__gt = 0 ) . count ( ) ,
' tag_ng ' : MClassifierTag . objects . filter ( user_id = user . pk , score__lt = 0 ) . count ( ) ,
' author_ps ' : MClassifierAuthor . objects . filter ( user_id = user . pk , score__gt = 0 ) . count ( ) ,
' author_ng ' : MClassifierAuthor . objects . filter ( user_id = user . pk , score__lt = 0 ) . count ( ) ,
' feed_ps ' : MClassifierFeed . objects . filter ( user_id = user . pk , score__gt = 0 ) . count ( ) ,
' feed_ng ' : MClassifierFeed . objects . filter ( user_id = user . pk , score__lt = 0 ) . count ( ) ,
2015-06-04 11:27:46 -07:00
}
2014-04-03 12:44:04 -07:00
}
2013-05-10 12:05:24 -07:00
return {
' is_premium ' : user . profile . is_premium ,
' premium_expire ' : user . profile . premium_expire ,
2014-04-03 12:44:04 -07:00
' payments ' : history ,
' statistics ' : statistics ,
2013-05-10 12:05:24 -07:00
}
2013-01-03 10:33:22 -08:00
2013-03-13 15:46:51 -07:00
@ajax_login_required
@json.json_view
def cancel_premium ( request ) :
canceled = request . user . profile . cancel_premium ( )
2014-04-03 14:59:30 -07:00
return {
' code ' : 1 if canceled else - 1 ,
}
2013-05-10 12:05:24 -07:00
@staff_member_required
@ajax_login_required
@json.json_view
def refund_premium ( request ) :
2020-06-08 11:25:23 -04:00
user_id = request . POST . get ( ' user_id ' )
partial = request . POST . get ( ' partial ' , False )
2013-05-10 12:05:24 -07:00
user = User . objects . get ( pk = user_id )
2013-05-10 12:14:18 -07:00
try :
2013-07-04 11:29:41 -07:00
refunded = user . profile . refund_premium ( partial = partial )
2013-05-10 12:14:18 -07:00
except stripe . InvalidRequestError , e :
2013-05-10 12:15:54 -07:00
refunded = e
2014-09-24 17:00:09 -07:00
except PayPalAPIResponseError , e :
refunded = e
2013-05-10 12:05:24 -07:00
return { ' code ' : 1 if refunded else - 1 , ' refunded ' : refunded }
@staff_member_required
@ajax_login_required
@json.json_view
def upgrade_premium ( request ) :
2020-06-08 11:25:23 -04:00
user_id = request . POST . get ( ' user_id ' )
2013-05-10 12:05:24 -07:00
user = User . objects . get ( pk = user_id )
2015-07-09 20:08:34 -07:00
gift = MGiftCode . add ( gifting_user_id = User . objects . get ( username = ' samuel ' ) . pk ,
receiving_user_id = user . pk )
MRedeemedCode . redeem ( user , gift . gift_code )
return { ' code ' : user . profile . is_premium }
2014-07-09 11:30:34 -07:00
2015-06-04 11:27:46 -07:00
@staff_member_required
@ajax_login_required
@json.json_view
def never_expire_premium ( request ) :
2020-06-08 11:25:52 -04:00
user_id = request . POST . get ( ' user_id ' )
2015-06-04 11:27:46 -07:00
user = User . objects . get ( pk = user_id )
if user . profile . is_premium :
user . profile . premium_expire = None
user . profile . save ( )
return { ' code ' : 1 }
return { ' code ' : - 1 }
2014-07-09 11:30:34 -07:00
@staff_member_required
@ajax_login_required
@json.json_view
def update_payment_history ( request ) :
2020-06-08 11:25:52 -04:00
user_id = request . POST . get ( ' user_id ' )
2014-07-09 11:30:34 -07:00
user = User . objects . get ( pk = user_id )
2019-09-09 21:17:10 -04:00
user . profile . setup_premium_history ( set_premium_expire = False )
2014-07-09 11:30:34 -07:00
return { ' code ' : 1 }
2013-03-13 15:46:51 -07:00
2013-01-03 10:33:22 -08:00
@login_required
@render_to ( ' profile/delete_account.xhtml ' )
def delete_account ( request ) :
if request . method == ' POST ' :
form = DeleteAccountForm ( request . POST , user = request . user )
if form . is_valid ( ) :
logging . user ( request . user , " ~SK~BC~FRDeleting ~SB %s ~SN ' s account. " %
request . user . username )
request . user . profile . delete_user ( confirm = True )
logout_user ( request )
return HttpResponseRedirect ( reverse ( ' index ' ) )
else :
logging . user ( request . user , " ~BC~FRFailed attempt to delete ~SB %s ~SN ' s account. " %
request . user . username )
else :
logging . user ( request . user , " ~BC~FRAttempting to delete ~SB %s ~SN ' s account. " %
request . user . username )
form = DeleteAccountForm ( user = request . user )
return {
' delete_form ' : form ,
2013-01-07 17:28:43 -08:00
}
@render_to ( ' profile/forgot_password.xhtml ' )
def forgot_password ( request ) :
if request . method == ' POST ' :
form = ForgotPasswordForm ( request . POST )
if form . is_valid ( ) :
logging . user ( request . user , " ~BC~FRForgot password: ~SB %s " % request . POST [ ' email ' ] )
try :
user = User . objects . get ( email__iexact = request . POST [ ' email ' ] )
except User . MultipleObjectsReturned :
user = User . objects . filter ( email__iexact = request . POST [ ' email ' ] ) [ 0 ]
user . profile . send_forgot_password_email ( )
return HttpResponseRedirect ( reverse ( ' index ' ) )
else :
logging . user ( request . user , " ~BC~FRFailed forgot password: ~SB %s ~SN " %
request . POST [ ' email ' ] )
else :
logging . user ( request . user , " ~BC~FRAttempting to retrieve forgotton password. " )
form = ForgotPasswordForm ( )
return {
' forgot_password_form ' : form ,
}
@login_required
@render_to ( ' profile/forgot_password_return.xhtml ' )
def forgot_password_return ( request ) :
if request . method == ' POST ' :
logging . user ( request . user , " ~BC~FRReseting ~SB %s ~SN ' s password. " %
request . user . username )
new_password = request . POST . get ( ' password ' , ' ' )
request . user . set_password ( new_password )
request . user . save ( )
return HttpResponseRedirect ( reverse ( ' index ' ) )
else :
logging . user ( request . user , " ~BC~FRAttempting to reset ~SB %s ~SN ' s password. " %
request . user . username )
form = ForgotPasswordReturnForm ( )
return {
' forgot_password_return_form ' : form ,
2013-05-23 18:14:21 -07:00
}
2014-09-29 13:09:46 -07:00
@ajax_login_required
@json.json_view
def delete_starred_stories ( request ) :
timestamp = request . POST . get ( ' timestamp ' , None )
if timestamp :
delete_date = datetime . datetime . fromtimestamp ( int ( timestamp ) )
else :
delete_date = datetime . datetime . now ( )
starred_stories = MStarredStory . objects . filter ( user_id = request . user . pk ,
starred_date__lte = delete_date )
stories_deleted = starred_stories . count ( )
starred_stories . delete ( )
MStarredStoryCounts . count_for_user ( request . user . pk , total_only = True )
starred_counts , starred_count = MStarredStoryCounts . user_counts ( request . user . pk , include_total = True )
logging . user ( request . user , " ~BC~FRDeleting %s / %s starred stories ( %s ) " % ( stories_deleted ,
stories_deleted + starred_count , delete_date ) )
return dict ( code = 1 , stories_deleted = stories_deleted , starred_counts = starred_counts ,
starred_count = starred_count )
2013-05-23 18:14:21 -07:00
@ajax_login_required
@json.json_view
def delete_all_sites ( request ) :
2017-03-18 14:41:12 -07:00
request . user . profile . send_opml_export_email ( reason = " You have deleted all of your sites, so here ' s a backup of all of your subscriptions just in case. " )
2013-05-23 18:14:21 -07:00
subs = UserSubscription . objects . filter ( user = request . user )
sub_count = subs . count ( )
subs . delete ( )
usf = UserSubscriptionFolders . objects . get ( user = request . user )
usf . folders = ' [] '
usf . save ( )
logging . user ( request . user , " ~BC~FRDeleting %s sites " % sub_count )
2014-01-30 19:29:13 -08:00
return dict ( code = 1 )
@login_required
@render_to ( ' profile/email_optout.xhtml ' )
def email_optout ( request ) :
user = request . user
user . profile . send_emails = False
user . profile . save ( )
return {
" user " : user ,
}
2019-08-29 10:33:53 -07:00
@json.json_view
def ios_subscription_status ( request ) :
2020-06-25 09:30:59 -04:00
logging . debug ( " ---> iOS Subscription Status: %s " % request . body )
2019-08-29 10:33:53 -07:00
subject = " iOS Subscription Status "
2020-06-25 09:30:59 -04:00
message = """ %s """ % ( request . body )
2019-08-29 10:33:53 -07:00
mail_admins ( subject , message )
return {
" code " : 1
2020-08-25 21:08:27 -04:00
}
2020-11-13 11:18:18 -05:00
def trigger_error ( request ) :
2020-12-07 13:55:28 -05:00
logging . user ( request . user , " ~BR~FW~SBTriggering divison by zero " )
2020-11-13 11:18:18 -05:00
division_by_zero = 1 / 0
return HttpResponseRedirect ( reverse ( ' index ' ) )