fusion done
This commit is contained in:
@@ -1,22 +1,34 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Workouts{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<h3>Fusion Editor</h3>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<h1>Fusion Editor</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<p>
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
</p>
|
||||
<p>
|
||||
{% csrf_token %}
|
||||
<input name='fusion' class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</form>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
Adding sensor data from workout {{ workout2.id }} into workout {{ workout1.id }}.
|
||||
This will create a new workout. After you submit the form, you will be
|
||||
taken to the newly created workout. If you are happy with the result, you
|
||||
can delete the two original workouts manually.
|
||||
Adding sensor data from workout {{ workout2.id }} into workout {{ workout1.id }}.
|
||||
This will create a new workout. After you submit the form, you will be
|
||||
taken to the newly created workout. If you are happy with the result, you
|
||||
can delete the two original workouts manually.
|
||||
</p>
|
||||
<p>
|
||||
Workout 1: {{ workout1.name }}
|
||||
@@ -24,21 +36,13 @@
|
||||
<p>
|
||||
Workout 2: {{ workout2.name }}
|
||||
</p>
|
||||
<p>On the right hand side, please select the columns from workout 2 that
|
||||
<p>Please select the columns from workout 2 that
|
||||
you want to replace the equivalent columns in workout 1. </p>
|
||||
</div>
|
||||
<div class="grid_4">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name='fusion' class="button green" type="submit" value="Submit"> </form>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,36 +1,34 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Workouts{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div id="workouts" class="grid_4 alpha">
|
||||
<div class="grid_4 alpha">
|
||||
<h1>Workout {{ id }}</h1>
|
||||
<table width=100%>
|
||||
<tr>
|
||||
{% block main %}
|
||||
<h1>Workout {{ id }} Sensor Fusion</h1>
|
||||
<ul class="main-content">
|
||||
<li>
|
||||
<table width=100%>
|
||||
<tr>
|
||||
<th>Rower:</th><td>{{ first_name }} {{ last_name }}</td>
|
||||
</tr><tr>
|
||||
<tr>
|
||||
</tr><tr>
|
||||
<tr>
|
||||
<th>Name:</th><td>{{ workout.name }}</td>
|
||||
</tr><tr>
|
||||
<tr>
|
||||
</tr><tr>
|
||||
<tr>
|
||||
<th>Date:</th><td>{{ workout.date }}</td>
|
||||
</tr><tr>
|
||||
</tr><tr>
|
||||
<th>Time:</th><td>{{ workout.starttime }}</td>
|
||||
</tr><tr>
|
||||
</tr><tr>
|
||||
<th>Distance:</th><td>{{ workout.distance }}m</td>
|
||||
</tr><tr>
|
||||
</tr><tr>
|
||||
<th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td>
|
||||
</tr><tr>
|
||||
</tr><tr>
|
||||
<th>Type:</th><td>{{ workout.workouttype }}</td>
|
||||
</tr><tr>
|
||||
</tr><tr>
|
||||
<th>Weight Category:</th><td>{{ workout.weightcategory }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="grid_4 alpha">
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
<form id="searchform" action=""
|
||||
method="get" accept-charset="utf-8">
|
||||
@@ -40,82 +38,108 @@
|
||||
<input class="searchfield" id="searchbox" name="q" type="text" placeholder="Search">
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
Select start and end date for a date range:
|
||||
<div class="grid_4 alpha">
|
||||
<p>
|
||||
<form enctype="multipart/form-data" action="/rowers/workout/fusion/{{ id }}/" method="post">
|
||||
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
</p>
|
||||
<p>
|
||||
<form enctype="multipart/form-data" action="/rowers/workout/fusion/{{ id }}/" method="post">
|
||||
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</p>
|
||||
<input name='daterange' class="button green" type="submit" value="Submit"> </form>
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="grid_3">
|
||||
<h1>Fuse this workout with data from:</h1>
|
||||
{% if workouts %}
|
||||
<p>
|
||||
<span>
|
||||
{% if workouts.has_previous %}
|
||||
{% if request.GET.q %}
|
||||
<a class="wh" href="?page=1&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-to-left"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.previous_page_number }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="wh" href="?page=1">
|
||||
<i class="fas fa-arrow-alt-to-left"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.previous_page_number }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<span>
|
||||
Page {{ workouts.number }} of {{ workouts.paginator.num_pages }}.
|
||||
</span>
|
||||
|
||||
{% if workouts.has_next %}
|
||||
{% if request.GET.q %}
|
||||
<a class="wh" href="?page={{ workouts.next_page_number }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.paginator.num_pages }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-to-right">
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="wh" href="?page={{ workouts.next_page_number }}">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.paginator.num_pages }}">
|
||||
<i class="fas fa-arrow-alt-to-right"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</span>
|
||||
</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div id="fusion" class="grid_8 omega">
|
||||
<h1>Fuse this workout with data from:</h1>
|
||||
{% if workouts %}
|
||||
<table width="100%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Date</th>
|
||||
<th> Time</th>
|
||||
<th> Name</th>
|
||||
<th> Type</th>
|
||||
<th> Distance </th>
|
||||
<th> Duration </th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th> Fusion</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</tbody>
|
||||
{% for cworkout in workouts %}
|
||||
<tr>
|
||||
<td> {{ cworkout.date }} </td>
|
||||
<td> {{ cworkout.starttime }} </td>
|
||||
<td> <a href="/rowers/workout/{{ workout.id }}/edit">{{ cworkout.name }}</a> </td>
|
||||
<td> {{ cworkout.workouttype }} </td>
|
||||
<td> {{ cworkout.distance }}m</td>
|
||||
<td> {{ cworkout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ cworkout.averagehr }} </td>
|
||||
<td> {{ cworkout.maxhr }} </td>
|
||||
{% if id == cworkout.id %}
|
||||
<td> </td>
|
||||
{% else %}
|
||||
<td> <a class="button blue small" href="/rowers/workout/fusion/{{ id }}/{{ cworkout.id }}">Fusion</a> </td>
|
||||
{% endif %}
|
||||
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p> No workouts found </p>
|
||||
{% endif %}
|
||||
|
||||
<div class="grid_2 prefix_5 suffix_1 omega">
|
||||
<span class="button gray small">
|
||||
{% if workouts.has_previous %}
|
||||
<a class="wh" href="/rowers/workout/fusion/{{ id }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}?page={{ workouts.previous_page_number }}"><</a>
|
||||
<table width="100%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Date</th>
|
||||
<th> Time</th>
|
||||
<th> Name</th>
|
||||
<th> Type</th>
|
||||
<th> Distance </th>
|
||||
<th> Duration </th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th> Fusion</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for cworkout in workouts %}
|
||||
<tr>
|
||||
<td> {{ cworkout.date }} </td>
|
||||
<td> {{ cworkout.starttime }} </td>
|
||||
<td> <a href="/rowers/workout/{{ workout.id }}/edit">{{ cworkout.name }}</a> </td>
|
||||
<td> {{ cworkout.workouttype }} </td>
|
||||
<td> {{ cworkout.distance }}m</td>
|
||||
<td> {{ cworkout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ cworkout.averagehr }} </td>
|
||||
<td> {{ cworkout.maxhr }} </td>
|
||||
{% if id == cworkout.id %}
|
||||
<td> </td>
|
||||
{% else %}
|
||||
<td> <a class="button blue small" href="/rowers/workout/fusion/{{ id }}/{{ cworkout.id }}">Fusion</a> </td>
|
||||
{% endif %}
|
||||
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p> No workouts found </p>
|
||||
{% endif %}
|
||||
|
||||
<span>
|
||||
Page {{ workouts.number }} of {{ workouts.paginator.num_pages }}.
|
||||
</span>
|
||||
|
||||
{% if workouts.has_next %}
|
||||
<a class="wh" href="/rowers/workout/fusion/{{ id }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}?page={{ workouts.next_page_number }}">></a>
|
||||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
189
rowers/views.py
189
rowers/views.py
@@ -6528,73 +6528,93 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
|
||||
|
||||
try:
|
||||
r = getrower(request.user)
|
||||
u = User.objects.get(id=r.user.id)
|
||||
if request.method == 'POST':
|
||||
dateform = DateRangeForm(request.POST)
|
||||
if dateform.is_valid():
|
||||
startdate = dateform.cleaned_data['startdate']
|
||||
enddate = dateform.cleaned_data['enddate']
|
||||
else:
|
||||
dateform = DateRangeForm(initial={
|
||||
'startdate':startdate,
|
||||
'enddate':enddate,
|
||||
})
|
||||
|
||||
if startdatestring:
|
||||
startdate = iso8601.parse_date(startdatestring)
|
||||
if enddatestring:
|
||||
enddate = iso8601.parse_date(enddatestring)
|
||||
|
||||
startdate = datetime.datetime.combine(startdate,datetime.time())
|
||||
enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59))
|
||||
#enddate = enddate+datetime.timedelta(days=1)
|
||||
|
||||
if enddate < startdate:
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
startdate = s
|
||||
|
||||
workouts = Workout.objects.filter(user=r,
|
||||
startdatetime__gte=startdate,
|
||||
startdatetime__lte=enddate).order_by("-date", "-starttime").exclude(id=id)
|
||||
|
||||
query = request.GET.get('q')
|
||||
if query:
|
||||
query_list = query.split()
|
||||
workouts = workouts.filter(
|
||||
reduce(operator.and_,
|
||||
(Q(name__icontains=q) for q in query_list)) |
|
||||
reduce(operator.and_,
|
||||
(Q(notes__icontains=q) for q in query_list))
|
||||
)
|
||||
|
||||
paginator = Paginator(workouts,15) # show 25 workouts per page
|
||||
page = request.GET.get('page')
|
||||
|
||||
try:
|
||||
workouts = paginator.page(page)
|
||||
except PageNotAnInteger:
|
||||
workouts = paginator.page(1)
|
||||
except EmptyPage:
|
||||
workouts = paginator.page(paginator.num_pages)
|
||||
row = get_workout(id)
|
||||
|
||||
messages.info(request,successmessage)
|
||||
messages.error(request,message)
|
||||
|
||||
return render(request, 'fusion_list.html',
|
||||
{'id':int(id),
|
||||
'workout':row,
|
||||
'workouts': workouts,
|
||||
'last_name':u.last_name,
|
||||
'first_name':u.first_name,
|
||||
'dateform':dateform,
|
||||
'startdate':startdate,
|
||||
'enddate':enddate,
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
except Rower.DoesNotExist:
|
||||
raise Http404("User has no rower instance")
|
||||
|
||||
u = User.objects.get(id=r.user.id)
|
||||
if request.method == 'POST':
|
||||
dateform = DateRangeForm(request.POST)
|
||||
if dateform.is_valid():
|
||||
startdate = dateform.cleaned_data['startdate']
|
||||
enddate = dateform.cleaned_data['enddate']
|
||||
else:
|
||||
dateform = DateRangeForm(initial={
|
||||
'startdate':startdate,
|
||||
'enddate':enddate,
|
||||
})
|
||||
|
||||
if startdatestring:
|
||||
startdate = iso8601.parse_date(startdatestring)
|
||||
if enddatestring:
|
||||
enddate = iso8601.parse_date(enddatestring)
|
||||
|
||||
startdate = datetime.datetime.combine(startdate,datetime.time())
|
||||
enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59))
|
||||
#enddate = enddate+datetime.timedelta(days=1)
|
||||
|
||||
if enddate < startdate:
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
startdate = s
|
||||
|
||||
workouts = Workout.objects.filter(user=r,
|
||||
startdatetime__gte=startdate,
|
||||
startdatetime__lte=enddate).order_by("-date", "-starttime").exclude(id=id)
|
||||
|
||||
query = request.GET.get('q')
|
||||
if query:
|
||||
query_list = query.split()
|
||||
workouts = workouts.filter(
|
||||
reduce(operator.and_,
|
||||
(Q(name__icontains=q) for q in query_list)) |
|
||||
reduce(operator.and_,
|
||||
(Q(notes__icontains=q) for q in query_list))
|
||||
)
|
||||
|
||||
paginator = Paginator(workouts,15) # show 25 workouts per page
|
||||
page = request.GET.get('page')
|
||||
|
||||
try:
|
||||
workouts = paginator.page(page)
|
||||
except PageNotAnInteger:
|
||||
workouts = paginator.page(1)
|
||||
except EmptyPage:
|
||||
workouts = paginator.page(paginator.num_pages)
|
||||
row = get_workout(id)
|
||||
|
||||
messages.info(request,successmessage)
|
||||
messages.error(request,message)
|
||||
|
||||
breadcrumbs = [
|
||||
{
|
||||
'url':'/rowers/list-workouts',
|
||||
'name':'Workouts'
|
||||
},
|
||||
{
|
||||
'url':get_workout_default_page(request,row.id),
|
||||
'name': str(row.id)
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_fusion_list,kwargs={'id':id}),
|
||||
'name': 'Sensor Fusion'
|
||||
}
|
||||
|
||||
]
|
||||
|
||||
return render(request, 'fusion_list.html',
|
||||
{'id':int(id),
|
||||
'workout':row,
|
||||
'rower':r,
|
||||
'active':'nav-workouts',
|
||||
'breadcrumbs':breadcrumbs,
|
||||
'workouts': workouts,
|
||||
'last_name':u.last_name,
|
||||
'first_name':u.first_name,
|
||||
'dateform':dateform,
|
||||
'startdate':startdate,
|
||||
'enddate':enddate,
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
|
||||
# Basic view of workout
|
||||
def workout_view(request,id=0):
|
||||
@@ -11021,6 +11041,9 @@ def workout_split_view(request,id=id):
|
||||
# Fuse two workouts
|
||||
@user_passes_test(ispromember,login_url="/",redirect_field_name=None)
|
||||
def workout_fusion_view(request,id1=0,id2=1):
|
||||
|
||||
r = getrower(request.user)
|
||||
|
||||
try:
|
||||
w1 = Workout.objects.get(id=id1)
|
||||
w2 = Workout.objects.get(id=id2)
|
||||
@@ -11061,20 +11084,36 @@ def workout_fusion_view(request,id1=0,id2=1):
|
||||
})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
else:
|
||||
return render(request, 'fusion.html',
|
||||
{'form':form,
|
||||
'teams':get_my_teams(request.user),
|
||||
'workout1':w1,
|
||||
'workout2':w2,
|
||||
})
|
||||
|
||||
|
||||
form = FusionMetricChoiceForm(instance=w2)
|
||||
else:
|
||||
form = FusionMetricChoiceForm(instance=w2)
|
||||
|
||||
breadcrumbs = [
|
||||
{
|
||||
'url':'/rowers/list-workouts',
|
||||
'name':'Workouts'
|
||||
},
|
||||
{
|
||||
'url':get_workout_default_page(request,w1.id),
|
||||
'name': str(w1.id)
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_fusion_list,kwargs={'id':id1}),
|
||||
'name': 'Sensor Fusion'
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_fusion_view,kwargs={'id1':id1,'id2':id2}),
|
||||
'name': 'Sensor Fusion'
|
||||
}
|
||||
|
||||
]
|
||||
|
||||
return render(request, 'fusion.html',
|
||||
{'form':form,
|
||||
'teams':get_my_teams(request.user),
|
||||
'workout':w1,
|
||||
'rower':r,
|
||||
'breadcrumbs':breadcrumbs,
|
||||
'active':'nav-workouts',
|
||||
'workout1':w1,
|
||||
'workout2':w2,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user