diff --git a/logos/logofornk.gif b/logos/logofornk.gif new file mode 100644 index 00000000..6e03addf Binary files /dev/null and b/logos/logofornk.gif differ diff --git a/logos/logofornk.jpg b/logos/logofornk.jpg new file mode 100644 index 00000000..5b2e864e Binary files /dev/null and b/logos/logofornk.jpg differ diff --git a/logos/logofornk.png b/logos/logofornk.png new file mode 100644 index 00000000..01d4c64f Binary files /dev/null and b/logos/logofornk.png differ diff --git a/logos/logofornk.xcf b/logos/logofornk.xcf new file mode 100644 index 00000000..e9a1041f Binary files /dev/null and b/logos/logofornk.xcf differ diff --git a/rowers/admin.py b/rowers/admin.py index ae1d32f4..0a5eaa14 100644 --- a/rowers/admin.py +++ b/rowers/admin.py @@ -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) diff --git a/rowers/models.py b/rowers/models.py index dedacd62..87585c37 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -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) diff --git a/rowers/templates/list_workouts.html b/rowers/templates/list_workouts.html index aaf47bdf..f26799fc 100644 --- a/rowers/templates/list_workouts.html +++ b/rowers/templates/list_workouts.html @@ -22,36 +22,37 @@ - -

My Workouts

-{% if workouts %} - - - - - - - - - - - - - - - - -{% for workout in workouts %} - - - - - {% else %} - {{ workout.name }} -{% endif %} +
+

My Workouts

+ + {% if workouts %} +
Date Time Name Type Distance Duration Avg HR Max HR Delete Export
{{ workout.date }} {{ workout.starttime }} - {% if user.rower.rowerplan == 'pro' %} - {{ workout.name }}
+ + + + + + + + + + + + + + + + {% for workout in workouts %} + + + + + {% else %} + {{ workout.name }} + {% endif %} @@ -71,6 +72,17 @@

No workouts found

{% endif %} + +
+

Announcements

+ {% if announcements %} + {% for a in announcements %} + {{ a.created }} +

{{ a.announcement }}

+ {% endfor %} + {% endif %} +
+
diff --git a/rowers/views.py b/rowers/views.py index 25b704f1..8b8d84e0 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -20,7 +20,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 @@ -1988,6 +1988,9 @@ def workouts_view(request,message='',successmessage='', except EmptyPage: workouts = paginator.page(paginator.num_pages) + + announcements = SiteAnnouncement.objects.all().order_by("-created") + return render(request, 'list_workouts.html', {'workouts': workouts, 'message': message, @@ -1995,6 +1998,7 @@ def workouts_view(request,message='',successmessage='', 'dateform':dateform, 'startdate':startdate, 'enddate':enddate, + 'announcements':announcements, }) except Rower.DoesNotExist: return HttpResponse("User has no rower instance") @@ -3152,12 +3156,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):
Date Time Name Type Distance Duration Avg HR Max HR Delete Export
{{ workout.date }} {{ workout.starttime }} + {% if user.rower.rowerplan == 'pro' %} + {{ workout.name }} {{ workout.workouttype }} {{ workout.distance }}m {{ workout.duration |durationprint:"%H:%M:%S.%f" }}