Private
Public Access
1
0

Merge branch 'feature/sliders' into develop

This commit is contained in:
sanderroosendaal
2016-10-31 15:36:12 +01:00
259 changed files with 228 additions and 21281 deletions

Binary file not shown.

View File

@@ -1,3 +0,0 @@
from __future__ import absolute_import
from .tasks import app as celery_app

View File

@@ -1,22 +0,0 @@
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
from django.conf import settings # noqa
app = Celery('proj')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))

Binary file not shown.

View File

@@ -1,29 +0,0 @@
from django import forms
from rowers.models import Workout
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)
workouttype = forms.ChoiceField(required=True,
choices=Workout.workouttypes,
initial='rower')
fileformat = forms.ChoiceField(required=True,
choices=filetypechoices,
initial='csv')
class Meta:
fields = ['title','file','workouttype','fileformat']

Binary file not shown.

View File

@@ -1,5 +0,0 @@
# -*- coding: utf-8 -*-
from django.db import models
class Document(models.Model):
docfile = models.FileField(upload_to='documents/%Y/%m/%d')

Binary file not shown.

View File

@@ -1,3 +0,0 @@
def addrc(x,y):
return x+y

Binary file not shown.

View File

@@ -1,80 +0,0 @@
import time
from django.core.exceptions import ValidationError
def format_pace_tick(x,pos=None):
min=int(x/60)
sec=int(x-min*60.)
sec_str=str(sec).zfill(2)
template='%d:%s'
return template % (min,sec_str)
def format_time_tick(x,pos=None):
hour=int(x/3600)
min=int((x-hour*3600.)/60)
min_str=str(min).zfill(2)
template='%d:%s'
return template % (hour,min_str)
def format_pace(x,pos=None):
if isinf(x) or isnan(x):
x=0
min=int(x/60)
sec=(x-min*60.)
str1 = "{min:0>2}:{sec:0>4.1f}".format(
min = min,
sec = sec
)
return str1
def format_time(x,pos=None):
min = int(x/60.)
sec = int(x-min*60)
str1 = "{min:0>2}:{sec:0>4.1f}".format(
min=min,
sec=sec,
)
return str1
def validate_file_extension(value):
import os
ext = os.path.splitext(value.name)[1]
valid_extensions = ['.tcx','.csv','.TCX','.CSV','.fit','.FIT']
if not ext in valid_extensions:
raise ValidationError(u'File not supported!')
def must_be_csv(value):
import os
ext = os.path.splitext(value.name)[1]
valid_extensions = ['.csv','.CSV']
if not ext in valid_extensions:
raise ValidationError(u'File not supported!')
def handle_uploaded_file(f):
fname = f.name
timestr = time.strftime("%Y%m%d-%H%M%S")
fname = timestr+'-'+fname
fname2 = 'media/'+fname
with open(fname2,'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
return fname,fname2
# this might work on windows
#import magic
#def validate_mime_type(value):
# supported_types=['text/csv','application/vnd.garmin.tcx+xml']
# with magic.Magic(flags=magic.MAGIC_MIME_TYPE) as m:
# mime_type=m.id_buffer(value.file.read())
# value.file.seek(0)
# if mime_type not in supported_types:
# raise ValidationError(u'Unsupported file type.')

Binary file not shown.

View File

@@ -1,236 +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/
"""
# -*- coding: utf-8 -*-
import os
from django.utils.translation import ugettext_lazy as _
DEFAULT_CHARSET = 'UTF-8'
# 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 = 'z_@2yia858=2i1cygo4ne3+14&i_&@wlty68$q1igdvn=9k5mo'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['rowsandall.com','rowsandall-1072.rostiapp.cz']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rowers',
'cvkbrno',
'django_rq',
'translation_manager',
'debug_toolbar',
'django_mailbox',
]
MIDDLEWARE_CLASSES = [
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'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',
'django.template.context_processors.i18n',
],
# 'loaders': [
# 'django.template.loaders.app_directories.Loader',
# ],
},
},
]
WSGI_APPLICATION = 'rowsandall_app.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'rowsanda_107501',
'USER': 'rowsanda_107501',
'PASSWORD': 'roeidata',
'HOST': 'store3.rosti.cz',
'PORT': '3306',
},
'slave': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'TEST': {
'CHARSET': 'utf8',
'COLLATION': 'utf8_general_ci',
},
}
# 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/
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
os.path.join(BASE_DIR, 'cvkbrno/locale'),
)
LANGUAGES = (
('cs',_(u'Czech')),
('nl',_(u'Dutch'))
)
LANGUAGE_CODE = 'en-us'
LANGUAGE_COOKIE_NAME = 'wm_lang'
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'static/plots'),]
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_IGNORE_RESULT = False
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TRACK_STARTED = True
CELERY_SEND_TASK_SENT_EVENT = True
# user authentication
# user authentication
LOGIN_REDIRECT_URL = '/rowers/list-workouts/'
LOGIN_URL = '/login/'
# Concept 2
C2_CLIENT_ID = "bgTBbmjSyn8wbJb0JEdlYjDUfSZFAPQSzJV8YDwH"
C2_CLIENT_SECRET = "HD6HnEu8bFWGkrpGoa89kliXhofLzAHzllltWMPg"
C2_REDIRECT_URI = "http://rowsandall.com/call_back"
# Strava
STRAVA_CLIENT_ID = "11567"
STRAVA_CLIENT_SECRET = "9e55d439879e1da6724e75e4a3220b35a493fe24"
STRAVA_REDIRECT_URI = "http://rowsandall.com/stravacall_back"
# SportTracks
SPORTTRACKS_CLIENT_ID = "rowingdata"
SPORTTRACKS_CLIENT_SECRET = "3GZVXH8GB4PZQHPD"
SPORTTRACKS_REDIRECT_URI = "http://rowsandall.com/sporttracks_callback"
# RQ stuff
RQ_QUEUES = {
'default': {
'HOST': 'localhost',
'PORT': 6379,
'DB': 0,
# 'PASSWORD': 'some-password',
'DEFAULT_TIMEOUT': 360,
},
'low': {
'HOST': 'localhost',
'PORT': 6379,
'DB': 0,
# 'PASSWORD': 'some-password',
'DEFAULT_TIMEOUT': 360,
},
}
#SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
#SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# email stuff
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'mail.rosti.cz'
EMAIL_PORT = '25'
EMAIL_HOST_USER = 'info@rowsandall.com'
EMAIL_HOST_PASSWORD = 'lnD3mbZ1NoI8RK1StOdO'
EMAIL_USE_TLS = True
# weather stuff
FORECAST_IO_KEY = "bc8196fbd89f11375c7dfc8aa6323c72"
GMAPIKEY = "AIzaSyAgu1w9QSthaGPMLp8y9JedPoMc9sfEgJ8"

Binary file not shown.

View File

@@ -1,64 +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/
"""
from settings import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),},
# 'TEST': {
# 'CHARSET': 'utf8',
# 'COLLATION': 'utf8_general_ci',
# },
# 'slave': {
# 'ENGINE': 'django.db.backends.mysql',
# 'NAME': 'rowsanda_107501',
# 'USER': 'rowsanda_107501',
# 'PASSWORD': 'roeidata',
# 'HOST': 'store3.rosti.cz',
# 'PORT': '3306',
# }
}
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
STATIC_URL = '/static/'
STATIC_ROOT = 'C:/python/rowsandallapp'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
LOGIN_REDIRECT_URL = '/rowers/list-workouts/'
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
#EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
#EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
#EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
#EMAIL_HOST = 'localhost'
#EMAIL_PORT = '1025'
#EMAIL_HOST_USER = ''
#EMAIL_HOST_PASSWORD = ''
#EMAIL_USE_TLS = True

