Private
Public Access
1
0

export & import views - line 321 urls.py

This commit is contained in:
Sander Roosendaal
2018-10-09 18:21:28 +02:00
parent a5e98dd69c
commit f8b09b7b6d
10 changed files with 590 additions and 321 deletions

View File

@@ -1,68 +1,74 @@
{% extends "base.html" %}
{% extends "newbase.html" %}
{% load staticfiles %}
{% load rowerfilters %}
{% block title %}Workouts{% endblock %}
{% block content %}
{% block main %}
<h1>Available on C2 Logbook</h1>
{% if workouts %}
<div class="grid_2 alpha ">
<a href="/rowers/workout/c2import/all/{{ page }}" class="button gray">Import all NEW</a>
</div>
<div class="grid_6">
<p>This imports all workouts that have not been imported to rowsandall.com.
<ul class="main-content">
{% if workouts %}
<li class="grid_2">
<a href="/rowers/workout/c2import/all/{{ page }}">Import all NEW</a>
<p>This imports all workouts that have not been imported to rowsandall.com.
The action may take a longer time to process, so please be patient. Click on Import in the list below to import an individual workout.
</p>
</div>
</li>
<li class="grid_2">
<p>
<span>
{% if page > 1 %}
<a class="wh" title="Previous" href="/rowers/workout/c2list/{{ page|add:-1 }}">
<i class="fas fa-arrow-alt-left"></i>
</a>
{% endif %}
<a class="wh" title="Next" href="/rowers/workout/c2list/{{ page|add:1 }}">
<i class="fas fa-arrow-alt-right"></i>
</a>
</span>
</p>
</li>
<li class="grid_4">
<table width="70%" class="listtable">
<thead>
<tr>
<th> Import </th>
<th> Date/Time </th>
<th> Duration </th>
<th> Total Distance</th>
<th> Type</th>
<th> Source</th>
<th> Comment</th>
<th> New</th>
</tr>
</thead>
<tbody>
{% for workout in workouts %}
<tr>
<td>
<a href="/rowers/workout/c2import/{{ workout|lookup:'id' }}/">Import</a></td>
<td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'duration' }}</td>
<td>{{ workout|lookup:'distance' }}</td>
<td>{{ workout|lookup:'rowtype' }}</td>
<td>{{ workout|lookup:'source' }}</td>
<td>{{ workout|lookup:'comment' }}</td>
<td>
{{ workout|lookup:'new' }}
</td>
</tr>
<div class="grid_2">
{% if page > 1 %}
<a class="button gray" href="/rowers/workout/c2list/{{ page|add:-1 }}">&lt</a>
{% endfor %}
</tbody>
</table>
</li>
{% else %}
&nbsp;
<p> No workouts found </p>
{% endif %}
</div>
<div class="grid_2 omega">
<a class="button gray" href="/rowers/workout/c2list/{{ page|add:1 }}">&gt</a>
</div>
<div class="grid_12 alpha">
<table width="70%" class="listtable">
<thead>
<tr>
<th> Import </th>
<th> Date/Time </th>
<th> Duration </th>
<th> Total Distance</th>
<th> Type</th>
<th> Source</th>
<th> Comment</th>
<th> New</th>
</tr>
</thead>
<tbody>
{% for workout in workouts %}
<tr>
<td>
<a href="/rowers/workout/c2import/{{ workout|lookup:'id' }}/">Import</a></td>
<td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'duration' }}</td>
<td>{{ workout|lookup:'distance' }}</td>
<td>{{ workout|lookup:'rowtype' }}</td>
<td>{{ workout|lookup:'source' }}</td>
<td>{{ workout|lookup:'comment' }}</td>
<td>
{{ workout|lookup:'new' }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p> No workouts found </p>
{% endif %}
</ul>
{% endblock %}
{% block sidebar %}
{% include 'menu_workouts.html' %}
{% endblock %}

View File

@@ -113,15 +113,111 @@
<input type="checkbox" name="group-export" id="group-export">
<label for="group-export">Export</label>
<ul>
<li id="export-c2"><a href="/rowers/workout/{{ workout.id }}/c2uploadw">Concept2</a></li>
<li id="export-strava"><a href="/rowers/workout/{{ workout.id }}/stravauploadw">Strava</a></li>
<li id="export-st"><a href="/rowers/workout/{{ workout.id }}/sporttracksuploadw">SportTracks</a></li>
<li id="export-rk"><a href="/rowers/workout/{{ workout.id }}/runkeeperuploadw">Runkeeper</a></li>
<li id="export-mmf"><a href="/rowers/workout/{{ workout.id }}/underarmouruploadw">MapMyFitness</a></li>
<li id="export-tp"><a href="/rowers/workout/{{ workout.id }}/tpuploadw">TrainingPeaks</a></li>
<li id="export-csv"><a href="/rowers/workout/{{ workout.id }}/emailcsv">CSV</a></li>
<li id="export-gpx"><a href="/rowers/workout/{{ workout.id }}/emailgpx">GPX</a></li>
<li id="export-tcx"><a href="/rowers/workout/{{ workout.id }}/emailtcx">TCX</a></li>
<li id="export-c2">
{% if workout.uploadedtoc2 %}
<a href="http://log.concept2.com/profile/{{ user|c2userid }}/log/{{ workout.uploadedtoc2 }}">
Concept2 <i class="fas fa-check"></i>
</a>
{% elif user.rower.c2token == None or user.rower.c2token == '' %}
<a href="/rowers/me/c2authorize">
Connect to Concept2
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/c2uploadw">
Concept2
</a>
{% endif %}
</li>
<li id="export-strava">
{% if workout.uploadedtostrava %}
<a href="https://www.strava.com/activities/{{ workout.uploadedtostrava }}">
Strava <i class="fas fa-check"></i>
</a>
{% elif user.rower.stravatoken == None or user.rower.stravatoken == '' %}
<a href="/rowers/me/stravaauthorize">
Connect to Strava
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/stravauploadw">
Strava
</a>
{% endif %}
</li>
<li id="export-st">
{% if workout.uploadedtosporttracks %}
<a href="https://sporttracks.mobi/activity/{{ workout.uploadedtosporttracks }}">
SportTracks <i class="fas fa-check"></i>
</a>
{% elif user.rower.sporttrackstoken == None or user.rower.sporttrackstoken == '' %}
<a href="/rowers/me/sporttracksauthorize">
Connect to SportTracks
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/sporttracksuploadw">
SportTracks
</a>
{% endif %}
</li>
<li id="export-rk">
{% if workout.uploadedtorunkeeper %}
<a href="https://runkeeper.com/user/{{ rower|rkuserid }}/activity/{{ workout.uploadedtorunkeeper }}">
Runkeeper <i class="fas fa-check"></i>
</a>
{% elif user.rower.runkeepertoken == None or user.rower.runkeepertoken == '' %}
<a href="/rowers/me/runkeeperauthorize">
Connect to Runkeeper
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/runkeeperuploadw">
Runkeeper
</a>
{% endif %}
</li>
<li id="export-mmf">
{% if workout.uploadedtounderarmour %}
<a href="https://www.mapmyfitness.com/workout/{{ workout.uploadedtounderarmour }}">
MapMyFitness <i class="fas fa-check"></i>
</a>
{% elif user.rower.underarmourtoken == None or user.rower.underarmourtoken == '' %}
<a href="/rowers/me/underarmourauthorize">
Connect to MapMyFitness
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/underarmouruploadw">
MapMyFitness
</a>
{% endif %}
</li>
<li id="export-tp">
{% if workout.uploadedtotp %}
<a href="https://app.trainingpeaks.com">
TrainingPeaks <i class="fas fa-check"></i>
</a>
{% elif user.rower.tptoken == None or user.rower.tptoken == '' %}
<a href="/rowers/me/tpauthorize">
Connect to TrainingPeaks
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/tpuploadw">
TrainingPeaks
</a>
{% endif %}
</li>
<li id="export-csv">
<a href="/rowers/workout/{{ workout.id }}/emailcsv">
CSV
</a>
</li>
<li id="export-gpx">
<a href="/rowers/workout/{{ workout.id }}/emailgpx">
GPX
</a>
</li>
<li id="export-tcx">
<a href="/rowers/workout/{{ workout.id }}/emailtcx">
TCX
</a>
</li>
</ul>
</li>
<li class="has-children" id="data">

View File

@@ -28,7 +28,7 @@
<label for="group-1"><i class="fas fa-cloud-download fa-fw"></i>&nbsp;Import</label>
<ul>
<li id="concept2"><a href="/rowers/workout/c2import">Concept2</a></li>
<li id="concept2"><a href="/rowers/workout/c2list">Concept2</a></li>
<li id="strava"><a href="/rowers/workout/stravaimport">Strava</a></li>
<li id="runkeeper"><a href="/rowers/workout/runkeeperimport">RunKeeper</a></li>
<li id="sporttracks"><a href="/rowers/workout/sporttracksimport">SportTracks</a></li>
@@ -47,7 +47,7 @@
<label for="athlete-selector"><i class="fas fa-users fa-fw"></i>&nbsp;Athletes</label>
<ul>
{% for member in user|team_members %}
<a href="/rowers/u/{{ member.id }}/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">
<a href={{ request.path|userurl:member }}>
<i class="fas fa-user fa-fw"></i>
{% if member == rower.user %}
&bull;

View File

@@ -1,10 +1,10 @@
{% extends "base.html" %}
{% extends "newbase.html" %}
{% load staticfiles %}
{% load rowerfilters %}
{% block title %}Workouts{% endblock %}
{% block content %}
{% block main %}
<h1>New Workouts Imported From Polar Flow</h1>
<p>Due to a limitation in Polar Flow's API, we can only access new workouts. We
@@ -47,3 +47,7 @@
<p> No new workouts found </p>
{% endif %}
{% endblock %}
{% block sidebar %}
{% include 'menu_workouts.html' %}
{% endblock %}

View File

@@ -1,37 +1,41 @@
{% extends "base.html" %}
{% extends "newbase.html" %}
{% load staticfiles %}
{% load rowerfilters %}
{% block title %}Workouts{% endblock %}
{% block content %}
{% block main %}
<h1>Available on Runkeeper</h1>
{% if workouts %}
<table width="70%" class="listtable">
<thead>
<tr>
<th> Import </th>
<th> Date/Time </th>
<th> Duration </th>
<th> Total Distance</th>
<th> Type</th>
</tr>
</thead>
<tbody>
{% for workout in workouts %}
<tr>
<td>
<a href="/rowers/workout/runkeeperimport/{{ workout|lookup:'id' }}/">Import</a></td>
<td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'duration' }} </td>
<td>{{ workout|lookup:'distance' }} m</td>
<td>{{ workout|lookup:'type' }}</td>
</tr>
{% if workouts %}
<table width="70%" class="listtable">
<thead>
<tr>
<th> Import </th>
<th> Date/Time </th>
<th> Duration </th>
<th> Total Distance</th>
<th> Type</th>
</tr>
</thead>
<tbody>
{% for workout in workouts %}
<tr>
<td>
<a href="/rowers/workout/runkeeperimport/{{ workout|lookup:'id' }}/">Import</a></td>
<td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'duration' }} </td>
<td>{{ workout|lookup:'distance' }} m</td>
<td>{{ workout|lookup:'type' }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p> No workouts found </p>
{% endif %}
{% endfor %}
</tbody>
</table>
{% else %}
<p> No workouts found </p>
{% endif %}
{% endblock %}
{% block sidebar %}
{% include 'menu_workouts.html' %}
{% endblock %}

View File

@@ -1,52 +1,59 @@
{% extends "base.html" %}
{% extends "newbase.html" %}
{% load staticfiles %}
{% load rowerfilters %}
{% block title %}Workouts{% endblock %}
{% block content %}
{% block main %}
<h1>Available on SportTracks</h1>
{% if workouts %}
<div class="grid_2 alpha ">
<a href="/rowers/workout/sporttracksimport/all/" class="button gray">Import all NEW</a>
</div>
<div class="grid_10 omega">
<p>This imports all workouts that have not been imported to rowsandall.com.
The action may take a longer time to process, so please be patient. Click on Import in the list below to import an individual workout.
</p>
</div>
<ul class="main-content">
<li>
<a href="/rowers/workout/sporttracksimport/all/">Import all NEW</a>
</li>
<li class="grid_3">
<p>This imports all workouts that have not been imported to rowsandall.com.
The action may take a longer time to process, so please be patient. Click on Import in the list below to import an individual workout.
</p>
</li>
<div class="grid_12 alpha">
<table width="70%" class="listtable">
<thead>
<tr>
<th> Import </th>
<th> Name </th>
<th> Date/Time </th>
<th> Duration </th>
<th> Total Distance</th>
<th> Type</th>
<th> New</th>
</tr>
</thead>
<tbody>
{% for workout in workouts %}
<tr>
<td>
<a href="/rowers/workout/sporttracksimport/{{ workout|lookup:'id' }}/">Import</a></td>
<td>{{ workout|lookup:'name' }}</td>
<td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'duration' }} </td>
<td>{{ workout|lookup:'distance' }} m</td>
<td>{{ workout|lookup:'type' }}</td>
<td>{{ workout|lookup:'new' }}</td>
</tr>
<li class="grid_4">
<table width="70%" class="listtable">
<thead>
<tr>
<th> Import </th>
<th> Name </th>
<th> Date/Time </th>
<th> Duration </th>
<th> Total Distance</th>
<th> Type</th>
<th> New</th>
</tr>
</thead>
<tbody>
{% for workout in workouts %}
<tr>
<td>
<a href="/rowers/workout/sporttracksimport/{{ workout|lookup:'id' }}/">Import</a></td>
<td>{{ workout|lookup:'name' }}</td>
<td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'duration' }} </td>
<td>{{ workout|lookup:'distance' }} m</td>
<td>{{ workout|lookup:'type' }}</td>
<td>{{ workout|lookup:'new' }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endfor %}
</tbody>
</table>
</li>
</ul>
{% else %}
<p> No workouts found </p>
{% endif %}
{% endblock %}
{% block sidebar %}
{% include 'menu_workouts.html' %}
{% endblock %}

