diff --git a/rowers/models.py b/rowers/models.py index 5b30abb6..f9632550 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -614,6 +614,12 @@ class BaseFavoriteFormSet(BaseFormSet): if not yparam2: yparam2 = 'None' +class BasePlannedSessionFormSet(BaseFormSet): + def clean(self): + if any(self.serrors): + return + + # Check if workout is owned by this user def checkworkoutuser(user,workout): try: @@ -918,6 +924,37 @@ class PlannedSessionForm(ModelForm): 'enddate': AdminDateWidget(), } +class PlannedSessionFormSmall(ModelForm): + + class Meta: + model = PlannedSession + fields = ['startdate', + 'enddate', + 'name', + 'sessiontype', + 'sessionmode', + 'criterium', + 'sessionvalue', + 'sessionunit', + 'manager', + 'comment', + ] + + dateTimeOptions = { + 'format': 'yyyy-mm-dd', + 'autoclose': True, + } + + widgets = { + 'startdate': DateInput(attrs={'size':10}), + 'enddate': DateInput(attrs={'size':10}), + 'name': forms.TextInput(attrs={'size':10}), + 'comment': forms.TextInput(attrs={'size':10}), + 'sessionvalue': forms.TextInput(attrs={'style':'width:3em', + 'type':'number'}), + 'manager': forms.HiddenInput(), + } + # Workout class Workout(models.Model): diff --git a/rowers/templates/plannedsession_multicreate.html b/rowers/templates/plannedsession_multicreate.html new file mode 100644 index 00000000..8ec43d64 --- /dev/null +++ b/rowers/templates/plannedsession_multicreate.html @@ -0,0 +1,146 @@ +{% extends "base.html" %} +{% load staticfiles %} +{% load rowerfilters %} + +{% block title %}New Planned Session{% endblock %} + +{% block content %} +
+ {% include "planningbuttons.html" %} +
+ +
+
+

Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}

+
+ +{% if user.is_authenticated and user|is_manager %} + +{% endif %} +
+ +
+

+ On this page, you can create and edit sessions for an entire time + period. +

+
+ {% csrf_token %} + {{ ps_formset.management_form }} + + + + + {% for field in ps_formset.0.visible_fields %} + + {% endfor %} + + + + {% for form in ps_formset %} + + + {% endfor %} + + {% endfor %} + +
 {{ field.label_tag }}
{{ forloop.counter }} + {% if form.instance.pk %}{{ form.DELETE }}{% endif %} + {{ form.id }} + {% for field in form.hidden_fields %} + {{ field }} + {% endfor %} + {% for field in form.visible_fields %} + + {{ field }} +
+ Add More + +
+ +
+{% endblock %} + +{% block scripts %} + + + + +{% endblock %} diff --git a/rowers/templates/plannedsessioncreate.html b/rowers/templates/plannedsessioncreate.html index b2d643cd..5263c3f5 100644 --- a/rowers/templates/plannedsessioncreate.html +++ b/rowers/templates/plannedsessioncreate.html @@ -11,7 +11,7 @@
-

Create Session for {{ rower.user.first_name }} {{ rower.user.last_name }}

+

Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}

