Skip to content

[ACEM] ruff x llteacher#83

Merged
siscia merged 1 commit intomainfrom
acem/ruff-format-0.14.8-20260504-032113
May 4, 2026
Merged

[ACEM] ruff x llteacher#83
siscia merged 1 commit intomainfrom
acem/ruff-format-0.14.8-20260504-032113

Conversation

@automaticcodeevolutionmanagement
Copy link
Copy Markdown

ruff x llteacher

Details

  • Policy: Ruff Format 0.14.8
  • Initiative ID: 17
  • Fixes Applied: 14 violations
  • Files Modified: 14

Original Violations

src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
--- src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
+++ src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
@@ -8,7 +8,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("conversations", "0004_sectionanswer"),
         ("homeworks", "0008_homeworkprogresswidget"),

--- src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
+++ src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
@@ -5,7 +5,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("conversations", "0005_homeworkprogresswidgetresponse"),
     ]

--- src/conversations/models.py
+++ src/conversations/models.py
@@ -1,6 +1,10 @@
 import uuid
 from django.db import models
-from django.core.validators import MinLengthValidator, MinValueValidator, MaxValueValidator
+from django.core.validators import (
+    MinLengthValidator,
+    MinValueValidator,
+    MaxValueValidator,
+)
 from django.utils import timezone
 
 
@@ -266,7 +270,9 @@
     def __str__(self):
         pre = self.pre_value if self.pre_value is not None else "N/A"
         post = self.post_value if self.post_value is not None else "N/A"
-        return f"{self.user.username} - Widget {self.widget.order}: pre={pre}, post={post}"
+        return (
+            f"{self.user.username} - Widget {self.widget.order}: pre={pre}, post={post}"
+        )
 
     def save(self, *args, **kwargs):
         if self.pre_value is not None and self.pre_submitted_at is None:

--- src/conversations/tests/test_conversation_start_view.py
+++ src/conversations/tests/test_conversation_start_view.py
@@ -242,5 +242,7 @@
         response = self.client.get(self.start_url)
         # This currently returns 200 (no pre-widget check exists) — SHOULD redirect
         self.assertEqual(
-            response.status_code, 302, "Student should be redirected, not allowed to start"
+            response.status_code,
+            302,
+            "Student should be redirected, not allowed to start",
         )

--- src/courses/tests/test_views.py
+++ src/courses/tests/test_views.py
@@ -1220,7 +1220,9 @@
         self.assertEqual(response.status_code, 302)
 
         homework = Homework.objects.get(title="Homework With Three Widgets")
-        widgets = list(HomeworkProgressWidget.objects.filter(homework=homework).order_by("order"))
+        widgets = list(
+            HomeworkProgressWidget.objects.filter(homework=homework).order_by("order")
+        )
         self.assertEqual(len(widgets), 3)
         self.assertEqual(widgets[0].order, 1)
         self.assertEqual(widgets[1].order, 2)

--- src/courses/views.py
+++ src/courses/views.py
@@ -705,12 +705,20 @@
             # Extract widgets data from formset
             widgets_data = []
             for widget_form in normalize_progress_widget_formset_orders(widget_formset):
-                if widget_form.cleaned_data.get("pre_prompt") or widget_form.cleaned_data.get("post_prompt"):
-                    widgets_data.append({
-                        "pre_prompt": widget_form.cleaned_data.get("pre_prompt", ""),
-                        "post_prompt": widget_form.cleaned_data.get("post_prompt", ""),
-                        "order": widget_form.cleaned_data.get("order", 1),
-                    })
+                if widget_form.cleaned_data.get(
+                    "pre_prompt"
+                ) or widget_form.cleaned_data.get("post_prompt"):
+                    widgets_data.append(
+                        {
+                            "pre_prompt": widget_form.cleaned_data.get(
+                                "pre_prompt", ""
+                            ),
+                            "post_prompt": widget_form.cleaned_data.get(
+                                "post_prompt", ""
+                            ),
+                            "order": widget_form.cleaned_data.get("order", 1),
+                        }
+                    )
             homework_data.widgets = widgets_data
 
             # Use service to create homework with sections (course already included in data)

--- src/homeworks/forms.py
+++ src/homeworks/forms.py
@@ -351,7 +351,7 @@
                 "rows": 2,
                 "placeholder": "Prompt shown after completing homework...",
             }
-        )
+        ),
     )
     order = forms.CharField(required=False, widget=forms.HiddenInput())
     DELETE = forms.BooleanField(required=False, widget=forms.HiddenInput())

--- src/homeworks/migrations/0008_homeworkprogresswidget.py
+++ src/homeworks/migrations/0008_homeworkprogresswidget.py
@@ -7,7 +7,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("homeworks", "0007_add_scheduled_homework_type"),
     ]

--- src/homeworks/services.py
+++ src/homeworks/services.py
@@ -1776,7 +1776,11 @@
 
             pre_val = response.pre_value if response else None
             post_val = response.post_value if response else None
-            diff = post_val - pre_val if pre_val is not None and post_val is not None else None
+            diff = (
+                post_val - pre_val
+                if pre_val is not None and post_val is not None
+                else None
+            )
 
             widget_data_list.append(
                 WidgetData(

--- src/homeworks/tests/test_edit_view.py
+++ src/homeworks/tests/test_edit_view.py
@@ -714,7 +714,9 @@
 
         self.client = Client()
         self.teacher_user = User.objects.create_user(
-            username="widget_edit_teacher", email="widget_edit@example.com", password="password"
+            username="widget_edit_teacher",
+            email="widget_edit@example.com",
+            password="password",
         )
         self.teacher = Teacher.objects.create(user=self.teacher_user)
         self.course = Course.objects.create(
@@ -790,7 +792,9 @@
         mock_update_homework.assert_called_once()
         update_data = mock_update_homework.call_args[0][1]
         self.assertEqual(len(update_data.widgets_to_create), 1)
-        self.assertEqual(update_data.widgets_to_create[0]["pre_prompt"], "New pre prompt")
+        self.assertEqual(
+            update_data.widgets_to_create[0]["pre_prompt"], "New pre prompt"
+        )
 
     @patch("homeworks.services.HomeworkService.update_homework")
     def test_edit_delete_existing_widget(self, mock_update_homework):

--- src/homeworks/tests/test_progress_widget.py
+++ src/homeworks/tests/test_progress_widget.py
@@ -46,7 +46,9 @@
         )
         self.assertEqual(widget.homework, self.homework)
         self.assertEqual(widget.pre_prompt, "How much do you know about this topic?")
-        self.assertEqual(widget.post_prompt, "How much do you now know about this topic?")
+        self.assertEqual(
+            widget.post_prompt, "How much do you now know about this topic?"
+        )
         self.assertEqual(widget.order, 1)
         self.assertIsInstance(widget.id, uuid.UUID)
 
@@ -259,7 +261,9 @@
         )
         self.assertEqual(response.pre_value, 10)
 
-        user2 = self.User.objects.create_user(username="student_range", password="pass123")
+        user2 = self.User.objects.create_user(
+            username="student_range", password="pass123"
+        )
         response2 = self.WidgetResponse.objects.create(
             user=user2,
             widget=self.widget,
@@ -647,9 +651,7 @@
         )
         self.assertTrue(result)
 
-        response = self.WidgetResponse.objects.get(
-            user=self.user, widget=self.widget1
-        )
+        response = self.WidgetResponse.objects.get(user=self.user, widget=self.widget1)
         self.assertEqual(response.pre_value, 7)
         self.assertIsNotNone(response.pre_submitted_at)
 
@@ -666,9 +668,7 @@
         )
         self.assertTrue(result)
 
