basic announcements functionality
This commit is contained in:
BIN
logos/logofornk.gif
Normal file
BIN
logos/logofornk.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.8 KiB |
BIN
logos/logofornk.jpg
Normal file
BIN
logos/logofornk.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.7 KiB |
BIN
logos/logofornk.png
Normal file
BIN
logos/logofornk.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.1 KiB |
BIN
logos/logofornk.xcf
Normal file
BIN
logos/logofornk.xcf
Normal file
Binary file not shown.
@@ -2,7 +2,7 @@ from django.contrib import admin
|
|||||||
from django.contrib.auth.admin import UserAdmin
|
from django.contrib.auth.admin import UserAdmin
|
||||||
from django.contrib.auth.models import User
|
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.
|
# Register your models here.
|
||||||
|
|
||||||
@@ -19,9 +19,13 @@ class WorkoutAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
class FavoriteChartAdmin(admin.ModelAdmin):
|
class FavoriteChartAdmin(admin.ModelAdmin):
|
||||||
list_display = ('user','xparam','yparam1','yparam2','plottype','workouttype','reststrokes')
|
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.unregister(User)
|
||||||
admin.site.register(User,UserAdmin)
|
admin.site.register(User,UserAdmin)
|
||||||
admin.site.register(Workout,WorkoutAdmin)
|
admin.site.register(Workout,WorkoutAdmin)
|
||||||
admin.site.register(GraphImage)
|
admin.site.register(GraphImage)
|
||||||
admin.site.register(FavoriteChart,FavoriteChartAdmin)
|
admin.site.register(FavoriteChart,FavoriteChartAdmin)
|
||||||
|
admin.site.register(SiteAnnouncement,SiteAnnouncementAdmin)
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ from django.conf import settings
|
|||||||
from sqlalchemy import create_engine
|
from sqlalchemy import create_engine
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
from sqlite3 import OperationalError
|
from sqlite3 import OperationalError
|
||||||
|
from django.utils import timezone
|
||||||
|
import datetime
|
||||||
|
|
||||||
user = settings.DATABASES['default']['USER']
|
user = settings.DATABASES['default']['USER']
|
||||||
password = settings.DATABASES['default']['PASSWORD']
|
password = settings.DATABASES['default']['PASSWORD']
|
||||||
@@ -499,3 +501,16 @@ class RowerForm(ModelForm):
|
|||||||
raise forms.ValidationError("TR should be lower than AN")
|
raise forms.ValidationError("TR should be lower than AN")
|
||||||
if an>=max:
|
if an>=max:
|
||||||
raise forms.ValidationError("AN should be lower than 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)
|
||||||
|
|||||||
@@ -22,36 +22,37 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h1>My Workouts</h1>
|
|
||||||
|
|
||||||
{% if workouts %}
|
<div class="grid_8 alpha">
|
||||||
<table width="70%" class="listtable">
|
<h1>My Workouts</h1>
|
||||||
<thead>
|
|
||||||
<tr>
|
{% if workouts %}
|
||||||
<th> Date</th>
|
<table width="95%" class="listtable">
|
||||||
<th> Time</th>
|
<thead>
|
||||||
<th> Name</th>
|
<tr>
|
||||||
<th> Type</th>
|
<th> Date</th>
|
||||||
<th> Distance </th>
|
<th> Time</th>
|
||||||
<th> Duration </th>
|
<th> Name</th>
|
||||||
<th> Avg HR </th>
|
<th> Type</th>
|
||||||
<th> Max HR </th>
|
<th> Distance </th>
|
||||||
<th> Delete</th>
|
<th> Duration </th>
|
||||||
<th> Export</th>
|
<th> Avg HR </th>
|
||||||
</tr>
|
<th> Max HR </th>
|
||||||
</thead>
|
<th> Delete</th>
|
||||||
</tbody>
|
<th> Export</th>
|
||||||
{% for workout in workouts %}
|
</tr>
|
||||||
<tr>
|
</thead>
|
||||||
<td> {{ workout.date }} </td>
|
<tbody>
|
||||||
<td> {{ workout.starttime }} </td>
|
{% for workout in workouts %}
|
||||||
<td>
|
<tr>
|
||||||
{% if user.rower.rowerplan == 'pro' %}
|
<td> {{ workout.date }} </td>
|
||||||
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
|
<td> {{ workout.starttime }} </td>
|
||||||
{% else %}
|
<td>
|
||||||
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
|
{% if user.rower.rowerplan == 'pro' %}
|
||||||
{% endif %}
|
<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.workouttype }} </td>
|
||||||
<td> {{ workout.distance }}m</td>
|
<td> {{ workout.distance }}m</td>
|
||||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||||
@@ -71,6 +72,17 @@
|
|||||||
<p> No workouts found </p>
|
<p> No workouts found </p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="grid_4 omega">
|
||||||
|
<h1>Announcements</h1>
|
||||||
|
{% if announcements %}
|
||||||
|
{% for a in announcements %}
|
||||||
|
<i>{{ a.created }}</i>
|
||||||
|
<p>{{ a.announcement }}</p>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="grid_6 alpha">
|
<div class="grid_6 alpha">
|
||||||
<form id="searchform" action="/rowers/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}"
|
<form id="searchform" action="/rowers/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}"
|
||||||
method="get" accept-charset="utf-8">
|
method="get" accept-charset="utf-8">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ from rowers.forms import PredictedPieceForm,DateRangeForm,DeltaDaysForm
|
|||||||
from rowers.forms import SummaryStringForm,IntervalUpdateForm,StrokeDataForm
|
from rowers.forms import SummaryStringForm,IntervalUpdateForm,StrokeDataForm
|
||||||
from rowers.models import Workout, User, Rower, WorkoutForm,FavoriteChart
|
from rowers.models import Workout, User, Rower, WorkoutForm,FavoriteChart
|
||||||
from rowers.models import RowerPowerForm,RowerForm,GraphImage,AdvancedWorkoutForm
|
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
|
from django.forms.formsets import formset_factory
|
||||||
import StringIO
|
import StringIO
|
||||||
from django.contrib.auth.decorators import login_required,user_passes_test
|
from django.contrib.auth.decorators import login_required,user_passes_test
|
||||||
@@ -1988,6 +1988,9 @@ def workouts_view(request,message='',successmessage='',
|
|||||||
except EmptyPage:
|
except EmptyPage:
|
||||||
workouts = paginator.page(paginator.num_pages)
|
workouts = paginator.page(paginator.num_pages)
|
||||||
|
|
||||||
|
|
||||||
|
announcements = SiteAnnouncement.objects.all().order_by("-created")
|
||||||
|
|
||||||
return render(request, 'list_workouts.html',
|
return render(request, 'list_workouts.html',
|
||||||
{'workouts': workouts,
|
{'workouts': workouts,
|
||||||
'message': message,
|
'message': message,
|
||||||
@@ -1995,6 +1998,7 @@ def workouts_view(request,message='',successmessage='',
|
|||||||
'dateform':dateform,
|
'dateform':dateform,
|
||||||
'startdate':startdate,
|
'startdate':startdate,
|
||||||
'enddate':enddate,
|
'enddate':enddate,
|
||||||
|
'announcements':announcements,
|
||||||
})
|
})
|
||||||
except Rower.DoesNotExist:
|
except Rower.DoesNotExist:
|
||||||
return HttpResponse("User has no rower instance")
|
return HttpResponse("User has no rower instance")
|
||||||
@@ -3152,12 +3156,12 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
|
|||||||
|
|
||||||
|
|
||||||
except Workout.DoesNotExist:
|
except Workout.DoesNotExist:
|
||||||
form = WorkoutForm(
|
message = "workout doesn't exist"
|
||||||
initial = {'workouttype' : 'rower'}
|
url = reverse(workouts_view,
|
||||||
)
|
kwargs = {
|
||||||
return render(request,
|
'message': str(message)
|
||||||
'workout_form.html',
|
})
|
||||||
{'form':form})
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
@user_passes_test(promember,login_url="/",redirect_field_name=None)
|
@user_passes_test(promember,login_url="/",redirect_field_name=None)
|
||||||
def workout_add_otw_powerplot_view(request,id):
|
def workout_add_otw_powerplot_view(request,id):
|
||||||
|
|||||||
Reference in New Issue
Block a user