adding transactions download
This commit is contained in:
@@ -15,6 +15,7 @@ from rowers.tasks import (
|
||||
handle_send_email_failed_cancel,
|
||||
)
|
||||
|
||||
import pandas as pd
|
||||
|
||||
from rowsandall_app.settings import (
|
||||
BRAINTREE_MERCHANT_ID,BRAINTREE_PUBLIC_KEY,BRAINTREE_PRIVATE_KEY
|
||||
@@ -314,5 +315,76 @@ def find_subscriptions(rower):
|
||||
result.append(thedict)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def get_transactions(start_date,end_date):
|
||||
results = gateway.transaction.search(
|
||||
braintree.TransactionSearch.created_at.between(
|
||||
start_date,
|
||||
end_date,
|
||||
)
|
||||
)
|
||||
|
||||
amounts = []
|
||||
countries = []
|
||||
card_countries = []
|
||||
names = []
|
||||
emails = []
|
||||
dates = []
|
||||
currencies = []
|
||||
statuses = []
|
||||
ids = []
|
||||
usernames = []
|
||||
|
||||
for transaction in results:
|
||||
try:
|
||||
r = Rower.objects.filter(
|
||||
customer_id=transaction.customer['id'],
|
||||
paymentprocessor='braintree')[0]
|
||||
countries.append(r.country)
|
||||
names.append('{f} {l}'.format(
|
||||
f = r.user.first_name,
|
||||
l = r.user.last_name,
|
||||
)
|
||||
)
|
||||
emails.append(r.user.email)
|
||||
ids.append(r.id)
|
||||
usernames.append(r.user.username)
|
||||
|
||||
except KeyError:
|
||||
countries.append(
|
||||
transaction.credit_card_details.country_of_issuance)
|
||||
names.append('{f} {l}'.format(
|
||||
f = transaction.customer['first_name'],
|
||||
l = transaction.customer['last_name']
|
||||
)
|
||||
)
|
||||
emails.append(transaction.customer.email)
|
||||
ids.append(transaction.customer['id'])
|
||||
usernames.append('unknown')
|
||||
|
||||
|
||||
amounts.append(transaction.amount)
|
||||
dates.append(transaction.created_at)
|
||||
currencies.append(transaction.currency_iso_code)
|
||||
card_countries.append(
|
||||
transaction.credit_card_details.country_of_issuance)
|
||||
statuses.append(transaction.status)
|
||||
|
||||
|
||||
df = pd.DataFrame({
|
||||
'name':names,
|
||||
'email':emails,
|
||||
'date':dates,
|
||||
'amount':amounts,
|
||||
'currency':currencies,
|
||||
'country':countries,
|
||||
'card_country':card_countries,
|
||||
'status':statuses,
|
||||
'username':usernames,
|
||||
'user_id':ids,
|
||||
}
|
||||
)
|
||||
|
||||
return df
|
||||
|
||||
|
||||
|
||||
@@ -10,22 +10,27 @@ def planstopaypal():
|
||||
plan.external_id = None
|
||||
plan.save()
|
||||
|
||||
def initiaterowerplans():
|
||||
rowers = Rower.objects.filter(paymenttype = 'recurring',paidplan = None)
|
||||
for r in rowers:
|
||||
r.paymentprocessor = 'paypal'
|
||||
r.save()
|
||||
|
||||
def setrowerplans():
|
||||
rowers = Rower.objects.all()
|
||||
|
||||
for r in rowers:
|
||||
if r.rowerplan != 'basic':
|
||||
paidplans = PaidPlan.objects.filter(
|
||||
shortname = r.rowerplan,
|
||||
paymenttype = r.paymenttype,
|
||||
clubsize = r.clubsize)
|
||||
paidplans = PaidPlan.objects.filter(
|
||||
shortname = r.rowerplan,
|
||||
paymenttype = r.paymenttype,
|
||||
clubsize = r.clubsize,
|
||||
paymentprocessor=r.paymentprocessor)
|
||||
|
||||
if paidplans:
|
||||
r.paidplan = paidplans[0]
|
||||
r.paymentprocessor = 'paypal'
|
||||
r.save()
|
||||
else:
|
||||
print 'Could not set plan for ',r
|
||||
if paidplans:
|
||||
r.paidplan = paidplans[0]
|
||||
r.save()
|
||||
else:
|
||||
print 'Could not set plan for ',r
|
||||
|
||||
def is_existing_customer(rower):
|
||||
if rower.country is not None and rower.customer_id is not None and rower.country != '':
|
||||
|
||||
@@ -27,8 +27,16 @@
|
||||
<i class="fas fa-tachometer-alt-slow fa-fw"></i> Manage Workflow
|
||||
</a>
|
||||
</li>
|
||||
{% if user.is_authenticated and user.is_staff %}
|
||||
<li id="manage-transactions">
|
||||
<a href="/rowers/me/transactions/">
|
||||
<i class="fas fa-credit-card fa-fw"></i> Transactions
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul><!-- cd-accordion-menu -->
|
||||
|
||||
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<p> </p>
|
||||
{% if user|team_members %}
|
||||
|
||||
24
rowers/templates/transactions.html
Normal file
24
rowers/templates/transactions.html
Normal file
@@ -0,0 +1,24 @@
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block main %}
|
||||
<h1>Download Transactions</h1>
|
||||
|
||||
<form actions="" method="post">
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sideheader %}
|
||||
<h1>Profile</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_profile.html' %}
|
||||
{% endblock %}
|
||||
@@ -404,6 +404,7 @@ urlpatterns = [
|
||||
url(r'^me/edit/$',views.rower_edit_view),
|
||||
url(r'^me/edit/user/(?P<userid>\d+)$',views.rower_edit_view),
|
||||
url(r'^me/preferences/$',views.rower_prefs_view),
|
||||
url(r'^me/transactions/$',views.transactions_view),
|
||||
url(r'^me/preferences/user/(?P<userid>\d+)$',views.rower_prefs_view),
|
||||
url(r'^me/edit/(.+.*)/$',views.rower_edit_view),
|
||||
url(r'^me/c2authorize/$',views.rower_c2_authorize),
|
||||
|
||||
@@ -141,7 +141,8 @@ from rowsandall_app.settings import (
|
||||
UNDERARMOUR_CLIENT_SECRET,UNDERARMOUR_CLIENT_KEY,
|
||||
RUNKEEPER_CLIENT_ID,RUNKEEPER_REDIRECT_URI,RUNKEEPER_CLIENT_SECRET,
|
||||
TP_CLIENT_ID,TP_REDIRECT_URI,TP_CLIENT_KEY,TP_CLIENT_SECRET,
|
||||
BRAINTREE_MERCHANT_ID,BRAINTREE_PUBLIC_KEY,BRAINTREE_PRIVATE_KEY
|
||||
BRAINTREE_MERCHANT_ID,BRAINTREE_PUBLIC_KEY,BRAINTREE_PRIVATE_KEY,
|
||||
PAYMENT_PROCESSING_ON
|
||||
)
|
||||
|
||||
from rowers.tasks_standalone import addcomment2
|
||||
@@ -1073,6 +1074,10 @@ def paidplans_view(request):
|
||||
|
||||
@login_required()
|
||||
def billing_view(request):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
if payments.is_existing_customer(r):
|
||||
@@ -1116,6 +1121,10 @@ def billing_view(request):
|
||||
|
||||
@login_required()
|
||||
def upgrade_view(request):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
if r.subscription_id is None or r.subscription_id == '':
|
||||
@@ -1154,6 +1163,10 @@ def upgrade_view(request):
|
||||
|
||||
@login_required()
|
||||
def downgrade_view(request):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
if r.subscription_id is None or r.subscription_id == '':
|
||||
@@ -1202,6 +1215,10 @@ def downgrade_view(request):
|
||||
|
||||
@login_required()
|
||||
def plan_stop_view(request):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
subscriptions = []
|
||||
@@ -1223,6 +1240,10 @@ def plan_stop_view(request):
|
||||
|
||||
@login_required()
|
||||
def plan_tobasic_view(request,id=0):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
if r.paidplan.paymentprocessor == 'braintree':
|
||||
@@ -1241,6 +1262,10 @@ def plan_tobasic_view(request,id=0):
|
||||
|
||||
@login_required()
|
||||
def upgrade_confirm_view(request,planid = 0):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
try:
|
||||
plan = PaidPlan.objects.get(id=planid)
|
||||
except PaidPlan.DoesNotExist:
|
||||
@@ -1262,6 +1287,10 @@ def upgrade_confirm_view(request,planid = 0):
|
||||
|
||||
@login_required()
|
||||
def downgrade_confirm_view(request,planid = 0):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
try:
|
||||
plan = PaidPlan.objects.get(id=planid)
|
||||
except PaidPlan.DoesNotExist:
|
||||
@@ -1284,6 +1313,10 @@ def downgrade_confirm_view(request,planid = 0):
|
||||
|
||||
@login_required()
|
||||
def payment_confirm_view(request,planid = 0):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
try:
|
||||
plan = PaidPlan.objects.get(id=planid)
|
||||
except PaidPlan.DoesNotExist:
|
||||
@@ -1306,6 +1339,10 @@ def payment_confirm_view(request,planid = 0):
|
||||
|
||||
@login_required()
|
||||
def checkouts_view(request):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
@@ -1336,6 +1373,10 @@ def checkouts_view(request):
|
||||
|
||||
@login_required()
|
||||
def upgrade_checkouts_view(request):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
@@ -1366,6 +1407,10 @@ def upgrade_checkouts_view(request):
|
||||
|
||||
@login_required()
|
||||
def downgrade_checkouts_view(request):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
@@ -1397,6 +1442,10 @@ def downgrade_checkouts_view(request):
|
||||
|
||||
@login_required()
|
||||
def payment_completed_view(request):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
return render(request,
|
||||
@@ -1407,6 +1456,10 @@ def payment_completed_view(request):
|
||||
|
||||
@login_required()
|
||||
def downgrade_completed_view(request):
|
||||
if not PAYMENT_PROCESSING_ON:
|
||||
url = reverse('promembership')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
return render(request,
|
||||
@@ -1864,6 +1917,33 @@ def plannedsessions_icsemail_view(request,userid=0):
|
||||
|
||||
return response
|
||||
|
||||
@login_required()
|
||||
def transactions_view(request):
|
||||
if not request.user.is_staff:
|
||||
raise PermissionDenied("Not Allowed")
|
||||
|
||||
if request.method == 'POST':
|
||||
dateform = DateRangeForm(request.POST)
|
||||
if dateform.is_valid():
|
||||
startdate = dateform.cleaned_data['startdate']
|
||||
enddate = dateform.cleaned_data['enddate']
|
||||
|
||||
df = braintreestuff.get_transactions(startdate,enddate)
|
||||
filename="transactions_{s}_{e}.csv".format(s = startdate, e = enddate)
|
||||
response = HttpResponse(df.to_csv())
|
||||
response['Content-Disposition'] = 'attachment; filename="%s"' % filename
|
||||
response['Content-Type'] = 'application/octet-stream'
|
||||
|
||||
return response
|
||||
|
||||
else:
|
||||
dateform = DateRangeForm()
|
||||
|
||||
return render(request,
|
||||
'transactions.html',
|
||||
{
|
||||
'dateform':dateform
|
||||
})
|
||||
|
||||
@login_required()
|
||||
def course_kmlemail_view(request,id=0):
|
||||
|
||||
Reference in New Issue
Block a user