View File

@@ -17,36 +17,37 @@
</p>
</li>
<li class="grid_4">
<table width="70%" class="listtable">
<thead>
<tr>
<th> Import </th>
<th> Name</th>
<th> Date</th>
<th> Duration </th>
<th> Distance </th>
<th> Type</th>
<th> New</th>
</tr>
</thead>
<tbody>
{% for workout in workouts %}
<tr>
<td>
<a href="/rowers/workout/stravaimport/{{ workout|lookup:'id' }}/">Import</a></td>
<td>{{ workout|lookup:'name' }}</td>
<td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'duration' }} </td>
<td>{{ workout|lookup:'distance' }} m</td>
<td>{{ workout|lookup:'type' }}</td>
<td>{{ workout|lookup:'new' }}</td>
<li class="grid_4">
<table width="70%" class="listtable">
<thead>
<tr>
<th> Import </th>
<th> Name</th>
<th> Date</th>
<th> Duration </th>
<th> Distance </th>
<th> Type</th>
<th> New</th>
</tr>
</thead>
<tbody>
{% for workout in workouts %}
<tr>
<td>
<a href="/rowers/workout/stravaimport/{{ workout|lookup:'id' }}/">Import</a></td>
<td>{{ workout|lookup:'name' }}</td>
<td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'duration' }} </td>
<td>{{ workout|lookup:'distance' }} m</td>
<td>{{ workout|lookup:'type' }}</td>
<td>{{ workout|lookup:'new' }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</li>
{% endfor %}
</tbody>
</table>
</li>
</ul>
{% else %}
<p>
No workouts found

View File

@@ -13,7 +13,12 @@ from rowers.plannedsessions import (
race_can_register, race_can_submit,race_rower_status
)
from rowers import c2stuff, runkeeperstuff
from rowers.c2stuff import c2_open
from rowers.runkeeperstuff import runkeeper_open
from rowers.types import otwtypes
from rowers.utils import NoTokenError
def strfdelta(tdelta):
minutes,seconds = divmod(tdelta.seconds,60)
@@ -86,6 +91,28 @@ def deltatimeprint(d):
else:
return strfdeltah(d)
@register.filter
def c2userid(user):
try:
thetoken = c2_open(user)
except NoTokenError:
return 0
c2userid = c2stuff.get_userid(thetoken)
return c2userid
@register.filter
def rkuserid(user):
try:
thetoken = runkeeper_open(user)
except NoTokenError:
return 0
rkuserid = runkeeperstuff.get_userid(thetoken)
return rkuserid
@register.filter
def courselength(course):
return course_length(course)

View File

@@ -138,8 +138,8 @@ urlpatterns = [
url(r'^list-workouts/team/(?P<teamid>\d+)/$',views.workouts_view),
url(r'^(?P<rowerid>\d+)/list-workouts/$',views.workouts_view),
url(r'^(?P<rowerid>\d+)/list-workouts/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.workouts_view),
url(r'^u/(?P<userid>\d+)/list-workouts/$',views.workouts_view),
url(r'^u/(?P<userid>\d+)/list-workouts/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.workouts_view),
url(r'^list-workouts/user/(?P<userid>\d+)/$',views.workouts_view),
url(r'^list-workouts/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)/user/(?P<userid>\d+)/$',views.workouts_view),
url(r'^list-workouts/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.workouts_view),
url(r'^virtualevents$',views.virtualevents_view),
url(r'^virtualevent/create$',views.virtualevent_create_view),
@@ -302,16 +302,22 @@ urlpatterns = [
url(r'^workout/c2import/$',views.workout_c2import_view),
url(r'^workout/c2list/$',views.workout_c2import_view),
url(r'^workout/c2list/(?P<page>\d+)$',views.workout_c2import_view),
url(r'^workout/c2list/user/(?P<userid>\d+)$',views.workout_c2import_view),
url(r'^workout/c2list/(?P<page>\d+)/user/(?P<userid>\d+)$',views.workout_c2import_view),
url(r'^workout/stravaimport/$',views.workout_stravaimport_view),
url(r'^workout/stravaimport/user/(?P<userid>\d+)$',views.workout_stravaimport_view),
url(r'^workout/c2import/all/$',views.workout_getc2workout_all),
url(r'^workout/c2import/all/(?P<page>\d+)$',views.workout_getc2workout_all),
url(r'^workout/(?P<source>\w+.*)import/(?P<externalid>\d+)/$',views.workout_getimportview),
url(r'^workout/stravaimport/all/$',views.workout_getstravaworkout_all),
url(r'^workout/stravaimport/next/$',views.workout_getstravaworkout_next),
url(r'^workout/sporttracksimport/$',views.workout_sporttracksimport_view),
url(r'^workout/sporttracksimport/user/(?P<userid>\d+)$',views.workout_sporttracksimport_view),
url(r'^workout/sporttracksimport/all/$',views.workout_getsporttracksworkout_all),
url(r'^workout/polarimport/$',views.workout_polarimport_view),
url(r'^workout/polarimport/user/(?P<userid>\d+)/',views.workout_polarimport_view),
url(r'^workout/runkeeperimport/$',views.workout_runkeeperimport_view),
url(r'^workout/runkeeperimport/user/(?P<userid>\d+)$',views.workout_runkeeperimport_view),
url(r'^workout/underarmourimport/$',views.workout_underarmourimport_view),
# url(r'^workout/(?P<id>\d+)/deleteconfirm$',views.workout_delete_confirm_view),
url(r'^workout/(?P<id>\d+)/c2uploadw/$',views.workout_c2_upload_view),

View File

@@ -1277,22 +1277,24 @@ def workout_tcxemail_view(request,id=0):
if r.emailbounced:
message = "Please check your email address first. Email to this address bounced."
messages.error(request, message)
return HttpResponseRedirect(
reverse(workout_export_view,
kwargs = {
'id':str(w.id),
})
)
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id)
})
return HttpResponseRedirect(url)
tcxfile,tcxmessg = stravastuff.createstravaworkoutdata(w,dozip=False)
if tcxfile == 0:
message = "Something went wrong (TCX export) "+tcxmessg
messages.error(request,message)
url = reverse(workout_export_view,
kwargs = {
'id':str(w.id),
})
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id)
})
return HttpResponseRedirect(url)
if tcxfile:
res = myqueue(queuehigh,handle_sendemailtcx,
@@ -1307,19 +1309,19 @@ def workout_tcxemail_view(request,id=0):
messages.info(request,successmessage)
url = reverse(workout_export_view,
kwargs = {
'id':str(w.id),
})
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id)
})
response = HttpResponseRedirect(url)
else:
message = "You are not allowed to export this workout"
messages.error(request,message)
url = reverse(workout_export_view,
kwargs = {
'id':str(w.id),
})
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id)
})
response = HttpResponseRedirect(url)
return response
@@ -1375,12 +1377,12 @@ def workout_gpxemail_view(request,id=0):
if r.emailbounced:
message = "Please check your email address first. Email to this address bounced."
messages.error(request, message)
return HttpResponseRedirect(
reverse(workout_export_view,
kwargs = {
'id':str(w.id),
})
)
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id)
})
return HttpResponseRedirect(url)
w = get_workout(id)
@@ -1399,17 +1401,17 @@ def workout_gpxemail_view(request,id=0):
successmessage = "The GPX file was sent to you per email"
messages.info(request,successmessage)
url = reverse(workout_export_view,
kwargs = {
'id':str(w.id),
})
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id)
})
response = HttpResponseRedirect(url)
else:
message = "You are not allowed to export this workout"
messages.error(request,message)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1425,7 +1427,7 @@ def workouts_summaries_email_view(request):
message = "Please check your email address first. Email to this address bounced."
messages.error(request, message)
return HttpResponseRedirect(
reverse(workout_export_view,
reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1468,7 +1470,7 @@ def workout_csvemail_view(request,id=0):
message = "Please check your email address first. Email to this address bounced."
messages.error(request, message)
return HttpResponseRedirect(
reverse(workout_export_view,
reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1486,7 +1488,7 @@ def workout_csvemail_view(request,id=0):
successmessage = "The CSV file was sent to you per email"
messages.info(request,successmessage)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1495,7 +1497,7 @@ def workout_csvemail_view(request,id=0):
else:
message = "You are not allowed to export this workout"
messages.error(request,message)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1577,7 +1579,7 @@ def workout_tp_upload_view(request,id=0):
message = "You are not allowed to export this workout to TP"
messages.error(request,message)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1621,7 +1623,7 @@ def workout_strava_upload_view(request,id=0):
os.remove(tcxfile)
except WindowsError:
pass
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1651,14 +1653,14 @@ def workout_strava_upload_view(request,id=0):
messages.error(request,message)
w.uploadedtostrava = -1
w.save()
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
response = HttpResponseRedirect(url)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
}
@@ -1670,7 +1672,7 @@ def workout_strava_upload_view(request,id=0):
w.uploadedtostrava = -1
w.save()
os.remove(tcxfile)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1697,10 +1699,11 @@ def workout_c2_upload_view(request,id=0):
messages.info(request,message)
url = reverse(workout_export_view,
kwargs = {
'id':str(w.id),
})
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id)
})
response = HttpResponseRedirect(url)
@@ -1725,7 +1728,7 @@ def workout_runkeeper_upload_view(request,id=0):
if not data:
message = "Data error"
messages.error(request,message)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1761,7 +1764,7 @@ def workout_runkeeper_upload_view(request,id=0):
message = "You are not authorized to upload this workout"
messages.error(request,message)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1787,7 +1790,7 @@ def workout_underarmour_upload_view(request,id=0):
if not data:
message = "Data error"
messages.error(request,message)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1824,7 +1827,7 @@ def workout_underarmour_upload_view(request,id=0):
message = "You are not authorized to upload this workout"
messages.error(request,message)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1851,7 +1854,7 @@ def workout_sporttracks_upload_view(request,id=0):
if not data:
message = "Data error"
messages.error(request,message)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -1889,7 +1892,7 @@ def workout_sporttracks_upload_view(request,id=0):
message = "You are not authorized to upload this workout"
messages.error(request,message)
url = reverse(workout_export_view,
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
})
@@ -9543,9 +9546,16 @@ def workout_add_chart_view(request,id,plotnr=1):
# The page where you select which Strava workout to import
@login_required()
def workout_stravaimport_view(request,message=""):
def workout_stravaimport_view(request,message="",userid=0):
res = stravastuff.get_strava_workout_list(request.user)
r = getrequestrower(request,userid=userid)
if r.user != request.user:
messages.info(request,"You cannot import other people's workouts from Concept2")
r = getrower(request.user)
if (res.status_code != 200):
if (res.status_code == 401):
r = getrower(request.user)
@@ -9605,10 +9615,25 @@ def workout_stravaimport_view(request,message=""):
res = dict(zip(keys,values))
workouts.append(res)
breadcrumbs = [
{
'url':'/rowers/list-workouts',
'name':'Workouts'
},
{
'url':reverse(workout_stravaimport_view),
'name':'Strava'
},
]
r = getrower(request.user)
return render(request,'strava_list_import.html',
{'workouts':workouts,
'rower':r,
'active':'nav-workouts',
'breadcrumbs':breadcrumbs,
'teams':get_my_teams(request.user),
})
@@ -9616,7 +9641,7 @@ def workout_stravaimport_view(request,message=""):
# The page where you select which RunKeeper workout to import
@login_required()
def workout_runkeeperimport_view(request,message=""):
def workout_runkeeperimport_view(request,message="",userid=0):
res = runkeeperstuff.get_runkeeper_workout_list(request.user)
if (res.status_code != 200):
if (res.status_code == 401):
@@ -9632,29 +9657,46 @@ def workout_runkeeperimport_view(request,message=""):
else:
url = reverse(workouts_view)
return HttpResponseRedirect(url)
else:
workouts = []
for item in res.json()['items']:
d = int(float(item['total_distance']))
i = getidfromuri(item['uri'])
ttot = str(datetime.timedelta(seconds=int(float(item['duration']))))
s = item['start_time']
r = item['type']
keys = ['id','distance','duration','starttime','type']
values = [i,d,ttot,s,r]
res = dict(zip(keys,values))
workouts.append(res)
return render(request,'runkeeper_list_import.html',
{'workouts':workouts,
'teams':get_my_teams(request.user),
})
workouts = []
for item in res.json()['items']:
d = int(float(item['total_distance']))
i = getidfromuri(item['uri'])
ttot = str(datetime.timedelta(seconds=int(float(item['duration']))))
s = item['start_time']
r = item['type']
keys = ['id','distance','duration','starttime','type']
values = [i,d,ttot,s,r]
res = dict(zip(keys,values))
workouts.append(res)
breadcrumbs = [
{
'url':'/rowers/list-workouts',
'name':'Workouts'
},
{
'url':reverse(workout_runkeeperimport_view),
'name':'Runkeeper'
}
]
r = getrower(request.user)
return render(request,'runkeeper_list_import.html',
{'workouts':workouts,
'rower':r,
'active':'nav-workouts',
'breadcrumbs':breadcrumbs,
'teams':get_my_teams(request.user),
})
return HttpResponse(res)
# The page where you select which RunKeeper workout to import
@login_required()
def workout_underarmourimport_view(request,message=""):
def workout_underarmourimport_view(request,message="",userid=0):
res = underarmourstuff.get_underarmour_workout_list(request.user)
if (res.status_code != 200):
if (res.status_code == 401):
@@ -9666,38 +9708,53 @@ def workout_underarmourimport_view(request,message=""):
messages.error(request,message)
url = reverse(workouts_view)
return HttpResponseRedirect(url)
else:
workouts = []
items = res.json()['_embedded']['workouts']
for item in items:
s = item['start_datetime']
i,r = underarmourstuff.get_idfromuri(request.user,item['_links'])
n = item['name']
try:
d = item['aggregates']['distance_total']
except KeyError:
d = 0
try:
ttot = item['aggregates']['active_time_total']
except KeyError:
ttot = 0
keys = ['id','distance','duration','starttime','type']
values = [i,d,ttot,s,r]
thedict = dict(zip(keys,values))
workouts = []
items = res.json()['_embedded']['workouts']
for item in items:
s = item['start_datetime']
i,r = underarmourstuff.get_idfromuri(request.user,item['_links'])
n = item['name']
try:
d = item['aggregates']['distance_total']
except KeyError:
d = 0
try:
ttot = item['aggregates']['active_time_total']
except KeyError:
ttot = 0
workouts.append(thedict)
keys = ['id','distance','duration','starttime','type']
values = [i,d,ttot,s,r]
thedict = dict(zip(keys,values))
return render(request,'underarmour_list_import.html',
{'workouts':workouts,
'teams':get_my_teams(request.user),
})
workouts.append(thedict)
rower = getrower(request.user)
breadcrumbs = [
{
'url':'/rowers/list-workouts',
'name':'Workouts'
},
{
'url':reverse(workout_c2import_view),
'name':'Concept2'
},
]
return render(request,'underarmour_list_import.html',
{'workouts':workouts,
'breadcrumbs':breadcrumbs,
'rower':rower,
'active':'nav-workouts',
'teams':get_my_teams(request.user),
})
return HttpResponse(res)
# the page where you select which Polar workout to Import
@login_required()
def workout_polarimport_view(request):
def workout_polarimport_view(request,userid=0):
exercises = polarstuff.get_polar_workouts(request.user)
workouts = []
@@ -9727,10 +9784,25 @@ def workout_polarimport_view(request):
res = dict(zip(keys,values))
workouts.append(res)
breadcrumbs = [
{
'url':'/rowers/list-workouts',
'name':'Workouts'
},
{
'url':reverse(workout_polarimport_view),
'name':'Polar'
},
]
r = getrower(request.user)
return render(request, 'polar_list_import.html',
{
'workouts':workouts,
'active':'nav-workouts',
'rower':r,
'breadcrumbs':breadcrumbs,
'teams':get_my_teams(request.user),
})
@@ -9739,7 +9811,9 @@ def workout_polarimport_view(request):
# The page where you select which SportTracks workout to import
@login_required()
def workout_sporttracksimport_view(request,message=""):
def workout_sporttracksimport_view(request,message="",userid=0):
res = sporttracksstuff.get_sporttracks_workout_list(request.user)
if (res.status_code != 200):
if (res.status_code == 401):
@@ -9756,31 +9830,48 @@ def workout_sporttracksimport_view(request,message=""):
else:
url = reverse(workouts_view)
return HttpResponseRedirect(url)
else:
workouts = []
r = getrower(request.user)
stids = [int(getidfromuri(item['uri'])) for item in res.json()['items']]
knownstids = uniqify([
w.uploadedtosporttracks for w in Workout.objects.filter(user=r)
])
newids = [stid for stid in stids if not stid in knownstids]
for item in res.json()['items']:
d = int(float(item['total_distance']))
i = int(getidfromuri(item['uri']))
if i in knownstids:
nnn = ''
else:
nnn = 'NEW'
n = item['name']
ttot = str(datetime.timedelta(seconds=int(float(item['duration']))))
s = item['start_time']
r = item['type']
keys = ['id','distance','duration','starttime','type','name','new']
values = [i,d,ttot,s,r,n,nnn]
res = dict(zip(keys,values))
workouts.append(res)
return render(request,'sporttracks_list_import.html',
workouts = []
r = getrower(request.user)
stids = [int(getidfromuri(item['uri'])) for item in res.json()['items']]
knownstids = uniqify([
w.uploadedtosporttracks for w in Workout.objects.filter(user=r)
])
newids = [stid for stid in stids if not stid in knownstids]
for item in res.json()['items']:
d = int(float(item['total_distance']))
i = int(getidfromuri(item['uri']))
if i in knownstids:
nnn = ''
else:
nnn = 'NEW'
n = item['name']
ttot = str(datetime.timedelta(seconds=int(float(item['duration']))))
s = item['start_time']
r = item['type']
keys = ['id','distance','duration','starttime','type','name','new']
values = [i,d,ttot,s,r,n,nnn]
res = dict(zip(keys,values))
workouts.append(res)
r = getrower(request.user)
breadcrumbs = [
{
'url':'/rowers/list-workouts',
'name':'Workouts'
},
{
'url':reverse(workout_sporttracksimport_view),
'name':'SportTracks'
},
]
return render(request,'sporttracks_list_import.html',
{'workouts':workouts,
'breadcrumbs':breadcrumbs,
'active':'nav-workouts',
'rower':r,
'teams':get_my_teams(request.user),
})
@@ -9864,7 +9955,15 @@ def workout_getc2workout_all(request,page=1,message=""):
# List of workouts available on Concept2 logbook - for import
@login_required()
def workout_c2import_view(request,page=1,message=""):
def workout_c2import_view(request,page=1,userid=0,message=""):
r = getrequestrower(request,userid=userid)
if r.user != request.user:
messages.info(request,"You cannot import other people's workouts from Concept2")
r = getrower(request.user)
try:
thetoken = c2_open(request.user)
except NoTokenError:
@@ -9877,38 +9976,57 @@ def workout_c2import_view(request,page=1,message=""):
messages.error(request,message)
url = reverse(workouts_view)
return HttpResponseRedirect(url)
else:
workouts = []
r = getrower(request.user)
c2ids = [item['id'] for item in res.json()['data']]
knownc2ids = uniqify([
w.uploadedtoc2 for w in Workout.objects.filter(user=r)
])
newids = [c2id for c2id in c2ids if not c2id in knownc2ids]
for item in res.json()['data']:
d = item['distance']
i = item['id']
ttot = item['time_formatted']
s = item['date']
r = item['type']
s2 = item['source']
c = item['comments']
if i in knownc2ids:
nnn = ''
else:
nnn = 'NEW'
keys = ['id','distance','duration','starttime','rowtype','source','comment','new']
values = [i,d,ttot,s,r,s2,c,nnn]
res = dict(zip(keys,values))
workouts.append(res)
workouts = []
c2ids = [item['id'] for item in res.json()['data']]
knownc2ids = uniqify([
w.uploadedtoc2 for w in Workout.objects.filter(user=r)
])
newids = [c2id for c2id in c2ids if not c2id in knownc2ids]
for item in res.json()['data']:
d = item['distance']
i = item['id']
ttot = item['time_formatted']
s = item['date']
r = item['type']
s2 = item['source']
c = item['comments']
if i in knownc2ids:
nnn = ''
else:
nnn = 'NEW'
keys = ['id','distance','duration','starttime','rowtype','source','comment','new']
values = [i,d,ttot,s,r,s2,c,nnn]
res = dict(zip(keys,values))
workouts.append(res)
return render(request,
'c2_list_import2.html',
{'workouts':workouts,
'teams':get_my_teams(request.user),
'page':page,
})
breadcrumbs = [
{
'url':'/rowers/list-workouts',
'name':'Workouts'
},
{
'url':reverse(workout_c2import_view),
'name':'Concept2'
},
{
'url':reverse(workout_c2import_view,kwargs={'page':page}),
'name':'Page '+str(page)
}
]
r = getrower(request.user)
return render(request,
'c2_list_import2.html',
{'workouts':workouts,
'rower':r,
'active':'nav-workouts',
'breadcrumbs':breadcrumbs,
'teams':get_my_teams(request.user),
'page':page,
})
importsources = {
'c2':c2stuff,