Private
Public Access
1
0
This commit is contained in:
Sander Roosendaal
2020-01-07 13:59:40 +01:00
13 changed files with 289 additions and 145 deletions

View File

@@ -18,6 +18,7 @@ from iso8601 import ParseError
import numpy import numpy
import json import json
from json.decoder import JSONDecodeError
from rowsandall_app.settings import ( from rowsandall_app.settings import (
C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET

View File

@@ -1782,6 +1782,11 @@ def delete_strokedata(id):
dirname = 'media/strokedata_{id}.parquet.gz'.format(id=id) dirname = 'media/strokedata_{id}.parquet.gz'.format(id=id)
try: try:
shutil.rmtree(dirname) shutil.rmtree(dirname)
except OSError:
try:
os.remove(dirname)
except FileNotFoundError:
pass
except FileNotFoundError: except FileNotFoundError:
pass pass

View File

@@ -115,7 +115,6 @@ class EmailForm(forms.Form):
lastname = forms.CharField(max_length=255) lastname = forms.CharField(max_length=255)
email = forms.EmailField() email = forms.EmailField()
subject = forms.CharField(max_length=255) subject = forms.CharField(max_length=255)
botcheck = forms.CharField(max_length=5)
message = forms.CharField() message = forms.CharField()
disqualificationreasons = ( disqualificationreasons = (

View File

@@ -3,115 +3,134 @@
{% block main %} {% block main %}
<h1>Contact us through email</h1> <h1>Contact us through email</h1>
<ul class="main-content"> <ul class="main-content">
<li class="grid_2"> <li class="grid_2">
{% if form.errors %} {% if form.errors %}
<p style="color: red;"> <p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below. Please correct the error{{ form.errors|pluralize }} below.
</p> </p>
{% endif %} {% endif %}
<form method="post" action="/rowers/email/send/">{% csrf_token %} <form method="post" action="/rowers/email/send/" id="contactform">{% csrf_token %}
<table> <p>
<tr><td> <table>
<label class="label">Name <span class="required">*</span></label> <tr><td>
<span class="span"> <label>Name <span class="required">*</span></label>
</td><td> <span class="span">
<input name= "firstname" class="inputtext" maxlength="255" size="12" /> </td><td>
<label class="spanlabel">First</label> <input name= "firstname" class="inputtext" maxlength="255" size="12" />
</td></tr> <label>First</label>
<tr><td> </td></tr>
</span> <tr><td>
<span class="span"> </span>
</td><td> <span class="span">
<input name= "lastname" class="inputtext" maxlength="255" size="18" /> </td><td>
<label class="spanlabel">Last</label> <input name= "lastname" class="inputtext" maxlength="255" size="18" />
</span> <label>Last</label>
</td></tr> </span>
<tr><td> </td></tr>
<label class="label">Email Address <span class="required">*</span></label> <tr><td>
</td><td> <label>Email Address <span class="required">*</span></label>
<input name="email" class="inputtext" type="text" maxlength="255" size="35" /> </td><td>
</td></tr> <input name="email" class="inputtext" type="text" maxlength="255" size="35" />
<tr><td> </td></tr>
<label class="label">Subject <span class="required">*</span></label> <tr><td>
</td><td> <label>Subject <span class="required">*</span></label>
<input name="subject" class="inputtext" type="text" maxlength="255" size="45" /> </td><td>
</td></tr> <input name="subject" class="inputtext" type="text" maxlength="255" size="45" />
</table> </td></tr>
<label class="label">You must answer <u>YES</u> to the question below to approve sending this email. <span class="required">*</span></label> </table>
<table> <table>
<tr><td> <input type="hidden" name="g-recaptcha-response" id='recaptcha'>
Do you want to send me an email? </td></tr>
</td><td> <tr><td>
<input name="botcheck" class="inputtext" type="text" maxlength="5" size="5" /> <label>Message <span class="required">*</span></label>
</td></tr> </td><td>
<tr><td> <textarea name="message" class="inputtextarea" rows="11" cols="45"></textarea>
<label class="label">Message <span class="required">*</span></label> </td></tr>
</td><td> <tr><td>
<textarea name="message" class="inputtextarea" rows="11" cols="45"></textarea> <input type="submit" name="submitform" value="Send Message" />
</td></tr> </td></tr>
<tr><td> </table>
<input type="submit" name="submitform" value="Send Message" /> </p>
</td></tr> </form>
</table>
</form>
</li> </li>
<li class="grid_2"> <li class="grid_2">
<h1>Bug reporting, feature requests</h1> <h1>Bug reporting, feature requests</h1>
<p> <p>
Bug reports and feature requests can be done through our BitBucket page. Please check on the following link if your bug or issue is a known one. Feel free to file any feature request. Bug reports and feature requests can be done through our BitBucket page. Please check on the following link if your bug or issue is a known one. Feel free to file any feature request.
<ul> <ul>
<li><a href="https://bitbucket.org/sanderroosendaal/rowsandall/issues">BitBucket Issue list (click here to go report an issue or request a feature)</a></li> <li><a href="https://bitbucket.org/sanderroosendaal/rowsandall/issues">BitBucket Issue list (click here to go report an issue or request a feature)</a></li>
</ul> </ul>
</p> </p>
</li> </li>
<li class="grid_2"> <li class="grid_2">
<h1>Facebook Group</h1> <h1>Facebook Group</h1>
<p>We run a facebook group where you can post questions and report problems, <p>We run a facebook group where you can post questions and report problems,
especially if you think the wider user community benefits from the answers.</p> especially if you think the wider user community benefits from the answers.</p>
<ul> <ul>
<li><a href="https://www.facebook.com/groups/rowsandall/">https://www.facebook.com/groups/rowsandall/</a></li> <li><a href="https://www.facebook.com/groups/rowsandall/">https://www.facebook.com/groups/rowsandall/</a></li>
</ul> </ul>
</li> </li>
<li class="grid_2"> <li class="grid_2">
<h1>Twitter</h1> <h1>Twitter</h1>
<p>You can also check me on Twitter: <p>You can also check me on Twitter:
<ul> <ul>
<li><a href="https://twitter.com/rowsandall">https://twitter.com/rowsandall</a> <li><a href="https://twitter.com/rowsandall">https://twitter.com/rowsandall</a>
</ul> </ul>
When the site is down, this is the appropriate channel to look for apologies, updates, and offer help. When the site is down, this is the appropriate channel to look for apologies, updates, and offer help.
</p> </p>
</li> </li>
<li class="grid_2"> <li class="grid_2">
<h1>Rowsandall s.r.o.</h1> <h1>Rowsandall s.r.o.</h1>
<p><strong>Rowsandall s.r.o.</strong><br /> <p><strong>Rowsandall s.r.o.</strong><br />
Nov&eacute; sady 988/2<br /> Nov&eacute; sady 988/2<br />
602 00 Brno<br /> 602 00 Brno<br />
Czech Republic<br /> Czech Republic<br />
IČ: 070 48 572<br /> IČ: 070 48 572<br />
DIČ: CZ 070 48 572 (Nejsme plátce DPH)<br /> DIČ: CZ 070 48 572 (Nejsme plátce DPH)<br />
Datová schránka: 7897syr<br /> Datová schránka: 7897syr<br />
Email: <a href="mailto:info@rowsandall.com">info@rowsandall.com</a><br /> Email: <a href="mailto:info@rowsandall.com">info@rowsandall.com</a><br />
The company is registered in the business register at the The company is registered in the business register at the
Regional Court in Brno (Společnost je zapsána v obchodním rejstříku vedeném u Krajského soudu v Brně, oddíl C, vložka 105845)<br/> Regional Court in Brno (Společnost je zapsána v obchodním rejstříku vedeném u Krajského soudu v Brně, oddíl C, vložka 105845)<br/>
</p> </p>
</li> </li>
</ul> </ul>
{% endblock %} {% endblock %}
{% block sidebar %} {% block sidebar %}
{% include 'menu_help.html' %} {% include 'menu_help.html' %}
{% endblock %} {% endblock %}
{% block scripts %}
<script src="https://www.google.com/recaptcha/api.js?render=6LdRtMwUAAAAAGcKcFc28pGvmEb1wwDY27i0AX8B"></script>
<script>
// 3
grecaptcha.ready(function() {
// 4
$('#contactform').submit(function(e){
var form = this;
// 5
e.preventDefault()
grecaptcha.execute('6LdRtMwUAAAAAGcKcFc28pGvmEb1wwDY27i0AX8B', {action: 'contactform'}).then(function(token) {
// 6
$('#recaptcha').val(token)
// 7
form.submit()
});
})
});
</script>
{% endblock %}

View File

@@ -7,6 +7,17 @@
Thank you. We have received the payment of &euro; {{ amount }} for Rowsandall related services. Thank you. We have received the payment of &euro; {{ amount }} for Rowsandall related services.
</p> </p>
<p>
With your contribution, you are helping to keep this service to the rowing community
running. As the founder and developer of the Rowsandall.com site I am very interested
to know what you think of Rowsandall.com, as well as suggestions for improvements.
</p>
<p>
So don't hesitate to respond to this email and let me know. I will read and respond to each
email.
</p>
<p> <p>
Please contact our customer service by replying to this email if you have any further Please contact our customer service by replying to this email if you have any further
questions regarding the payment. questions regarding the payment.
@@ -16,4 +27,3 @@
Best Regards, the Rowsandall Team Best Regards, the Rowsandall Team
</p> </p>
{% endblock %} {% endblock %}

View File

@@ -0,0 +1,31 @@
{% extends "emailbase.html" %}
{% block body %}
<p>Dear <strong>{{ first_name }}</strong>,</p>
<p>
Welcome on the trial for the Self-Coach plan.
</p>
<p>
As the developer of the Rowsandall.com site I am very interested to know what you think of Rowsandall.com. Especially, I'd like to understand how you started using the site, what you are looking for, and what you think could be improved.
</p>
<p>
The Self-Coach functionality allows you to create training plans and sessions for you and your training group. Feel free to contact me any time you need help.
</p>
<p>
I'd also love to hear a bit about your rowing background.
</p>
<p>
So don't hesitate to respond to this email and let me know. I will read and respond to each
email.
</p>
<p>
Thank you very much for your help and for supporting <a href="rowsandall.com">rowsandall.com</a>.
</p>
<p>
Best Regards, the Rowsandall Team
</p>
{% endblock %}

View File

@@ -0,0 +1,33 @@
{% extends "emailbase.html" %}
{% block body %}
<p>Dear <strong>{{ first_name }}</strong>,</p>
<p>
Welcome on the trial for the Pro plan.
</p>
<p>
As the developer of the Rowsandall.com site I am very interested to know
what you think of Rowsandall.com.
Especially, I'd like to understand how you started using the site,
what you are looking for, and what you think could be improved.
</p>
<p>
I'd also love to hear a bit about your rowing background.
</p>
<p>
So don't hesitate to respond to this email and let me know. I will read and respond to each
email.
</p>
<p>
Thank you very much for your help and for supporting <a href="rowsandall.com">rowsandall.com</a>.
</p>
<p>
Best Regards, the Rowsandall Team
</p>
{% endblock %}

View File

@@ -9,8 +9,20 @@
You are now on the Rowsandall paid plan "{{ planname }}". You are now on the Rowsandall paid plan "{{ planname }}".
</p> </p>
<p>
With your contribution, you are helping to keep this service to the rowing community
running. As the founder and developer of the Rowsandall.com site I am very interested
to know what you think of Rowsandall.com, as well as suggestions for improvements.
</p>
<p>
So don't hesitate to respond to this email and let me know. I will read and respond to each
email.
</p>
{% if recurring=='recurring' %} {% if recurring=='recurring' %}
<p> <p>
Some more information about the subscription.
The subscription cost is &euro;{{ price }} per year. The subscription cost is &euro;{{ price }} per year.
Your next charge is due on {{ end_of_billing_period }}. We will charge you automatically Your next charge is due on {{ end_of_billing_period }}. We will charge you automatically
on that date. on that date.
@@ -60,4 +72,3 @@
Best Regards, the Rowsandall Team Best Regards, the Rowsandall Team
</p> </p>
{% endblock %} {% endblock %}

View File

@@ -158,7 +158,8 @@ from rowsandall_app.settings import (
RUNKEEPER_CLIENT_ID,RUNKEEPER_REDIRECT_URI,RUNKEEPER_CLIENT_SECRET, RUNKEEPER_CLIENT_ID,RUNKEEPER_REDIRECT_URI,RUNKEEPER_CLIENT_SECRET,
TP_CLIENT_ID,TP_REDIRECT_URI,TP_CLIENT_KEY,TP_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 PAYMENT_PROCESSING_ON,
RECAPTCHA_SITE_KEY, RECAPTCHA_SITE_SECRET
) )
#from rowers.tasks_standalone import addcomment2 #from rowers.tasks_standalone import addcomment2
@@ -1073,28 +1074,39 @@ def add_defaultfavorites(r):
f.save() f.save()
return 1 return 1
# Shows email form and sends it if submitted # Shows email form and sends it if submitted
def sendmail(request): def sendmail(request):
if request.method == 'POST': if request.method == 'POST':
# test recaptcha
response_string = request.POST.get('g-recaptcha-response')
# replace below with settings
recaptcha_secret = RECAPTCHA_SITE_SECRET
url = 'https://www.google.com/recaptcha/api/siteverify'
data = {
'secret':recaptcha_secret,
'response': response_string,
}
response = requests.post(url,data=data,verify=True)
success = False
if response.status_code == 200:
success = response.json().get('success')
form = EmailForm(request.POST) form = EmailForm(request.POST)
if form.is_valid(): if form.is_valid() and success:
firstname = form.cleaned_data['firstname'] firstname = form.cleaned_data['firstname']
lastname = form.cleaned_data['lastname'] lastname = form.cleaned_data['lastname']
email = form.cleaned_data['email'] email = form.cleaned_data['email']
subject = form.cleaned_data['subject'] subject = 'Rowsandall Contact Form:'+form.cleaned_data['subject']
botcheck = form.cleaned_data['botcheck'].lower()
message = form.cleaned_data['message'] message = form.cleaned_data['message']
if botcheck == 'yes': fullemail = firstname + " " + lastname + " " + "<" + email + ">"
try: send_mail(subject, message, fullemail, ['info@rowsandall.com'])
fullemail = firstname + " " + lastname + " " + "<" + email + ">" return HttpResponseRedirect('/rowers/email/thankyou/')
send_mail(subject, message, fullemail, ['info@rowsandall.com'])
return HttpResponseRedirect('/rowers/email/thankyou/')
except:
return HttpResponseRedirect('/rowers/email/')
else:
messages.error(request,'You have to answer YES to the question')
return HttpResponseRedirect('/rowers/email/')
else: else:
if not success:
messages.error(request,'Bots are not welcome')
else:
messages.error(request,'Something went wrong. Please try again')
return HttpResponseRedirect('/rowers/email/') return HttpResponseRedirect('/rowers/email/')
else: else:
return HttpResponseRedirect('/rowers/email/') return HttpResponseRedirect('/rowers/email/')

View File

@@ -30,6 +30,13 @@ def start_trial_view(request):
'Rowsandall Server <info@rowsandall.com>', 'Rowsandall Server <info@rowsandall.com>',
['roosendaalsander@gmail.com']) ['roosendaalsander@gmail.com'])
send_template_email('Rowsandall <info@rowsandall.com>',
[r.user.email],
'Welcome to the Rowsandall Pro Trial',
'protrialewelcome.html',
{'first_name':r.user.first_name,
'last_name':r.user.last_name})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@login_required() @login_required()
@@ -58,6 +65,13 @@ def start_plantrial_view(request):
'Rowsandall Server <info@rowsandall.com>', 'Rowsandall Server <info@rowsandall.com>',
['roosendaalsander@gmail.com']) ['roosendaalsander@gmail.com'])
send_template_email('Rowsandall <info@rowsandall.com>',
[r.user.email],
'Welcome to the Rowsandall Self-Coach Trial',
'plantrialwelcome.html',
{'first_name':r.user.first_name,
'last_name':r.user.last_name})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
# Page where user can manage his favorite charts # Page where user can manage his favorite charts
@@ -491,5 +505,3 @@ def rower_update_empower_view(
'form':form, 'form':form,
'rower':r 'rower':r
}) })

View File

@@ -494,3 +494,13 @@ try:
CELERY = CFG['use_celery'] CELERY = CFG['use_celery']
except KeyError: except KeyError:
CELERY = False CELERY = False
# Recaptcha
try:
RECAPTCHA_SITE_KEY = CFG['recaptcha_site_key']
RECAPTCHA_SITE_SECRET = CFG['recaptcha_site_secret']
except KeyError:
RECAPTCHA_SITE_KEY = ''
RECAPTCHA_SITE_SECRET = ''

View File

@@ -60,7 +60,7 @@ DEBUG = True
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
ALLOWED_HOSTS = ['localhost'] ALLOWED_HOSTS = ['localhost','127.0.0.1']
# INSTALLED_APPS += ['debug_toolbar',] # INSTALLED_APPS += ['debug_toolbar',]

View File

@@ -48,6 +48,7 @@
<link rel="stylesheet" href="/static/css/rowsandall2.min.css" /> <link rel="stylesheet" href="/static/css/rowsandall2.min.css" />
{% block meta %} {% endblock %} {% block meta %} {% endblock %}
<div id="fb-root"></div> <div id="fb-root"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>(function(d, s, id) { <script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0]; var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return; if (d.getElementById(id)) return;