-        response = self.WidgetResponse.objects.get(
-            user=self.user, widget=self.widget1
-        )
+        response = self.WidgetResponse.objects.get(user=self.user, widget=self.widget1)
         self.assertEqual(response.post_value, 9)
         self.assertIsNotNone(response.post_submitted_at)
 
@@ -709,8 +709,16 @@
             sections_to_create=[],
             sections_to_delete=[],
             widgets_to_create=[
-                {"pre_prompt": "Pre prompt 1", "post_prompt": "Post prompt 1", "order": 1},
-                {"pre_prompt": "Pre prompt 2", "post_prompt": "Post prompt 2", "order": 2},
+                {
+                    "pre_prompt": "Pre prompt 1",
+                    "post_prompt": "Post prompt 1",
+                    "order": 1,
+                },
+                {
+                    "pre_prompt": "Pre prompt 2",
+                    "post_prompt": "Post prompt 2",
+                    "order": 2,
+                },
             ],
         )
 
@@ -782,6 +790,4 @@
         result = HomeworkService.update_homework(self.homework.id, update_data)
         self.assertTrue(result.success)
 
-        self.assertFalse(
-            HomeworkProgressWidget.objects.filter(id=widget_id).exists()
-        )
\ No newline at end of file
+        self.assertFalse(HomeworkProgressWidget.objects.filter(id=widget_id).exists())

--- src/homeworks/tests/test_section_detail_view.py
+++ src/homeworks/tests/test_section_detail_view.py
@@ -415,7 +415,9 @@
         response = self.client.get(self.url)
         self.assertRedirects(
             response,
-            reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id}),
+            reverse(
+                "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+            ),
         )
 
     def test_teacher_can_access_section_regardless_of_widgets(self):

--- src/homeworks/tests/test_widget_answer_view.py
+++ src/homeworks/tests/test_widget_answer_view.py
@@ -8,7 +8,11 @@
 from datetime import timedelta
 
 from homeworks.models import Homework, HomeworkProgressWidget, Section
-from conversations.models import HomeworkProgressWidgetResponse, Conversation, Submission
+from conversations.models import (
+    HomeworkProgressWidgetResponse,
+    Conversation,
+    Submission,
+)
 from accounts.models import User, Teacher, Student
 from courses.models import Course, CourseEnrollment, CourseTeacher
 
@@ -57,7 +61,9 @@
             order=1,
         )
 
-        self.url = reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id})
+        self.url = reverse(
+            "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+        )
 
     def test_student_get_shows_pre_widget(self):
         """Test that student sees pre-assessment widget when not yet answered."""
@@ -78,7 +84,9 @@
         response = self.client.get(self.url)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, "Post-Assessment")
-        self.assertContains(response, "How much do you now know about this topic? (Post)")
+        self.assertContains(
+            response, "How much do you now know about this topic? (Post)"
+        )
 
     def test_student_get_shows_pre_value_locked_when_post(self):
         """Test that pre value is shown (locked) when answering post widget."""
@@ -175,7 +183,11 @@
             },
         )
         self.assertEqual(response.status_code, 302)
-        messages = list(response.context["messages"]) if hasattr(response, "context") and response.context else []
+        messages = (
+            list(response.context["messages"])
+            if hasattr(response, "context") and response.context
+            else []
+        )
         # Value should not be saved since 11 is out of range
         response_obj = HomeworkProgressWidgetResponse.objects.filter(
             user=self.student_user, widget=self.widget
@@ -202,7 +214,6 @@
         # View redirects to list when homework not found
         self.assertEqual(response.status_code, 302)
 
-
     def test_after_pre_answered_redirects_to_homework_not_post(self):
         """After answering all pre, student should go to homework, not post."""
         # Create an interactive section so there's homework to do
@@ -249,7 +260,9 @@
         response = self.client.get(self.url)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, "Post-Assessment")
-        self.assertContains(response, "How much do you now know about this topic? (Post)")
+        self.assertContains(
+            response, "How much do you now know about this topic? (Post)"
+        )
 
 
 class WidgetAnswerViewMultipleWidgetsTestCase(TestCase):
@@ -302,7 +315,9 @@
             order=2,
         )
 
-        self.url = reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id})
+        self.url = reverse(
+            "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+        )
 
     def test_student_must_answer_all_pre_widgets(self):
         """Test that student must answer all pre widgets before sections."""
@@ -351,4 +366,4 @@
         )
 
         self.assertEqual(response1.pre_value, 5)  # Unchanged
-        self.assertEqual(response2.pre_value, 7)  # Created via POST
\ No newline at end of file
+        self.assertEqual(response2.pre_value, 7)  # Created via POST

--- src/homeworks/views.py
+++ src/homeworks/views.py
@@ -486,9 +486,7 @@
             type[ProgressWidgetFormSet],
             formset_factory(ProgressWidgetForm, extra=0, formset=ProgressWidgetFormSet),
         )
-        widget_formset = WidgetFormset(
-            prefix="widgets", initial=initial_widget_data
-        )
+        widget_formset = WidgetFormset(prefix="widgets", initial=initial_widget_data)
         assert_type(widget_formset, ProgressWidgetFormSet)
 
         # Return form data
@@ -1383,9 +1381,7 @@
         # Check pre-conditions: student must answer all pre-assessment widgets
         from .services import HomeworkService
 
-        next_widget = HomeworkService.get_next_unanswered_widget(
-            request.user, homework
-        )
+        next_widget = HomeworkService.get_next_unanswered_widget(request.user, homework)
         if next_widget is not None and not next_widget.is_post:
             return redirect("homeworks:widget_answer", homework_id=homework_id)
 
@@ -1489,9 +1485,7 @@
         ):
             return HttpResponseForbidden("You are not enrolled in this course.")
 
-        widget = HomeworkService.get_next_unanswered_widget(
-            request.user, homework
-        )
+        widget = HomeworkService.get_next_unanswered_widget(request.user, homework)
 
         if widget is None:
             return redirect("homeworks:detail", homework_id=homework_id)
src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
--- src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
+++ src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
@@ -8,7 +8,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("conversations", "0004_sectionanswer"),
         ("homeworks", "0008_homeworkprogresswidget"),

--- src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
+++ src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
@@ -5,7 +5,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("conversations", "0005_homeworkprogresswidgetresponse"),
     ]

--- src/conversations/models.py
+++ src/conversations/models.py
@@ -1,6 +1,10 @@
 import uuid
 from django.db import models
-from django.core.validators import MinLengthValidator, MinValueValidator, MaxValueValidator
+from django.core.validators import (
+    MinLengthValidator,
+    MinValueValidator,
+    MaxValueValidator,
+)
 from django.utils import timezone
 
 
@@ -266,7 +270,9 @@
     def __str__(self):
         pre = self.pre_value if self.pre_value is not None else "N/A"
         post = self.post_value if self.post_value is not None else "N/A"
-        return f"{self.user.username} - Widget {self.widget.order}: pre={pre}, post={post}"
+        return (
+            f"{self.user.username} - Widget {self.widget.order}: pre={pre}, post={post}"
+        )
 
     def save(self, *args, **kwargs):
         if self.pre_value is not None and self.pre_submitted_at is None:

