Private
Public Access
1
0

Merge branch 'release/v8.25'

This commit is contained in:
Sander Roosendaal
2018-10-25 13:09:15 +02:00
11 changed files with 445 additions and 39 deletions
+53 -15
View File
@@ -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>
&nbsp; &nbsp;
</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 %}
+17
View File
@@ -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 %}
+1 -1
View File
@@ -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>&nbsp;Blog <i class="fab fa-wordpress-simple fa-fw"></i>&nbsp;Blog
</a> </a>
</li> </li>
+250 -2
View File
@@ -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
View File
@@ -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),
+3
View File
@@ -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
View File
@@ -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']
+1
View File
@@ -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': '/'},
+4
View File
@@ -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()
+22
View File
@@ -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;