Merge branch 'release/v7.44'
This commit is contained in:
@@ -143,7 +143,6 @@ def kmltocourse(f):
|
|||||||
if not courses:
|
if not courses:
|
||||||
courses = doc.findall('.//opengis:Placemark',ns)
|
courses = doc.findall('.//opengis:Placemark',ns)
|
||||||
|
|
||||||
|
|
||||||
if courses:
|
if courses:
|
||||||
return crewnerdcourse(courses)
|
return crewnerdcourse(courses)
|
||||||
|
|
||||||
|
|||||||
@@ -871,6 +871,8 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
|
|||||||
# auto smoothing
|
# auto smoothing
|
||||||
pace = row.df[' Stroke500mPace (sec/500m)'].values
|
pace = row.df[' Stroke500mPace (sec/500m)'].values
|
||||||
velo = 500. / pace
|
velo = 500. / pace
|
||||||
|
if workouttype == 'bikeerg':
|
||||||
|
velo = 1000. / pace
|
||||||
|
|
||||||
f = row.df['TimeStamp (sec)'].diff().mean()
|
f = row.df['TimeStamp (sec)'].diff().mean()
|
||||||
if f != 0 and not np.isnan(f):
|
if f != 0 and not np.isnan(f):
|
||||||
|
|||||||
@@ -1236,7 +1236,12 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True,
|
|||||||
engine = create_engine(database_url, echo=False)
|
engine = create_engine(database_url, echo=False)
|
||||||
|
|
||||||
with engine.connect() as conn, conn.begin():
|
with engine.connect() as conn, conn.begin():
|
||||||
data.to_sql('strokedata',engine,if_exists='append',index=False)
|
try:
|
||||||
|
data.to_sql('strokedata',engine,if_exists='append',index=False)
|
||||||
|
except OperationalError:
|
||||||
|
data.drop(columns=['rhythm'],inplace=True)
|
||||||
|
data.to_sql('strokedata',engine,if_exists='append',index=False)
|
||||||
|
|
||||||
conn.close()
|
conn.close()
|
||||||
engine.dispose()
|
engine.dispose()
|
||||||
return data
|
return data
|
||||||
|
|||||||
@@ -977,6 +977,39 @@ def handle_sendemailcsv(first_name, last_name, email, csvfile,**kwargs):
|
|||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
@app.task
|
||||||
|
def handle_sendemailfile(first_name, last_name, email, csvfile,**kwargs):
|
||||||
|
|
||||||
|
|
||||||
|
# send email with attachment
|
||||||
|
fullemail = first_name + " " + last_name + " " + "<" + email + ">"
|
||||||
|
subject = "File from Rowsandall.com"
|
||||||
|
|
||||||
|
d = {'first_name':first_name,
|
||||||
|
'siteurl':siteurl,
|
||||||
|
}
|
||||||
|
|
||||||
|
from_email = 'Rowsandall <info@rowsandall.com>'
|
||||||
|
|
||||||
|
|
||||||
|
res = send_template_email(from_email,[fullemail],
|
||||||
|
subject,'fileemail.html',d,
|
||||||
|
attach_file=csvfile,**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
if 'delete' in kwargs:
|
||||||
|
dodelete = kwargs['delete']
|
||||||
|
else:
|
||||||
|
dodelete = False
|
||||||
|
|
||||||
|
if dodelete:
|
||||||
|
try:
|
||||||
|
os.remove(csvfile)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
# Calculate wind and stream corrections for OTW rowing
|
# Calculate wind and stream corrections for OTW rowing
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{% extends "emailbase.html" %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<p>Dear <strong>{{ first_name }}</strong>,</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Please find attached the requested file from rowsandall.com
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Best Regards, the Rowsandall Team
|
||||||
|
</p>
|
||||||
|
{% endblock %}
|
||||||
@@ -2,6 +2,7 @@ workouttypes = (
|
|||||||
('water','Standard Racing Shell'),
|
('water','Standard Racing Shell'),
|
||||||
('rower','Indoor Rower'),
|
('rower','Indoor Rower'),
|
||||||
('skierg','Ski Erg'),
|
('skierg','Ski Erg'),
|
||||||
|
('bike','Bike Erg'),
|
||||||
('dynamic','Dynamic Indoor Rower'),
|
('dynamic','Dynamic Indoor Rower'),
|
||||||
('slides','Indoor Rower on Slides'),
|
('slides','Indoor Rower on Slides'),
|
||||||
('paddle','Paddle Adapter'),
|
('paddle','Paddle Adapter'),
|
||||||
|
|||||||
+60
-40
@@ -396,58 +396,78 @@ def do_sync(w,options):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
if ('upload_to_C2' in options and options['upload_to_C2']) or (w.user.c2_auto_export and isprorower(w.user)):
|
if ('upload_to_C2' in options and options['upload_to_C2']) or (w.user.c2_auto_export and isprorower(w.user)):
|
||||||
try:
|
if ('upload_to_C2' in options and not options['upload_to_C2']):
|
||||||
message,id = c2stuff.workout_c2_upload(w.user.user,w)
|
pass
|
||||||
except NoTokenError:
|
else:
|
||||||
id = 0
|
try:
|
||||||
message = "Something went wrong with the Concept2 sync"
|
message,id = c2stuff.workout_c2_upload(w.user.user,w)
|
||||||
|
except NoTokenError:
|
||||||
|
id = 0
|
||||||
|
message = "Something went wrong with the Concept2 sync"
|
||||||
|
|
||||||
if ('upload_to_Strava' in options and options['upload_to_Strava']) or (w.user.strava_auto_export and isprorower(w.user)):
|
if ('upload_to_Strava' in options and options['upload_to_Strava']) or (w.user.strava_auto_export and isprorower(w.user)):
|
||||||
try:
|
if ('upload_to_Strava' in options and not options['upload_to_Strava']):
|
||||||
message,id = stravastuff.workout_strava_upload(
|
pass
|
||||||
w.user.user,w
|
else:
|
||||||
)
|
try:
|
||||||
except NoTokenError:
|
message,id = stravastuff.workout_strava_upload(
|
||||||
id = 0
|
w.user.user,w
|
||||||
message = "Please connect to Strava first"
|
)
|
||||||
|
except NoTokenError:
|
||||||
|
id = 0
|
||||||
|
message = "Please connect to Strava first"
|
||||||
|
|
||||||
|
|
||||||
if ('upload_to_SportTracks' in options and options['upload_to_SportTracks']) or (w.user.sporttracks_auto_export and isprorower(w.user)):
|
if ('upload_to_SportTracks' in options and options['upload_to_SportTracks']) or (w.user.sporttracks_auto_export and isprorower(w.user)):
|
||||||
try:
|
if ('upload_to_SportTracks' in options and not options['upload_to_SportTracks']):
|
||||||
message,id = sporttracksstuff.workout_sporttracks_upload(
|
pass
|
||||||
w.user.user,w
|
else:
|
||||||
)
|
|
||||||
except NoTokenError:
|
try:
|
||||||
message = "Please connect to SportTracks first"
|
message,id = sporttracksstuff.workout_sporttracks_upload(
|
||||||
id = 0
|
w.user.user,w
|
||||||
|
)
|
||||||
|
except NoTokenError:
|
||||||
|
message = "Please connect to SportTracks first"
|
||||||
|
id = 0
|
||||||
|
|
||||||
|
|
||||||
if ('upload_to_RunKeeper' in options and options['upload_to_RunKeeper']) or (w.user.runkeeper_auto_export and isprorower(w.user)):
|
if ('upload_to_RunKeeper' in options and options['upload_to_RunKeeper']) or (w.user.runkeeper_auto_export and isprorower(w.user)):
|
||||||
try:
|
if ('upload_to_RunKeeper' in options and not options['upload_to_RunKeeper']):
|
||||||
message,id = runkeeperstuff.workout_runkeeper_upload(
|
pass
|
||||||
w.user.user,w
|
else:
|
||||||
)
|
|
||||||
except NoTokenError:
|
try:
|
||||||
message = "Please connect to Runkeeper first"
|
message,id = runkeeperstuff.workout_runkeeper_upload(
|
||||||
id = 0
|
w.user.user,w
|
||||||
|
)
|
||||||
|
except NoTokenError:
|
||||||
|
message = "Please connect to Runkeeper first"
|
||||||
|
id = 0
|
||||||
|
|
||||||
if ('upload_to_MapMyFitness' in options and options['upload_to_MapMyFitness']) or (w.user.mapmyfitness_auto_export and isprorower(w.user)):
|
if ('upload_to_MapMyFitness' in options and options['upload_to_MapMyFitness']) or (w.user.mapmyfitness_auto_export and isprorower(w.user)):
|
||||||
try:
|
if ('upload_to_MapMyFitness' in options and not options['upload_to_MapMyFitness']):
|
||||||
message,id = underarmourstuff.workout_ua_upload(
|
pass
|
||||||
w.user.user,w
|
else:
|
||||||
)
|
try:
|
||||||
except NoTokenError:
|
message,id = underarmourstuff.workout_ua_upload(
|
||||||
message = "Please connect to MapMyFitness first"
|
w.user.user,w
|
||||||
id = 0
|
)
|
||||||
|
except NoTokenError:
|
||||||
|
message = "Please connect to MapMyFitness first"
|
||||||
|
id = 0
|
||||||
|
|
||||||
|
|
||||||
if ('upload_to_TrainingPeaks' in options and options['upload_to_TrainingPeaks']) or (w.user.trainingpeaks_auto_export and isprorower(w.user)):
|
if ('upload_to_TrainingPeaks' in options and options['upload_to_TrainingPeaks']) or (w.user.trainingpeaks_auto_export and isprorower(w.user)):
|
||||||
try:
|
if ('upload_to_TrainingPeaks' in options and not options['upload_to_TrainingPeaks']):
|
||||||
message,id = tpstuff.workout_tp_upload(
|
pass
|
||||||
w.user.user,w
|
else:
|
||||||
)
|
try:
|
||||||
except NoTokenError:
|
message,id = tpstuff.workout_tp_upload(
|
||||||
message = "Please connect to TrainingPeaks first"
|
w.user.user,w
|
||||||
id = 0
|
)
|
||||||
|
except NoTokenError:
|
||||||
|
message = "Please connect to TrainingPeaks first"
|
||||||
|
id = 0
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -249,6 +249,7 @@ urlpatterns = [
|
|||||||
url(r'^workout/(?P<id>\d+)/emailgpx$',views.workout_gpxemail_view),
|
url(r'^workout/(?P<id>\d+)/emailgpx$',views.workout_gpxemail_view),
|
||||||
url(r'^workout/(?P<id>\d+)/emailcsv$',views.workout_csvemail_view),
|
url(r'^workout/(?P<id>\d+)/emailcsv$',views.workout_csvemail_view),
|
||||||
url(r'^workout/(?P<id>\d+)/csvtoadmin$',views.workout_csvtoadmin_view),
|
url(r'^workout/(?P<id>\d+)/csvtoadmin$',views.workout_csvtoadmin_view),
|
||||||
|
url(r'^ergcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\w+.*)$',views.otecp_toadmin_view),
|
||||||
url(r'^workout/compare/(?P<id>\d+)/$',views.workout_comparison_list),
|
url(r'^workout/compare/(?P<id>\d+)/$',views.workout_comparison_list),
|
||||||
url(r'^workout/compare2/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>\w+.*)/$',views.workout_comparison_view),
|
url(r'^workout/compare2/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>\w+.*)/$',views.workout_comparison_view),
|
||||||
url(r'^workout/compare/(?P<id>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\w+.*)$',views.workout_comparison_list),
|
url(r'^workout/compare/(?P<id>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\w+.*)$',views.workout_comparison_list),
|
||||||
|
|||||||
+101
-6
@@ -132,6 +132,7 @@ from rowers.tasks import handle_makeplot,handle_otwsetpower,handle_sendemailtcx,
|
|||||||
from rowers.tasks import (
|
from rowers.tasks import (
|
||||||
handle_sendemail_unrecognized,handle_sendemailnewcomment,
|
handle_sendemail_unrecognized,handle_sendemailnewcomment,
|
||||||
handle_sendemailsummary,
|
handle_sendemailsummary,
|
||||||
|
handle_sendemailfile,
|
||||||
handle_sendemailkml,
|
handle_sendemailkml,
|
||||||
handle_sendemailnewresponse, handle_updatedps,
|
handle_sendemailnewresponse, handle_updatedps,
|
||||||
handle_updatecp,long_test_task,long_test_task2,
|
handle_updatecp,long_test_task,long_test_task2,
|
||||||
@@ -4276,6 +4277,79 @@ def otwrankings_view(request,theuser=0,
|
|||||||
'workouttype':'water',
|
'workouttype':'water',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@login_required()
|
||||||
|
def otecp_toadmin_view(request,theuser=0,
|
||||||
|
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||||
|
enddate=timezone.now(),
|
||||||
|
startdatestring="",
|
||||||
|
enddatestring="",
|
||||||
|
):
|
||||||
|
|
||||||
|
if startdatestring != "":
|
||||||
|
try:
|
||||||
|
startdate = iso8601.parse_date(startdatestring)
|
||||||
|
except ParseError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if enddatestring != "":
|
||||||
|
try:
|
||||||
|
enddate = iso8601.parse_date(enddatestring)
|
||||||
|
except ParseError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if theuser == 0:
|
||||||
|
theuser = request.user.id
|
||||||
|
|
||||||
|
r = Rower.objects.get(user=request.user)
|
||||||
|
|
||||||
|
startdate = datetime.datetime.combine(startdate,datetime.time())
|
||||||
|
enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59))
|
||||||
|
|
||||||
|
theworkouts = Workout.objects.filter(
|
||||||
|
user=r,rankingpiece=True,
|
||||||
|
workouttype__in=[
|
||||||
|
'rower',
|
||||||
|
'dynamic',
|
||||||
|
'slides'
|
||||||
|
],
|
||||||
|
startdatetime__gte=startdate,
|
||||||
|
startdatetime__lte=enddate
|
||||||
|
).order_by("-startdatetime")
|
||||||
|
|
||||||
|
|
||||||
|
delta,cpvalue,avgpower = dataprep.fetchcp(
|
||||||
|
r,theworkouts,table='cpergdata'
|
||||||
|
)
|
||||||
|
|
||||||
|
powerdf = pd.DataFrame({
|
||||||
|
'Delta':delta,
|
||||||
|
'CP':cpvalue,
|
||||||
|
})
|
||||||
|
|
||||||
|
csvfilename = 'CP_data_user_{id}.csv'.format(
|
||||||
|
id = theuser
|
||||||
|
)
|
||||||
|
|
||||||
|
powerdf = powerdf[powerdf['CP']>0]
|
||||||
|
powerdf.dropna(axis=0,inplace=True)
|
||||||
|
powerdf.sort_values(['Delta','CP'],ascending=[1,0],inplace=True)
|
||||||
|
powerdf.drop_duplicates(subset='Delta',keep='first',inplace=True)
|
||||||
|
powerdf.to_csv(csvfilename)
|
||||||
|
|
||||||
|
res = myqueue(queuehigh,
|
||||||
|
handle_sendemailfile,
|
||||||
|
'Sander',
|
||||||
|
'Roosendaal',
|
||||||
|
'roosendaalsander@gmail.com',
|
||||||
|
csvfilename,
|
||||||
|
delete=True)
|
||||||
|
|
||||||
|
successmessage = "The CSV file was sent to the site admin per email"
|
||||||
|
messages.info(request,successmessage)
|
||||||
|
response = HttpResponseRedirect('/rowers/list-workouts/')
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
||||||
# Show ranking distances including predicted paces
|
# Show ranking distances including predicted paces
|
||||||
@user_passes_test(ispromember,login_url="/",redirect_field_name=None)
|
@user_passes_test(ispromember,login_url="/",redirect_field_name=None)
|
||||||
def oterankings_view(request,theuser=0,
|
def oterankings_view(request,theuser=0,
|
||||||
@@ -9893,6 +9967,9 @@ def workout_upload_view(request,
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
upload_to_tp = False
|
upload_to_tp = False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
response = {}
|
response = {}
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
form = DocumentsForm(request.POST,request.FILES)
|
form = DocumentsForm(request.POST,request.FILES)
|
||||||
@@ -10040,7 +10117,7 @@ def workout_upload_view(request,
|
|||||||
request.session['async_tasks'] = [(jobid,'make_plot')]
|
request.session['async_tasks'] = [(jobid,'make_plot')]
|
||||||
|
|
||||||
# upload to C2
|
# upload to C2
|
||||||
if (upload_to_c2) or (w.user.c2_auto_export and isprorower(w.user)):
|
if (upload_to_c2):
|
||||||
try:
|
try:
|
||||||
message,id = c2stuff.workout_c2_upload(request.user,w)
|
message,id = c2stuff.workout_c2_upload(request.user,w)
|
||||||
except NoTokenError:
|
except NoTokenError:
|
||||||
@@ -10051,7 +10128,7 @@ def workout_upload_view(request,
|
|||||||
else:
|
else:
|
||||||
messages.error(request,message)
|
messages.error(request,message)
|
||||||
|
|
||||||
if (upload_to_strava) or (w.user.strava_auto_export and isprorower(w.user)):
|
if (upload_to_strava):
|
||||||
try:
|
try:
|
||||||
message,id = stravastuff.workout_strava_upload(
|
message,id = stravastuff.workout_strava_upload(
|
||||||
request.user,w
|
request.user,w
|
||||||
@@ -10064,7 +10141,7 @@ def workout_upload_view(request,
|
|||||||
else:
|
else:
|
||||||
messages.error(request,message)
|
messages.error(request,message)
|
||||||
|
|
||||||
if (upload_to_st) or (w.user.sporttracks_auto_export and isprorower(w.user)):
|
if (upload_to_st):
|
||||||
try:
|
try:
|
||||||
message,id = sporttracksstuff.workout_sporttracks_upload(
|
message,id = sporttracksstuff.workout_sporttracks_upload(
|
||||||
request.user,w
|
request.user,w
|
||||||
@@ -10077,7 +10154,7 @@ def workout_upload_view(request,
|
|||||||
else:
|
else:
|
||||||
messages.error(request,message)
|
messages.error(request,message)
|
||||||
|
|
||||||
if (upload_to_rk) or (w.user.runkeeper_auto_export and isprorower(w.user)):
|
if (upload_to_rk):
|
||||||
try:
|
try:
|
||||||
message,id = runkeeperstuff.workout_runkeeper_upload(
|
message,id = runkeeperstuff.workout_runkeeper_upload(
|
||||||
request.user,w
|
request.user,w
|
||||||
@@ -10092,7 +10169,7 @@ def workout_upload_view(request,
|
|||||||
messages.error(request,message)
|
messages.error(request,message)
|
||||||
|
|
||||||
|
|
||||||
if (upload_to_ua) or (w.user.mapmyfitness_auto_export and isprorower(w.user)):
|
if (upload_to_ua):
|
||||||
try:
|
try:
|
||||||
message,id = underarmourstuff.workout_ua_upload(
|
message,id = underarmourstuff.workout_ua_upload(
|
||||||
request.user,w
|
request.user,w
|
||||||
@@ -10107,7 +10184,7 @@ def workout_upload_view(request,
|
|||||||
messages.error(request,message)
|
messages.error(request,message)
|
||||||
|
|
||||||
|
|
||||||
if (upload_to_tp) or (w.user.trainingpeaks_auto_export and isprorower(w.user)):
|
if (upload_to_tp):
|
||||||
try:
|
try:
|
||||||
message,id = tpstuff.workout_tp_upload(
|
message,id = tpstuff.workout_tp_upload(
|
||||||
request.user,w
|
request.user,w
|
||||||
@@ -10150,6 +10227,24 @@ def workout_upload_view(request,
|
|||||||
return response
|
return response
|
||||||
else:
|
else:
|
||||||
if not is_ajax:
|
if not is_ajax:
|
||||||
|
if r.c2_auto_export and isprorower(r):
|
||||||
|
uploadoptions['upload_to_C2'] = True
|
||||||
|
|
||||||
|
if r.strava_auto_export and isprorower(r):
|
||||||
|
uploadoptions['upload_to_Strava'] = True
|
||||||
|
|
||||||
|
if r.sporttracks_auto_export and isprorower(r):
|
||||||
|
uploadoptions['upload_to_SportTracks'] = True
|
||||||
|
|
||||||
|
if r.runkeeper_auto_export and isprorower(r):
|
||||||
|
uploadoptions['upload_to_RunKeeper'] = True
|
||||||
|
|
||||||
|
if r.trainingpeaks_auto_export and isprorower(r):
|
||||||
|
uploadoptions['upload_to_TrainingPeaks'] = True
|
||||||
|
|
||||||
|
if r.mapmyfitness_auto_export and isprorower(r):
|
||||||
|
uploadoptions['upload_to_MapMyFitness'] = True
|
||||||
|
|
||||||
form = DocumentsForm(initial=docformoptions)
|
form = DocumentsForm(initial=docformoptions)
|
||||||
optionsform = UploadOptionsForm(initial=uploadoptions)
|
optionsform = UploadOptionsForm(initial=uploadoptions)
|
||||||
return render(request, 'document_form.html',
|
return render(request, 'document_form.html',
|
||||||
|
|||||||
Reference in New Issue
Block a user