Merge branch 'feature/sliders' into develop
This commit is contained in:
Binary file not shown.
@@ -1,3 +0,0 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
from .tasks import app as celery_app
|
||||
@@ -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.
@@ -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.
@@ -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.
@@ -1,3 +0,0 @@
|
||||
|
||||
def addrc(x,y):
|
||||
return x+y
|
||||
Binary file not shown.
@@ -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.
@@ -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.
@@ -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.
@@ -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/'
|
||||
@@ -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.
@@ -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.
@@ -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.
Reference in New Issue
Block a user