--- src/conversations/tests/test_conversation_start_view.py
+++ src/conversations/tests/test_conversation_start_view.py
@@ -242,5 +242,7 @@
         response = self.client.get(self.start_url)
         # This currently returns 200 (no pre-widget check exists) — SHOULD redirect
         self.assertEqual(
-            response.status_code, 302, "Student should be redirected, not allowed to start"
+            response.status_code,
+            302,
+            "Student should be redirected, not allowed to start",
         )

--- src/courses/tests/test_views.py
+++ src/courses/tests/test_views.py
@@ -1220,7 +1220,9 @@
         self.assertEqual(response.status_code, 302)
 
         homework = Homework.objects.get(title="Homework With Three Widgets")
-        widgets = list(HomeworkProgressWidget.objects.filter(homework=homework).order_by("order"))
+        widgets = list(
+            HomeworkProgressWidget.objects.filter(homework=homework).order_by("order")
+        )
         self.assertEqual(len(widgets), 3)
         self.assertEqual(widgets[0].order, 1)
         self.assertEqual(widgets[1].order, 2)

--- src/courses/views.py
+++ src/courses/views.py
@@ -705,12 +705,20 @@
             # Extract widgets data from formset
             widgets_data = []
             for widget_form in normalize_progress_widget_formset_orders(widget_formset):
-                if widget_form.cleaned_data.get("pre_prompt") or widget_form.cleaned_data.get("post_prompt"):
-                    widgets_data.append({
-                        "pre_prompt": widget_form.cleaned_data.get("pre_prompt", ""),
-                        "post_prompt": widget_form.cleaned_data.get("post_prompt", ""),
-                        "order": widget_form.cleaned_data.get("order", 1),
-                    })
+                if widget_form.cleaned_data.get(
+                    "pre_prompt"
+                ) or widget_form.cleaned_data.get("post_prompt"):
+                    widgets_data.append(
+                        {
+                            "pre_prompt": widget_form.cleaned_data.get(
+                                "pre_prompt", ""
+                            ),
+                            "post_prompt": widget_form.cleaned_data.get(
+                                "post_prompt", ""
+                            ),
+                            "order": widget_form.cleaned_data.get("order", 1),
+                        }
+                    )
             homework_data.widgets = widgets_data
 
             # Use service to create homework with sections (course already included in data)

--- src/homeworks/forms.py
+++ src/homeworks/forms.py
@@ -351,7 +351,7 @@
                 "rows": 2,
                 "placeholder": "Prompt shown after completing homework...",
             }
-        )
+        ),
     )
     order = forms.CharField(required=False, widget=forms.HiddenInput())
     DELETE = forms.BooleanField(required=False, widget=forms.HiddenInput())

--- src/homeworks/migrations/0008_homeworkprogresswidget.py
+++ src/homeworks/migrations/0008_homeworkprogresswidget.py
@@ -7,7 +7,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("homeworks", "0007_add_scheduled_homework_type"),
     ]

--- src/homeworks/services.py
+++ src/homeworks/services.py
@@ -1776,7 +1776,11 @@
 
             pre_val = response.pre_value if response else None
             post_val = response.post_value if response else None
-            diff = post_val - pre_val if pre_val is not None and post_val is not None else None
+            diff = (
+                post_val - pre_val
+                if pre_val is not None and post_val is not None
+                else None
+            )
 
             widget_data_list.append(
                 WidgetData(

--- src/homeworks/tests/test_edit_view.py
+++ src/homeworks/tests/test_edit_view.py
@@ -714,7 +714,9 @@
 
         self.client = Client()
         self.teacher_user = User.objects.create_user(
-            username="widget_edit_teacher", email="widget_edit@example.com", password="password"
+            username="widget_edit_teacher",
+            email="widget_edit@example.com",
+            password="password",
         )
         self.teacher = Teacher.objects.create(user=self.teacher_user)
         self.course = Course.objects.create(
@@ -790,7 +792,9 @@
         mock_update_homework.assert_called_once()
         update_data = mock_update_homework.call_args[0][1]
         self.assertEqual(len(update_data.widgets_to_create), 1)
-        self.assertEqual(update_data.widgets_to_create[0]["pre_prompt"], "New pre prompt")
+        self.assertEqual(
+            update_data.widgets_to_create[0]["pre_prompt"], "New pre prompt"
+        )
 
     @patch("homeworks.services.HomeworkService.update_homework")
     def test_edit_delete_existing_widget(self, mock_update_homework):

--- src/homeworks/tests/test_progress_widget.py
+++ src/homeworks/tests/test_progress_widget.py
@@ -46,7 +46,9 @@
         )
         self.assertEqual(widget.homework, self.homework)
         self.assertEqual(widget.pre_prompt, "How much do you know about this topic?")
-        self.assertEqual(widget.post_prompt, "How much do you now know about this topic?")
+        self.assertEqual(
+            widget.post_prompt, "How much do you now know about this topic?"
+        )
         self.assertEqual(widget.order, 1)
         self.assertIsInstance(widget.id, uuid.UUID)
 
@@ -259,7 +261,9 @@
         )
         self.assertEqual(response.pre_value, 10)
 
-        user2 = self.User.objects.create_user(username="student_range", password="pass123")
+        user2 = self.User.objects.create_user(
+            username="student_range", password="pass123"
+        )
         response2 = self.WidgetResponse.objects.create(
             user=user2,
             widget=self.widget,
@@ -647,9 +651,7 @@
         )
         self.assertTrue(result)
 
-        response = self.WidgetResponse.objects.get(
-            user=self.user, widget=self.widget1
-        )
+        response = self.WidgetResponse.objects.get(user=self.user, widget=self.widget1)
         self.assertEqual(response.pre_value, 7)
         self.assertIsNotNone(response.pre_submitted_at)
 
@@ -666,9 +668,7 @@
         )
         self.assertTrue(result)
 
-        response = self.WidgetResponse.objects.get(
-            user=self.user, widget=self.widget1
-        )
+        response = self.WidgetResponse.objects.get(user=self.user, widget=self.widget1)
         self.assertEqual(response.post_value, 9)
         self.assertIsNotNone(response.post_submitted_at)
 
@@ -709,8 +709,16 @@
             sections_to_create=[],
             sections_to_delete=[],
             widgets_to_create=[
-                {"pre_prompt": "Pre prompt 1", "post_prompt": "Post prompt 1", "order": 1},
-                {"pre_prompt": "Pre prompt 2", "post_prompt": "Post prompt 2", "order": 2},
+                {
+                    "pre_prompt": "Pre prompt 1",
+                    "post_prompt": "Post prompt 1",
+                    "order": 1,
+                },
+                {
+                    "pre_prompt": "Pre prompt 2",
+                    "post_prompt": "Post prompt 2",
+                    "order": 2,
+                },
             ],
         )
 
@@ -782,6 +790,4 @@
         result = HomeworkService.update_homework(self.homework.id, update_data)
         self.assertTrue(result.success)
 
-        self.assertFalse(
-            HomeworkProgressWidget.objects.filter(id=widget_id).exists()
-        )
\ No newline at end of file
+        self.assertFalse(HomeworkProgressWidget.objects.filter(id=widget_id).exists())

