diff --git a/forms.py b/forms.py
index 8e5131e..818f9d6 100644
--- a/forms.py
+++ b/forms.py
@@ -54,6 +54,24 @@ class ContactListForm(TeamReportForm):
class TshirtListForm(TeamReportForm):
pass
+class HoursListForm(forms.Form):
+ who = forms.MultipleChoiceField(
+ widget=forms.CheckboxSelectMultiple,
+ choices=(
+ ('Mentor', "Mentor"),
+ ('Student', "Student"),
+ ),
+ initial=['Mentor', 'Student'])
+
+ team = forms.MultipleChoiceField(
+ widget=forms.CheckboxSelectMultiple,
+ choices=[(x.id, x.name) for x in Team.objects.all()])
+
+ from_date = forms.DateField(required=False)
+ to_date = forms.DateField(required=False)
+
+ include_hours = forms.BooleanField(required=False, initial=True)
+
class EventEmailListForm(forms.Form):
who = forms.MultipleChoiceField(
widget=forms.CheckboxSelectMultiple,
diff --git a/templates/roster/front.html b/templates/roster/front.html
index 98a051b..714ba5c 100644
--- a/templates/roster/front.html
+++ b/templates/roster/front.html
@@ -10,6 +10,7 @@
Team Phone List
Team Contact List
T-Shirt List
+ Hours List
Badge Generation
diff --git a/urls.py b/urls.py
index 3e002dc..29cb3a8 100644
--- a/urls.py
+++ b/urls.py
@@ -10,6 +10,7 @@
url(r'^phone/$', 'phone_list', name="phone_list"),
url(r'^contact/$', 'contact_list', name="contact_list"),
url(r'^tshirt/$', 'tshirt_list', name="tshirt_list"),
+ url(r'^hours/$', 'hours_list', name="hours_list"),
url(r'^event_email/$', 'event_email_list', name="event_email_list"),
url(r'^team_reg_verify/$', 'team_reg_verify', name="team_reg_verify"),
url(r'^badges/$', 'badges', name="badges"),
diff --git a/views.py b/views.py
index 6861e23..f8785b1 100644
--- a/views.py
+++ b/views.py
@@ -4,7 +4,7 @@
from django.shortcuts import render_to_response, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.template import RequestContext
-from django.db.models import Q, Count
+from django.db.models import Q, Count, Sum
from django.views.decorators.csrf import csrf_exempt
from django.db import transaction
from django.contrib.formtools.wizard.views import SessionWizardView
@@ -286,6 +286,40 @@ def tshirt_list(request):
return render_to_response("roster/tshirt_list.html", locals(),
context_instance=RequestContext(request))
+@login_required(login_url='/roster/login/')
+def hours_list(request):
+ """Team hours list."""
+
+ if request.method == 'GET' and request.GET:
+ form = HoursListForm(request.GET)
+ if form.is_valid():
+ who = set(form.data.getlist('who'))
+
+ people = PersonTeam.objects.filter(role__in=who,
+ status='Active',
+ team__in=form.data.getlist('team')).values('person')
+
+ results = Person.objects.filter(id__in=people)
+
+ from_date = form.cleaned_data.get('from_date', None)
+ to_date = form.cleaned_data.get('to_date', None)
+ if from_date and to_date:
+ results = results.filter(timerecord__clock_in__range=(from_date, to_date))
+ elif from_date:
+ results = results.filter(timerecord__clock_in__gt=from_date)
+ elif to_date:
+ results = results.filter(timerecord__clock_in__lt=to_date)
+
+ results = results.annotate(total_hours=Sum('timerecord__hours')).order_by('-total_hours')
+
+ total = sum(x.total_hours for x in results)
+ show_hours = 'include_hours' in form.data
+ else:
+ form = HoursListForm()
+
+ return render_to_response("roster/hours_list.html", locals(),
+ context_instance=RequestContext(request))
+
@login_required(login_url='/roster/login/')
def event_email_list(request):
"""Event email list."""