Merge branch 'feature/backtoworkflow' into develop
This commit is contained in:
@@ -2510,7 +2510,16 @@ def thumbnails_set(r,id,favorites):
|
||||
columns += [f.yparam2 for f in favorites]
|
||||
|
||||
columns += ['time']
|
||||
rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True)
|
||||
try:
|
||||
rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True)
|
||||
except:
|
||||
return [
|
||||
{'script':"",
|
||||
'div':"",
|
||||
'notes':""
|
||||
}]
|
||||
|
||||
|
||||
rowdata.dropna(axis=1,how='all',inplace=True)
|
||||
|
||||
if rowdata.empty:
|
||||
|
||||
@@ -24,7 +24,12 @@
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export</a>
|
||||
</p>
|
||||
|
||||
@@ -23,7 +23,12 @@
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export</a>
|
||||
</p>
|
||||
|
||||
@@ -15,7 +15,12 @@
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
|
||||
@@ -32,7 +32,12 @@
|
||||
<a class="button gray small" href="/rowers/workout/{{ id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_8 omega">
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_6 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{% if charts %}
|
||||
<h2>Flex Charts</h2>
|
||||
<p>Click on the thumbnails to view the full chart.</p>
|
||||
{% for chart in charts %}
|
||||
<div class="grid_3 alpha">
|
||||
<big>{{ forloop.counter }}</big>
|
||||
|
||||
@@ -43,7 +43,13 @@
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
|
||||
@@ -14,7 +14,13 @@
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
@@ -62,4 +68,4 @@
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
{% load rowerfilters %}
|
||||
{% load tz %}
|
||||
<div class="grid_6 suffix_3 alpha">
|
||||
<table width=100%>
|
||||
<tr>
|
||||
{% localtime on %}
|
||||
<th>Date/Time:</th><td>{{ workout.startdatetime|localtime}}</td>
|
||||
{% endlocaltime %}
|
||||
</tr><tr>
|
||||
<th>Distance:</th><td>{{ workout.distance }}m</td>
|
||||
</tr><tr>
|
||||
<th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td>
|
||||
</tr><tr>
|
||||
<th>Public link to this workout</th>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<th>Comments</th>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}/comment">Comment ({{ aantalcomments }})</a>
|
||||
</td>
|
||||
|
||||
</tr><tr>
|
||||
<th>Public link to interactive chart</th>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}/interactiveplot">https://rowsandall.com/rowers/workout/{{ workout.id }}/interactiveplot</a>
|
||||
<td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
@@ -0,0 +1,5 @@
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button red small" href="/rowers/workout/{{ workout.id }}/deleteconfirm">Delete</a>
|
||||
</p>
|
||||
</div>
|
||||
@@ -0,0 +1,5 @@
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
@@ -0,0 +1,9 @@
|
||||
<div style="height:100%;" id="theplot" class="grid_9 alpha flexplot">
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/map">Map View</a>
|
||||
</p>
|
||||
</div>
|
||||
@@ -0,0 +1,14 @@
|
||||
<div class="grid_9">
|
||||
<div class="grid_1 alpha">
|
||||
<div class="fb-share-button" data-href="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-layout="button" data-size="small" data-mobile-iframe="false">
|
||||
<a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id }}">Share</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_1 suffix_7 omega">
|
||||
<a class="twitter-share-button"
|
||||
href="https://twitter.com/intent/tweet"
|
||||
data-url="https://rowsandall.com/rowers/workout/{{ workout.id }}"
|
||||
data-text="@rowsandall #rowingdata">Tweet</a>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<div class="grid_2 alpha">
|
||||
<div class="fb-share-button" data-href="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-layout="button" data-size="small" data-mobile-iframe="false">
|
||||
<a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id }}">Share</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_2 alpha">
|
||||
<p> </p>
|
||||
<a class="twitter-share-button"
|
||||
href="https://twitter.com/intent/tweet"
|
||||
data-url="https://rowsandall.com/rowers/workout/{{ workout.id }}"
|
||||
data-text="@rowsandall #rowingdata">Tweet</a>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -29,7 +29,10 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_6 alpha">
|
||||
<div class="grid_2 prefix_4 alpha">
|
||||
<div class="grid_2 prefix_2 alpha">
|
||||
<p><a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a></p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p><a class="button blue small" href="/rowers/workout/{{ workout.id }}/wind">Wind Edit</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export</a>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a>
|
||||
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -28,7 +28,10 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_6 alpha">
|
||||
<div class="grid_2 prefix_4 alpha">
|
||||
<div class="grid_2 prefix_2 alpha">
|
||||
<p><a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a></p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p><a class="button blue small" href="/rowers/workout/{{ workout.id }}/stream">Stream Edit</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
{% load rowerfilters %}
|
||||
{% load tz %}
|
||||
|
||||
|
||||
{% get_current_timezone as TIME_ZONE %}
|
||||
|
||||
{% block title %}{{ workout.name }}{% endblock %}
|
||||
@@ -40,9 +39,6 @@
|
||||
{% include templateName %}
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
<div class="grid_2 alpha">
|
||||
<p>Click on the thumbnails to view the full chart</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="middlepanel" class="grid_9">
|
||||
{% block middle_panel %}
|
||||
|
||||
@@ -44,7 +44,12 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_6 alpha">
|
||||
<div class="grid_2 prefix_2 alpha">
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/map">Map View</a>
|
||||
</p>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export</a>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -118,7 +118,6 @@ def user_teams(user):
|
||||
return teams
|
||||
|
||||
|
||||
|
||||
@register.filter
|
||||
def has_teams(user):
|
||||
try:
|
||||
|
||||
+12
-3
@@ -9,15 +9,23 @@ workflowmiddlepanel = (
|
||||
('panel_statcharts.html','Static Charts'),
|
||||
('flexthumbnails.html','Flex Charts'),
|
||||
('panel_summary.html','Summary'),
|
||||
('panel_map.html','Map'),
|
||||
('panel_comments.html','Basic Info and Links'),
|
||||
('panel_middlesocial.html','Social Media Share Buttons'),
|
||||
)
|
||||
|
||||
defaultmiddle = ['panel_statcharts.html',
|
||||
defaultmiddle = ['panel_middlesocial.html',
|
||||
'panel_statcharts.html',
|
||||
'flexthumbnails.html',
|
||||
'panel_summary.html']
|
||||
'panel_summary.html',
|
||||
'panel_map.html']
|
||||
|
||||
workflowleftpanel = (
|
||||
('panel_navigationheader.html','Navigation Header'),
|
||||
('panel_editbuttons.html','Edit Workout Button'),
|
||||
('panel_delete.html','Delete Workout Button'),
|
||||
('panel_export.html','Export Workout Button'),
|
||||
('panel_social.html','Social Media Share Buttons'),
|
||||
('panel_advancededit.html','Advanced Workout Edit Button'),
|
||||
('panel_editintervals.html','Edit Intervals Button'),
|
||||
('panel_stats.html','Workout Statistics Button'),
|
||||
@@ -25,7 +33,8 @@ workflowleftpanel = (
|
||||
('panel_geekyheader.html','Geeky Header'),
|
||||
('panel_editwind.html','Edit Wind Data'),
|
||||
('panel_editstream.html','Edit Stream Data'),
|
||||
('panel_otwpower.html','Run OTW Power Calculations')
|
||||
('panel_otwpower.html','Run OTW Power Calculations'),
|
||||
('panel_mapview.html','Map'),
|
||||
)
|
||||
|
||||
defaultleft = [
|
||||
|
||||
+59
-5
@@ -12,6 +12,7 @@ from PIL import Image
|
||||
from numbers import Number
|
||||
from django.views.generic.base import TemplateView
|
||||
from django.db.models import Q
|
||||
from django import template
|
||||
from django.db import IntegrityError, transaction
|
||||
from django.shortcuts import render
|
||||
from django.http import (
|
||||
@@ -157,6 +158,27 @@ from interactiveplots import *
|
||||
# Define the API documentation
|
||||
schema_view = get_swagger_view(title='Rowsandall API')
|
||||
|
||||
# Test if row data include candidates
|
||||
def rowhascoordinates(row):
|
||||
# create interactive plot
|
||||
f1 = row.csvfilename
|
||||
u = row.user.user
|
||||
r = getrower(u)
|
||||
rowdata = rdata(f1)
|
||||
hascoordinates = 1
|
||||
if rowdata != 0:
|
||||
try:
|
||||
latitude = rowdata.df[' latitude']
|
||||
if not latitude.std():
|
||||
hascoordinates = 0
|
||||
except KeyError,AttributeError:
|
||||
hascoordinates = 0
|
||||
|
||||
else:
|
||||
hascoordinates = 0
|
||||
|
||||
return hascoordinates
|
||||
|
||||
# Custom error pages with Rowsandall headers
|
||||
def error500_view(request):
|
||||
response = render_to_response('500.html', {},
|
||||
@@ -5231,7 +5253,11 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
|
||||
kwargs = {
|
||||
'id':int(id)}
|
||||
|
||||
url = reverse(workout_advanced_view,kwargs=kwargs)
|
||||
try:
|
||||
url = request.session['referer']
|
||||
except KeyError:
|
||||
url = reverse(workout_advanced_view,kwargs=kwargs)
|
||||
|
||||
response = HttpResponseRedirect(url)
|
||||
return response
|
||||
|
||||
@@ -6006,16 +6032,42 @@ def workout_workflow_view(request,id):
|
||||
|
||||
charts = []
|
||||
|
||||
if favorites:
|
||||
if favorites and 'flexthumbnails.html' in r.workflowmiddlepanel:
|
||||
charts = thumbnails_set(r,id,favorites)
|
||||
if charts[0]['script'] == '':
|
||||
charts = []
|
||||
|
||||
if 'panel_map.html' in r.workflowmiddlepanel and rowhascoordinates(row):
|
||||
rowdata = rdata(row.csvfilename)
|
||||
mapscript,mapdiv = leaflet_chart2(rowdata.df[' latitude'],
|
||||
rowdata.df[' longitude'],
|
||||
row.name)
|
||||
else:
|
||||
mapscript = ''
|
||||
mapdiv = ''
|
||||
|
||||
|
||||
|
||||
statcharts = GraphImage.objects.filter(workout=row)
|
||||
|
||||
# This will be user configurable in the future
|
||||
middleTemplates = r.workflowmiddlepanel
|
||||
|
||||
leftTemplates = r.workflowleftpanel
|
||||
middleTemplates = []
|
||||
for t in r.workflowmiddlepanel:
|
||||
try:
|
||||
template.loader.get_template(t)
|
||||
middleTemplates.append(t)
|
||||
except template.TemplateDoesNotExist:
|
||||
pass
|
||||
|
||||
leftTemplates = []
|
||||
for t in r.workflowleftpanel:
|
||||
try:
|
||||
template.loader.get_template(t)
|
||||
leftTemplates.append(t)
|
||||
except template.TemplateDoesNotExist:
|
||||
pass
|
||||
|
||||
|
||||
return render(request,
|
||||
'workflow.html',
|
||||
{
|
||||
@@ -6023,6 +6075,8 @@ def workout_workflow_view(request,id):
|
||||
'leftTemplates':leftTemplates,
|
||||
'charts':charts,
|
||||
'workout':row,
|
||||
'mapscript':mapscript,
|
||||
'mapdiv':mapdiv,
|
||||
'statcharts':statcharts,
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user