--- src/homeworks/tests/test_section_detail_view.py
+++ src/homeworks/tests/test_section_detail_view.py
@@ -415,7 +415,9 @@
         response = self.client.get(self.url)
         self.assertRedirects(
             response,
-            reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id}),
+            reverse(
+                "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+            ),
         )
 
     def test_teacher_can_access_section_regardless_of_widgets(self):

--- src/homeworks/tests/test_widget_answer_view.py
+++ src/homeworks/tests/test_widget_answer_view.py
@@ -8,7 +8,11 @@
 from datetime import timedelta
 
 from homeworks.models import Homework, HomeworkProgressWidget, Section
-from conversations.models import HomeworkProgressWidgetResponse, Conversation, Submission
+from conversations.models import (
+    HomeworkProgressWidgetResponse,
+    Conversation,
+    Submission,
+)
 from accounts.models import User, Teacher, Student
 from courses.models import Course, CourseEnrollment, CourseTeacher
 
@@ -57,7 +61,9 @@
             order=1,
         )
 
-        self.url = reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id})
+        self.url = reverse(
+            "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+        )
 
     def test_student_get_shows_pre_widget(self):
         """Test that student sees pre-assessment widget when not yet answered."""
@@ -78,7 +84,9 @@
         response = self.client.get(self.url)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, "Post-Assessment")
-        self.assertContains(response, "How much do you now know about this topic? (Post)")
+        self.assertContains(
+            response, "How much do you now know about this topic? (Post)"
+        )
 
     def test_student_get_shows_pre_value_locked_when_post(self):
         """Test that pre value is shown (locked) when answering post widget."""
@@ -175,7 +183,11 @@
             },
         )
         self.assertEqual(response.status_code, 302)
-        messages = list(response.context["messages"]) if hasattr(response, "context") and response.context else []
+        messages = (
+            list(response.context["messages"])
+            if hasattr(response, "context") and response.context
+            else []
+        )
         # Value should not be saved since 11 is out of range
         response_obj = HomeworkProgressWidgetResponse.objects.filter(
             user=self.student_user, widget=self.widget
@@ -202,7 +214,6 @@
         # View redirects to list when homework not found
         self.assertEqual(response.status_code, 302)
 
-
     def test_after_pre_answered_redirects_to_homework_not_post(self):
         """After answering all pre, student should go to homework, not post."""
         # Create an interactive section so there's homework to do
@@ -249,7 +260,9 @@
         response = self.client.get(self.url)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, "Post-Assessment")
-        self.assertContains(response, "How much do you now know about this topic? (Post)")
+        self.assertContains(
+            response, "How much do you now know about this topic? (Post)"
+        )
 
 
 class WidgetAnswerViewMultipleWidgetsTestCase(TestCase):
@@ -302,7 +315,9 @@
             order=2,
         )
 
-        self.url = reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id})
+        self.url = reverse(
+            "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+        )
 
     def test_student_must_answer_all_pre_widgets(self):
         """Test that student must answer all pre widgets before sections."""
@@ -351,4 +366,4 @@
         )
 
         self.assertEqual(response1.pre_value, 5)  # Unchanged
-        self.assertEqual(response2.pre_value, 7)  # Created via POST
\ No newline at end of file
+        self.assertEqual(response2.pre_value, 7)  # Created via POST

--- src/homeworks/views.py
+++ src/homeworks/views.py
@@ -486,9 +486,7 @@
             type[ProgressWidgetFormSet],
             formset_factory(ProgressWidgetForm, extra=0, formset=ProgressWidgetFormSet),
         )
-        widget_formset = WidgetFormset(
-            prefix="widgets", initial=initial_widget_data
-        )
+        widget_formset = WidgetFormset(prefix="widgets", initial=initial_widget_data)
         assert_type(widget_formset, ProgressWidgetFormSet)
 
         # Return form data
@@ -1383,9 +1381,7 @@
         # Check pre-conditions: student must answer all pre-assessment widgets
         from .services import HomeworkService
 
-        next_widget = HomeworkService.get_next_unanswered_widget(
-            request.user, homework
-        )
+        next_widget = HomeworkService.get_next_unanswered_widget(request.user, homework)
         if next_widget is not None and not next_widget.is_post:
             return redirect("homeworks:widget_answer", homework_id=homework_id)
 
@@ -1489,9 +1485,7 @@
         ):
             return HttpResponseForbidden("You are not enrolled in this course.")
 
-        widget = HomeworkService.get_next_unanswered_widget(
-            request.user, homework
-        )
+        widget = HomeworkService.get_next_unanswered_widget(request.user, homework)
 
         if widget is None:
             return redirect("homeworks:detail", homework_id=homework_id)
src/conversations/models.py
--- src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
+++ src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
@@ -8,7 +8,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("conversations", "0004_sectionanswer"),
         ("homeworks", "0008_homeworkprogresswidget"),

--- src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
+++ src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
@@ -5,7 +5,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("conversations", "0005_homeworkprogresswidgetresponse"),
     ]

--- src/conversations/models.py
+++ src/conversations/models.py
@@ -1,6 +1,10 @@
 import uuid
 from django.db import models
-from django.core.validators import MinLengthValidator, MinValueValidator, MaxValueValidator
+from django.core.validators import (
+    MinLengthValidator,
+    MinValueValidator,
+    MaxValueValidator,
+)
 from django.utils import timezone
 
 
@@ -266,7 +270,9 @@
     def __str__(self):
         pre = self.pre_value if self.pre_value is not None else "N/A"
         post = self.post_value if self.post_value is not None else "N/A"
-        return f"{self.user.username} - Widget {self.widget.order}: pre={pre}, post={post}"
+        return (
+            f"{self.user.username} - Widget {self.widget.order}: pre={pre}, post={post}"
+        )
 
     def save(self, *args, **kwargs):
         if self.pre_value is not None and self.pre_submitted_at is None:

--- src/conversations/tests/test_conversation_start_view.py
+++ src/conversations/tests/test_conversation_start_view.py
@@ -242,5 +242,7 @@
         response = self.client.get(self.start_url)
         # This currently returns 200 (no pre-widget check exists) — SHOULD redirect
         self.assertEqual(
-            response.status_code, 302, "Student should be redirected, not allowed to start"
+            response.status_code,
+            302,
+            "Student should be redirected, not allowed to start",
         )

--- src/courses/tests/test_views.py
+++ src/courses/tests/test_views.py
@@ -1220,7 +1220,9 @@
         self.assertEqual(response.status_code, 302)
 
         homework = Homework.objects.get(title="Homework With Three Widgets")
-        widgets = list(HomeworkProgressWidget.objects.filter(homework=homework).order_by("order"))
+        widgets = list(
+            HomeworkProgressWidget.objects.filter(homework=homework).order_by("order")
+        )
         self.assertEqual(len(widgets), 3)
         self.assertEqual(widgets[0].order, 1)
         self.assertEqual(widgets[1].order, 2)

--- src/courses/views.py
+++ src/courses/views.py
@@ -705,12 +705,20 @@
             # Extract widgets data from formset
             widgets_data = []
             for widget_form in normalize_progress_widget_formset_orders(widget_formset):