+
+ Bulk Session Edit ({{ timeperiod|verbosetimeperiod }}) +
{% if user.is_authenticated and user|is_manager %} {% if timeperiod %} diff --git a/rowers/urls.py b/rowers/urls.py index 85d4a845..6e093cfa 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -419,6 +419,17 @@ urlpatterns = [ url(r'^sessions/create/(?P[\w\ ]+.*)$', views.plannedsession_create_view), + url(r'^sessions/multicreate$',views.plannedsession_multicreate_view), + url(r'^sessions/multicreate/(?P[\w\ ]+.*)/rower/(?P\d+)/extra/(?P\d+)$', + views.plannedsession_multicreate_view), + url(r'^sessions/multicreate/rower/(?P\d+)$', + views.plannedsession_multicreate_view), + url( + r'^sessions/multicreate/(?P[\w\ ]+.*)/rower/(?P\d+)$', + views.plannedsession_multicreate_view), + url(r'^sessions/multicreate/(?P[\w\ ]+.*)$', + views.plannedsession_multicreate_view), + url(r'^sessions/(?P\d+)/edit$',views.plannedsession_edit_view), url(r'^sessions/(?P\d+)/edit/(?P[\w\ ]+.*)/rower/(?P\d+)$',views.plannedsession_edit_view), url(r'^sessions/(?P\d+)/edit/(?P[\w\ ]+.*)$',views.plannedsession_edit_view), diff --git a/rowers/views.py b/rowers/views.py index c59cd8db..4d5453a2 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -60,13 +60,17 @@ from rowers.models import ( RowerPowerZonesForm,AccountRowerForm,UserForm,StrokeData, Team,TeamForm,TeamInviteForm,TeamInvite,TeamRequest, WorkoutComment,WorkoutCommentForm,RowerExportForm, - CalcAgePerformance,PowerTimeFitnessMetric,PlannedSessionForm + CalcAgePerformance,PowerTimeFitnessMetric,PlannedSessionForm, + PlannedSessionFormSmall, + ) +from rowers.models import ( + FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement,BasePlannedSessionFormSet ) -from rowers.models import FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement from rowers.metrics import rowingmetrics,defaultfavoritecharts from rowers import metrics import rowers.uploads as uploads from django.forms.formsets import formset_factory +from django.forms import modelformset_factory import StringIO from django.contrib.auth.decorators import login_required,user_passes_test from time import strftime,strptime,mktime,time,daylight @@ -8807,7 +8811,6 @@ def workout_uploadimage_view(request,id): if f is not None: filename,path_and_filename = handle_uploaded_image(f) - print path_and_filename,'aap' try: width,height = Image.open(path_and_filename).size except: @@ -11643,8 +11646,6 @@ def plannedsession_create_view(request,timeperiod='thisweek',rowerid=0): else: forminitial = {} - print forminitial - sessioncreateform = PlannedSessionForm(initial=forminitial) startdate,enddate = get_dates_timeperiod(timeperiod) @@ -11659,6 +11660,101 @@ def plannedsession_create_view(request,timeperiod='thisweek',rowerid=0): 'timeperiod':timeperiod, }) +@user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/", + redirect_field_name=None) +def plannedsession_multicreate_view(request,timeperiod='thisweek', + teamid=0,rowerid=0,extrasessions=0): + + extrasessions=int(extrasessions) + + if rowerid==0: + r = getrower(request.user) + else: + try: + r = Rower.objects.get(id=rowerid) + except Rower.DoesNotExist: + raise Http404("This rower doesn't exist") + if not checkaccessuser(request.user,r): + raise PermissionDenied("You don't have access to this plan") + + startdate,enddate = get_dates_timeperiod(timeperiod) + sps = get_sessions(r,startdate=startdate,enddate=enddate) + + m = Rower.objects.get(user=request.user) + + if m.rowerplan == 'coach': + teams = Team.objects.filter(manager=request.user) + members = Rower.objects.filter(team__in=teams).distinct() + if r in members: + qset = PlannedSession.objects.filter( + rower__in=[r], + startdate__lte=enddate, + enddate__gte=startdate, + ).order_by("startdate","enddate") + else: + qset = [] + + if not qset: + qset = PlannedSession.objects.filter( + rower__in=[r], + manager = request.user, + startdate__lte=enddate, + enddate__gte=startdate, + ).order_by("startdate","enddate") + + + + initial = { + 'startdate':startdate, + 'enddate':enddate, + 'sessionvalue':60, + 'manager':request.user, + 'name': 'NEW SESSION' + } + + + + initials = [initial for i in range(extrasessions)] + PlannedSessionFormSet = modelformset_factory( + PlannedSession, + form=PlannedSessionFormSmall, + can_delete=True, + extra=extrasessions, + ) + if request.method == "POST": + ps_formset = PlannedSessionFormSet(queryset = qset, + data = request.POST) + if ps_formset.is_valid(): + instances = ps_formset.save(commit=False) + for ps in instances: + ps.save() + add_rower_session(r,ps) + for obj in ps_formset.deleted_objects: + obj.delete() + else: + print ps_formset.errors + + url = reverse(plannedsession_multicreate_view, + kwargs = { + 'rowerid':r.id, + 'timeperiod':timeperiod + } + ) + return HttpResponseRedirect(url) + + ps_formset = PlannedSessionFormSet(queryset = qset, + initial=initials) + + context = { + 'ps_formset':ps_formset, + 'rower':r, + 'timeperiod':timeperiod, + 'teams':get_my_teams(request.user), + 'extrasessions': extrasessions+1 + } + + return render(request,'plannedsession_multicreate.html',context) + # Manager creates sessions for entire team @user_passes_test(iscoachmember,login_url="/rowers/planmembership/", redirect_field_name=None)