From 8066c2c05f23a29d8ba854b491848c6a6473b39b Mon Sep 17 00:00:00 2001 From: Nikolas Nyby Date: Tue, 28 Nov 2023 15:51:00 -0500 Subject: [PATCH] Add assignment student detail view basics A lot more to do here, this just sets up the basic view and various connections. Also, some of the topics tests required some adjustments with these changes. I'm not sure why my changes caused the failures here, but our Topic/django-ordered-model implementation has proven to be quite fragile. --- econplayground/assignment/tests/test_views.py | 12 ++++++ econplayground/assignment/views.py | 8 ++++ econplayground/main/tests/test_views.py | 24 +++++++++--- .../assignment/assignment_detail_student.html | 38 +++++++++++++++++++ .../assignment/assignment_list_student.html | 10 ++--- .../templates/assignment/step_detail.html | 32 ++++++++++------ econplayground/urls.py | 3 ++ 7 files changed, 102 insertions(+), 25 deletions(-) create mode 100644 econplayground/templates/assignment/assignment_detail_student.html diff --git a/econplayground/assignment/tests/test_views.py b/econplayground/assignment/tests/test_views.py index d6c2a2aad..c1e786c09 100644 --- a/econplayground/assignment/tests/test_views.py +++ b/econplayground/assignment/tests/test_views.py @@ -534,3 +534,15 @@ def test_assignment_step_value_submission(self): score_path.refresh_from_db() self.assertEqual(score_path.score, 0.5) + + +class AssignmentDetailStudentViewTest( + LoggedInTestStudentMixin, AssignmentMixin, TestCase): + def test_assignment_step_view(self): + assignment = self.setup_sample_assignment() + r = self.client.get(reverse('assignment_detail_student', kwargs={ + 'pk': assignment.pk + })) + + self.assertEqual(r.status_code, 200) + self.assertContains(r, assignment.title) diff --git a/econplayground/assignment/views.py b/econplayground/assignment/views.py index 9897c3b92..a5101fe81 100644 --- a/econplayground/assignment/views.py +++ b/econplayground/assignment/views.py @@ -114,6 +114,14 @@ def get_context_data(self, **kwargs): return ctx +class AssignmentDetailStudentView(LoginRequiredMixin, DetailView): + """ + Read-only view for working through an assignment. + """ + model = Assignment + template_name = 'assignment/assignment_detail_student.html' + + class AssignmentTreeUpdateView(LoginRequiredMixin, UserPassesTestMixin, View): """ Add and remove nodes from the assignment tree. diff --git a/econplayground/main/tests/test_views.py b/econplayground/main/tests/test_views.py index 3cda28274..b4ddbbe45 100644 --- a/econplayground/main/tests/test_views.py +++ b/econplayground/main/tests/test_views.py @@ -748,8 +748,12 @@ def test_get(self): self.assertContains(r, 'Topic B') self.assertEqual(r.context['all_count'], 3) self.assertEqual(r.context['featured_count'], 2) - self.assertEqual(r.context['topic_list'][0].published_graph_count(), 2) - self.assertEqual(r.context['topic_list'][1].published_graph_count(), 1) + + self.t1.refresh_from_db() + self.t2.refresh_from_db() + self.assertEqual(len(r.context['topic_list']), 2) + self.assertEqual(self.t1.published_graph_count(), 2) + self.assertEqual(self.t2.published_graph_count(), 1) r = self.client.get( '{}?all=true'.format( @@ -769,8 +773,12 @@ def test_get(self): self.assertContains(r, 'Topic B') self.assertEqual(r.context['all_count'], 3) self.assertEqual(r.context['featured_count'], 2) - self.assertEqual(r.context['topic_list'][0].published_graph_count(), 2) - self.assertEqual(r.context['topic_list'][1].published_graph_count(), 1) + + self.t1.refresh_from_db() + self.t2.refresh_from_db() + self.assertEqual(len(r.context['topic_list']), 2) + self.assertEqual(self.t1.published_graph_count(), 2) + self.assertEqual(self.t2.published_graph_count(), 1) r = self.client.get( '{}?topic={}'.format( @@ -815,8 +823,12 @@ def test_get(self): self.assertContains(r, 'Topic B') self.assertEqual(r.context['all_count'], 3) self.assertEqual(r.context['featured_count'], 2) - self.assertEqual(r.context['topic_list'][0].published_graph_count(), 2) - self.assertEqual(r.context['topic_list'][1].published_graph_count(), 1) + + self.t1.refresh_from_db() + self.t2.refresh_from_db() + self.assertEqual(len(r.context['topic_list']), 2) + self.assertEqual(self.t1.published_graph_count(), 2) + self.assertEqual(self.t2.published_graph_count(), 1) class MockLTI(object): diff --git a/econplayground/templates/assignment/assignment_detail_student.html b/econplayground/templates/assignment/assignment_detail_student.html new file mode 100644 index 000000000..956598447 --- /dev/null +++ b/econplayground/templates/assignment/assignment_detail_student.html @@ -0,0 +1,38 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{{ object.title }}{% endblock %} + +{% block breadcrumb %} + +{% endblock %} + +{% block pagetitle %} +

{{ object.title }}

+{% endblock %} + +{% block content %} +
+ Welcome to assignment {{object.pk}}! +
+ + {% if object.first_step %} + + First question + + {% endif %} +{% endblock %} diff --git a/econplayground/templates/assignment/assignment_list_student.html b/econplayground/templates/assignment/assignment_list_student.html index feb5b22f1..56a32ace9 100644 --- a/econplayground/templates/assignment/assignment_list_student.html +++ b/econplayground/templates/assignment/assignment_list_student.html @@ -17,14 +17,10 @@ {% for assignment in assignment_list %} - {% if assignment.first_step %} - - {{assignment.title}} - - {% else %} + {{assignment.title}} - {% endif %} + {% for cohort in assignment.cohorts.all %} diff --git a/econplayground/templates/assignment/step_detail.html b/econplayground/templates/assignment/step_detail.html index 6241beb51..7587ebd71 100644 --- a/econplayground/templates/assignment/step_detail.html +++ b/econplayground/templates/assignment/step_detail.html @@ -8,18 +8,26 @@ {% endblock %} {% block breadcrumb %} - + {% user_is_instructor request.user as i_am_instructor %} + + {% endblock %} {% block pagetitle %} diff --git a/econplayground/urls.py b/econplayground/urls.py index 184162ba8..891db96e3 100644 --- a/econplayground/urls.py +++ b/econplayground/urls.py @@ -103,6 +103,9 @@ def trigger_error(request): path('assignment//', assignment_views.AssignmentDetailView.as_view(), name='assignment_detail'), + path('assignment//view/', + assignment_views.AssignmentDetailStudentView.as_view(), + name='assignment_detail_student'), path('assignment_assignment//edit/', assignment_views.AssignmentUpdateView.as_view(), name='assignment_assignment_edit'),