-                if widget_form.cleaned_data.get("pre_prompt") or widget_form.cleaned_data.get("post_prompt"):
-                    widgets_data.append({
-                        "pre_prompt": widget_form.cleaned_data.get("pre_prompt", ""),
-                        "post_prompt": widget_form.cleaned_data.get("post_prompt", ""),
-                        "order": widget_form.cleaned_data.get("order", 1),
-                    })
+                if widget_form.cleaned_data.get(
+                    "pre_prompt"
+                ) or widget_form.cleaned_data.get("post_prompt"):
+                    widgets_data.append(
+                        {
+                            "pre_prompt": widget_form.cleaned_data.get(
+                                "pre_prompt", ""
+                            ),
+                            "post_prompt": widget_form.cleaned_data.get(
+                                "post_prompt", ""
+                            ),
+                            "order": widget_form.cleaned_data.get("order", 1),
+                        }
+                    )
             homework_data.widgets = widgets_data
 
             # Use service to create homework with sections (course already included in data)

--- src/homeworks/forms.py
+++ src/homeworks/forms.py
@@ -351,7 +351,7 @@
                 "rows": 2,
                 "placeholder": "Prompt shown after completing homework...",
             }
-        )
+        ),
     )
     order = forms.CharField(required=False, widget=forms.HiddenInput())
     DELETE = forms.BooleanField(required=False, widget=forms.HiddenInput())

--- src/homeworks/migrations/0008_homeworkprogresswidget.py
+++ src/homeworks/migrations/0008_homeworkprogresswidget.py
@@ -7,7 +7,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("homeworks", "0007_add_scheduled_homework_type"),
     ]

--- src/homeworks/services.py
+++ src/homeworks/services.py
@@ -1776,7 +1776,11 @@
 
             pre_val = response.pre_value if response else None
             post_val = response.post_value if response else None
-            diff = post_val - pre_val if pre_val is not None and post_val is not None else None
+            diff = (
+                post_val - pre_val
+                if pre_val is not None and post_val is not None
+                else None
+            )
 
             widget_data_list.append(
                 WidgetData(

--- src/homeworks/tests/test_edit_view.py
+++ src/homeworks/tests/test_edit_view.py
@@ -714,7 +714,9 @@
 
         self.client = Client()
         self.teacher_user = User.objects.create_user(
-            username="widget_edit_teacher", email="widget_edit@example.com", password="password"
+            username="widget_edit_teacher",
+            email="widget_edit@example.com",
+            password="password",
         )
         self.teacher = Teacher.objects.create(user=self.teacher_user)
         self.course = Course.objects.create(
@@ -790,7 +792,9 @@
         mock_update_homework.assert_called_once()
         update_data = mock_update_homework.call_args[0][1]
         self.assertEqual(len(update_data.widgets_to_create), 1)
-        self.assertEqual(update_data.widgets_to_create[0]["pre_prompt"], "New pre prompt")
+        self.assertEqual(
+            update_data.widgets_to_create[0]["pre_prompt"], "New pre prompt"
+        )
 
     @patch("homeworks.services.HomeworkService.update_homework")
     def test_edit_delete_existing_widget(self, mock_update_homework):

--- src/homeworks/tests/test_progress_widget.py
+++ src/homeworks/tests/test_progress_widget.py
@@ -46,7 +46,9 @@
         )
         self.assertEqual(widget.homework, self.homework)
         self.assertEqual(widget.pre_prompt, "How much do you know about this topic?")
-        self.assertEqual(widget.post_prompt, "How much do you now know about this topic?")
+        self.assertEqual(
+            widget.post_prompt, "How much do you now know about this topic?"
+        )
         self.assertEqual(widget.order, 1)
         self.assertIsInstance(widget.id, uuid.UUID)
 
@@ -259,7 +261,9 @@
         )
         self.assertEqual(response.pre_value, 10)
 
-        user2 = self.User.objects.create_user(username="student_range", password="pass123")
+        user2 = self.User.objects.create_user(
+            username="student_range", password="pass123"
+        )
         response2 = self.WidgetResponse.objects.create(
             user=user2,
             widget=self.widget,
@@ -647,9 +651,7 @@
         )
         self.assertTrue(result)
 
-        response = self.WidgetResponse.objects.get(
-            user=self.user, widget=self.widget1
-        )
+        response = self.WidgetResponse.objects.get(user=self.user, widget=self.widget1)
         self.assertEqual(response.pre_value, 7)
         self.assertIsNotNone(response.pre_submitted_at)
 
@@ -666,9 +668,7 @@
         )
         self.assertTrue(result)
 
-        response = self.WidgetResponse.objects.get(
-            user=self.user, widget=self.widget1
-        )
+        response = self.WidgetResponse.objects.get(user=self.user, widget=self.widget1)
         self.assertEqual(response.post_value, 9)
         self.assertIsNotNone(response.post_submitted_at)
 
@@ -709,8 +709,16 @@
             sections_to_create=[],
             sections_to_delete=[],
             widgets_to_create=[
-                {"pre_prompt": "Pre prompt 1", "post_prompt": "Post prompt 1", "order": 1},
-                {"pre_prompt": "Pre prompt 2", "post_prompt": "Post prompt 2", "order": 2},
+                {
+                    "pre_prompt": "Pre prompt 1",
+                    "post_prompt": "Post prompt 1",
+                    "order": 1,
+                },
+                {
+                    "pre_prompt": "Pre prompt 2",
+                    "post_prompt": "Post prompt 2",
+                    "order": 2,
+                },
             ],
         )
 
@@ -782,6 +790,4 @@
         result = HomeworkService.update_homework(self.homework.id, update_data)
         self.assertTrue(result.success)
 
-        self.assertFalse(
-            HomeworkProgressWidget.objects.filter(id=widget_id).exists()
-        )
\ No newline at end of file
+        self.assertFalse(HomeworkProgressWidget.objects.filter(id=widget_id).exists())

--- src/homeworks/tests/test_section_detail_view.py
+++ src/homeworks/tests/test_section_detail_view.py
@@ -415,7 +415,9 @@
         response = self.client.get(self.url)
         self.assertRedirects(
             response,
-            reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id}),
+            reverse(
+                "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+            ),
         )
 
     def test_teacher_can_access_section_regardless_of_widgets(self):

--- src/homeworks/tests/test_widget_answer_view.py
+++ src/homeworks/tests/test_widget_answer_view.py
@@ -8,7 +8,11 @@
 from datetime import timedelta
 
 from homeworks.models import Homework, HomeworkProgressWidget, Section
-from conversations.models import HomeworkProgressWidgetResponse, Conversation, Submission
+from conversations.models import (
+    HomeworkProgressWidgetResponse,
+    Conversation,
+    Submission,
+)
 from accounts.models import User, Teacher, Student
 from courses.models import Course, CourseEnrollment, CourseTeacher
 
@@ -57,7 +61,9 @@
             order=1,
         )
 
-        self.url = reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id})
+        self.url = reverse(
+            "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+        )
 
     def test_student_get_shows_pre_widget(self):
         """Test that student sees pre-assessment widget when not yet answered."""
@@ -78,7 +84,9 @@
         response = self.client.get(self.url)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, "Post-Assessment")
-        self.assertContains(response, "How much do you now know about this topic? (Post)")
+        self.assertContains(
+            response, "How much do you now know about this topic? (Post)"
+        )
 
     def test_student_get_shows_pre_value_locked_when_post(self):
         """Test that pre value is shown (locked) when answering post widget."""
@@ -175,7 +183,11 @@
             },
         )
         self.assertEqual(response.status_code, 302)
