=mina && x1[i]<=maxa && z1[i]<=maxz && z1[i]>=minz) {
- data2['x'].push(x1[i])
- data2['y'].push(y1[i])
- data2['z'].push(z1[i])
- }
- }
-
- source2.trigger('change');
- """)
-
- s1 = Slider(start=0.0, end=5,value=0.0, step=.1,title="Min X Value",callback=callback)
- callback.args["mina"] = s1
-
- s2 = Slider(start=0.0, end=5,value=5.0, step=.1,title="Max X Value",callback=callback)
- callback.args["maxa"] = s2
-
- s3 = Slider(start=0.0, end=25,value=0.0, step=.1,title="Min Z Value",callback=callback)
- callback.args["minz"] = s3
-
- s4 = Slider(start=0.0, end=25,value=25.0, step=.1,title="Max Z Value",callback=callback)
- callback.args["maxz"] = s4
-
- hover = plot.select(dict(type=HoverTool))
-
- hover.tooltips = OrderedDict([
- ('X value','@x'),
- ('Y value','@y'),
- ('Z value','@z'),
- ])
-
- hover.mode = 'mouse'
-
- layout = layoutrow([layoutcolumn([s1,s2,s3,s4]),plot])
-# widgetbox(s)
- script, div = components(layout)
- js_resources = INLINE.render_js()
- css_resources = INLINE.render_css()
- return render(request,
- 'test.html',
- {'the_script': script,
- 'the_div': div,
- 'js_res': js_resources,
- 'css_res':css_resources,
- })
-
-#@user_passes_test(promember,login_url="/",redirect_field_name=None)
+# The interactive plot with the colored Heart rate zones
def workout_biginteractive_view(request,id=0,message="",successmessage=""):
row = Workout.objects.get(id=id)
# check if user is owner of this workout
@@ -3007,6 +2909,7 @@ def workout_biginteractive_view(request,id=0,message="",successmessage=""):
'promember':promember,
'mayedit':mayedit})
+# The interactive plot with wind corrected pace for OTW outings
def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
row = Workout.objects.get(id=id)
# check if user is owner of this workout
@@ -4414,31 +4317,6 @@ def graph_delete_view(request,id=0):
return HttpResponse("Graph Image doesn't exist")
-@login_required()
-def dashboard_view(request,message="",successmessage=""):
- try:
- request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
-
- r = Rower.objects.get(user=request.user)
- workouts = Workout.objects.filter(user=r).order_by("-date", "-starttime")
- g = GraphImage.objects.filter(workout__in=workouts).order_by("-creationdatetime")
- if (len(g)<=3):
- return render(request,'dashboard.html',
- {'workouts':workouts,
- 'graphs1':g[0:3],
- 'message':message,
- 'successmessage':successmessage})
- else:
- return render(request,'dashboard.html',
- {'workouts':workouts,
- 'graphs1':g[0:3],
- 'graphs2':g[3:6],
- 'message':message,
- 'successmessage':successmessage})
-
- except Rower.DoesNotExist:
- return HttpResponse("User has no rower instance")
-
@login_required()
def graphs_view(request):
diff --git a/rowsandall_app/forms.py b/rowsandall_app/forms.py
index 55b40689..97f5d436 100644
--- a/rowsandall_app/forms.py
+++ b/rowsandall_app/forms.py
@@ -1,33 +1,5 @@
from django import forms
-from rowers.models import Workout
-from rows import validate_file_extension
-
-class ContactForm(forms.Form):
- subject = forms.CharField()
- email = forms.EmailField(required=False)
- message = forms.CharField(widget=forms.Textarea)
-
-class DocumentsForm(forms.Form):
- filetypechoices = (
- ('tcx' , 'TCX'),
- ('csv' , 'Painsled CSV')
- )
- title = forms.CharField(required=False)
- file = forms.FileField(required=True,
- validators=[validate_file_extension])
- workouttype = forms.ChoiceField(required=True,
- choices=Workout.workouttypes,
- initial='rower')
- fileformat = forms.ChoiceField(required=True,
- choices=filetypechoices,
- initial='csv')
- notes = forms.CharField(required=False,
- widget=forms.Textarea)
-
- class Meta:
- fields = ['title','file','workouttype','fileformat']
-
diff --git a/rowsandall_app/models.py b/rowsandall_app/models.py
index 070f1f9f..9ae69826 100644
--- a/rowsandall_app/models.py
+++ b/rowsandall_app/models.py
@@ -1,7 +1,3 @@
# -*- coding: utf-8 -*-
from django.db import models
-from rows import validate_file_extension
-class Document(models.Model):
- docfile = models.FileField(upload_to='documents/%Y/%m/%d',
- validators=[validate_file_extension])
diff --git a/rowsandall_app/rctasks.py b/rowsandall_app/rctasks.py
deleted file mode 100644
index 2546b73e..00000000
--- a/rowsandall_app/rctasks.py
+++ /dev/null
@@ -1,3 +0,0 @@
-
-def addrc(x,y,z):
- return int(x)+int(y)
diff --git a/rowsandall_app/settings_orig.py b/rowsandall_app/settings_orig.py
deleted file mode 100644
index 8e6b74bb..00000000
--- a/rowsandall_app/settings_orig.py
+++ /dev/null
@@ -1,121 +0,0 @@
-"""
-Django settings for rowsandall_app project.
-
-Generated by 'django-admin startproject' using Django 1.9.5.
-
-For more information on this file, see
-https://docs.djangoproject.com/en/1.9/topics/settings/
-
-For the full list of settings and their values, see
-https://docs.djangoproject.com/en/1.9/ref/settings/
-"""
-
-import os
-
-# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
-BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-
-
-# Quick-start development settings - unsuitable for production
-# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/
-
-# SECURITY WARNING: keep the secret key used in production secret!
-SECRET_KEY = '&cg#y8h-8s#00ayk#gu)+l43j1j9^9r&qf$3!$x#ov@1houiph'
-
-# SECURITY WARNING: don't run with debug turned on in production!
-DEBUG = True
-
-ALLOWED_HOSTS = []
-
-
-# Application definition
-
-INSTALLED_APPS = [
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
-]
-
-MIDDLEWARE_CLASSES = [
- 'django.middleware.security.SecurityMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.common.CommonMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- 'django.middleware.clickjacking.XFrameOptionsMiddleware',
-]
-
-ROOT_URLCONF = 'rowsandall_app.urls'
-
-TEMPLATES = [
- {
- 'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [os.path.join(BASE_DIR,'templates')],
- 'APP_DIRS': True,
- 'OPTIONS': {
- 'context_processors': [
- 'django.template.context_processors.debug',
- 'django.template.context_processors.request',
- 'django.contrib.auth.context_processors.auth',
- 'django.contrib.messages.context_processors.messages',
- ],
- },
- },
-]
-
-WSGI_APPLICATION = 'rowsandall_app.wsgi.application'
-
-
-# Database
-# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
-
-DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
- }
-}
-
-
-# Password validation
-# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
-
-AUTH_PASSWORD_VALIDATORS = [
- {
- 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
- },
- {
- 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
- },
- {
- 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
- },
- {
- 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
- },
-]
-
-
-# Internationalization
-# https://docs.djangoproject.com/en/1.9/topics/i18n/
-
-LANGUAGE_CODE = 'en-us'
-
-TIME_ZONE = 'Europe/Prague'
-
-USE_I18N = True
-
-USE_L10N = True
-
-USE_TZ = True
-
-
-# Static files (CSS, JavaScript, Images)
-# https://docs.djangoproject.com/en/1.9/howto/static-files/
-
-STATIC_URL = '/static/'
diff --git a/rowsandall_app/templates/interactiveplot.html b/rowsandall_app/templates/interactiveplot.html
deleted file mode 100644
index d4585020..00000000
--- a/rowsandall_app/templates/interactiveplot.html
+++ /dev/null
@@ -1,3 +0,0 @@
-graph = {{ my_data|safe }};
-
-mpld3.draw_figure("fig01", graph);
\ No newline at end of file
diff --git a/rowsandall_app/urls.py b/rowsandall_app/urls.py
index 3415cd36..b90e14d6 100644
--- a/rowsandall_app/urls.py
+++ b/rowsandall_app/urls.py
@@ -17,9 +17,7 @@ from django.conf.urls import url,include
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
-from rowsandall_app.views import rootview,version,rowingdata,showStaticImage,\
- add,wait,nrowingdata,waitforplot,showplot,interactiveplot
-from rowsandall_app.views import uploadfile
+from rowsandall_app.views import rootview
from django.contrib.auth import views as auth_views
from rowers import views as rowersviews
@@ -28,8 +26,6 @@ urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^$',rootview),
- url(r'^version/$',version),
- url(r'^addresult/(.+.*)/$',wait),
url(r'^login/',auth_views.login, name='login'),
url(r'^logout/',auth_views.logout_then_login,name='logout'),
url(r'^password_change_done/$',auth_views.password_change_done,name='password_change_done'),
@@ -42,12 +38,10 @@ urlpatterns = [
url(r'^password_reset_complete/$',auth_views.password_reset_complete,name='password_reset_complete'),
url(r'^rowers/',include('rowers.urls')),
url(r'^cvkbrno/',include('cvkbrno.urls')),
- url(r'^add/(\d+)/(\d+)/$',add),
url(r'^call\_back',rowersviews.rower_process_callback),
url(r'^stravacall\_back',rowersviews.rower_process_stravacallback),
url(r'^sporttracks\_callback',rowersviews.rower_process_sporttrackscallback),
url(r'^twitter\_callback',rowersviews.rower_process_twittercallback),
- url(r'^interactiveplot',interactiveplot),
url(r'^i18n/', include('django.conf.urls.i18n')),
]
diff --git a/rowsandall_app/views.py b/rowsandall_app/views.py
index 6f351bcf..921e05f6 100644
--- a/rowsandall_app/views.py
+++ b/rowsandall_app/views.py
@@ -1,258 +1,11 @@
-from django.http import HttpResponse,Http404,HttpResponseRedirect
-from django.template import Template, Context
-from django.template.loader import get_template
from django.shortcuts import render, redirect, render_to_response
from django.conf import settings
-from rowsandall_app.forms import ContactForm,DocumentsForm
-from django.core.mail import send_mail
-from django.core.urlresolvers import reverse
-from matplotlib.pyplot import figure, axes, pie, title
-from matplotlib.backends.backend_agg import FigureCanvasAgg
-from matplotlib.ticker import MultipleLocator,FuncFormatter,NullFormatter
-import matplotlib.pyplot as plt
-from rowingdata import rower as rrower
+
from rowingdata import main as rmain
-from rowingdata import rowingdata as rdata
-from rowingdata import TCXParser
-import StringIO
-from django.contrib.auth.decorators import login_required
-
-import django_rq
-queue = django_rq.get_queue('default')
-
-import datetime
-import pandas as pd
-import os
-import numpy as np
-import json
-import mpld3
-
-from rctasks import addrc
-
-from rows import *
-from rowers.tasks import add as addtask
-from rowers.tasks import handle_makeplot
-from celery.result import AsyncResult
-from celery.exceptions import TimeoutError
-from rowers.models import Rower,User,Workout,GraphImage
-
-
-def showStaticImage(request,imagename):
- return render(request, 'image_page.html', {'imagename': imagename})
def rootview(request):
magicsentence = rmain()
return render(request, 'frontpage.html', {'versionstring': magicsentence})
-def version(request):
- magicsentence = rmain()
- return render(request, 'base.html', {'versionstring': magicsentence})
-def rowingdata(request,formloc):
- if request.method == 'POST':
- form = DocumentsForm(request.POST,request.FILES)
-
- if form.is_valid():
- f = request.FILES['file']
- t = request.POST['title']
- res = handle_uploaded_file(f)
- f1 = res[0]
- f2 = res[1]
- row = rdata(f2)
- fig1 = row.get_timeplot_erg(t)
-
- canvas = FigureCanvasAgg(fig1)
- # response = HttpResponse(content_type='image/png')
- # canvas.print_png(response)
- imagename = f1+'.png'
- plt.savefig('static/plots/'+imagename,format='png')
- plt.close(fig1)
- response = render(request,'image_page.html',{'imagename':'plots/'+imagename})
-
- else:
- response = HttpResponse("invalid form")
-
- return response
- else:
- form = DocumentsForm()
- return render(request, 'document_form.html',
- {'form':form, 'formloc': formloc})
-
-@login_required()
-def nrowingdata(request,formloc):
- if request.method == 'POST':
- form = DocumentsForm(request.POST,request.FILES)
-
- if form.is_valid():
- f = request.FILES['file']
- res = handle_uploaded_file(f)
- t = request.POST['title']
- fileformat = request.POST['fileformat']
- workouttype = request.POST['workouttype']
- notes = request.POST['notes']
-
- f1 = res[0] # file name
- f2 = res[1] # file name incl media directory
-
- # handle TCX
- if (fileformat == 'tcx'):
- row = TCXParser(f2)
- f_to_be_deleted = f2
- # should delete file
- f2 = f2+'.csv'
- row.write_csv(f2)
- os.remove(f_to_be_deleted)
-
- imagename = f1+'.png'
- fullpathimagename = 'static/plots/'+imagename
- u = request.user
- r = Rower.objects.get(user=request.user)
- hrdata = {
- 'hrmax':r.max,
- 'hrut2':r.ut2,
- 'hrut1':r.ut1,
- 'hrat':r.at,
- 'hrtr':r.tr,
- 'hran':r.an,
- }
-
- # make plot - asynchronous task
- res = handle_makeplot.delay(f1,f2,t,hrdata)
-
- # make workout and put in database
- rr = rrower(hrmax=r.max,hrut2=r.ut2,
- hrut1=r.ut1,hrat=r.at,
- hrtr=r.tr,hran=r.an)
- row = rdata(f2,rower=rr)
- totaldist = row.df['cum_dist'].max()
- totaltime = row.df['TimeStamp (sec)'].max()-row.df['TimeStamp (sec)'].min()
- totaltime = totaltime+row.df.ix[0,' ElapsedTime (sec)']
-
-
- hours = int(totaltime/3600.)
- minutes = int((totaltime - 3600.*hours)/60.)
- seconds = int(totaltime - 3600.*hours - 60.*minutes)
-
- duration = "%s:%s:%s" % (hours,minutes,seconds)
-
-
- workoutdate = row.rowdatetime.strftime('%Y-%m-%d')
- workoutstarttime = row.rowdatetime.strftime('%H:%M:%S')
-
- # check for duplicate start times
- r = Rower.objects.get(user=request.user)
-
- ws = Workout.objects.filter(starttime=workoutstarttime,
- user=r)
- if (len(ws) != 0):
- print "Warning: This workout probably already exists in the database"
-
- w = Workout(user=r,name=t,date=workoutdate,workouttype=workouttype,
- duration=duration,distance=totaldist,
- weightcategory=r.weightcategory,
- starttime=workoutstarttime,
- csvfilename=f2,notes=notes)
- w.save()
-
- i = GraphImage(workout=w,creationdatetime=datetime.datetime.now(),
- filename=fullpathimagename)
- i.save()
-
- url = reverse(waitforplot,args=[str(res.id)])
- return HttpResponseRedirect(url)
-
- else:
- response = HttpResponse("invalid form")
-
- return response
- else:
- form = DocumentsForm()
- return render(request, 'document_form.html',
- {'form':form, 'formloc': formloc})
-
-
-
-def uploadfile(request,formloc):
- if request.method == 'POST':
- form = DocumentsForm(request.POST, request.FILES)
-
- if form.is_valid():
- result = handle_uploaded_file(request.FILES['file'])
- return HttpResponse("succes! "+result)
- else:
- return HttpResponse("Invalid Form")
- else:
- form = DocumentsForm()
- return render(request, 'document_form.html',
- {'form': form, 'formloc':formloc})
-
-@login_required()
-def add(request,x,y):
- if settings.DEBUG:
- task = addtask.apply_async((int(x),int(y)),countdown=10)
- task_id = AsyncResult(task)
- print task.id
- else:
- task = queue.enqueue(addrc,x,y,0)
- task_id = task.id
-
- url = reverse(wait,args=[str(task_id)])
- return HttpResponseRedirect(url)
-
-
-
-
-def wait(request,task_id=""):
- if settings.DEBUG:
- res = AsyncResult(task_id)
- else:
- res = queue.fetch_job(task_id)
- if (res.status == 'SUCCESS') or (res.status == 'finished'):
- return HttpResponse("Task complete. Result: "+str(res.result))
- else:
- m = "Task status: "+str(res.status)
- return render(request,'waiting_page.html',{'message':m})
- return HttpResponse("Task status: "+str(res.status)+". Hit reload to check again")
-
-
-def waitforplot(request,task_id=""):
- res = AsyncResult(task_id)
- if (res.status == 'SUCCESS'):
- url = reverse(showplot,args=[str(res.result)])
- return HttpResponseRedirect(url)
- else:
- m = "Task status: "+str(res.status)
-
- return render(request,'waiting_page.html',{'message':m})
-
-def showplot(request,imagename=""):
- return render(request,'image_page.html',{'imagename':'plots/'+imagename})
-
-
-def contact(request):
- if request.method == 'POST':
- form = ContactForm(request.POST)
- if form.is_valid():
- cd = form.cleaned_data
- send_mail(
- cd['subject'],
- cd['message'],
- cd.get('email', 'noreply@example.com'),
- ['siteowner@example.com'],
- )
- return HttpResponseRedirect('/contact/thanks/')
- else:
- form = ContactForm()
- return render(request, 'contact_form.html', {'form': form})
-
-def interactiveplot(request):
- x = np.linspace(-10,10,num=1200)
- y = x**2-5*x+4
- fig = plt.figure(figsize=(6,5))
- graph = plt.plot(x,y)
- g = mpld3.fig_to_html(fig)
- # js_data = json.dumps(mpld3.fig_to_dict(fig))
- plt.close()
- # return render(request,'interactiveplot.html',{"my_data":js_data})
- return HttpResponse(g)
diff --git a/rowsandall_app/wsgi.py b/rowsandall_app/wsgi.py
index a6d5107e..62686321 100644
--- a/rowsandall_app/wsgi.py
+++ b/rowsandall_app/wsgi.py
@@ -13,4 +13,4 @@ from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "rowsandall_app.settings")
-application = get_wsgi_application()
+application = get_wsgi_application()