diff --git a/db.sqlite3-journal b/db.sqlite3-journal new file mode 100644 index 00000000..13232561 Binary files /dev/null and b/db.sqlite3-journal differ diff --git a/rowers/templates/menu_workouts.html b/rowers/templates/menu_workouts.html index 45778dc5..5b2982a8 100644 --- a/rowers/templates/menu_workouts.html +++ b/rowers/templates/menu_workouts.html @@ -37,6 +37,15 @@  Glue Workouts +
  • + {% if user|is_promember %} + + {% else %} + + {% endif %} +  Remove Duplicates + +
  • diff --git a/rowers/templates/workout_duplicates_select.html b/rowers/templates/workout_duplicates_select.html new file mode 100644 index 00000000..4c18dae2 --- /dev/null +++ b/rowers/templates/workout_duplicates_select.html @@ -0,0 +1,50 @@ +{% extends "newbase.html" %} +{% load static %} +{% load rowerfilters %} + +{% block title %}Workouts{% endblock %} + +{% block main %} + + +

    {{ team.name }} Select Duplicate Workouts

    + +
      +
    • +

      + The workouts in the list are duplicate workouts. They are overlapping in time with other + workouts you have performed. They are not used in analysis or statistics. With the + form below you can select any number of duplicate workouts and remove them + permanently. This action is not reversible. +

      + {% if workouts %} +
      + {% csrf_token %} + Toggle All
      + + + {{ form.as_table }} +
      + +
      + {% else %} +

      No workouts found

      + {% endif %} +
    • +
    + + +{% endblock %} + + + +{% block sidebar %} +{% include 'menu_workouts.html' %} +{% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index 65836ba7..ef07ec60 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -349,6 +349,8 @@ urlpatterns = [ re_path( r'^user-analysis-select/(?P\w.*)/team/(?P\d+)/workout/(?P\b[0-9A-Fa-f]+\b)/$', views.analysis_new, name='analysis_new'), + re_path(r'^workouts-dupes-select/$', + views.workouts_duplicates_select_view, name='workouts_duplicates_select_view'), re_path( r'^user-analysis-select/(?P\w.*)/session/(?P\d+)/workout/(?P\b[0-9A-Fa-f]+\b)/$', views.analysis_new, name='analysis_new'), diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 3da4b04f..0de40b23 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -807,6 +807,44 @@ def workout_recalcsummary_view(request, id=0): return HttpResponseRedirect(url) +# Selecting duplicates +@user_passes_test(ispromember, login_url="/rowers/paidplans", + message="This functionality requires a Pro plan or higher." + " If you are already a Pro user, please log in to access this functionality", + redirect_field_name=None) +def workouts_duplicates_select_view(request): + r = getrequestrower(request) + + if request.method == 'POST': + form = WorkoutMultipleCompareForm(request.POST) + if form.is_valid(): + workouts = form.cleaned_data['workouts'] + for w in workouts: + w.delete() + + workouts = Workout.objects.filter(user=r,duplicate=True).order_by("-startdatetime")[:19] + + form = WorkoutMultipleCompareForm() + form.fields["workouts"].queryset = workouts + + breadcrumbs = [ + { + 'url': '/rowers/list-workouts/', + 'name': 'Workouts' + }, + {'url': reverse('workouts_duplicates_select_view'), + 'name': 'Select Duplicates' + } + + ] + + return render(request,'workout_duplicates_select.html', + { + 'workouts':workouts, + 'rower':r, + 'form':form, + 'breadcrumbs': breadcrumbs, + }) # Joining workout @user_passes_test(ispromember, login_url="/rowers/paidplans",