-        messages = list(response.context["messages"]) if hasattr(response, "context") and response.context else []
+        messages = (
+            list(response.context["messages"])
+            if hasattr(response, "context") and response.context
+            else []
+        )
         # Value should not be saved since 11 is out of range
         response_obj = HomeworkProgressWidgetResponse.objects.filter(
             user=self.student_user, widget=self.widget
@@ -202,7 +214,6 @@
         # View redirects to list when homework not found
         self.assertEqual(response.status_code, 302)
 
-
     def test_after_pre_answered_redirects_to_homework_not_post(self):
         """After answering all pre, student should go to homework, not post."""
         # Create an interactive section so there's homework to do
@@ -249,7 +260,9 @@
         response = self.client.get(self.url)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, "Post-Assessment")
-        self.assertContains(response, "How much do you now know about this topic? (Post)")
+        self.assertContains(
+            response, "How much do you now know about this topic? (Post)"
+        )
 
 
 class WidgetAnswerViewMultipleWidgetsTestCase(TestCase):
@@ -302,7 +315,9 @@
             order=2,
         )
 
-        self.url = reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id})
+        self.url = reverse(
+            "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+        )
 
     def test_student_must_answer_all_pre_widgets(self):
         """Test that student must answer all pre widgets before sections."""
@@ -351,4 +366,4 @@
         )
 
         self.assertEqual(response1.pre_value, 5)  # Unchanged
-        self.assertEqual(response2.pre_value, 7)  # Created via POST
\ No newline at end of file
+        self.assertEqual(response2.pre_value, 7)  # Created via POST

--- src/homeworks/views.py
+++ src/homeworks/views.py
@@ -486,9 +486,7 @@
             type[ProgressWidgetFormSet],
             formset_factory(ProgressWidgetForm, extra=0, formset=ProgressWidgetFormSet),
         )
-        widget_formset = WidgetFormset(
-            prefix="widgets", initial=initial_widget_data
-        )
+        widget_formset = WidgetFormset(prefix="widgets", initial=initial_widget_data)
         assert_type(widget_formset, ProgressWidgetFormSet)
 
         # Return form data
@@ -1383,9 +1381,7 @@
         # Check pre-conditions: student must answer all pre-assessment widgets
         from .services import HomeworkService
 
-        next_widget = HomeworkService.get_next_unanswered_widget(
-            request.user, homework
-        )
+        next_widget = HomeworkService.get_next_unanswered_widget(request.user, homework)
         if next_widget is not None and not next_widget.is_post:
             return redirect("homeworks:widget_answer", homework_id=homework_id)
 
@@ -1489,9 +1485,7 @@
         ):
             return HttpResponseForbidden("You are not enrolled in this course.")
 
-        widget = HomeworkService.get_next_unanswered_widget(
-            request.user, homework
-        )
+        widget = HomeworkService.get_next_unanswered_widget(request.user, homework)
 
         if widget is None:
             return redirect("homeworks:detail", homework_id=homework_id)
src/conversations/tests/test_conversation_start_view.py
--- src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
+++ src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
@@ -8,7 +8,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("conversations", "0004_sectionanswer"),
         ("homeworks", "0008_homeworkprogresswidget"),

--- src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
+++ src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
@@ -5,7 +5,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("conversations", "0005_homeworkprogresswidgetresponse"),
     ]

--- src/conversations/models.py
+++ src/conversations/models.py
@@ -1,6 +1,10 @@
 import uuid
 from django.db import models
-from django.core.validators import MinLengthValidator, MinValueValidator, MaxValueValidator
+from django.core.validators import (
+    MinLengthValidator,
+    MinValueValidator,
+    MaxValueValidator,
+)
 from django.utils import timezone
 
 
@@ -266,7 +270,9 @@
     def __str__(self):
         pre = self.pre_value if self.pre_value is not None else "N/A"
         post = self.post_value if self.post_value is not None else "N/A"
-        return f"{self.user.username} - Widget {self.widget.order}: pre={pre}, post={post}"
+        return (
+            f"{self.user.username} - Widget {self.widget.order}: pre={pre}, post={post}"
+        )
 
     def save(self, *args, **kwargs):
         if self.pre_value is not None and self.pre_submitted_at is None:

--- src/conversations/tests/test_conversation_start_view.py
+++ src/conversations/tests/test_conversation_start_view.py
@@ -242,5 +242,7 @@
         response = self.client.get(self.start_url)
         # This currently returns 200 (no pre-widget check exists) — SHOULD redirect
         self.assertEqual(
-            response.status_code, 302, "Student should be redirected, not allowed to start"
+            response.status_code,
+            302,
+            "Student should be redirected, not allowed to start",
         )

--- src/courses/tests/test_views.py
+++ src/courses/tests/test_views.py
@@ -1220,7 +1220,9 @@
         self.assertEqual(response.status_code, 302)
 
         homework = Homework.objects.get(title="Homework With Three Widgets")
-        widgets = list(HomeworkProgressWidget.objects.filter(homework=homework).order_by("order"))
+        widgets = list(
+            HomeworkProgressWidget.objects.filter(homework=homework).order_by("order")
+        )
         self.assertEqual(len(widgets), 3)
         self.assertEqual(widgets[0].order, 1)
         self.assertEqual(widgets[1].order, 2)

--- src/courses/views.py
+++ src/courses/views.py
@@ -705,12 +705,20 @@
             # Extract widgets data from formset
             widgets_data = []
             for widget_form in normalize_progress_widget_formset_orders(widget_formset):
-                if widget_form.cleaned_data.get("pre_prompt") or widget_form.cleaned_data.get("post_prompt"):
-                    widgets_data.append({
-                        "pre_prompt": widget_form.cleaned_data.get("pre_prompt", ""),
-                        "post_prompt": widget_form.cleaned_data.get("post_prompt", ""),
-                        "order": widget_form.cleaned_data.get("order", 1),
-                    })
+                if widget_form.cleaned_data.get(
+                    "pre_prompt"
+                ) or widget_form.cleaned_data.get("post_prompt"):
+                    widgets_data.append(
+                        {
+                            "pre_prompt": widget_form.cleaned_data.get(
+                                "pre_prompt", ""
+                            ),
+                            "post_prompt": widget_form.cleaned_data.get(
+                                "post_prompt", ""
+                            ),
+                            "order": widget_form.cleaned_data.get("order", 1),
+                        }
+                    )
             homework_data.widgets = widgets_data
 
             # Use service to create homework with sections (course already included in data)

--- src/homeworks/forms.py
+++ src/homeworks/forms.py
@@ -351,7 +351,7 @@
                 "rows": 2,
                 "placeholder": "Prompt shown after completing homework...",
             }
-        )
+        ),
     )
     order = forms.CharField(required=False, widget=forms.HiddenInput())
     DELETE = forms.BooleanField(required=False, widget=forms.HiddenInput())

--- src/homeworks/migrations/0008_homeworkprogresswidget.py
+++ src/homeworks/migrations/0008_homeworkprogresswidget.py
@@ -7,7 +7,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("homeworks", "0007_add_scheduled_homework_type"),
     ]

--- src/homeworks/services.py
+++ src/homeworks/services.py
@@ -1776,7 +1776,11 @@
 
             pre_val = response.pre_value if response else None
             post_val = response.post_value if response else None
