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