diff --git a/accounts/models.py b/accounts/models.py
index 2e2f3f2..a12186b 100644
--- a/accounts/models.py
+++ b/accounts/models.py
@@ -19,7 +19,7 @@ class Instructor(models.Model):
modified = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
- return reverse('user-detail', kwargs={'pk': self.pk})
+ return reverse('account-detail', kwargs={'pk': self.pk})
def __str__(self):
return f'{self.user.first_name} {self.user.last_name}'
@@ -34,7 +34,7 @@ class Student(models.Model):
modified = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
- return reverse('user-detail', kwargs={'pk': self.pk})
+ return reverse('account-detail', kwargs={'pk': self.pk})
def __str__(self):
return f'{self.student_number}: {self.user.first_name} {self.user.last_name}'
diff --git a/accounts/templates/accounts/account_list.html b/accounts/templates/accounts/account_list.html
index 0008997..31fe62d 100644
--- a/accounts/templates/accounts/account_list.html
+++ b/accounts/templates/accounts/account_list.html
@@ -9,7 +9,7 @@
| {{ user.username }} |
{{user.first_name}} {{user.last_name}} |
- Update |
+ Update |
{% empty %}
| No users yet. |
diff --git a/accounts/tests.py b/accounts/tests.py
index 7ce503c..84401bb 100644
--- a/accounts/tests.py
+++ b/accounts/tests.py
@@ -1,3 +1,108 @@
-from django.test import TestCase
+import json
+from django.test import TestCase, Client
+from django.urls import reverse
+from django.utils import timezone
+from django.contrib.auth.models import User
+from .models import Department, Instructor, Student
-# Create your tests here.
+class TestModels(TestCase):
+ def setUp(self):
+ self.peter = User.objects.create_user('Peter Templer', 'peter@testing.com', 'peterspassword321')
+ self.nick = User.objects.create_user('Nick Jenkins', 'nick@testing.com', 'nickspassword321')
+ self.department = Department.objects.create(name = "Blandings Castle")
+ self.student = Student.objects.create(
+ user = self.peter,
+ student_number = 357950,
+ department = self.department,
+ )
+ self.instructor = Instructor.objects.create(
+ user = self.nick,
+ department = self.department,
+ )
+
+ def test_student_user_relationship(self):
+ self.assertEquals(self.peter, self.student.user)
+
+ def test_student_get_absolute_url(self):
+ url = self.student.get_absolute_url()
+ self.assertEquals(url, '/accounts/1/')
+
+ def test_instructor_user_relationship(self):
+ self.assertEquals(self.nick, self.instructor.user)
+
+ def test_instructor_get_absolute_url(self):
+ url = self.instructor.get_absolute_url()
+ self.assertEquals(url, '/accounts/1/')
+
+class TestViews(TestCase):
+ def setUp(self):
+ self.client = Client()
+ self.reverse_urls = {
+ 'list': reverse('account-list'),
+ 'create': reverse('account-create'),
+ 'detail': reverse('account-detail', args=['1']),
+ 'update': reverse('account-update', args=['1']),
+ 'delete': reverse('account-delete', args=['1'])
+ }
+
+ self.peter = User.objects.create_user('Peter Templer', 'peter@testing.com', 'peterspassword321')
+ self.nick = User.objects.create_user('Nick Jenkins', 'nick@testing.com', 'nickspassword321')
+ self.department = Department.objects.create(name = "Blandings Castle")
+ self.student = Student.objects.create(
+ user = self.peter,
+ student_number = 357950,
+ department = self.department,
+ )
+ self.instructor = Instructor.objects.create(
+ user = self.nick,
+ department = self.department,
+ )
+ self.client.force_login(self.peter)
+
+ def test_students_list(self):
+ response = self.client.get(self.reverse_urls['list'])
+ self.assertEquals(response.status_code, 200)
+ self.assertTemplateUsed(response, 'accounts/account_list.html')
+
+ def test_students_create_GET(self):
+ response = self.client.get(self.reverse_urls['create'])
+ self.assertEquals(response.status_code, 200)
+ self.assertTemplateUsed(response, 'accounts/account_form.html')
+
+ def test_students_create_POST(self):
+ response = self.client.post(self.reverse_urls['create'], {
+ 'user': self.peter.id,
+ 'student_number': 357950,
+ 'department': self.department,
+ }, follow=True)
+
+ self.assertRedirects(
+ response,
+ reverse('account-detail', args=[self.peter.id]),
+ status_code=302,
+ target_status_code=200,
+ fetch_redirect_response=True
+ )
+
+ def test_students_detail(self):
+ response = self.client.get(self.reverse_urls['detail'])
+ self.assertEquals(response.status_code, 200)
+ self.assertTemplateUsed(response, 'accounts/account_detail.html')
+
+ def test_students_update_GET(self):
+ response = self.client.get(self.reverse_urls['update'])
+ self.assertEquals(response.status_code, 200)
+ self.assertTemplateUsed(response, 'accounts/account_form.html')
+
+ def test_students_update_POST(self):
+ pass
+
+ def test_student_delete(self):
+ response = self.client.get(self.reverse_urls['delete'])
+ self.assertEquals(response.status_code, 200)
+ self.assertTemplateUsed(response, 'accounts/account_confirm_delete.html')
+
+ def test_student_delete(self):
+ response = self.client.delete(self.reverse_urls['delete'], json.dumps({ 'id': 1 }))
+
+ self.assertEquals(response.status_code, 302)
\ No newline at end of file
diff --git a/attendance/tests.py b/attendance/tests.py
index 7ce503c..b7e1499 100644
--- a/attendance/tests.py
+++ b/attendance/tests.py
@@ -1,3 +1,104 @@
-from django.test import TestCase
+from django.test import TestCase, Client
+from django.urls import reverse
+from django.utils import timezone
+from django.contrib.auth.models import User
+from accounts.models import Department, Instructor, Student
+from .models import Code, Period
+from .forms import AttendanceUpdateForm
+
+# Code
+# student
+# station_number
+# Period
+# student
+# station_number
+
+class CodeModelTests(TestCase):
+ def setUp(self):
+ self.peter = User.objects.create_user('Peter Templer', 'peter@testing.com', 'peterspassword321')
+ self.nick = User.objects.create_user('Nick Jenkins', 'nick@testing.com', 'nickspassword321')
+ self.department = Department.objects.create(name = "Blandings Castle")
+ self.student = Student.objects.create(
+ user = self.peter,
+ student_number = 357950,
+ department = self.department,
+ )
+ self.instructor = Instructor.objects.create(
+ user = self.nick,
+ department = self.department,
+ )
+
+ self.code = Code.objects.create(student=self.student, station_number=22)
+
+ def test_code_qr_code_str(self):
+ """test_qr_code_str() returns a string joining on ':' and contains student_number"""
+ self.assertEqual("357950:22", self.code.qr_code_str())
+
+class TestForms(TestCase):
+ def setUp(self):
+ pass
+
+ def test_attendance_update_form(self):
+ form = AttendanceUpdateForm(data={
+ 'qr_string': '357950:22'
+ })
+
+ self.assertTrue(form.is_valid())
+
+class TestPeriodViews(TestCase):
+ def setUp(self):
+ self.client = Client()
+ self.reverse_urls = {
+ # 'list': reverse('period-list'),
+ # 'create': reverse('period-create'),
+ 'detail': reverse('period-detail', args=['1']),
+ 'update': reverse('period-update', args=['1']),
+ 'delete': reverse('period-delete', args=['1'])
+ }
+ self.peter = User.objects.create_user('Peter Templer', 'peter@testing.com', 'peterspassword321')
+ self.nick = User.objects.create_user('Nick Jenkins', 'nick@testing.com', 'nickspassword321')
+ self.department = Department.objects.create(name = "Blandings Castle")
+ self.student = Student.objects.create(
+ user = self.peter,
+ student_number = 357950,
+ department = self.department,
+ )
+ self.instructor = Instructor.objects.create(
+ user = self.nick,
+ department = self.department,
+ )
+ self.period = Period.objects.create(
+ student = self.student,
+ station_number = 22,
+ )
+ self.client.force_login(self.peter)
+
+ # def test_period_create_GET(self):
+ # response = self.client.get(self.reverse_urls['create'])
+ # self.assertEquals(response.status_code, 200)
+ # self.assertTemplateUsed(response, 'attendance/period_form.html')
+
+ # def test_period_create_POST(self):
+ # response = self.client.post(self.reverse_urls['create'], {
+ # 'student': self.student.id,
+ # 'station_number': 22,
+ # }, follow=True)
+
+ # self.assertRedirects(
+ # response,
+ # reverse('period-detail', args=[self.a_shift.id]),
+ # status_code=302,
+ # target_status_code=200,
+ # fetch_redirect_response=True
+ # )
+
+ def test_period_detail(self):
+ response = self.client.get(self.reverse_urls['detail'])
+ self.assertEquals(response.status_code, 200)
+ self.assertTemplateUsed(response, 'attendance/period_detail.html')
+
+ def test_period_update_GET(self):
+ response = self.client.get(self.reverse_urls['update'])
+ self.assertEquals(response.status_code, 200)
+ self.assertTemplateUsed(response, 'attendance/period_form.html')
-# Create your tests here.
diff --git a/attendance/views.py b/attendance/views.py
index 22a31da..6943278 100644
--- a/attendance/views.py
+++ b/attendance/views.py
@@ -41,8 +41,10 @@ class AttendanceOverview(LoginRequiredMixin, TemplateView):
).order_by('-clocked_in'
).aggregate(total_duration=Sum('duration'))
+ hours = ""
# Convert to hours floating point
- hours = round((total_duration['total_duration'].total_seconds() / 3600), 2)
+ if hasattr(total_duration, 'total_duration'):
+ hours = round((total_duration['total_duration'].total_seconds() / 3600), 2)
context['period_list'] = Period.objects.filter(
student=self.request.user.student