From 4fb1bee385ff333f49e01cf51d219987d973ab3b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 22 Nov 2016 13:58:32 +0100 Subject: [PATCH] Search form and pagination --- rowers/interactiveplots.py | 18 ++++++--- rowers/templates/comparison_list.html | 24 ++++++++++++ rowers/templates/list_graphs.html | 8 ++++ rowers/templates/list_workouts.html | 35 ++++++++++++++++- rowers/views.py | 55 ++++++++++++++++++++++++++- static/css/rowsandall.css | 19 ++++++++- 6 files changed, 151 insertions(+), 8 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 5e358a15..7228a80e 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -5,6 +5,8 @@ from rowingdata import cumcpdata,histodata from rowingdata import rowingdata as rrdata +from django.utils import timezone + from bokeh.plotting import figure, ColumnDataSource, Figure,curdoc from bokeh.models import CustomJS,Slider from bokeh.charts import Histogram,HeatMap @@ -570,7 +572,6 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, datadf = dataprep.smalldataprep(theworkouts,xparam,yparam1,yparam2) - axlabels = { 'time': 'Time', 'distance': 'Distance (m)', @@ -631,11 +632,16 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, return ['','

No non-zero data in selection

','',''] - datadf['x1'] = datadf.ix[:,xparam] - - datadf['y1'] = datadf.ix[:,yparam1] + # datadf['x1'] = datadf.ix[:,xparam] + datadf = datadf.rename(columns={ + xparam:'x1', + yparam1:'y1', + }) + + # datadf['y1'] = datadf.ix[:,yparam1] if yparam2 != 'None': - datadf['y2'] = datadf.ix[:,yparam2] + # datadf['y2'] = datadf.ix[:,yparam2] + datadf = datadf.rename(columns={yparam2:'y2'}) else: datadf['y2'] = datadf['y1'] @@ -674,6 +680,8 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, datadf.copy() ) + print "jet",timezone.now() + # Add hover to this comma-separated string and see what changes if (promember==1): TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,resize,crosshair' diff --git a/rowers/templates/comparison_list.html b/rowers/templates/comparison_list.html index a0fbcadb..9db40a2a 100644 --- a/rowers/templates/comparison_list.html +++ b/rowers/templates/comparison_list.html @@ -30,6 +30,14 @@ Weight Category:{{ workout.weightcategory }} +
+ + +
+
@@ -73,5 +81,21 @@ {% else %}

No workouts found

{% endif %} + +
+ + {% if workouts.has_previous %} + < + {% endif %} + + + Page {{ workouts.number }} of {{ workouts.paginator.num_pages }}. + + + {% if workouts.has_next %} + > + {% endif %} + +
{% endblock %} diff --git a/rowers/templates/list_graphs.html b/rowers/templates/list_graphs.html index 921960cc..bfc1e571 100644 --- a/rowers/templates/list_graphs.html +++ b/rowers/templates/list_graphs.html @@ -6,6 +6,14 @@ {% block content %}

Recent Graphs

+ +
+ + +
{% if graphs1 %}

 

diff --git a/rowers/templates/list_workouts.html b/rowers/templates/list_workouts.html index 0b4334ef..31c1ce88 100644 --- a/rowers/templates/list_workouts.html +++ b/rowers/templates/list_workouts.html @@ -5,8 +5,10 @@ {% block title %}Workouts{% endblock %} {% block content %} +

My Workouts

- {% if workouts %} + +{% if workouts %} @@ -49,4 +51,35 @@ {% else %}

No workouts found

{% endif %} + +
+
+
+ +
+
+ +
+ +
+
+ + {% if workouts.has_previous %} + < + {% endif %} + + + Page {{ workouts.number }} of {{ workouts.paginator.num_pages }}. + + + {% if workouts.has_next %} + > + {% endif %} + +
+ + {% endblock %} diff --git a/rowers/views.py b/rowers/views.py index 96bf21ee..1fe4f108 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -1,11 +1,14 @@ import time +import operator from django.views.generic.base import TemplateView +from django.db.models import Q from django.shortcuts import render from django.http import HttpResponse, HttpResponseRedirect from django.contrib.auth import authenticate, login, logout from rowers.forms import LoginForm,DocumentsForm,UploadOptionsForm from django.core.urlresolvers import reverse from django.template import RequestContext +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.conf import settings from django.utils.datastructures import MultiValueDictKeyError from django.utils import timezone,translation @@ -1772,7 +1775,26 @@ def workouts_view(request,message='',successmessage=''): # successmessage = 'New Workouts have been created from email' workouts = Workout.objects.filter(user=r).order_by("-date", "-starttime") - + 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,25) # 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) + return render(request, 'list_workouts.html', {'workouts': workouts, 'message': message, @@ -1787,6 +1809,27 @@ def workout_comparison_list(request,id=0,message='',successmessage=''): r = Rower.objects.get(user=request.user) u = User.objects.get(id=r.user.id) workouts = Workout.objects.filter(user=r).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 = Workout.objects.get(id=id) return render(request, 'comparison_list.html', @@ -3942,6 +3985,16 @@ def graphs_view(request): try: r = Rower.objects.get(user=request.user) workouts = Workout.objects.filter(user=r).order_by("-date", "-starttime") + 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)) + ) + g = GraphImage.objects.filter(workout__in=workouts).order_by("-creationdatetime") if (len(g)<=5): return render(request, 'list_graphs.html', diff --git a/static/css/rowsandall.css b/static/css/rowsandall.css index dcfe9580..d163a455 100644 --- a/static/css/rowsandall.css +++ b/static/css/rowsandall.css @@ -17,14 +17,19 @@ a { text-decoration: none; } + a:visited { color:#000; } a:link { color: #000; } + a:hover { text-decoration: underline; } + + + h1 { /* font-family: Georgia, serif; */ font-weight: normal; @@ -471,4 +476,16 @@ a.button { .flexplot { position: relative; z-index: 10; -} \ No newline at end of file +} + +a.wh:link { + color: #e9e9e9; +} + +a.wh:visited { + color: #e9e9e9; +} + +a.wh:hover { + color: #e9e9e9; +}