-            diff = post_val - pre_val if pre_val is not None and post_val is not None else None
+            diff = (
+                post_val - pre_val
+                if pre_val is not None and post_val is not None
+                else None
+            )
 
             widget_data_list.append(
                 WidgetData(

--- src/homeworks/tests/test_edit_view.py
+++ src/homeworks/tests/test_edit_view.py
@@ -714,7 +714,9 @@
 
         self.client = Client()
         self.teacher_user = User.objects.create_user(
-            username="widget_edit_teacher", email="widget_edit@example.com", password="password"
+            username="widget_edit_teacher",
+            email="widget_edit@example.com",
+            password="password",
         )
         self.teacher = Teacher.objects.create(user=self.teacher_user)
         self.course = Course.objects.create(
@@ -790,7 +792,9 @@
         mock_update_homework.assert_called_once()
         update_data = mock_update_homework.call_args[0][1]
         self.assertEqual(len(update_data.widgets_to_create), 1)
-        self.assertEqual(update_data.widgets_to_create[0]["pre_prompt"], "New pre prompt")
+        self.assertEqual(
+            update_data.widgets_to_create[0]["pre_prompt"], "New pre prompt"
+        )
 
     @patch("homeworks.services.HomeworkService.update_homework")
     def test_edit_delete_existing_widget(self, mock_update_homework):

--- src/homeworks/tests/test_progress_widget.py
+++ src/homeworks/tests/test_progress_widget.py
@@ -46,7 +46,9 @@
         )
         self.assertEqual(widget.homework, self.homework)
         self.assertEqual(widget.pre_prompt, "How much do you know about this topic?")
-        self.assertEqual(widget.post_prompt, "How much do you now know about this topic?")
+        self.assertEqual(
+            widget.post_prompt, "How much do you now know about this topic?"
+        )
         self.assertEqual(widget.order, 1)
         self.assertIsInstance(widget.id, uuid.UUID)
 
@@ -259,7 +261,9 @@
         )
         self.assertEqual(response.pre_value, 10)
 
-        user2 = self.User.objects.create_user(username="student_range", password="pass123")
+        user2 = self.User.objects.create_user(
+            username="student_range", password="pass123"
+        )
         response2 = self.WidgetResponse.objects.create(
             user=user2,
             widget=self.widget,
@@ -647,9 +651,7 @@
         )
         self.assertTrue(result)
 
-        response = self.WidgetResponse.objects.get(
-            user=self.user, widget=self.widget1
-        )
+        response = self.WidgetResponse.objects.get(user=self.user, widget=self.widget1)
         self.assertEqual(response.pre_value, 7)
         self.assertIsNotNone(response.pre_submitted_at)
 
@@ -666,9 +668,7 @@
         )
         self.assertTrue(result)
 
-        response = self.WidgetResponse.objects.get(
-            user=self.user, widget=self.widget1
-        )
+        response = self.WidgetResponse.objects.get(user=self.user, widget=self.widget1)
         self.assertEqual(response.post_value, 9)
         self.assertIsNotNone(response.post_submitted_at)
 
@@ -709,8 +709,16 @@
             sections_to_create=[],
             sections_to_delete=[],
             widgets_to_create=[
-                {"pre_prompt": "Pre prompt 1", "post_prompt": "Post prompt 1", "order": 1},
-                {"pre_prompt": "Pre prompt 2", "post_prompt": "Post prompt 2", "order": 2},
+                {
+                    "pre_prompt": "Pre prompt 1",
+                    "post_prompt": "Post prompt 1",
+                    "order": 1,
+                },
+                {
+                    "pre_prompt": "Pre prompt 2",
+                    "post_prompt": "Post prompt 2",
+                    "order": 2,
+                },
             ],
         )
 
@@ -782,6 +790,4 @@
         result = HomeworkService.update_homework(self.homework.id, update_data)
         self.assertTrue(result.success)
 
-        self.assertFalse(
-            HomeworkProgressWidget.objects.filter(id=widget_id).exists()
-        )
\ No newline at end of file
+        self.assertFalse(HomeworkProgressWidget.objects.filter(id=widget_id).exists())

--- src/homeworks/tests/test_section_detail_view.py
+++ src/homeworks/tests/test_section_detail_view.py
@@ -415,7 +415,9 @@
         response = self.client.get(self.url)
         self.assertRedirects(
             response,
-            reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id}),
+            reverse(
+                "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+            ),
         )
 
     def test_teacher_can_access_section_regardless_of_widgets(self):

--- src/homeworks/tests/test_widget_answer_view.py
+++ src/homeworks/tests/test_widget_answer_view.py
@@ -8,7 +8,11 @@
 from datetime import timedelta
 
 from homeworks.models import Homework, HomeworkProgressWidget, Section
-from conversations.models import HomeworkProgressWidgetResponse, Conversation, Submission
+from conversations.models import (
+    HomeworkProgressWidgetResponse,
+    Conversation,
+    Submission,
+)
 from accounts.models import User, Teacher, Student
 from courses.models import Course, CourseEnrollment, CourseTeacher
 
@@ -57,7 +61,9 @@
             order=1,
         )
 
-        self.url = reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id})
+        self.url = reverse(
+            "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+        )
 
     def test_student_get_shows_pre_widget(self):
         """Test that student sees pre-assessment widget when not yet answered."""
@@ -78,7 +84,9 @@
         response = self.client.get(self.url)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, "Post-Assessment")
-        self.assertContains(response, "How much do you now know about this topic? (Post)")
+        self.assertContains(
+            response, "How much do you now know about this topic? (Post)"
+        )
 
     def test_student_get_shows_pre_value_locked_when_post(self):
         """Test that pre value is shown (locked) when answering post widget."""
@@ -175,7 +183,11 @@
             },
         )
         self.assertEqual(response.status_code, 302)
-        messages = list(response.context["messages"]) if hasattr(response, "context") and response.context else []
+        messages = (
+            list(response.context["messages"])
+            if hasattr(response, "context") and response.context
+            else []
+        )
         # Value should not be saved since 11 is out of range
         response_obj = HomeworkProgressWidgetResponse.objects.filter(
             user=self.student_user, widget=self.widget
@@ -202,7 +214,6 @@
         # View redirects to list when homework not found
         self.assertEqual(response.status_code, 302)
 
-
     def test_after_pre_answered_redirects_to_homework_not_post(self):
         """After answering all pre, student should go to homework, not post."""
         # Create an interactive section so there's homework to do
@@ -249,7 +260,9 @@
         response = self.client.get(self.url)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, "Post-Assessment")
-        self.assertContains(response, "How much do you now know about this topic? (Post)")
+        self.assertContains(
+            response, "How much do you now know about this topic? (Post)"
+        )
 
 
 class WidgetAnswerViewMultipleWidgetsTestCase(TestCase):
@@ -302,7 +315,9 @@
             order=2,
         )
 
-        self.url = reverse("homeworks:widget_answer", kwargs={"homework_id": self.homework.id})
+        self.url = reverse(
+            "homeworks:widget_answer", kwargs={"homework_id": self.homework.id}
+        )
 
     def test_student_must_answer_all_pre_widgets(self):
         """Test that student must answer all pre widgets before sections."""
@@ -351,4 +366,4 @@
         )
 
         self.assertEqual(response1.pre_value, 5)  # Unchanged
-        self.assertEqual(response2.pre_value, 7)  # Created via POST
\ No newline at end of file
+        self.assertEqual(response2.pre_value, 7)  # Created via POST

