diff --git a/rowers/forms.py b/rowers/forms.py
index 23d67fb4..37e6c7aa 100644
--- a/rowers/forms.py
+++ b/rowers/forms.py
@@ -252,3 +252,7 @@ class StatsOptionsForm(forms.Form):
paddle = forms.BooleanField(initial=False,required=False)
snow = forms.BooleanField(initial=False,required=False)
other = forms.BooleanField(initial=False,required=False)
+
+class WorkoutMultipleCompareForm(forms.Form):
+ workouts = forms.ModelMultipleChoiceField(queryset=Workout.objects.all(),
+ widget=forms.CheckboxSelectMultiple())
diff --git a/rowers/models.py b/rowers/models.py
index c1dd3bbb..d43d28c6 100644
--- a/rowers/models.py
+++ b/rowers/models.py
@@ -398,17 +398,23 @@ class Workout(models.Model):
privacy = models.CharField(default='visible',max_length=30,
choices=privacychoices)
- def __str__(self):
+ def __unicode__(self):
date = self.date
name = self.name
+ distance = str(self.distance)
+ ownerfirst = self.user.user.first_name
+ ownerlast = self.user.user.last_name
+ duration = self.duration
- try:
- stri = date.strftime('%Y-%m-%d')+'_'+name
- except AttributeError:
- stri = str(date)+'_'+name
-
-
+ stri = u'{d}_{n}_{dist}m_{duration:%H:%M:%S}_{ownerfirst}_{ownerlast}'.format(
+ d = date.strftime('%Y-%m-%d'),
+ n = name,
+ dist = distance,
+ duration = duration,
+ ownerfirst = ownerfirst,
+ ownerlast = ownerlast,
+ )
return stri
@@ -890,7 +896,7 @@ class WorkoutComment(models.Model):
def __unicode__(self):
return u'Comment to: {w} by {u1} {u2}'.format(
- w=self.workout.name,
+ w=self.workout,
u1 = self.user.first_name,
u2 = self.user.last_name,
)
diff --git a/rowers/templates/team_compare_select.html b/rowers/templates/team_compare_select.html
new file mode 100644
index 00000000..67988ec9
--- /dev/null
+++ b/rowers/templates/team_compare_select.html
@@ -0,0 +1,95 @@
+{% extends "base.html" %}
+{% load staticfiles %}
+{% load rowerfilters %}
+
+{% block title %}Workouts{% endblock %}
+
+{% block content %}
+
+
+
+
+
+
+ Select start and end date for a date range:
+
+
+
+
+
+
+
+
+
+ {% if team %}
+
{{ team.name }} Team Workouts
+ {% else %}
+
Team Workouts
+ {% endif %}
+
+ {% if workouts %}
+
+{% else %}
+
No workouts found
+{% endif %}
+
+
+
+
+
+
+ {% if workouts.has_previous %}
+ {% if request.GET.q %}
+ <
+ {% else %}
+ <
+ {% endif %}
+ {% endif %}
+
+
+ Page {{ workouts.number }} of {{ workouts.paginator.num_pages }}.
+
+
+ {% if workouts.has_next %}
+ {% if request.GET.q %}
+ >
+ {% else %}
+ >
+ {% endif %}
+ {% endif %}
+
+
+{% endblock %}
diff --git a/rowers/urls.py b/rowers/urls.py
index e54bbac2..fb71fa02 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -113,6 +113,13 @@ urlpatterns = [
url(r'^list-workouts/team/(?P
\d+)/$',views.workouts_view),
url(r'^list-workouts/(?P\w+.*)/(?P\w+.*)$',views.workouts_view),
url(r'^list-workouts/$',views.workouts_view),
+ url(r'^team-compare-select/c/(?P\w+.*)/$',views.team_comparison_select),
+ url(r'^team-compare-select/s/(?P\w+.*)/$',views.team_comparison_select),
+ url(r'^team-compare-select/c/(?P\w+.*)/s/(?P\w+.*)$',views.team_comparison_select),
+ url(r'^team-compare-select/team/(?P\d+)/(?P\w+.*)/(?P\w+.*)$',views.team_comparison_select),
+ url(r'^team-compare-select/team/(?P\d+)/$',views.team_comparison_select),
+ url(r'^team-compare-select/(?P\w+.*)/(?P\w+.*)$',views.team_comparison_select),
+ url(r'^team-compare-select/$',views.team_comparison_select),
url(r'^list-graphs/$',views.graphs_view),
url(r'^(?P\d+)/ote-bests/(?P\w+.*)/(?P\w+.*)$',views.rankings_view),
url(r'^(?P\d+)/ote-bests/(?P\d+)$',views.rankings_view),
diff --git a/rowers/views.py b/rowers/views.py
index 2e50b45e..4e717cbd 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -26,7 +26,7 @@ from rowers.forms import (
StatsOptionsForm,PredictedPieceForm,DateRangeForm,DeltaDaysForm,
EmailForm, RegistrationForm, RegistrationFormTermsOfService,
RegistrationFormUniqueEmail,CNsummaryForm,UpdateWindForm,
- UpdateStreamForm
+ UpdateStreamForm,WorkoutMultipleCompareForm,
)
from rowers.models import Workout, User, Rower, WorkoutForm,FavoriteChart
from rowers.models import (
@@ -1955,7 +1955,97 @@ def workout_setprivate_view(request,id,
})
return HttpResponseRedirect(url)
+# Team comparison
+@login_required()
+def team_comparison_select(request,
+ startdatestring="",
+ enddatestring="",
+ message='',
+ successmessage='',
+ startdate=timezone.now()-datetime.timedelta(days=30),
+ enddate=timezone.now()+datetime.timedelta(days=1),
+ teamid=0):
+ try:
+ r = Rower.objects.get(user=request.user)
+ except Rower.DoesNotExist:
+ raise Http404("Rower doesn't exist")
+
+ if request.method == 'POST':
+ dateform = DateRangeForm(request.POST)
+ if dateform.is_valid():
+ startdate = dateform.cleaned_data['startdate']
+ enddate = dateform.cleaned_data['enddate']
+ else:
+ dateform = DateRangeForm(initial={
+ 'startdate':startdate,
+ 'enddate':enddate,
+ })
+
+ startdate = datetime.datetime.combine(startdate,datetime.time())
+ enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59))
+ enddate = enddate+datetime.timedelta(days=1)
+
+ if startdatestring:
+ startdate = iso8601.parse_date(startdatestring)
+ if enddatestring:
+ enddate = iso8601.parse_date(enddatestring)
+
+ if enddate < startdate:
+ s = enddate
+ enddate = startdate
+ startdate = s
+
+ try:
+ theteam = Team.objects.get(id=teamid)
+ except Team.DoesNotExist:
+ raise Http404("Team doesn't exist")
+
+ if theteam.viewing == 'allmembers' or theteam.manager == request.user:
+ workouts = Workout.objects.filter(team=theteam,
+ startdatetime__gte=startdate,
+ startdatetime__lte=enddate).order_by("-date", "-starttime")
+ elif theteam.viewing == 'coachonly':
+ workouts = Workout.objects.filter(team=theteam,user=r,
+ startdatetime__gte=startdate,
+ startdatetime__lte=enddate).order_by("-date","-starttime")
+
+
+ else:
+ theteam = None
+ workouts = Workout.objects.filter(user=r,
+ startdatetime__gte=startdate,
+ startdatetime__lte=enddate).order_by("-date", "-starttime")
+
+ query = request.GET.get('q')
+ if query:
+ query_list = query.split()
+ workouts = workouts.filter(
+ reduce(operator.and_,
+ (Q(name__icontains=q) for q in query_list)) |
+ reduce(operator.and_,
+ (Q(notes__icontains=q) for q in query_list))
+ )
+
+ workouts1 = workouts
+
+
+
+ form = WorkoutMultipleCompareForm()
+ form.fields["workouts"].queryset = workouts1
+
+ return render(request, 'team_compare_select.html',
+ {'workouts': workouts,
+ 'message': message,
+ 'successmessage':successmessage,
+ 'dateform':dateform,
+ 'startdate':startdate,
+ 'enddate':enddate,
+ 'team':theteam,
+ 'form':form,
+ })
+
+
# List Workouts
@login_required()
def workouts_view(request,message='',successmessage='',