Private
Public Access
1
0

Merge branch 'develop' into feature/restapi

This commit is contained in:
Sander Roosendaal
2016-12-20 11:36:05 +01:00
10 changed files with 118 additions and 40 deletions

View File

@@ -2,7 +2,7 @@ from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from .models import Rower, Workout,GraphImage,FavoriteChart
from .models import Rower, Workout,GraphImage,FavoriteChart,SiteAnnouncement
# Register your models here.
@@ -19,9 +19,13 @@ class WorkoutAdmin(admin.ModelAdmin):
class FavoriteChartAdmin(admin.ModelAdmin):
list_display = ('user','xparam','yparam1','yparam2','plottype','workouttype','reststrokes')
class SiteAnnouncementAdmin(admin.ModelAdmin):
list_display = ('announcement','created','modified','expires')
admin.site.unregister(User)
admin.site.register(User,UserAdmin)
admin.site.register(Workout,WorkoutAdmin)
admin.site.register(GraphImage)
admin.site.register(FavoriteChart,FavoriteChartAdmin)
admin.site.register(SiteAnnouncement,SiteAnnouncementAdmin)

View File

@@ -14,6 +14,8 @@ from django.conf import settings
from sqlalchemy import create_engine
import sqlalchemy as sa
from sqlite3 import OperationalError
from django.utils import timezone
import datetime
user = settings.DATABASES['default']['USER']
password = settings.DATABASES['default']['PASSWORD']
@@ -499,3 +501,16 @@ class RowerForm(ModelForm):
raise forms.ValidationError("TR should be lower than AN")
if an>=max:
raise forms.ValidationError("AN should be lower than Max")
class SiteAnnouncement(models.Model):
created = models.DateField(default=timezone.now)
announcement = models.TextField(max_length=140)
expires = models.DateField(default=timezone.now)
modified = models.DateField(default=timezone.now)
def save(self, *args, **kwargs):
if not self.id:
self.created = timezone.now()
self.expires = timezone.now()+datetime.timedelta(days=10)
self.modified = timezone.now()
return super(SiteAnnouncement,self).save(*args, **kwargs)

View File

@@ -22,36 +22,37 @@
</div>
</div>
<h1>My Workouts</h1>
{% if workouts %}
<table width="70%" class="listtable">
<thead>
<tr>
<th> Date</th>
<th> Time</th>
<th> Name</th>
<th> Type</th>
<th> Distance </th>
<th> Duration </th>
<th> Avg HR </th>
<th> Max HR </th>
<th> Delete</th>
<th> Export</th>
</tr>
</thead>
</tbody>
{% for workout in workouts %}
<tr>
<td> {{ workout.date }} </td>
<td> {{ workout.starttime }} </td>
<td>
{% if user.rower.rowerplan == 'pro' %}
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
{% endif %}
<div class="grid_8 alpha">
<h3>My Workouts</h3>
{% if workouts %}
<table width="100%" class="listtable">
<thead>
<tr>
<th> Date</th>
<th> Time</th>
<th> Name</th>
<th> Type</th>
<th> Distance </th>
<th> Duration </th>
<th> Avg HR </th>
<th> Max HR </th>
<th> Delete</th>
<th> Export</th>
</tr>
</thead>
<tbody>
{% for workout in workouts %}
<tr>
<td> {{ workout.date }} </td>
<td> {{ workout.starttime }} </td>
<td>
{% if user.rower.rowerplan == 'pro' %}
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
{% endif %}
<td> {{ workout.workouttype }} </td>
<td> {{ workout.distance }}m</td>
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
@@ -71,20 +72,52 @@
<p> No workouts found </p>
{% endif %}
</div>
<div class="grid_6 alpha">
<div class="grid_4 omega">
<div class="grid_4" id="announcements">
{% if announcements %}
<h3>What's New?</h3>
{% for a in announcements %}
<div class="site-announcement-box">
<div class="site-announcement">
<i>{{ a.created }}:</i>
{{ a.announcement }}
</div>
</div>
{% endfor %}
<p>&nbsp;</p>
{% endif %}
</div>
<div class="grid_4" id="about">
<h3>About</h3>
<p>This site is a beta site, pioneering rowing data visualization and analysis. No warranties. The site's author is
Sander Roosendaal. A Masters rower.
Read his <a href="http://blog.rowsandall.com/">blog</a>
</p>
<div style="text-align: right; padding: 2em">
<img src="/static/img/sander.jpg" width="80">
</div>
</div>
</div>
</div>
<div class="grid_5 alpha">
<form id="searchform" action="/rowers/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}"
method="get" accept-charset="utf-8">
<div class="grid_3 prefix_1 alpha">
<input class="searchfield" id="searchbox" name="q" type="text" placeholder="Search">
</div>
<div class="grid_1 suffix_1 omega">
<div class="grid_1 omega">
<button class="button blue small" type="submit">
Search
</button>
</div>
</form>
</div>
<div class="grid_2 prefix_3 omega">
<div class="grid_2 prefix_1 omega">
<span class="button gray small">
{% if workouts.has_previous %}
<a class="wh" href="?page={{ workouts.previous_page_number }}">&lt;</a>

View File

@@ -24,7 +24,7 @@ from rowers.forms import PredictedPieceForm,DateRangeForm,DeltaDaysForm
from rowers.forms import SummaryStringForm,IntervalUpdateForm,StrokeDataForm
from rowers.models import Workout, User, Rower, WorkoutForm,FavoriteChart
from rowers.models import RowerPowerForm,RowerForm,GraphImage,AdvancedWorkoutForm
from rowers.models import FavoriteForm,BaseFavoriteFormSet
from rowers.models import FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement
from django.forms.formsets import formset_factory
import StringIO
from django.contrib.auth.decorators import login_required,user_passes_test
@@ -1992,6 +1992,14 @@ def workouts_view(request,message='',successmessage='',
except EmptyPage:
workouts = paginator.page(paginator.num_pages)
today = timezone.now()
announcements = SiteAnnouncement.objects.filter(
expires__gte=today
).order_by(
"-created",
"-id"
)
return render(request, 'list_workouts.html',
{'workouts': workouts,
'message': message,
@@ -1999,6 +2007,7 @@ def workouts_view(request,message='',successmessage='',
'dateform':dateform,
'startdate':startdate,
'enddate':enddate,
'announcements':announcements[0:4],
})
except Rower.DoesNotExist:
return HttpResponse("User has no rower instance")
@@ -3156,12 +3165,12 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
except Workout.DoesNotExist:
form = WorkoutForm(
initial = {'workouttype' : 'rower'}
)
return render(request,
'workout_form.html',
{'form':form})
message = "workout doesn't exist"
url = reverse(workouts_view,
kwargs = {
'message': str(message)
})
return HttpResponseRedirect(url)
@user_passes_test(promember,login_url="/",redirect_field_name=None)
def workout_add_otw_powerplot_view(request,id):