Merge branch 'release/v8.25'
This commit is contained in:
@@ -92,6 +92,10 @@
|
|||||||
<li class="grid_5">
|
<li class="grid_5">
|
||||||
<p class="midden">and more</p>
|
<p class="midden">and more</p>
|
||||||
</li>
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="main-content" id="id_blogs">
|
||||||
|
</ul>
|
||||||
|
<ul class="main-content">
|
||||||
<li>
|
<li>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
@@ -119,21 +123,55 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<p class="midden">
|
<p class="midden">
|
||||||
Compatible with:
|
Compatible with:
|
||||||
<img src="/static/img/stravasquare.png" alt="Strava icon" width="30" height="30">
|
<img src="/static/img/stravasquare.png" alt="Strava icon" width="30" height="30">
|
||||||
<img src="/static/img/sporttrackssquare.png" alt="SportTracks icon" width="30" height="30">
|
<img src="/static/img/sporttrackssquare.png" alt="SportTracks icon" width="30" height="30">
|
||||||
<img src="/static/img/c2square.jpg" alt="C2 icon" width="30" height="30">
|
<img src="/static/img/c2square.jpg" alt="C2 icon" width="30" height="30">
|
||||||
<img src="/static/img/nksquare.png" alt="NK icon" width="30" height="30">
|
<img src="/static/img/nksquare.png" alt="NK icon" width="30" height="30">
|
||||||
<img src="/static/img/cnsquare.png" alt="CrewNerd icon" width="30" height="30">
|
<img src="/static/img/cnsquare.png" alt="CrewNerd icon" width="30" height="30">
|
||||||
<img src="/static/img/rimsquare.png" alt="RiM icon" width="30" height="30">
|
<img src="/static/img/rimsquare.png" alt="RiM icon" width="30" height="30">
|
||||||
<img src="/static/img/rpsquare.png" alt="RowPro icon" width="30" height="30">
|
<img src="/static/img/rpsquare.png" alt="RowPro icon" width="30" height="30">
|
||||||
<img src="/static/img/essquare.png" alt="ErgStick icon" width="30" height="30">
|
<img src="/static/img/essquare.png" alt="ErgStick icon" width="30" height="30">
|
||||||
<img src="/static/img/bcsquare.png" alt="BoatCoach icon" width="30" height="30">
|
<img src="/static/img/bcsquare.png" alt="BoatCoach icon" width="30" height="30">
|
||||||
<img src="/static/img/pssquare.png" alt="PainSled icon" width="30" height="30">
|
<img src="/static/img/pssquare.png" alt="PainSled icon" width="30" height="30">
|
||||||
<img src="/static/img/coxmate.png" alt="CoxMate icon" width="30" height="30">
|
<img src="/static/img/coxmate.png" alt="CoxMate icon" width="30" height="30">
|
||||||
<img src="/static/img/ritmo_logo.gif" alt="RitmoTime icon" width="30" height="30">
|
<img src="/static/img/ritmo_logo.gif" alt="RitmoTime icon" width="30" height="30">
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block scripts %}
|
||||||
|
<script type='text/javascript'
|
||||||
|
src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$( document ).ready(function() {
|
||||||
|
console.log('loading script');
|
||||||
|
$.getJSON(window.location.protocol + '//'+window.location.host + '/getblogs', function(data) {
|
||||||
|
var html = '';
|
||||||
|
if (data.length != 0) {
|
||||||
|
html += '<li class="grid_5"><div class="midden"><img src="/static/img/horizontal_line.png" alt="horizontal line"></div></li> '
|
||||||
|
html += '<li class="grid_5"><h2 class="midden">Recent articles on the Analytics blog</h2></li>';
|
||||||
|
html += '<li></li>';
|
||||||
|
};
|
||||||
|
$.each(data, function(key, blog) {
|
||||||
|
console.log(blog.title);
|
||||||
|
html += '<li class="frontitem">';
|
||||||
|
html += '<a style="text-decoration: none; color: black;" href="'+blog.link+'">';
|
||||||
|
html += '<h3 class="midden">'+blog.title+'</h3>';
|
||||||
|
html += '<p class="midden"><img src="'+blog.image+'" height=150px;></p>';
|
||||||
|
html += '<p>'+blog.excerpt+'</p>';
|
||||||
|
html += '</a>';
|
||||||
|
html += '</li>';
|
||||||
|
});
|
||||||
|
if (data.length != 0) {
|
||||||
|
html += '<li></li>';
|
||||||
|
};
|
||||||
|
$("#id_blogs").html(html);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{% load staticfiles %}
|
||||||
|
{% load rowerfilters %}
|
||||||
|
|
||||||
|
{% for blog in blogposts %}
|
||||||
|
<li class="frontitem">
|
||||||
|
<h3 class="midden">{{ blog.title|safe }}</h3>
|
||||||
|
<p class="midden">
|
||||||
|
<img src={{ blog.image }} height=150px;>
|
||||||
|
</p>
|
||||||
|
{{ blog.excerpt|safe }}
|
||||||
|
<p class="midden">
|
||||||
|
<a href={{ blog.link }}>
|
||||||
|
read more
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li id="blog">
|
<li id="blog">
|
||||||
<a href="analytics.rowsandall.com">
|
<a href="https://analytics.rowsandall.com">
|
||||||
<i class="fab fa-wordpress-simple fa-fw"></i> Blog
|
<i class="fab fa-wordpress-simple fa-fw"></i> Blog
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
+250
-2
@@ -1,7 +1,7 @@
|
|||||||
#from __future__ import print_function
|
#from __future__ import print_function
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
import re
|
import re
|
||||||
|
from nose_parameterized import parameterized
|
||||||
from django.test import TestCase, Client,override_settings
|
from django.test import TestCase, Client,override_settings
|
||||||
from django.core.management import call_command
|
from django.core.management import call_command
|
||||||
from django.utils.six import StringIO
|
from django.utils.six import StringIO
|
||||||
@@ -1291,7 +1291,8 @@ class ViewTest(TestCase):
|
|||||||
'sander@ds.ds',
|
'sander@ds.ds',
|
||||||
'koeinsloot')
|
'koeinsloot')
|
||||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||||
gdproptindate=timezone.now()
|
gdproptindate=timezone.now(),
|
||||||
|
rowerplan='coach',
|
||||||
)
|
)
|
||||||
self.nu = datetime.datetime.now()
|
self.nu = datetime.datetime.now()
|
||||||
|
|
||||||
@@ -1365,6 +1366,8 @@ class ViewTest(TestCase):
|
|||||||
os.remove(f_to_be_deleted+'.gz')
|
os.remove(f_to_be_deleted+'.gz')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def test_upload_view_notloggedin(self):
|
def test_upload_view_notloggedin(self):
|
||||||
response = self.c.post('/rowers/workout/upload/',follow=True)
|
response = self.c.post('/rowers/workout/upload/',follow=True)
|
||||||
|
|
||||||
@@ -1977,6 +1980,251 @@ class ViewTest(TestCase):
|
|||||||
# f_to_be_deleted = w.csvfilename
|
# f_to_be_deleted = w.csvfilename
|
||||||
# os.remove(f_to_be_deleted+'.gz')
|
# os.remove(f_to_be_deleted+'.gz')
|
||||||
|
|
||||||
|
class URLTests(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
redis_connection.publish('tasks','KILL')
|
||||||
|
u = User.objects.create_user('john',
|
||||||
|
'sander@ds.ds',
|
||||||
|
'koeinsloot',
|
||||||
|
)
|
||||||
|
r = Rower.objects.create(user=u,rowerplan='coach')
|
||||||
|
self.c = Client()
|
||||||
|
self.c.login(username='john',password='koeinsloot')
|
||||||
|
|
||||||
|
self.nu = datetime.datetime.now()
|
||||||
|
filename = 'rowers/testdata/testdata.csv'
|
||||||
|
self.wotw = Workout.objects.create(name='testworkout',
|
||||||
|
workouttype='On-water',
|
||||||
|
user=r,date=self.nu.strftime('%Y-%m-%d'),
|
||||||
|
starttime=self.nu.strftime('%H:%M:%S'),
|
||||||
|
duration="0:55:00",distance=8000,
|
||||||
|
csvfilename=filename)
|
||||||
|
|
||||||
|
self.wote = Workout.objects.create(name='testworkout',
|
||||||
|
workouttype='Indoor Rower',
|
||||||
|
user=r,date=self.nu.strftime('%Y-%m-%d'),
|
||||||
|
starttime=self.nu.strftime('%H:%M:%S'),
|
||||||
|
duration="0:55:00",distance=8000,
|
||||||
|
csvfilename=filename)
|
||||||
|
|
||||||
|
powerperc = 100*np.array([r.pw_ut2,
|
||||||
|
r.pw_ut1,
|
||||||
|
r.pw_at,
|
||||||
|
r.pw_tr,r.pw_an])/r.ftp
|
||||||
|
|
||||||
|
|
||||||
|
self.hrdata = {
|
||||||
|
'hrmax':r.max,
|
||||||
|
'hrut2':r.ut2,
|
||||||
|
'hrut1':r.ut1,
|
||||||
|
'hrat':r.at,
|
||||||
|
'hrtr':r.tr,
|
||||||
|
'hran':r.an,
|
||||||
|
'ftp':r.ftp,
|
||||||
|
'powerperc':serialize_list(powerperc),
|
||||||
|
'powerzones':serialize_list(r.powerzones),
|
||||||
|
}
|
||||||
|
|
||||||
|
urlstotest = [
|
||||||
|
'/rowers/400/',
|
||||||
|
'/rowers/403/',
|
||||||
|
'/rowers/404/',
|
||||||
|
'/rowers/500/',
|
||||||
|
'/rowers/502/',
|
||||||
|
'/rowers/1/list-workouts/',
|
||||||
|
'/rowers/1/list-workouts/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/1/ote-bests/',
|
||||||
|
'/rowers/1/ote-bests2/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/about',
|
||||||
|
'/rowers/addmanual/',
|
||||||
|
'/rowers/agegroupcp/30',
|
||||||
|
'/rowers/agegroupcp/30/1',
|
||||||
|
'/rowers/agegrouprecords/male/hwt',
|
||||||
|
'/rowers/agegrouprecords/male/hwt/2000m',
|
||||||
|
'/rowers/agegrouprecords/male/hwt/2000min',
|
||||||
|
'/rowers/ajax_agegroup/45/hwt/male/1',
|
||||||
|
'/rowers/analysis/',
|
||||||
|
'/rowers/analysis/user/1',
|
||||||
|
'/rowers/brochure',
|
||||||
|
'/rowers/courses/upload',
|
||||||
|
'/rowers/createplan/',
|
||||||
|
'/rowers/createplan/user/1/',
|
||||||
|
'/rowers/cumstats/',
|
||||||
|
'/rowers/cumstats/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/cumstats/user/1',
|
||||||
|
'/rowers/cumstats/user/1/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/developers',
|
||||||
|
'/rowers/email/',
|
||||||
|
'/rowers/email/thankyou/',
|
||||||
|
'/rowers/fitness-progress/',
|
||||||
|
'/rowers/fitness-progress/user/1',
|
||||||
|
'/rowers/fitness-progress/user/1/rower',
|
||||||
|
'/rowers/flexall/',
|
||||||
|
'/rowers/flexall/spm/hr/None/',
|
||||||
|
'/rowers/flexall/spm/hr/None/2016-01-01/2016-12-31/',
|
||||||
|
'/rowers/flexall/spm/hr/None/2016-01-01/2016-12-31/user/1',
|
||||||
|
'/rowers/flexall/user/1/',
|
||||||
|
'/rowers/flexalldata/',
|
||||||
|
'/rowers/help',
|
||||||
|
'/rowers/histo/',
|
||||||
|
'/rowers/histo/user/1',
|
||||||
|
'/rowers/histo/user/1/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/histodata',
|
||||||
|
'/rowers/job-kill/1',
|
||||||
|
'/rowers/jobs-status/',
|
||||||
|
'/rowers/laboratory/',
|
||||||
|
'/rowers/laboratory/user/1',
|
||||||
|
'/rowers/legal',
|
||||||
|
'/rowers/list-courses/',
|
||||||
|
'/rowers/list-graphs/',
|
||||||
|
'/rowers/list-jobs/',
|
||||||
|
'/rowers/list-workouts/',
|
||||||
|
'/rowers/list-workouts/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/list-workouts/2016-01-01/2016-12-31/user/1/',
|
||||||
|
'/rowers/list-workouts/ranking',
|
||||||
|
'/rowers/list-workouts/user/1/',
|
||||||
|
'/rowers/me/calcdps/',
|
||||||
|
'/rowers/me/edit/',
|
||||||
|
'/rowers/me/edit/user/1',
|
||||||
|
'/rowers/me/exportsettings/',
|
||||||
|
'/rowers/me/exportsettings/user/1',
|
||||||
|
'/rowers/me/favoritecharts/',
|
||||||
|
'/rowers/me/favoritecharts/user/1',
|
||||||
|
'/rowers/me/invitation/',
|
||||||
|
'/rowers/me/preferences/',
|
||||||
|
'/rowers/me/preferences/user/1',
|
||||||
|
'/rowers/me/request/',
|
||||||
|
'/rowers/me/teams/',
|
||||||
|
'/rowers/me/workflowconfig2/',
|
||||||
|
'/rowers/me/workflowconfig2/user/1',
|
||||||
|
'/rowers/me/workflowdefault',
|
||||||
|
'/rowers/multi-compare',
|
||||||
|
'/rowers/ote-bests/',
|
||||||
|
'/rowers/ote-bests/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/ote-bests/user/1',
|
||||||
|
'/rowers/ote-bests/user/1/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/ote-bests2/',
|
||||||
|
'/rowers/ote-bests2/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/ote-bests2/user/1',
|
||||||
|
'/rowers/ote-ranking/',
|
||||||
|
'/rowers/ote-ranking/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/ote-ranking/user/1/',
|
||||||
|
'/rowers/ote-ranking/user/1/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/otw-bests/',
|
||||||
|
'/rowers/otw-bests/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/otw-bests/user/1/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/partners',
|
||||||
|
'/rowers/physics',
|
||||||
|
'/rowers/planrequired',
|
||||||
|
'/rowers/promembership',
|
||||||
|
'/rowers/register',
|
||||||
|
'/rowers/register/thankyou/',
|
||||||
|
'/rowers/sessions/',
|
||||||
|
'/rowers/sessions/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/sessions/2016-01-01/2016-12-31/user/1',
|
||||||
|
'/rowers/sessions/coach/',
|
||||||
|
'/rowers/sessions/coach/user/1/',
|
||||||
|
'/rowers/sessions/create/',
|
||||||
|
'/rowers/sessions/create/user/1',
|
||||||
|
'/rowers/sessions/manage/',
|
||||||
|
'/rowers/sessions/manage/user/1/',
|
||||||
|
'/rowers/sessions/multiclone/',
|
||||||
|
'/rowers/sessions/multiclone/user/1/',
|
||||||
|
'/rowers/sessions/multicreate/',
|
||||||
|
'/rowers/sessions/multicreate/user/1/',
|
||||||
|
'/rowers/sessions/print/',
|
||||||
|
'/rowers/sessions/print/user/1',
|
||||||
|
'/rowers/sessions/teamcreate/',
|
||||||
|
'/rowers/sessions/user/1',
|
||||||
|
'/rowers/team-compare-select/',
|
||||||
|
'/rowers/team-compare-select/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/test-job/2',
|
||||||
|
'/rowers/test-job2/2',
|
||||||
|
'/rowers/test_callback',
|
||||||
|
'/rowers/updatefitness',
|
||||||
|
'/rowers/updatefitness/rower',
|
||||||
|
'/rowers/updatefitness/rower/50',
|
||||||
|
'/rowers/user-boxplot',
|
||||||
|
'/rowers/user-boxplot-data',
|
||||||
|
'/rowers/user-boxplot-select/',
|
||||||
|
'/rowers/user-boxplot-select/user/1/',
|
||||||
|
'/rowers/user-boxplot/user/1',
|
||||||
|
'/rowers/user-multiflex-data',
|
||||||
|
'/rowers/user-multiflex-select/',
|
||||||
|
'/rowers/user-multiflex-select/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/user-multiflex-select/user/1/',
|
||||||
|
'/rowers/user-multiflex-select/user/1/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/user-multiflex/',
|
||||||
|
'/rowers/user-multiflex/user/1',
|
||||||
|
'/rowers/workout/1/',
|
||||||
|
'/rowers/workout/1/adddistanceplot',
|
||||||
|
'/rowers/workout/1/adddistanceplot2',
|
||||||
|
'/rowers/workout/1/addotwpowerplot',
|
||||||
|
'/rowers/workout/1/addpiechart',
|
||||||
|
'/rowers/workout/1/addpowerpiechart',
|
||||||
|
'/rowers/workout/1/addstatic',
|
||||||
|
'/rowers/workout/1/addstatic/3',
|
||||||
|
'/rowers/workout/1/addtimeplot',
|
||||||
|
'/rowers/workout/1/addtimeplot2',
|
||||||
|
'/rowers/workout/1/comment',
|
||||||
|
'/rowers/workout/1/darkskywind',
|
||||||
|
'/rowers/workout/1/data',
|
||||||
|
'/rowers/workout/1/edit',
|
||||||
|
'/rowers/workout/1/editintervals',
|
||||||
|
'/rowers/workout/1/flexchart',
|
||||||
|
'/rowers/workout/1/flexchart/spm/hr/None',
|
||||||
|
'/rowers/workout/1/flexchart/spm/hr/None/scatter',
|
||||||
|
'/rowers/workout/1/flexchart/spm/hr/None/scatter/',
|
||||||
|
'/rowers/workout/1/forcecurve',
|
||||||
|
'/rowers/workout/1/get-testscript',
|
||||||
|
'/rowers/workout/1/get-thumbnails',
|
||||||
|
'/rowers/workout/1/histo',
|
||||||
|
'/rowers/workout/1/image',
|
||||||
|
'/rowers/workout/1/instroke',
|
||||||
|
'/rowers/workout/1/interactiveotwplot',
|
||||||
|
'/rowers/workout/1/map',
|
||||||
|
'/rowers/workout/1/otwsetpower',
|
||||||
|
'/rowers/workout/1/recalcsummary/',
|
||||||
|
'/rowers/workout/1/restore',
|
||||||
|
'/rowers/workout/1/smoothenpace',
|
||||||
|
'/rowers/workout/1/split',
|
||||||
|
'/rowers/workout/1/stats',
|
||||||
|
'/rowers/workout/1/stream',
|
||||||
|
'/rowers/workout/1/task',
|
||||||
|
'/rowers/workout/1/test_strokedata',
|
||||||
|
'/rowers/workout/1/toggle-ranking',
|
||||||
|
'/rowers/workout/1/undosmoothenpace',
|
||||||
|
'/rowers/workout/1/unsubscribe',
|
||||||
|
'/rowers/workout/1/updatecp',
|
||||||
|
'/rowers/workout/1/view',
|
||||||
|
'/rowers/workout/1/wind',
|
||||||
|
'/rowers/workout/1/workflow',
|
||||||
|
'/rowers/workout/compare/1/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/workout/fusion/1/',
|
||||||
|
'/rowers/workout/fusion/1/2016-01-01/2016-12-31',
|
||||||
|
'/rowers/workout/upload/',
|
||||||
|
'/rowers/workout/upload/team/',
|
||||||
|
'/rowers/workouts-join',
|
||||||
|
'/rowers/workouts-join-select/',
|
||||||
|
'/rowers/workouts-join-select/2016-01-01/2016-12-31',
|
||||||
|
]
|
||||||
|
|
||||||
|
lijst = []
|
||||||
|
for url in urlstotest:
|
||||||
|
lijst.append(
|
||||||
|
(url,200)
|
||||||
|
)
|
||||||
|
|
||||||
|
@parameterized.expand(lijst)
|
||||||
|
def test_url_generator(self,url,expected):
|
||||||
|
response = self.c.get(url,follow=True)
|
||||||
|
if response.status_code != expected:
|
||||||
|
print response.status_code
|
||||||
|
self.assertEqual(response.status_code,
|
||||||
|
expected,
|
||||||
|
msg=url+' response status code not 200')
|
||||||
|
|
||||||
|
|
||||||
class subroutinetests(TestCase):
|
class subroutinetests(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
redis_connection.publish('tasks','KILL')
|
redis_connection.publish('tasks','KILL')
|
||||||
|
|||||||
+5
-3
@@ -245,8 +245,9 @@ urlpatterns = [
|
|||||||
# url(r'^workout/(?P<id>\d+)/advanced$',views.workout_advanced_view),
|
# url(r'^workout/(?P<id>\d+)/advanced$',views.workout_advanced_view),
|
||||||
url(r'^workout/(?P<id>\d+)/instroke/(?P<metric>\w+.*)$',views.instroke_chart),
|
url(r'^workout/(?P<id>\d+)/instroke/(?P<metric>\w+.*)$',views.instroke_chart),
|
||||||
url(r'^workout/(?P<id>\d+)/instroke$',views.instroke_view),
|
url(r'^workout/(?P<id>\d+)/instroke$',views.instroke_view),
|
||||||
url(r'^workout/(?P<id>\d+)/stats$',views.workout_stats_view),
|
url(r'^workout/(?P<id>\d+)/stats$',views.workout_stats_view,name='workout_stats_view'),
|
||||||
url(r'^workout/(?P<id>\d+)/data$',views.workout_data_view),
|
url(r'^workout/(?P<id>\d+)/data$',views.workout_data_view,
|
||||||
|
name='workout_data_view'),
|
||||||
url(r'^workout/(?P<id>\d+)/otwsetpower$',views.workout_otwsetpower_view),
|
url(r'^workout/(?P<id>\d+)/otwsetpower$',views.workout_otwsetpower_view),
|
||||||
url(r'^workout/(?P<id>\d+)/interactiveotwplot$',views.workout_otwpowerplot_view),
|
url(r'^workout/(?P<id>\d+)/interactiveotwplot$',views.workout_otwpowerplot_view),
|
||||||
url(r'^workout/(?P<id>\d+)/wind$',views.workout_wind_view),
|
url(r'^workout/(?P<id>\d+)/wind$',views.workout_wind_view),
|
||||||
@@ -255,7 +256,8 @@ urlpatterns = [
|
|||||||
url(r'^workout/(?P<id>\d+)/metar/(?P<airportcode>\w+)$',views.workout_downloadmetar_view),
|
url(r'^workout/(?P<id>\d+)/metar/(?P<airportcode>\w+)$',views.workout_downloadmetar_view),
|
||||||
url(r'^workout/(?P<id>\d+)/stream$',views.workout_stream_view),
|
url(r'^workout/(?P<id>\d+)/stream$',views.workout_stream_view),
|
||||||
# url(r'^workout/(?P<id>\d+)/crewnerdsummary$',views.workout_crewnerd_summary_view),
|
# url(r'^workout/(?P<id>\d+)/crewnerdsummary$',views.workout_crewnerd_summary_view),
|
||||||
url(r'^workout/(?P<id>\d+)/editintervals$',views.workout_summary_edit_view),
|
url(r'^workout/(?P<id>\d+)/editintervals$',views.workout_summary_edit_view,
|
||||||
|
name='workout_summary_edit_view'),
|
||||||
url(r'^workout/(?P<id>\d+)/restore$',views.workout_summary_restore_view),
|
url(r'^workout/(?P<id>\d+)/restore$',views.workout_summary_restore_view),
|
||||||
url(r'^workout/(?P<id>\d+)/split$',views.workout_split_view),
|
url(r'^workout/(?P<id>\d+)/split$',views.workout_split_view),
|
||||||
# url(r'^workout/(?P<id>\d+)/interactiveplot$',views.workout_biginteractive_view),
|
# url(r'^workout/(?P<id>\d+)/interactiveplot$',views.workout_biginteractive_view),
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ lbstoN = 4.44822
|
|||||||
landingpages = (
|
landingpages = (
|
||||||
('workout_edit_view','Edit View'),
|
('workout_edit_view','Edit View'),
|
||||||
('workout_workflow_view','Workflow View'),
|
('workout_workflow_view','Workflow View'),
|
||||||
|
('workout_stats_view','Stats View'),
|
||||||
|
('workout_data_view','Data Explore View'),
|
||||||
|
('workout_summary_edit_view','Intervals Editor'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+86
-15
@@ -25,8 +25,12 @@ from pyparsing import ParseException
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
import codecs
|
import codecs
|
||||||
import isodate
|
import isodate
|
||||||
|
import re
|
||||||
|
import cgi
|
||||||
|
|
||||||
|
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
from django.template.loader import render_to_string
|
||||||
|
|
||||||
from django.views.generic.edit import UpdateView,DeleteView
|
from django.views.generic.edit import UpdateView,DeleteView
|
||||||
|
|
||||||
@@ -243,6 +247,8 @@ def getrequestrower(request,rowerid=0,userid=0,notpermanent=False):
|
|||||||
|
|
||||||
|
|
||||||
def getrower(user):
|
def getrower(user):
|
||||||
|
if user.is_anonymous():
|
||||||
|
return None
|
||||||
try:
|
try:
|
||||||
r = Rower.objects.get(user=user)
|
r = Rower.objects.get(user=user)
|
||||||
except Rower.DoesNotExist:
|
except Rower.DoesNotExist:
|
||||||
@@ -654,6 +660,65 @@ def get_thumbnails(request,id):
|
|||||||
|
|
||||||
return JSONResponse(charts)
|
return JSONResponse(charts)
|
||||||
|
|
||||||
|
|
||||||
|
def get_blog_posts(request):
|
||||||
|
response = requests.get(
|
||||||
|
'https://analytics.rowsandall.com/wp-json/wp/v2/posts')
|
||||||
|
if response.status_code == 200:
|
||||||
|
blogs_json = response.json()
|
||||||
|
# with open('blogs.txt','w') as o:
|
||||||
|
# o.write(json.dumps(blogs_json,indent=2,sort_keys=True))
|
||||||
|
else:
|
||||||
|
blogs_json = []
|
||||||
|
|
||||||
|
blogposts = []
|
||||||
|
|
||||||
|
|
||||||
|
for postdata in blogs_json[0:3]:
|
||||||
|
try:
|
||||||
|
featuredmedia = postdata['featured_media']
|
||||||
|
url = 'https://analytics.rowsandall.com/wp-json/wp/v2/media/%d' % featuredmedia
|
||||||
|
response = requests.get(url)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
image_json = response.json()
|
||||||
|
image_url = image_json[
|
||||||
|
'media_details'
|
||||||
|
][
|
||||||
|
'sizes'
|
||||||
|
][
|
||||||
|
'thumbnail'
|
||||||
|
][
|
||||||
|
'source_url'
|
||||||
|
]
|
||||||
|
except KeyError:
|
||||||
|
image_url = ''
|
||||||
|
|
||||||
|
|
||||||
|
title = postdata['title']['rendered'].encode(
|
||||||
|
'ascii','xmlcharrefreplace')
|
||||||
|
|
||||||
|
excerpt = postdata['excerpt']['rendered'].encode(
|
||||||
|
'ascii','xmlcharrefreplace')
|
||||||
|
|
||||||
|
ptester = re.compile('\<p\>(\w.*)\<\/p\>')
|
||||||
|
excerpt_first = ptester.match(excerpt).group(1)
|
||||||
|
|
||||||
|
thedict = {
|
||||||
|
'title': title,
|
||||||
|
'author': '',
|
||||||
|
'image': image_url,
|
||||||
|
'excerpt': excerpt_first,
|
||||||
|
'link': postdata['link'],
|
||||||
|
}
|
||||||
|
|
||||||
|
blogposts.append(thedict)
|
||||||
|
|
||||||
|
return JSONResponse(blogposts)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@login_required()
|
@login_required()
|
||||||
def deactivate_user(request):
|
def deactivate_user(request):
|
||||||
pk = request.user.id
|
pk = request.user.id
|
||||||
@@ -2463,6 +2528,7 @@ def rower_process_testcallback(request):
|
|||||||
|
|
||||||
|
|
||||||
def keyvalue_get_default(key,options,def_options):
|
def keyvalue_get_default(key,options,def_options):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return options[key]
|
return options[key]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -2481,17 +2547,17 @@ def cum_flex_data(
|
|||||||
'xparam':'spm',
|
'xparam':'spm',
|
||||||
'yparam1':'power',
|
'yparam1':'power',
|
||||||
'yparam2':'None',
|
'yparam2':'None',
|
||||||
'enddatestring':'',
|
'enddatestring':timezone.now().strftime("%Y-%m-%d"),
|
||||||
'startdatestring':'',
|
'startdatestring':(timezone.now()-datetime.timedelta(days=30)).strftime("%Y-%m-%d"),
|
||||||
'deltadays':-1,
|
'deltadays':-1,
|
||||||
}):
|
}):
|
||||||
|
|
||||||
def_options = options
|
def_options = options
|
||||||
|
|
||||||
|
|
||||||
if 'options' in request.session:
|
if 'options' in request.session:
|
||||||
options = request.session['options']
|
options = request.session['options']
|
||||||
|
|
||||||
|
|
||||||
modality = keyvalue_get_default('modality',options,def_options)
|
modality = keyvalue_get_default('modality',options,def_options)
|
||||||
rankingonly = keyvalue_get_default('rankingonly',options,def_options)
|
rankingonly = keyvalue_get_default('rankingonly',options,def_options)
|
||||||
includereststrokes = keyvalue_get_default('includereststrokes',options,def_options)
|
includereststrokes = keyvalue_get_default('includereststrokes',options,def_options)
|
||||||
@@ -2504,6 +2570,7 @@ def cum_flex_data(
|
|||||||
startdatestring = keyvalue_get_default('startdatestring',options,def_options)
|
startdatestring = keyvalue_get_default('startdatestring',options,def_options)
|
||||||
enddatestring = keyvalue_get_default('enddatestring',options,def_options)
|
enddatestring = keyvalue_get_default('enddatestring',options,def_options)
|
||||||
|
|
||||||
|
|
||||||
if modality == 'all':
|
if modality == 'all':
|
||||||
modalities = [m[0] for m in mytypes.workouttypes]
|
modalities = [m[0] for m in mytypes.workouttypes]
|
||||||
else:
|
else:
|
||||||
@@ -2582,8 +2649,8 @@ def histo_data(
|
|||||||
'modality':'all',
|
'modality':'all',
|
||||||
'waterboattype':mytypes.waterboattype,
|
'waterboattype':mytypes.waterboattype,
|
||||||
'theuser':0,
|
'theuser':0,
|
||||||
'enddatestring':'',
|
'enddatestring':timezone.now().strftime("%Y-%m-%d"),
|
||||||
'startdatestring':'',
|
'startdatestring':(timezone.now()-datetime.timedelta(days=30)).strftime("%Y-%m-%d"),
|
||||||
'deltadays':-1,
|
'deltadays':-1,
|
||||||
}):
|
}):
|
||||||
|
|
||||||
@@ -2676,8 +2743,8 @@ def cum_flex(request,theuser=0,
|
|||||||
startdate=timezone.now()-datetime.timedelta(days=10),
|
startdate=timezone.now()-datetime.timedelta(days=10),
|
||||||
enddate=timezone.now(),
|
enddate=timezone.now(),
|
||||||
deltadays=-1,
|
deltadays=-1,
|
||||||
startdatestring="",
|
enddatestring=timezone.now().strftime("%Y-%m-%d"),
|
||||||
enddatestring="",
|
startdatestring=(timezone.now()-datetime.timedelta(days=30)).strftime("%Y-%m-%d"),
|
||||||
options={
|
options={
|
||||||
'includereststrokes':False,
|
'includereststrokes':False,
|
||||||
'workouttypes':[i[0] for i in mytypes.workouttypes],
|
'workouttypes':[i[0] for i in mytypes.workouttypes],
|
||||||
@@ -2753,6 +2820,8 @@ def cum_flex(request,theuser=0,
|
|||||||
s = enddate
|
s = enddate
|
||||||
enddate = startdate
|
enddate = startdate
|
||||||
startdate = s
|
startdate = s
|
||||||
|
startdatestring = startdate.strftime('%Y-%m-%d')
|
||||||
|
enddatestring = enddate.strftime('%Y-%m-%d')
|
||||||
if modalityform.is_valid():
|
if modalityform.is_valid():
|
||||||
modality = modalityform.cleaned_data['modality']
|
modality = modalityform.cleaned_data['modality']
|
||||||
waterboattype = modalityform.cleaned_data['waterboattype']
|
waterboattype = modalityform.cleaned_data['waterboattype']
|
||||||
@@ -3049,14 +3118,14 @@ def histo(request,theuser=0,
|
|||||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||||
enddate=timezone.now(),
|
enddate=timezone.now(),
|
||||||
deltadays=-1,
|
deltadays=-1,
|
||||||
startdatestring="",
|
enddatestring=timezone.now().strftime("%Y-%m-%d"),
|
||||||
enddatestring="",
|
startdatestring=(timezone.now()-datetime.timedelta(days=30)).strftime("%Y-%m-%d"),
|
||||||
options={
|
options={
|
||||||
'includereststrokes':False,
|
'includereststrokes':False,
|
||||||
'workouttypes':[i[0] for i in mytypes.workouttypes],
|
'workouttypes':[i[0] for i in mytypes.workouttypes],
|
||||||
'waterboattype':mytypes.waterboattype,
|
'waterboattype':mytypes.waterboattype,
|
||||||
'rankingonly': False,
|
'rankingonly': False,
|
||||||
}):
|
}):
|
||||||
|
|
||||||
r = getrequestrower(request,userid=theuser)
|
r = getrequestrower(request,userid=theuser)
|
||||||
theuser = r.user
|
theuser = r.user
|
||||||
@@ -3124,6 +3193,8 @@ def histo(request,theuser=0,
|
|||||||
s = enddate
|
s = enddate
|
||||||
enddate = startdate
|
enddate = startdate
|
||||||
startdate = s
|
startdate = s
|
||||||
|
startdatestring = startdate.strftime('%Y-%m-%d')
|
||||||
|
enddatestring = enddate.strftime('%Y-%m-%d')
|
||||||
if modalityform.is_valid():
|
if modalityform.is_valid():
|
||||||
modality = modalityform.cleaned_data['modality']
|
modality = modalityform.cleaned_data['modality']
|
||||||
waterboattype = modalityform.cleaned_data['waterboattype']
|
waterboattype = modalityform.cleaned_data['waterboattype']
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ urlpatterns += [
|
|||||||
url(r'^admin/', admin.site.urls),
|
url(r'^admin/', admin.site.urls),
|
||||||
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
|
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
|
||||||
url(r'^$',rootview),
|
url(r'^$',rootview),
|
||||||
|
url(r'^getblogs$',rowersviews.get_blog_posts),
|
||||||
url(r'^login/',auth_views.login, name='login'),
|
url(r'^login/',auth_views.login, name='login'),
|
||||||
url(r'^logout/$',auth_views.logout,
|
url(r'^logout/$',auth_views.logout,
|
||||||
{'next_page': '/'},
|
{'next_page': '/'},
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
from django.shortcuts import render, redirect, render_to_response
|
from django.shortcuts import render, redirect, render_to_response
|
||||||
|
from django.template.loader import render_to_string
|
||||||
from django.template import RequestContext
|
from django.template import RequestContext
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from rowers.forms import LoginForm
|
from rowers.forms import LoginForm
|
||||||
|
from django.http import HttpResponse
|
||||||
|
|
||||||
from rowingdata import main as rmain
|
from rowingdata import main as rmain
|
||||||
|
|
||||||
|
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
|
||||||
def rootview(request):
|
def rootview(request):
|
||||||
magicsentence = rmain()
|
magicsentence = rmain()
|
||||||
loginform = LoginForm()
|
loginform = LoginForm()
|
||||||
|
|||||||
@@ -324,6 +324,28 @@ th.rotate > div > span {
|
|||||||
z-index: -1;
|
z-index: -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.vignet2 {
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 200px;
|
||||||
|
height: 200px;
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 5px;
|
||||||
|
margin: 5px;
|
||||||
|
-webkit-box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
|
||||||
|
-moz-box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
|
||||||
|
box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
|
||||||
|
|
||||||
|
line-height: 0; /* ensure no space between bottom */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.vignet2 img {
|
||||||
|
position: center;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
font: 1.1em/1.5em sans-serif;
|
font: 1.1em/1.5em sans-serif;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
|||||||
Reference in New Issue
Block a user