def add(request, pk): ''' Add a new workout log ''' template_data = {} template_data.update(csrf(request)) # Load the day and check ownership day = get_object_or_404(Day, pk=pk) if day.get_owner_object().user != request.user: return HttpResponseForbidden() # We need several lists here because we need to assign specific form to each # exercise: the entries for weight and repetitions have no indicator to which # exercise they belong besides the form-ID, from Django's formset counter = 0 total_sets = 0 exercise_list = {} form_to_exercise = {} for exercise_set in day.set_set.all(): for exercise in exercise_set.exercises.all(): # Maximum possible values total_sets += int(exercise_set.sets) counter_before = counter counter = counter + int(exercise_set.sets) - 1 form_id_range = range(counter_before, counter + 1) # Add to list exercise_list[exercise.id] = {'obj': exercise, 'sets': int(exercise_set.sets), 'form_ids': form_id_range} counter += 1 # Helper mapping form-ID <--> Exercise for id in form_id_range: form_to_exercise[id] = exercise # Define the formset here because now we know the value to pass to 'extra' WorkoutLogFormSet = modelformset_factory(WorkoutLog, form=WorkoutLogForm, exclude=('date', 'workout'), extra = total_sets) # Process the request if request.method == 'POST': # Make a copy of the POST data and go through it. The reason for this is # that the form expects a value for the exercise which is not present in # the form (for space and usability reasons) post_copy = request.POST.copy() for form_id in form_to_exercise: if post_copy.get('form-%s-weight' % form_id) or post_copy.get('form-%s-reps' % form_id): post_copy['form-%s-exercise' % form_id] = form_to_exercise[form_id].id # Pass the new data to the forms formset = WorkoutLogFormSet(data=post_copy) dateform = HelperDateForm(data=post_copy) session_form = HelperWorkoutSessionForm(data=post_copy) # If all the data is valid, save and redirect to log overview page if dateform.is_valid() and session_form.is_valid() and formset.is_valid(): log_date = dateform.cleaned_data['date'] if WorkoutSession.objects.filter(user=request.user, date=log_date).exists(): session = WorkoutSession.objects.get(user=request.user, date=log_date) session_form = HelperWorkoutSessionForm(data=post_copy, instance=session) # Save the Workout Session only if there is not already one for this date instance = session_form.save(commit=False) if not WorkoutSession.objects.filter(user=request.user, date=log_date).exists(): instance.date = log_date instance.user = request.user instance.workout = day.training else: session = WorkoutSession.objects.get(user=request.user, date=log_date) instance.instance = session instance.save() # Log entries instances = formset.save(commit=False) for instance in instances: instance.user = request.user instance.workout = day.training instance.date = log_date instance.save() return HttpResponseRedirect(reverse('manager:log:log', kwargs={'pk': day.training_id})) else: # Initialise the formset with a queryset that won't return any objects # (we only add new logs here and that seems to be the fastest way) formset = WorkoutLogFormSet(queryset=WorkoutLog.objects.none()) dateform = HelperDateForm(initial={'date': formats.date_format(datetime.date.today(), "SHORT_DATE_FORMAT")}) # Depending on whether there is already a workout session for today, update # the current one or create a new one (this will be the most usual case) if WorkoutSession.objects.filter(user=request.user, date=datetime.date.today()).exists(): session = WorkoutSession.objects.get(user=request.user, date=datetime.date.today()) session_form = HelperWorkoutSessionForm(instance=session) else: session_form = HelperWorkoutSessionForm() # Pass the correct forms to the exercise list for exercise in exercise_list: form_id_from = min(exercise_list[exercise]['form_ids']) form_id_to = max(exercise_list[exercise]['form_ids']) exercise_list[exercise]['forms'] = formset[form_id_from:form_id_to + 1] template_data['day'] = day template_data['exercises'] = exercise_list template_data['exercise_list'] = exercise_list template_data['formset'] = formset template_data['dateform'] = dateform template_data['session_form'] = session_form template_data['form_action'] = reverse('manager:day:log', kwargs={'pk': pk}) return render(request, 'day/log.html', template_data)
def add(request, pk): ''' Add a new workout log ''' template_data = {} template_data.update(csrf(request)) # Load the day and check ownership day = get_object_or_404(Day, pk=pk) if day.get_owner_object().user != request.user: return HttpResponseForbidden() # We need several lists here because we need to assign specific form to each # exercise: the entries for weight and repetitions have no indicator to which # exercise they belong besides the form-ID, from Django's formset counter = 0 total_sets = 0 exercise_list = {} form_to_exercise = {} for exercise_set in day.set_set.all(): for exercise in exercise_set.exercises.all(): # Maximum possible values total_sets += int(exercise_set.sets) counter_before = counter counter = counter + int(exercise_set.sets) - 1 form_id_range = range(counter_before, counter + 1) # Add to list exercise_list[exercise.id] = { 'obj': exercise, 'sets': int(exercise_set.sets), 'form_ids': form_id_range } counter += 1 # Helper mapping form-ID <--> Exercise for id in form_id_range: form_to_exercise[id] = exercise # Define the formset here because now we know the value to pass to 'extra' WorkoutLogFormSet = modelformset_factory(WorkoutLog, form=WorkoutLogForm, exclude=('date', 'workout'), extra=total_sets) # Process the request if request.method == 'POST': # Make a copy of the POST data and go through it. The reason for this is # that the form expects a value for the exercise which is not present in # the form (for space and usability reasons) post_copy = request.POST.copy() for form_id in form_to_exercise: if post_copy.get('form-%s-weight' % form_id) or post_copy.get( 'form-%s-reps' % form_id): post_copy['form-%s-exercise' % form_id] = form_to_exercise[form_id].id # Pass the new data to the forms formset = WorkoutLogFormSet(data=post_copy) dateform = HelperDateForm(data=post_copy) session_form = HelperWorkoutSessionForm(data=post_copy) # If all the data is valid, save and redirect to log overview page if dateform.is_valid() and session_form.is_valid( ) and formset.is_valid(): log_date = dateform.cleaned_data['date'] if WorkoutSession.objects.filter(user=request.user, date=log_date).exists(): session = WorkoutSession.objects.get(user=request.user, date=log_date) session_form = HelperWorkoutSessionForm(data=post_copy, instance=session) # Save the Workout Session only if there is not already one for this date instance = session_form.save(commit=False) if not WorkoutSession.objects.filter(user=request.user, date=log_date).exists(): instance.date = log_date instance.user = request.user instance.workout = day.training else: session = WorkoutSession.objects.get(user=request.user, date=log_date) instance.instance = session instance.save() # Log entries instances = formset.save(commit=False) for instance in instances: instance.user = request.user instance.workout = day.training instance.date = log_date instance.save() return HttpResponseRedirect( reverse('manager:log:log', kwargs={'pk': day.training_id})) else: # Initialise the formset with a queryset that won't return any objects # (we only add new logs here and that seems to be the fastest way) user_weight_unit = 1 if request.user.userprofile.use_metric else 2 formset = WorkoutLogFormSet(queryset=WorkoutLog.objects.none(), initial=[{ 'weight_unit': user_weight_unit, 'repetition_unit': 1 } for x in range(0, total_sets)]) dateform = HelperDateForm(initial={'date': datetime.date.today()}) # Depending on whether there is already a workout session for today, update # the current one or create a new one (this will be the most usual case) if WorkoutSession.objects.filter(user=request.user, date=datetime.date.today()).exists(): session = WorkoutSession.objects.get(user=request.user, date=datetime.date.today()) session_form = HelperWorkoutSessionForm(instance=session) else: session_form = HelperWorkoutSessionForm() # Pass the correct forms to the exercise list for exercise in exercise_list: form_id_from = min(exercise_list[exercise]['form_ids']) form_id_to = max(exercise_list[exercise]['form_ids']) exercise_list[exercise]['forms'] = formset[form_id_from:form_id_to + 1] template_data['day'] = day template_data['exercises'] = exercise_list template_data['exercise_list'] = exercise_list template_data['formset'] = formset template_data['dateform'] = dateform template_data['session_form'] = session_form template_data['form_action'] = reverse('manager:day:log', kwargs={'pk': pk}) return render(request, 'day/log.html', template_data)
def add(request, pk): """ Add a new workout log """ template_data = {} template_data.update(csrf(request)) # Load the day and check ownership day = get_object_or_404(Day, pk=pk) if day.get_owner_object().user != request.user: return HttpResponseForbidden() # We need several lists here because we need to assign specific form to each # exercise: the entries for weight and repetitions have no indicator to which # exercise they belong besides the form-ID, from Django's formset counter = 0 total_sets = 0 exercise_list = {} form_to_exercise = {} for exercise_set in day.set_set.all(): for exercise in exercise_set.exercises.all(): # Maximum possible values total_sets += int(exercise_set.sets) counter_before = counter counter = counter + int(exercise_set.sets) - 1 form_id_range = range(counter_before, counter + 1) # Add to list exercise_list[exercise.id] = {"obj": exercise, "sets": int(exercise_set.sets), "form_ids": form_id_range} counter += 1 # Helper mapping form-ID <--> Exercise for id in form_id_range: form_to_exercise[id] = exercise # Define the formset here because now we know the value to pass to 'extra' WorkoutLogFormSet = modelformset_factory( WorkoutLog, form=WorkoutLogForm, exclude=("date", "workout"), extra=total_sets ) # Process the request if request.method == "POST": # Make a copy of the POST data and go through it. The reason for this is # that the form expects a value for the exercise which is not present in # the form (for space and usability reasons) post_copy = request.POST.copy() for form_id in form_to_exercise: if post_copy.get("form-%s-weight" % form_id) or post_copy.get("form-%s-reps" % form_id): post_copy["form-%s-exercise" % form_id] = form_to_exercise[form_id].id # Pass the new data to the forms formset = WorkoutLogFormSet(data=post_copy) dateform = HelperDateForm(data=post_copy) session_form = HelperWorkoutSessionForm(data=post_copy) # If all the data is valid, save and redirect to log overview page if dateform.is_valid() and session_form.is_valid() and formset.is_valid(): log_date = dateform.cleaned_data["date"] if WorkoutSession.objects.filter(user=request.user, date=log_date).exists(): session = WorkoutSession.objects.get(user=request.user, date=log_date) session_form = HelperWorkoutSessionForm(data=post_copy, instance=session) # Save the Workout Session only if there is not already one for this date instance = session_form.save(commit=False) if not WorkoutSession.objects.filter(user=request.user, date=log_date).exists(): instance.date = log_date instance.user = request.user instance.workout = day.training else: session = WorkoutSession.objects.get(user=request.user, date=log_date) instance.instance = session instance.save() # Log entries (only the ones with actual content) instances = [i for i in formset.save(commit=False) if i.reps] for instance in instances: if not instance.weight: instance.weight = 0 instance.user = request.user instance.workout = day.training instance.date = log_date instance.save() return HttpResponseRedirect(reverse("manager:log:log", kwargs={"pk": day.training_id})) else: # Initialise the formset with a queryset that won't return any objects # (we only add new logs here and that seems to be the fastest way) user_weight_unit = 1 if request.user.userprofile.use_metric else 2 formset = WorkoutLogFormSet( queryset=WorkoutLog.objects.none(), initial=[{"weight_unit": user_weight_unit, "repetition_unit": 1} for x in range(0, total_sets)], ) dateform = HelperDateForm(initial={"date": datetime.date.today()}) # Depending on whether there is already a workout session for today, update # the current one or create a new one (this will be the most usual case) if WorkoutSession.objects.filter(user=request.user, date=datetime.date.today()).exists(): session = WorkoutSession.objects.get(user=request.user, date=datetime.date.today()) session_form = HelperWorkoutSessionForm(instance=session) else: session_form = HelperWorkoutSessionForm() # Pass the correct forms to the exercise list for exercise in exercise_list: form_id_from = min(exercise_list[exercise]["form_ids"]) form_id_to = max(exercise_list[exercise]["form_ids"]) exercise_list[exercise]["forms"] = formset[form_id_from : form_id_to + 1] template_data["day"] = day template_data["exercises"] = exercise_list template_data["exercise_list"] = exercise_list template_data["formset"] = formset template_data["dateform"] = dateform template_data["session_form"] = session_form template_data["form_action"] = reverse("manager:day:log", kwargs={"pk": pk}) return render(request, "day/log.html", template_data)