Binary file not shown.

View File

@@ -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': [],
'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 = 'UTC'
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/'

View File

@@ -1,42 +0,0 @@
from celery import Celery
import os
import rowingdata
from rowingdata import main as rmain
from rowingdata import rowingdata as rdata
import rowingdata
from matplotlib.backends.backend_agg import FigureCanvasAgg
import matplotlib.pyplot as plt
from rowers.models import Rower, User
app = Celery('tasks',
broker='redis://localhost',
backend='redis://localhost',)
# Using a string here means the worker will not have to
# pickle the object when using Windows.
#app.config_from_object('django.conf:settings')
@app.task
def add(x, y):
return x + y
@app.task
def handle_makeplot(f1,f2,t): #,user):
r = Rower.objects.get(user=user)
rr = rowingdata.rower(hrmax=r.max,hrut2=r.ut2,hrut1=r.ut1,hrat=r.at,
hrtr=r.tr,hran=r.an,weightcategory=r.weightcategory)
row = rdata(f2,rower=rr)
fig1 = row.get_timeplot_erg(t)
canvas = FigureCanvasAgg(fig1)
imagename = f1+'.png'
plt.savefig('static/plots/'+imagename,format='png')
plt.close(fig1)
return imagename
def add2(x,y):
return x+y

Binary file not shown.

View File

@@ -1,58 +0,0 @@
"""rowsandall_app URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.9/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
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 django.contrib.auth import views as auth_views
from rowers import views as rowersviews
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url('^', include('django.contrib.auth.urls')),
url(r'^$',rootview),
url(r'^version/$',version),
# url(r'^rowingdata/$',rowingdata,{'formloc':'/rowingdata/'}),
# url(r'^nrowingdata/$',nrowingdata,{'formloc':'/nrowingdata/'}),
# url(r'^upload/$',uploadfile,{'formloc':'/upload/'}),
url(r'^addresult/(.+.*)/$',wait),
# url(r'^waitforplot/(.+.*)/$',waitforplot),
# url(r'^showplot/(.+.*)/$',showplot),
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'),
url(r'^password_change/',auth_views.password_change),
url(r'^password_reset/$',auth_views.password_reset,name='password_reset'),
url(r'^password_reset_done/$',auth_views.password_reset_done,name='password_reset_done'),
url(r'^password_reset_confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', 'django.contrib.auth.views.password_reset_confirm',name='password_reset_confirm'),
url(r'^password_reset_confirm/$',auth_views.password_reset_confirm,name='password_reset_confirm'),
url(r'^password_reset_complete/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', 'django.contrib.auth.views.password_reset_complete',name='password_reset_complete'),
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'^interactiveplot',interactiveplot),
url(r'^i18n/', include('django.conf.urls.i18n')),
]

Binary file not shown.

View File

@@ -1,258 +0,0 @@
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, 'base.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)+". <p>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)

Binary file not shown.