--- src/homeworks/views.py
+++ src/homeworks/views.py
@@ -486,9 +486,7 @@
             type[ProgressWidgetFormSet],
             formset_factory(ProgressWidgetForm, extra=0, formset=ProgressWidgetFormSet),
         )
-        widget_formset = WidgetFormset(
-            prefix="widgets", initial=initial_widget_data
-        )
+        widget_formset = WidgetFormset(prefix="widgets", initial=initial_widget_data)
         assert_type(widget_formset, ProgressWidgetFormSet)
 
         # Return form data
@@ -1383,9 +1381,7 @@
         # Check pre-conditions: student must answer all pre-assessment widgets
         from .services import HomeworkService
 
-        next_widget = HomeworkService.get_next_unanswered_widget(
-            request.user, homework
-        )
+        next_widget = HomeworkService.get_next_unanswered_widget(request.user, homework)
         if next_widget is not None and not next_widget.is_post:
             return redirect("homeworks:widget_answer", homework_id=homework_id)
 
@@ -1489,9 +1485,7 @@
         ):
             return HttpResponseForbidden("You are not enrolled in this course.")
 
-        widget = HomeworkService.get_next_unanswered_widget(
-            request.user, homework
-        )
+        widget = HomeworkService.get_next_unanswered_widget(request.user, homework)
 
         if widget is None:
             return redirect("homeworks:detail", homework_id=homework_id)
src/courses/tests/test_views.py
--- src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
+++ src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
@@ -8,7 +8,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("conversations", "0004_sectionanswer"),
         ("homeworks", "0008_homeworkprogresswidget"),

--- src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
+++ src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
@@ -5,7 +5,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("conversations", "0005_homeworkprogresswidgetresponse"),
     ]

--- src/conversations/models.py
+++ src/conversations/models.py
@@ -1,6 +1,10 @@
 import uuid
 from django.db import models
-from django.core.validators import MinLengthValidator, MinValueValidator, MaxValueValidator
+from django.core.validators import (
+    MinLengthValidator,
+    MinValueValidator,
+    MaxValueValidator,
+)
 from django.utils import timezone
 
 
@@ -266,7 +270,9 @@
     def __str__(self):
         pre = self.pre_value if self.pre_value is not None else "N/A"
         post = self.post_value if self.post_value is not None else "N/A"
-        return f"{self.user.username} - Widget {self.widget.order}: pre={pre}, post={post}"
+        return (
+            f"{self.user.username} - Widget {self.widget.order}: pre={pre}, post={post}"
+        )
 
     def save(self, *args, **kwargs):
         if self.pre_value is not None and self.pre_submitted_at is None:

--- src/conversations/tests/test_conversation_start_view.py
+++ src/conversations/tests/test_conversation_start_view.py
@@ -242,5 +242,7 @@
         response = self.client.get(self.start_url)
         # This currently returns 200 (no pre-widget check exists) — SHOULD redirect
         self.assertEqual(
-            response.status_code, 302, "Student should be redirected, not allowed to start"
+            response.status_code,
+            302,
+            "Student should be redirected, not allowed to start",
         )

--- src/courses/tests/test_views.py
+++ src/courses/tests/test_views.py
@@ -1220,7 +1220,9 @@
         self.assertEqual(response.status_code, 302)
 
         homework = Homework.objects.get(title="Homework With Three Widgets")
-        widgets = list(HomeworkProgressWidget.objects.filter(homework=homework).order_by("order"))
+        widgets = list(
+            HomeworkProgressWidget.objects.filter(homework=homework).order_by("order")
+        )
         self.assertEqual(len(widgets), 3)
         self.assertEqual(widgets[0].order, 1)
         self.assertEqual(widgets[1].order, 2)

--- src/courses/views.py
+++ src/courses/views.py
@@ -705,12 +705,20 @@
             # Extract widgets data from formset
             widgets_data = []
             for widget_form in normalize_progress_widget_formset_orders(widget_formset):
-                if widget_form.cleaned_data.get("pre_prompt") or widget_form.cleaned_data.get("post_prompt"):
-                    widgets_data.append({
-                        "pre_prompt": widget_form.cleaned_data.get("pre_prompt", ""),
-                        "post_prompt": widget_form.cleaned_data.get("post_prompt", ""),
-                        "order": widget_form.cleaned_data.get("order", 1),
-                    })
+                if widget_form.cleaned_data.get(
+                    "pre_prompt"
+                ) or widget_form.cleaned_data.get("post_prompt"):
+                    widgets_data.append(
+                        {
+                            "pre_prompt": widget_form.cleaned_data.get(
+                                "pre_prompt", ""
+                            ),
+                            "post_prompt": widget_form.cleaned_data.get(
+                                "post_prompt", ""
+                            ),
+                            "order": widget_form.cleaned_data.get("order", 1),
+                        }
+                    )
             homework_data.widgets = widgets_data
 
             # Use service to create homework with sections (course already included in data)

--- src/homeworks/forms.py
+++ src/homeworks/forms.py
@@ -351,7 +351,7 @@
                 "rows": 2,
                 "placeholder": "Prompt shown after completing homework...",
             }
-        )
+        ),
     )
     order = forms.CharField(required=False, widget=forms.HiddenInput())
     DELETE = forms.BooleanField(required=False, widget=forms.HiddenInput())

--- src/homeworks/migrations/0008_homeworkprogresswidget.py
+++ src/homeworks/migrations/0008_homeworkprogresswidget.py
@@ -7,7 +7,6 @@
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         ("homeworks", "0007_add_scheduled_homework_type"),
     ]

--- src/homeworks/services.py
+++ src/homeworks/services.py
@@ -1776,7 +1776,11 @@
 
             pre_val = response.pre_value if response else None
             post_val = response.post_value if response else None
-            diff = post_val - pre_val if pre_val is not None and post_val is not None else None
+            diff = (
+                post_val - pre_val
+                if pre_val is not None and post_val is not None
+                else None
+            )
 
             widget_data_list.append(
                 WidgetData(

--- src/homeworks/tests/test_edit_view.py
+++ src/homeworks/tests/test_edit_view.py
@@ -714,7 +714,9 @@
 
         self.client = Client()
         self.teacher_user = User.objects.create_user(
-            username="widget_edit_teacher", email="widget_edit@example.com", password="password"
+            username="widget_edit_teacher",
+      

...

*(truncated — full output exceeded GitHub's 65536 character limit)*
---

*This pull request was automatically created by ACEM.*

Policy: Ruff Format 0.14.8
Fixed: 14 violations

Original Violations:

Formatted 14 file(s):
  - src/conversations/migrations/0005_homeworkprogresswidgetresponse.py
  - src/conversations/migrations/0006_alter_homeworkprogresswidgetresponse_post_value_and_more.py
  - src/conversations/models.py
  - src/conversations/tests/test_conversation_start_view.py
  - src/courses/tests/test_views.py
  - src/courses/views.py
  - src/homeworks/forms.py
  - src/homeworks/migrations/0008_homeworkprogresswidget.py
  - src/homeworks/services.py
  - src/homeworks/tests/test_edit_view.py
  - src/homeworks/tests/test_progress_widget.py
  - src/homeworks/tests/test_section_detail_view.py
  - src/homeworks/tests/test_widget_answer_view.py
  - src/homeworks/views.py

Automated by ACEM - Initiative #17
@siscia siscia merged commit 43257d6 into main May 4, 2026
4 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant