Repository: ioannisioannides/scopewatch
Pull request #73: Formatting improvements and minor refactoring
Author: login: ioannisioannides
Created: 2025-04-11T16:24:24Z | Merged: 2025-04-11T16:24:47Z

This pull request includes formatting improvements and minor refactoring across multiple files to enhance code readability and maintainability.

### Formatting Improvements:

* [`apps/audits/models.py`](diffhunk://#diff-a194abf14a221dd42e915700e353a33234b24cafe7c35e6358491540f5904112L159-R161): Reformatted the `ForeignKey` fields in `AuditTeam` and `AuditorAssignment` classes for better readability. [[1]](diffhunk://#diff-a194abf14a221dd42e915700e353a33234b24cafe7c35e6358491540f5904112L159-R161) [[2]](diffhunk://#diff-a194abf14a221dd42e915700e353a33234b24cafe7c35e6358491540f5904112L186-R190)
* [`apps/certification_bodies/test_views_extended.py`](diffhunk://#diff-408a5163e2638f102be8af85c40523f892f3adfe5ad3dcf6178ff369d7be28c9L10-R19): Reformatted multiple `create_user` and `create` method calls to improve code readability. [[1]](diffhunk://#diff-408a5163e2638f102be8af85c40523f892f3adfe5ad3dcf6178ff369d7be28c9L10-R19) [[2]](diffhunk://#diff-408a5163e2638f102be8af85c40523f892f3adfe5ad3dcf6178ff369d7be28c9L50-R60) [[3]](diffhunk://#diff-408a5163e2638f102be8af85c40523f892f3adfe5ad3dcf6178ff369d7be28c9L102-R103)
* [`apps/certification_bodies/tests.py`](diffhunk://#diff-50802c2b4abb2b1bf839985af645d605261d763eeaf7a7888fba233b1fa2d5cdL415-R426): Applied consistent formatting to `create_user` and `create` method calls. [[1]](diffhunk://#diff-50802c2b4abb2b1bf839985af645d605261d763eeaf7a7888fba233b1fa2d5cdL415-R426) [[2]](diffhunk://#diff-50802c2b4abb2b1bf839985af645d605261d763eeaf7a7888fba233b1fa2d5cdL436-R440) [[3]](diffhunk://#diff-50802c2b4abb2b1bf839985af645d605261d763eeaf7a7888fba233b1fa2d5cdL522-R534) [[4]](diffhunk://#diff-50802c2b4abb2b1bf839985af645d605261d763eeaf7a7888fba233b1fa2d5cdL553-R557)
* [`apps/organizations/test_api_comprehensive.py`](diffhunk://#diff-aa1d9559b27c79531f0a76176e5f6524c538a7de5eb54b8ec80c6ceca818fe63R8-R28): Improved readability by reformatting dictionary definitions and method calls. [[1]](diffhunk://#diff-aa1d9559b27c79531f0a76176e5f6524c538a7de5eb54b8ec80c6ceca818fe63R8-R28) [[2]](diffhunk://#diff-aa1d9559b27c79531f0a76176e5f6524c538a7de5eb54b8ec80c6ceca818fe63L96-R102) [[3]](diffhunk://#diff-aa1d9559b27c79531f0a76176e5f6524c538a7de5eb54b8ec80c6ceca818fe63L173-R180)
* [`backups/migrations/old_migrations_20250410_214853/audits/0000_fix_nonconformance.py`](diffhunk://#diff-61ceb61103bacb2c098f9fc266775ff69e4ababa6a1fa7e111c3b45c61044d26L18-R21): Reformatted the `BigAutoField` definition for better readability.
* [`backups/migrations/old_migrations_20250410_214853/certification_bodies/0007_reset_migrations.py`](diffhunk://#diff-4b520a330461e32cbb590735849e1977b70c37cc3ed4528ccf4ca7a80210d55aL22-R31): Reformatted the `replaces` list for better readability.

### Minor Refactoring:

* [`apps/certification_bodies/test_views_extended.py`](diffhunk://#diff-408a5163e2638f102be8af85c40523f892f3adfe5ad3dcf6178ff369d7be28c9L119-R120): Renamed variables to follow a consistent naming convention (e.g., `_audit_result`, `_existing_cert`). [[1]](diffhunk://#diff-408a5163e2638f102be8af85c40523f892f3adfe5ad3dcf6178ff369d7be28c9L119-R120) [[2]](diffhunk://#diff-408a5163e2638f102be8af85c40523f892f3adfe5ad3dcf6178ff369d7be28c9L191-R192) [[3]](diffhunk://#diff-408a5163e2638f102be8af85c40523f892f3adfe5ad3dcf6178ff369d7be28c9L229-R230) [[4]](diffhunk://#diff-408a5163e2638f102be8af85c40523f892f3adfe5ad3dcf6178ff369d7be28c9L255-R264) [[5]](diffhunk://#diff-408a5163e2638f102be8af85c40523f892f3adfe5ad3dcf6178ff369d7be28c9L306-R307)
* [`apps/certification_bodies/tests.py`](diffhunk://#diff-50802c2b4abb2b1bf839985af645d605261d763eeaf7a7888fba233b1fa2d5cdL215-R215): Updated variable names to use underscores for consistency (e.g., `_audit_result`, `_user_no_cert`). [[1]](diffhunk://#diff-50802c2b4abb2b1bf839985af645d605261d763eeaf7a7888fba233b1fa2d5cdL215-R215) [[2]](diffhunk://#diff-50802c2b4abb2b1bf839985af645d605261d763eeaf7a7888fba233b1fa2d5cdL241-R241) [[3]](diffhunk://#diff-50802c2b4abb2b1bf839985af645d605261d763eeaf7a7888fba233b1fa2d5cdL264-R264)
* [`apps/certification_bodies/views.py`](diffhunk://#diff-8e114364ec0c000e91baa3aae8a192d1c2d88eb026aa5d44ec04891496231dbcL184-R184): Reformatted the `messages.success` call for better readability.
* [`apps/consultants/tests.py`](diffhunk://#diff-fc8d0b429b98dc26adc3d5931f0bde2ba22298c7215d711b7f60ab0fc6b1db33R10-R22): Added missing import statements and reformatted existing ones for consistency.
* [`apps/organizations/test_api.py`](diffhunk://#diff-1c568a167d26e0105ca2d4b596aba1b5acde1bec8f64e4e26d97927e1cd5e170L80-R81): Reformatted the `reverse` call for better readability.
* [`apps/public/tests.py`](diffhunk://#diff-de619bcb527678ff2aaf377df0d3b4c3d27bdcbc7171d4e2e4c7482ec73b00f5L178-R179): Reformatted assertions for better readability.

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **Style**
  - Enhanced overall code formatting and organization for improved maintainability.
  
- **Tests**
  - Optimized test clarity with refined variable names and streamlined import usage.
  
- **Chores**
  - Updated internal scripts and migration routines for consistent readability and improved code structure.

These internal improvements boost code quality and maintainability without affecting end-user functionality.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/apps/audits/models.py b/apps/audits/models.py
index bec9c6e..23429ab 100644
--- a/apps/audits/models.py
+++ b/apps/audits/models.py
@@ -156,7 +156,9 @@ class AuditTeam(models.Model):
 
     audit = models.OneToOneField(Audit, on_delete=models.CASCADE, related_name="audit_team")
     lead_auditor = models.ForeignKey(
-        "certification_bodies.Auditor", on_delete=models.PROTECT, related_name="lead_audits"
+        "certification_bodies.Auditor",
+        on_delete=models.PROTECT,
+        related_name="lead_audits",
     )
 
     def __str__(self):
@@ -183,7 +185,9 @@ class AuditorAssignment(models.Model):
 
     team = models.ForeignKey(AuditTeam, on_delete=models.CASCADE, related_name="assignments")
     auditor = models.ForeignKey(
-        "certification_bodies.Auditor", on_delete=models.CASCADE, related_name="assignments"
+        "certification_bodies.Auditor",
+        on_delete=models.CASCADE,
+        related_name="assignments",
     )
     role = models.CharField(max_length=20, choices=ROLE_CHOICES)
     is_active = models.BooleanField(default=True)
diff --git a/apps/certification_bodies/test_views_extended.py b/apps/certification_bodies/test_views_extended.py
index c989f70..07f8ddd 100644
--- a/apps/certification_bodies/test_views_extended.py
+++ b/apps/certification_bodies/test_views_extended.py
@@ -7,24 +7,16 @@
 
 from datetime import timedelta
 
-from django.contrib import messages
 from django.contrib.auth import get_user_model
 from django.contrib.messages.storage.fallback import FallbackStorage
-from django.test import Client, RequestFactory, TestCase
+from django.test import RequestFactory, TestCase
 from django.urls import reverse
 from django.utils import timezone
 
 from apps.audits.models import Audit, AuditResult, NonConformance
 from apps.organizations.models import Certification, Organization
 
-from .forms import AuditDecisionForm, CertificationIssueForm
-from .models import Auditor, CertBody, CertBodyUser
-from .views import (
-    audit_decision_view,
-    certbody_detail_view,
-    certbody_list_view,
-    issue_certificate_view,
-)
+from .models import CertBody, CertBodyUser
 
 User = get_user_model()
 
@@ -47,10 +39,14 @@ def setUp(self):
             username="admin_user", password="secure_password", email="admin@example.com"
         )
         self.auditor_user = User.objects.create_user(
-            username="auditor_user", password="secure_password", email="auditor@example.com"
+            username="auditor_user",
+            password="secure_password",
+            email="auditor@example.com",
         )
         self.unauthorized_user = User.objects.create_user(
-            username="unauthorized", password="secure_password", email="unauthorized@example.com"
+            username="unauthorized",
+            password="secure_password",
+            email="unauthorized@example.com",
         )
 
         # Create cert body users
@@ -58,7 +54,10 @@ def setUp(self):
             user=self.admin_user, cert_body=self.cert_body, role="admin", is_active=True
         )
         self.auditor_cb_user = CertBodyUser.objects.create(
-            user=self.auditor_user, cert_body=self.cert_body, role="auditor", is_active=True
+            user=self.auditor_user,
+            cert_body=self.cert_body,
+            role="auditor",
+            is_active=True,
         )
 
         # Create another certification body for testing unauthorized access
@@ -99,7 +98,9 @@ def setUp(self):
 
         # Create nonconformances
         self.nonconformance = NonConformance.objects.create(
-            audit=self.completed_audit, description="Test nonconformance", severity="minor"
+            audit=self.completed_audit,
+            description="Test nonconformance",
+            severity="minor",
         )
 
         # Set up request factory for view testing
@@ -116,7 +117,7 @@ def test_audit_pending_decision_list_view_exception_handling(self):
         """Test AuditPendingDecisionListView exception handling."""
         # Remove attributes to force exception
         # This test confirms that exception handling in the view returns an empty queryset
-        original_user = self.admin_user
+        _original_user = self.admin_user
 
         url = reverse("certification_bodies:pending_decisions")
         self.client.force_login(self.unauthorized_user)
@@ -188,7 +189,7 @@ def test_audit_decision_view_with_reject_decision(self):
     def test_issue_certificate_view_complete_workflow(self):
         """Test the complete workflow for issuing a certificate."""
         # First create an approved audit result
-        audit_result = AuditResult.objects.create(
+        _audit_result = AuditResult.objects.create(
             audit=self.completed_audit,
             decision="approve",
             comments="Approved without conditions",
@@ -226,7 +227,7 @@ def test_issue_certificate_view_complete_workflow(self):
     def test_issue_certificate_with_invalid_form(self):
         """Test certificate issuance with invalid form data."""
         # Create approved audit result
-        audit_result = AuditResult.objects.create(
+        _audit_result = AuditResult.objects.create(
             audit=self.completed_audit,
             decision="approve",
             comments="Approved without conditions",
@@ -252,7 +253,7 @@ def test_issue_certificate_with_invalid_form(self):
     def test_issue_certificate_value_error(self):
         """Test handling of ValueError during certificate issuance."""
         # Create approved audit result
-        audit_result = AuditResult.objects.create(
+        _audit_result = AuditResult.objects.create(
             audit=self.completed_audit,
             decision="approve",
             comments="Approved without conditions",
@@ -260,7 +261,7 @@ def test_issue_certificate_value_error(self):
         )
 
         # Create a certification with the same certificate number we'll try to use
-        existing_cert = Certification.objects.create(
+        _existing_cert = Certification.objects.create(
             organization=self.organization,
             certificate_number="DUPLICATE-NUMBER",
             standard=self.completed_audit.standard,
@@ -303,7 +304,7 @@ def mock_issue_certificate(*args, **kwargs):
     def test_issue_certificate_with_default_expiry(self):
         """Test certificate issuance using default expiry date."""
         # Create approved audit result
-        audit_result = AuditResult.objects.create(
+        _audit_result = AuditResult.objects.create(
             audit=self.completed_audit,
             decision="approve",
             comments="Approved",
diff --git a/apps/certification_bodies/tests.py b/apps/certification_bodies/tests.py
index cf473ae..d8096b6 100644
--- a/apps/certification_bodies/tests.py
+++ b/apps/certification_bodies/tests.py
@@ -212,7 +212,7 @@ def test_issue_certificate_view_unauthorized(self):
         Test that unauthorized users cannot issue certificates.
         """
         # Create an approved audit result first
-        audit_result = AuditResult.objects.create(
+        _audit_result = AuditResult.objects.create(
             audit=self.audit,
             decision="approve",
             comments="Approved for certification",
@@ -238,7 +238,7 @@ def test_issue_certificate_view_authorized(self):
         Test that authorized users can access the certificate issuance view.
         """
         # Create an approved audit result first
-        audit_result = AuditResult.objects.create(
+        _audit_result = AuditResult.objects.create(
             audit=self.audit,
             decision="approve",
             comments="Approved for certification",
@@ -261,7 +261,7 @@ def test_issue_certificate_submission(self):
         Test that submitting a certificate issuance form works correctly.
         """
         # Create an approved audit result first
-        audit_result = AuditResult.objects.create(
+        _audit_result = AuditResult.objects.create(
             audit=self.audit,
             decision="approve",
             comments="Approved for certification",
@@ -412,7 +412,10 @@ def setUp(self):
             username="other_tester", email="other@certbody.com", password="otherpass123"
         )
         self.other_cert_body_user = CertBodyUser.objects.create(
-            user=self.other_user, cert_body=self.other_cert_body, role="admin", is_active=True
+            user=self.other_user,
+            cert_body=self.other_cert_body,
+            role="admin",
+            is_active=True,
         )
 
     def test_pending_decision_list_no_cert_body_user(self):
@@ -420,7 +423,7 @@ def test_pending_decision_list_no_cert_body_user(self):
         Test pending decision list when user has no certification body association.
         """
         # Create user with no cert body association
-        user_no_cert = User.objects.create_user(username="no_cert_user", password="password123")
+        _user_no_cert = User.objects.create_user(username="no_cert_user", password="password123")
 
         self.client.login(username="no_cert_user", password="password123")
         response = self.client.get(reverse("certification_bodies:pending_decisions"))
@@ -433,7 +436,8 @@ def test_audit_decision_view_exception_handling(self):
         Test that the audit decision view handles exceptions properly.
         """
         # Login with an unrelated user (no cert body associations)
-        unrelated_user = User.objects.create_user(username="unrelated", password="unrelated123")
+        _unrelated_user = User.objects.create_user(username="unrelated", password="unrelated123")
+
         self.client.login(username="unrelated", password="unrelated123")
 
         # Access audit decision view without proper permissions
@@ -519,7 +523,7 @@ def test_issue_certificate_already_exists(self):
         Test when trying to issue a certificate that already exists.
         """
         # Create approved audit result
-        audit_result = AuditResult.objects.create(
+        _audit_result = AuditResult.objects.create(
             audit=self.audit,
             decision="approve",
             comments="Approved",
@@ -527,7 +531,7 @@ def test_issue_certificate_already_exists(self):
         )
 
         # Create existing certification
-        existing_cert = Certification.objects.create(
+        _existing_cert = Certification.objects.create(
             organization=self.organization,
             standard=self.audit.standard,
             certificate_number="EXISTING-123",
@@ -550,7 +554,7 @@ def test_issue_certificate_form_validation_error(self):
         Test form validation error when issuing a certificate.
         """
         # Create approved audit result
-        audit_result = AuditResult.objects.create(
+        _audit_result = AuditResult.objects.create(
             audit=self.audit,
             decision="approve",
             comments="Approved",
diff --git a/apps/certification_bodies/views.py b/apps/certification_bodies/views.py
index abb2eac..520422e 100644
--- a/apps/certification_bodies/views.py
+++ b/apps/certification_bodies/views.py
@@ -12,7 +12,6 @@
 from django.contrib import messages
 from django.contrib.auth.decorators import login_required
 from django.shortcuts import get_object_or_404, redirect, render
-from django.urls import reverse
 from django.utils import timezone
 from django.utils.decorators import method_decorator
 from django.views.generic import ListView
@@ -181,7 +180,8 @@ def issue_certificate_view(request, audit_id):
                     expiry_date=expiry_date,
                 )
                 messages.success(
-                    request, f"Certificate {certification.certificate_number} issued successfully."
+                    request,
+                    f"Certificate {certification.certificate_number} issued successfully.",
                 )
                 return redirect("organizations:certification_detail", pk=certification.pk)
             except ValueError as e:
diff --git a/apps/consultants/tests.py b/apps/consultants/tests.py
index 3ffe93b..ea65c6c 100644
--- a/apps/consultants/tests.py
+++ b/apps/consultants/tests.py
@@ -7,16 +7,19 @@
 consultants and consultancy firms.
 """
 
+from datetime import timedelta
+
 from django.contrib.auth import get_user_model
-from django.test import Client, TestCase
+from django.test import TestCase
 from django.urls import reverse
-
-User = get_user_model()
+from django.utils import timezone
 
 from apps.consultants.models import ConsultancyFirm, Consultant, ConsultantEngagement
 from apps.organizations.models import Organization
 from apps.utils.test_credentials import get_test_credential
 
+User = get_user_model()
+
 
 class ConsultantModelTest(TestCase):
     """
diff --git a/apps/organizations/test_api.py b/apps/organizations/test_api.py
index 10e85c1..3e4e153 100644
--- a/apps/organizations/test_api.py
+++ b/apps/organizations/test_api.py
@@ -77,7 +77,8 @@ def setUp(self):
             "organizations-api:organization-detail", args=[self.organization1.pk]
         )
         self.certifications_url = reverse(
-            "organizations-api:organization-certifications", args=[self.organization1.pk]
+            "organizations-api:organization-certifications",
+            args=[self.organization1.pk],
         )
 
     def test_get_organizations_unauthenticated(self):
diff --git a/apps/organizations/test_api_comprehensive.py b/apps/organizations/test_api_comprehensive.py
index f77194d..23cdf48 100644
--- a/apps/organizations/test_api_comprehensive.py
+++ b/apps/organizations/test_api_comprehensive.py
@@ -5,18 +5,18 @@
 covering additional edge cases and authorization scenarios.
 """
 
+from datetime import timedelta
+
 from django.contrib.auth import get_user_model
-from django.urls import reverse
+from django.test import TestCase
+from django.urls import resolve, reverse
+from django.utils import timezone
 from rest_framework import status
 from rest_framework.test import APIClient, APITestCase
 
-User = get_user_model()
-
 from apps.certification_bodies.models import CertBody
 from apps.utils.test_credentials import get_test_credential
 
-from .api_urls import router
-from .api_views import CertificationViewSet, OrganizationViewSet
 from .models import Certification, Organization, OrganizationUser
 from .serializers import (
     CertificationSerializer,
@@ -24,6 +24,8 @@
     OrganizationSerializer,
 )
 
+User = get_user_model()
+
 
 class OrganizationAPIURLsTest(TestCase):
     """Test suite for Organizations API URL patterns."""
@@ -93,7 +95,11 @@ def test_unauthenticated_access(self):
         self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
 
         # Create organization (unauthenticated)
-        data = {"name": "New Test Org", "industry": "Finance", "contact_email": "new@example.com"}
+        data = {
+            "name": "New Test Org",
+            "industry": "Finance",
+            "contact_email": "new@example.com",
+        }
         response = self.client.post(self.organizations_url, data, format="json")
         self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
 
@@ -170,7 +176,8 @@ def setUp(self):
             "organizations-api:organization-detail", args=[self.organization1.pk]
         )
         self.organization_certifications_url = reverse(
-            "organizations-api:organization-certifications", args=[self.organization1.pk]
+            "organizations-api:organization-certifications",
+            args=[self.organization1.pk],
         )
 
     def test_get_organization_list(self):
diff --git a/apps/public/tests.py b/apps/public/tests.py
index bdfbdb3..99be4d2 100644
--- a/apps/public/tests.py
+++ b/apps/public/tests.py
@@ -175,7 +175,8 @@ def test_verify_certificate_api(self):
         self.assertEqual(content["standard"], "ISO 27001:2022")
         self.assertEqual(content["cert_body"], "ViewTest Certifier")
         self.assertEqual(
-            content["scope"], "Information Security Management System for cloud services"
+            content["scope"],
+            "Information Security Management System for cloud services",
         )
 
         # Verify that a verification log was created
diff --git a/backups/migrations/old_migrations_20250410_214853/audits/0000_fix_nonconformance.py b/backups/migrations/old_migrations_20250410_214853/audits/0000_fix_nonconformance.py
index d175281..faf6646 100644
--- a/backups/migrations/old_migrations_20250410_214853/audits/0000_fix_nonconformance.py
+++ b/backups/migrations/old_migrations_20250410_214853/audits/0000_fix_nonconformance.py
@@ -15,7 +15,10 @@ class Migration(migrations.Migration):
                 (
                     "id",
                     models.BigAutoField(
-                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
                     ),
                 ),
                 (
diff --git a/backups/migrations/old_migrations_20250410_214853/certification_bodies/0007_reset_migrations.py b/backups/migrations/old_migrations_20250410_214853/certification_bodies/0007_reset_migrations.py
index 183786e..a6f2fdc 100644
--- a/backups/migrations/old_migrations_20250410_214853/certification_bodies/0007_reset_migrations.py
+++ b/backups/migrations/old_migrations_20250410_214853/certification_bodies/0007_reset_migrations.py
@@ -19,10 +19,16 @@ class Migration(migrations.Migration):
     replaces = [
         ("certification_bodies", "0001_initial"),
         ("certification_bodies", "0002_remove_certbody_contact_email_and_more"),
-        ("certification_bodies", "0003_certbody_contact_email_certbody_is_active_auditor_and_more"),
+        (
+            "certification_bodies",
+            "0003_certbody_contact_email_certbody_is_active_auditor_and_more",
+        ),
         ("certification_bodies", "0004_add_standard_qualification"),
         ("certification_bodies", "0005_merge_20250408_0423"),
-        ("certification_bodies", "0006_remove_certbodyuser_joined_date_auditor_bio_and_more"),
+        (
+            "certification_bodies",
+            "0006_remove_certbodyuser_joined_date_auditor_bio_and_more",
+        ),
     ]
 
     # Define initial state (no dependencies on previous migrations)
@@ -50,8 +56,14 @@ class Migration(migrations.Migration):
                 ("name", models.CharField(max_length=255)),
                 ("accreditation_id", models.CharField(max_length=100)),
                 ("address", models.CharField(blank=True, max_length=255)),
-                ("logo", models.ImageField(blank=True, null=True, upload_to="certbody_logos/")),
-                ("contact_email", models.EmailField(blank=True, max_length=254, null=True)),
+                (
+                    "logo",
+                    models.ImageField(blank=True, null=True, upload_to="certbody_logos/"),
+                ),
+                (
+                    "contact_email",
+                    models.EmailField(blank=True, max_length=254, null=True),
+                ),
                 ("is_active", models.BooleanField(default=True)),
                 ("created_at", models.DateTimeField(default=django.utils.timezone.now)),
                 ("updated_at", models.DateTimeField(auto_now=True)),
diff --git a/backups/migrations/old_migrations_20250410_214853/consultants/0012_reset_migrations.py b/backups/migrations/old_migrations_20250410_214853/consultants/0012_reset_migrations.py
index 687e4c2..a4a9e5b 100644
--- a/backups/migrations/old_migrations_20250410_214853/consultants/0012_reset_migrations.py
+++ b/backups/migrations/old_migrations_20250410_214853/consultants/0012_reset_migrations.py
@@ -54,7 +54,10 @@ class Migration(migrations.Migration):
                 ),
                 ("name", models.CharField(max_length=255)),
                 ("address", models.CharField(blank=True, max_length=255)),
-                ("contact_email", models.EmailField(blank=True, max_length=254, null=True)),
+                (
+                    "contact_email",
+                    models.EmailField(blank=True, max_length=254, null=True),
+                ),
                 ("website", models.URLField(blank=True)),
                 ("specialties", models.CharField(blank=True, max_length=255)),
                 ("is_active", models.BooleanField(default=True)),
@@ -175,7 +178,8 @@ class Migration(migrations.Migration):
                 (
                     "standard",
                     models.CharField(
-                        help_text="The standard this document is prepared for", max_length=255
+                        help_text="The standard this document is prepared for",
+                        max_length=255,
                     ),
                 ),
                 ("created_at", models.DateTimeField(default=django.utils.timezone.now)),
diff --git a/scripts/migrations/ci_migration_fix.py b/scripts/migrations/ci_migration_fix.py
index 09ed2f8..c3573d8 100644
--- a/scripts/migrations/ci_migration_fix.py
+++ b/scripts/migrations/ci_migration_fix.py
@@ -155,7 +155,10 @@ def fake_migrations():
     )
 
     # Finally, remaining apps
-    run_command(["python", "manage.py", "migrate", "--fake"], "Fake migrating all remaining apps")
+    run_command(
+        ["python", "manage.py", "migrate", "--fake"],
+        "Fake migrating all remaining apps",
+    )
 
 
 def mark_migrations_applied():
diff --git a/scripts/migrations/fix_ci_migrations.py b/scripts/migrations/fix_ci_migrations.py
index d268fd6..1559dfc 100644
--- a/scripts/migrations/fix_ci_migrations.py
+++ b/scripts/migrations/fix_ci_migrations.py
@@ -245,7 +245,10 @@ def fix_audit_migrations():
 
                 # Update the file with corrected dependencies
                 new_content = re.sub(
-                    deps_pattern, f"dependencies = [{new_deps}]", content, flags=re.DOTALL
+                    deps_pattern,
+                    f"dependencies = [{new_deps}]",
+                    content,
+                    flags=re.DOTALL,
                 )
                 with open(migration_0007_path, "w") as f:
                     f.write(new_content)
diff --git a/scripts/migrations/fix_migration_now.py b/scripts/migrations/fix_migration_now.py
index bd4450a..ea7a6fe 100755
--- a/scripts/migrations/fix_migration_now.py
+++ b/scripts/migrations/fix_migration_now.py
@@ -115,7 +115,11 @@ def fix_migration_history():
                     INSERT INTO django_migrations (app, name, applied)
                     VALUES (%s, %s, datetime(%s, '-1 minute'))
                     """,
-                    ["certification_bodies", "0003_certbodyuser_contact_phone", audit_timestamp[0]],
+                    [
+                        "certification_bodies",
+                        "0003_certbodyuser_contact_phone",
+                        audit_timestamp[0],
+                    ],
                 )
                 print("✅ Added missing migration with timestamp before audits.0007")
         else:
@@ -150,7 +154,14 @@ def verify_fix():
             # Fake apply these migrations
             try:
                 subprocess.run(
-                    ["python", "manage.py", "migrate", "certification_bodies", "--fake"], check=True
+                    [
+                        "python",
+                        "manage.py",
+                        "migrate",
+                        "certification_bodies",
+                        "--fake",
+                    ],
+                    check=True,
                 )
                 subprocess.run(["python", "manage.py", "migrate", "audits", "--fake"], check=True)
                 subprocess.run(["python", "manage.py", "migrate"], check=True)
diff --git a/scripts/migrations/reset_all_migrations.py b/scripts/migrations/reset_all_migrations.py
index dc3dd62..9566a81 100644
--- a/scripts/migrations/reset_all_migrations.py
+++ b/scripts/migrations/reset_all_migrations.py
@@ -113,7 +113,8 @@ def fake_apply_migrations():
     try:
         # First cert bodies and organizations which are base apps
         subprocess.run(
-            ["python", "manage.py", "migrate", "certification_bodies", "--fake"], check=True
+            ["python", "manage.py", "migrate", "certification_bodies", "--fake"],
+            check=True,
         )
         subprocess.run(["python", "manage.py", "migrate", "organizations", "--fake"], check=True)
 
diff --git a/scripts/migrations/reset_migrations.py b/scripts/migrations/reset_migrations.py
index 03e921b..a70c072 100644
--- a/scripts/migrations/reset_migrations.py
+++ b/scripts/migrations/reset_migrations.py
@@ -101,7 +101,10 @@ def get_latest_migration(app):
     base_path = Path(__file__).resolve().parent
 
     # Check both potential locations for migrations
-    paths_to_check = [base_path / app / "migrations", base_path / "apps" / app / "migrations"]
+    paths_to_check = [
+        base_path / app / "migrations",
+        base_path / "apps" / app / "migrations",
+    ]
 
     for migrations_path in paths_to_check:
         if not migrations_path.exists():
@@ -252,7 +255,14 @@ def fix_inconsistent_history():
         check=True,
     )
     subprocess.run(
-        ["python", "manage.py", "migrate", "audits", "0006_change_audit_status_choices", "--fake"],
+        [
+            "python",
+            "manage.py",
+            "migrate",
+            "audits",
+            "0006_change_audit_status_choices",
+            "--fake",
+        ],
         check=True,
     )
 
@@ -269,7 +279,8 @@ def create_empty_fixed_migration(app, name, dependencies, dry_run=False):
     if not dry_run:
         # Create migration using makemigrations --empty
         subprocess.run(
-            ["python", "manage.py", "makemigrations", "--empty", "--name", name, app], check=True
+            ["python", "manage.py", "makemigrations", "--empty", "--name", name, app],
+            check=True,
         )
 
         # Now find the created migration file
@@ -315,14 +326,20 @@ def create_empty_fixed_migration(app, name, dependencies, dry_run=False):
 def main():
     parser = argparse.ArgumentParser(description="Reset and squash Django migrations")
     parser.add_argument(
-        "--dry-run", action="store_true", help="Show what would be done without making changes"
+        "--dry-run",
+        action="store_true",
+        help="Show what would be done without making changes",
     )
     parser.add_argument(
-        "--backup", action="store_true", help="Create a database backup before proceeding"
+        "--backup",
+        action="store_true",
+        help="Create a database backup before proceeding",
     )
     parser.add_argument("--squash", action="store_true", help="Generate squashed migrations")
     parser.add_argument(
-        "--reset-db", action="store_true", help="Reset the migration history in the database"
+        "--reset-db",
+        action="store_true",
+        help="Reset the migration history in the database",
     )
     parser.add_argument("--clean", action="store_true", help="Remove old migration files")
     parser.add_argument("--fix", action="store_true", help="Fix inconsistent migration history")
@@ -365,7 +382,14 @@ def main():
                 print("\nTrying alternate approach...")
                 # Try specific problem migrations
                 subprocess.run(
-                    ["python", "manage.py", "migrate", "certification_bodies", "--fake"], check=True
+                    [
+                        "python",
+                        "manage.py",
+                        "migrate",
+                        "certification_bodies",
+                        "--fake",
+                    ],
+                    check=True,
                 )
                 subprocess.run(["python", "manage.py", "migrate", "audits", "--fake"], check=True)
         else:
diff --git a/scripts/utils/setup_dev_environment.py b/scripts/utils/setup_dev_environment.py
index 40b49a2..a6d3cdf 100755
--- a/scripts/utils/setup_dev_environment.py
+++ b/scripts/utils/setup_dev_environment.py
@@ -73,7 +73,9 @@ def check_virtualenv():
 
     try:
         subprocess.run(
-            [sys.executable, "-m", "pip", "show", "virtualenv"], check=True, capture_output=True
+            [sys.executable, "-m", "pip", "show", "virtualenv"],
+            check=True,
+            capture_output=True,
         )
         print_success("virtualenv is installed.")
         return True
@@ -128,7 +130,13 @@ def install_requirements():
     # Install development requirements
     try:
         subprocess.run(
-            [str(pip_path), "install", "-r", str(PROJECT_ROOT / "requirements-dev.txt")], check=True
+            [
+                str(pip_path),
+                "install",
+                "-r",
+                str(PROJECT_ROOT / "requirements-dev.txt"),
+            ],
+            check=True,
         )
         print_success("Development dependencies installed successfully.")
     except subprocess.CalledProcessError:
@@ -138,7 +146,8 @@ def install_requirements():
     # Install production requirements
     try:
         subprocess.run(
-            [str(pip_path), "install", "-r", str(PROJECT_ROOT / "requirements.txt")], check=True
+            [str(pip_path), "install", "-r", str(PROJECT_ROOT / "requirements.txt")],
+            check=True,
         )
         print_success("Production dependencies installed successfully.")
         return True
@@ -180,7 +189,8 @@ def setup_database():
     try:
         # Make migrations
         subprocess.run(
-            [str(python_path), str(PROJECT_ROOT / "manage.py"), "makemigrations"], check=True
+            [str(python_path), str(PROJECT_ROOT / "manage.py"), "makemigrations"],
+            check=True,
         )
 
         # Apply migrations
diff --git a/scripts/utils/update_local_dev_db.py b/scripts/utils/update_local_dev_db.py
index 200f47f..8e8d0f1 100644
--- a/scripts/utils/update_local_dev_db.py
+++ b/scripts/utils/update_local_dev_db.py
@@ -107,7 +107,8 @@ def fake_migrations():
     try:
         # First handle Django's built-in apps
         subprocess.run(
-            ["python", "manage.py", "migrate", "--fake-initial", "contenttypes"], check=True
+            ["python", "manage.py", "migrate", "--fake-initial", "contenttypes"],
+            check=True,
         )
         subprocess.run(["python", "manage.py", "migrate", "--fake-initial", "auth"], check=True)
         subprocess.run(["python", "manage.py", "migrate", "--fake-initial", "admin"], check=True)


Reviews:
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T16:24:47Z
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T16:26:42Z

Review comments:
diff_hunk: @@ -412,15 +412,18 @@
             username="other_tester", email="other@certbody.com", password="otherpass123"
         )
         self.other_cert_body_user = CertBodyUser.objects.create(
-            user=self.other_user, cert_body=self.other_cert_body, role="admin", is_active=True
+            user=self.other_user,
+            cert_body=self.other_cert_body,
+            role="admin",
+            is_active=True,
         )
 
     def test_pending_decision_list_no_cert_body_user(self):
         """
         Test pending decision list when user has no certification body association.
         """
         # Create user with no cert body association
-        user_no_cert = User.objects.create_user(username="no_cert_user", password="password123")
+        _user_no_cert = User.objects.create_user(username="no_cert_user", password="password123")
path: apps/certification_bodies/tests.py
user: login: github-advanced-security[bot]
body: Possible hardcoded password: 'password123'

[Show more details](https://github.com/ioannisioannides/scopewatch/security/code-scanning/700)
created_at: 2025-04-11T16:24:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -433,7 +436,8 @@
         Test that the audit decision view handles exceptions properly.
         """
         # Login with an unrelated user (no cert body associations)
-        unrelated_user = User.objects.create_user(username="unrelated", password="unrelated123")
+        _unrelated_user = User.objects.create_user(username="unrelated", password="unrelated123")
path: apps/certification_bodies/tests.py
user: login: github-advanced-security[bot]
body: Possible hardcoded password: 'unrelated123'

[Show more details](https://github.com/ioannisioannides/scopewatch/security/code-scanning/701)
created_at: 2025-04-11T16:24:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -412,15 +412,18 @@
             username="other_tester", email="other@certbody.com", password="otherpass123"
         )
         self.other_cert_body_user = CertBodyUser.objects.create(
-            user=self.other_user, cert_body=self.other_cert_body, role="admin", is_active=True
+            user=self.other_user,
+            cert_body=self.other_cert_body,
+            role="admin",
+            is_active=True,
         )
 
     def test_pending_decision_list_no_cert_body_user(self):
         """
         Test pending decision list when user has no certification body association.
         """
         # Create user with no cert body association
-        user_no_cert = User.objects.create_user(username="no_cert_user", password="password123")
+        _user_no_cert = User.objects.create_user(username="no_cert_user", password="password123")
path: apps/certification_bodies/tests.py
user: login: github-advanced-security[bot]
body: Possible hardcoded password: 'password123'

[Show more details](https://github.com/ioannisioannides/scopewatch/security/code-scanning/722)
created_at: 2025-04-11T16:26:42Z
author_association: CONTRIBUTOR
diff_hunk: @@ -433,7 +436,8 @@
         Test that the audit decision view handles exceptions properly.
         """
         # Login with an unrelated user (no cert body associations)
-        unrelated_user = User.objects.create_user(username="unrelated", password="unrelated123")
+        _unrelated_user = User.objects.create_user(username="unrelated", password="unrelated123")
path: apps/certification_bodies/tests.py
user: login: github-advanced-security[bot]
body: Possible hardcoded password: 'unrelated123'

[Show more details](https://github.com/ioannisioannides/scopewatch/security/code-scanning/723)
created_at: 2025-04-11T16:26:42Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-04-11T16:24:31Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: failure by coderabbit.ai -->

> [!CAUTION]
> ## Review failed
> 
> The pull request is closed.

<!-- end of auto-generated comment: failure by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough
The pull request applies a series of formatting and cleanup improvements across the codebase. Changes include reformatting field declarations, multi-line argument structuring, and removal of unused imports. In several test files the naming of internal variables has been standardized and setUp methods have been reformatted for clarity. Migration and utility scripts now display command arguments more readably. There are no changes to the underlying logic, error handling, or public interfaces.

## Changes

| File(s) | Change Summary |
|---------|----------------|
| `apps/audits/models.py` | Reformatted `ForeignKey` declarations in `AuditTeam` and `AuditorAssignment` for improved readability. |
| `apps/certification_bodies/test_views_extended.py`, `apps/certification_bodies/tests.py` | Removed unused imports, renamed test variables (e.g., `audit_result` → `_audit_result`, `existing_cert` → `_existing_cert`), and reformatted `setUp` methods for clarity. |
| `apps/certification_bodies/views.py` | Modified the success message construction in `issue_certificate_view` and removed an unnecessary import. |
| `apps/consultants/tests.py` | Reordered import statements, added `timedelta` and `timezone` imports, and removed the redundant `Client` import. |
| `apps/organizations/test_api.py`, `apps/organizations/test_api_comprehensive.py` | Reformatted URL reversal calls and aligned data dictionary definitions to enhance clarity in API tests. |
| `apps/public/tests.py` | Adjusted assertion formatting (splitting key and value across lines) for better readability in certificate verification tests. |
| `backups/migrations/old_migrations_20250410_214853/audits/0000_fix_nonconformance.py`, `.../certification_bodies/0007_reset_migrations.py`, `.../consultants/0012_reset_migrations.py` | Reformatted migration files by reworking field declarations and list structures into multi-line formats without affecting functionality. |
| `scripts/migrations/ci_migration_fix.py`, `scripts/migrations/fix_ci_migrations.py`, `scripts/migrations/fix_migration_now.py`, `scripts/migrations/reset_all_migrations.py`, `scripts/migrations/reset_migrations.py` | Enhanced migration scripts with multi-line formatting for command parameters and lists to improve clarity. |
| `scripts/utils/setup_dev_environment.py`, `scripts/utils/update_local_dev_db.py` | Reformatted subprocess command invocations into multi-line lists for better code structure and readability. |

## Poem
> I'm a hopping rabbit in a code-filled glen,  
> Formatting each line again and again.  
> Imports trimmed and variables renamed,  
> My tidy paths and commands are famed.  
> A joyful hop through refactored code,  
> Where clarity blooms on every road.  
> 🐰 Keep on coding, let neatness explode!

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- announcements_start -->

> [!TIP]
> <details>
> <summary>⚡💬 Agentic Chat (Pro Plan, General Availability)</summary>
> 
> - We're introducing multi-step agentic chat in review comments and issue comments, within and outside of PR's. This feature enhances review and issue discussions with the CodeRabbit agentic chat by enabling advanced interactions, including the ability to create pull requests directly from comments and add commits to existing pull requests.
> 
> </details>

<!-- announcements_end -->

---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 8f7da69391c3196950f91281c9ca37d3097e163e and 5e8bf07f3a1fc8d53913cbc23afba32a9c63730f.

</details>

<details>
<summary>📒 Files selected for processing (18)</summary>

* `apps/audits/models.py` (2 hunks)
* `apps/certification_bodies/test_views_extended.py` (8 hunks)
* `apps/certification_bodies/tests.py` (7 hunks)
* `apps/certification_bodies/views.py` (1 hunks)
* `apps/consultants/tests.py` (1 hunks)
* `apps/organizations/test_api.py` (1 hunks)
* `apps/organizations/test_api_comprehensive.py` (3 hunks)
* `apps/public/tests.py` (1 hunks)
* `backups/migrations/old_migrations_20250410_214853/audits/0000_fix_nonconformance.py` (1 hunks)
* `backups/migrations/old_migrations_20250410_214853/certification_bodies/0007_reset_migrations.py` (2 hunks)
* `backups/migrations/old_migrations_20250410_214853/consultants/0012_reset_migrations.py` (2 hunks)
* `scripts/migrations/ci_migration_fix.py` (1 hunks)
* `scripts/migrations/fix_ci_migrations.py` (1 hunks)
* `scripts/migrations/fix_migration_now.py` (2 hunks)
* `scripts/migrations/reset_all_migrations.py` (1 hunks)
* `scripts/migrations/reset_migrations.py` (5 hunks)
* `scripts/utils/setup_dev_environment.py` (4 hunks)
* `scripts/utils/update_local_dev_db.py` (1 hunks)

</details>

</details>
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=ioannisioannides/scopewatch&utm_content=73):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai plan` to trigger planning for file edits and PR creation.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-11T16:24:37Z
body: <h1>Dependency Review</h1>
✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.<h2>Scanned Files</h2>
None

<!-- dependency-review-pr-comment-marker -->
author_association: NONE