From 5d66f8a266868cb3345766d72c9c8b9a1729ce60 Mon Sep 17 00:00:00 2001 From: Phil Dominguez <142051477+phildominguez-gsa@users.noreply.github.com> Date: Tue, 15 Oct 2024 10:23:46 -0400 Subject: [PATCH 1/3] Tweaking audit user management instructions (#4382) * Allowing users to remove editors * Better handling for users removing their own access * User management documentation * Lint * Lint * Unit tests * Lint * Lint * More 404 tests * Only editors can remove an editor * Moving RemoveEditorViewTests to its own file * Lint * Fixing test * Fixing Remove column * Test cleanup * Lint * Audit metadata fix * Fixing unit tests * Updating instructions * Tweaking instructions --- backend/audit/templates/audit/manage-submission.html | 4 ++-- backend/audit/templates/audit/remove-editor-access.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/audit/templates/audit/manage-submission.html b/backend/audit/templates/audit/manage-submission.html index 300e65110..75f988348 100644 --- a/backend/audit/templates/audit/manage-submission.html +++ b/backend/audit/templates/audit/manage-submission.html @@ -27,7 +27,7 @@

Manage user roles

The table below lists the individuals with access to this single audit submission.

- There may only be one Auditee Certifying Official and one Auditor Certifying Official. These users must have different email addresses. Any substitution for these roles will remove the prior user. + There must only be one Auditee Certifying Official and one Auditor Certifying Official. These users must have different email addresses. Any substitution for these roles will remove the prior user.

{% comment %} Uncomment when we can add/remove other types of editors. @@ -36,7 +36,7 @@

Manage user roles

{% endcomment %}

- To change an individual's role, click the "edit" link in the table. At this time, you may only change the certifying officials and this may only be done by the Audit Editor. + To change an individual's role, click the “Edit” link in the table. At this time, you can only change the certifying officials, and this can only be done by an Audit Editor.

It's recommended that larger organizations always add at least two of their staff in the Audit Editor role. This ensures that an audit does not become inaccessible due to the departure of a staff member. diff --git a/backend/audit/templates/audit/remove-editor-access.html b/backend/audit/templates/audit/remove-editor-access.html index 90488bc2c..ac4dfc52d 100644 --- a/backend/audit/templates/audit/remove-editor-access.html +++ b/backend/audit/templates/audit/remove-editor-access.html @@ -33,7 +33,7 @@

Remove Editor

{% if is_editor_removing_self %}

- Editors do not have permission to remove their own access. + Audit Editors cannot remove their own access. This helps to ensure that an audit remains accessible to an organization.

{% endif %} From 8d59859ec6ef011fc12f31947d74b4fbd9699964 Mon Sep 17 00:00:00 2001 From: Bobby Novak <176936850+rnovak338@users.noreply.github.com> Date: Tue, 15 Oct 2024 10:29:38 -0400 Subject: [PATCH 2/3] Delete old replaced migrations (#4378) * Django FSM migration to Viewflow - Added new `django-viewflow` and `django-filter` dependencies to `requirements.txt`. - New file `viewflow.py` under `/audit/models/` which contains the FSM logic for transitioning an SAC. - Moved `STATUS` enumeration outside of the `SingleAuditChecklist` class. This required import/reference changes across many files and tests. - Removed references of old deprecated library `django-fsm`. - New migration to handle the changing the SAC's `submission_name` field to remove dependency on the deprecated `django-fsm`. * Git conflicts with #4292 * Squash migrations * Remove django-fsm requirement * Update requirements.txt * Re-add django-fsm dependency This cannot be done until the migration squash is deployed to production. * Remove replaced migrations --- backend/audit/migrations/0001_initial.py | 472 ------------------ ..._0013_singleauditchecklistflow_and_more.py | 16 - ...02_alter_singleauditchecklist_report_id.py | 17 - ...ngleauditchecklist_data_source_and_more.py | 63 --- ...uditchecklist_cognizant_agency_and_more.py | 34 -- .../0005_alter_submissionevent_event.py | 59 --- .../audit/migrations/0006_deletedaccess.py | 84 ---- ...07_alter_deletedaccess_options_and_more.py | 21 - .../0008_alter_submissionevent_event.py | 78 --- ...ueivalidationwaiver_sacvalidationwaiver.py | 143 ------ .../0010_alter_ueivalidationwaiver_uei.py | 18 - ...ueivalidationwaiver_expiration_and_more.py | 31 -- ..._alter_sacvalidationwaiver_waiver_types.py | 40 -- .../0013_singleauditchecklistflow_and_more.py | 47 -- 14 files changed, 1123 deletions(-) delete mode 100644 backend/audit/migrations/0001_initial.py delete mode 100644 backend/audit/migrations/0002_alter_singleauditchecklist_report_id.py delete mode 100644 backend/audit/migrations/0003_alter_singleauditchecklist_data_source_and_more.py delete mode 100644 backend/audit/migrations/0004_alter_singleauditchecklist_cognizant_agency_and_more.py delete mode 100644 backend/audit/migrations/0005_alter_submissionevent_event.py delete mode 100644 backend/audit/migrations/0006_deletedaccess.py delete mode 100644 backend/audit/migrations/0007_alter_deletedaccess_options_and_more.py delete mode 100644 backend/audit/migrations/0008_alter_submissionevent_event.py delete mode 100644 backend/audit/migrations/0009_ueivalidationwaiver_sacvalidationwaiver.py delete mode 100644 backend/audit/migrations/0010_alter_ueivalidationwaiver_uei.py delete mode 100644 backend/audit/migrations/0011_ueivalidationwaiver_expiration_and_more.py delete mode 100644 backend/audit/migrations/0012_alter_sacvalidationwaiver_waiver_types.py delete mode 100644 backend/audit/migrations/0013_singleauditchecklistflow_and_more.py diff --git a/backend/audit/migrations/0001_initial.py b/backend/audit/migrations/0001_initial.py deleted file mode 100644 index 3118977b6..000000000 --- a/backend/audit/migrations/0001_initial.py +++ /dev/null @@ -1,472 +0,0 @@ -# Generated by Django 4.2.3 on 2023-09-20 13:57 - -import audit.models -import audit.validators -from django.conf import settings -import django.contrib.postgres.fields -from django.db import migrations, models -import django.db.models.deletion -import django_fsm - - -class Migration(migrations.Migration): - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name="SingleAuditChecklist", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("date_created", models.DateTimeField(auto_now_add=True)), - ( - "submission_status", - django_fsm.FSMField( - choices=[ - ("in_progress", "In Progress"), - ("ready_for_certification", "Ready for Certification"), - ("auditor_certified", "Auditor Certified"), - ("auditee_certified", "Auditee Certified"), - ("certified", "Certified"), - ("submitted", "Submitted"), - ("disseminated", "Disseminated"), - ], - default="in_progress", - max_length=50, - ), - ), - ("data_source", models.CharField(default="GSA")), - ( - "transition_name", - django.contrib.postgres.fields.ArrayField( - base_field=models.CharField( - choices=[ - ("in_progress", "In Progress"), - ("ready_for_certification", "Ready for Certification"), - ("auditor_certified", "Auditor Certified"), - ("auditee_certified", "Auditee Certified"), - ("certified", "Certified"), - ("submitted", "Submitted"), - ("disseminated", "Disseminated"), - ], - max_length=40, - ), - blank=True, - default=list, - null=True, - size=None, - ), - ), - ( - "transition_date", - django.contrib.postgres.fields.ArrayField( - base_field=models.DateTimeField(), - blank=True, - default=list, - null=True, - size=None, - ), - ), - ("report_id", models.CharField(max_length=17, unique=True)), - ( - "audit_type", - models.CharField( - blank=True, - choices=[ - ("single-audit", "Single Audit"), - ("program-specific", "Program-Specific Audit"), - ], - max_length=20, - null=True, - ), - ), - ( - "general_information", - models.JSONField( - blank=True, - null=True, - validators=[audit.validators.validate_general_information_json], - ), - ), - ( - "audit_information", - models.JSONField( - blank=True, - null=True, - validators=[audit.validators.validate_audit_information_json], - ), - ), - ( - "federal_awards", - models.JSONField( - blank=True, - null=True, - validators=[audit.validators.validate_federal_award_json], - ), - ), - ( - "corrective_action_plan", - models.JSONField( - blank=True, - null=True, - validators=[ - audit.validators.validate_corrective_action_plan_json - ], - ), - ), - ( - "findings_text", - models.JSONField( - blank=True, - null=True, - validators=[audit.validators.validate_findings_text_json], - ), - ), - ( - "findings_uniform_guidance", - models.JSONField( - blank=True, - null=True, - validators=[ - audit.validators.validate_findings_uniform_guidance_json - ], - ), - ), - ( - "additional_ueis", - models.JSONField( - blank=True, - null=True, - validators=[audit.validators.validate_additional_ueis_json], - ), - ), - ( - "additional_eins", - models.JSONField( - blank=True, - null=True, - validators=[audit.validators.validate_additional_eins_json], - ), - ), - ( - "secondary_auditors", - models.JSONField( - blank=True, - null=True, - validators=[audit.validators.validate_secondary_auditors_json], - ), - ), - ( - "notes_to_sefa", - models.JSONField( - blank=True, - null=True, - validators=[audit.validators.validate_notes_to_sefa_json], - ), - ), - ( - "auditor_certification", - models.JSONField( - blank=True, - null=True, - validators=[ - audit.validators.validate_auditor_certification_json - ], - ), - ), - ( - "auditee_certification", - models.JSONField( - blank=True, - null=True, - validators=[ - audit.validators.validate_auditee_certification_json - ], - ), - ), - ( - "tribal_data_consent", - models.JSONField( - blank=True, - null=True, - validators=[audit.validators.validate_tribal_data_consent_json], - ), - ), - ( - "cognizant_agency", - models.CharField( - blank=True, - max_length=2, - null=True, - verbose_name="Agency assigned to this large submission. Computed when the submisson is finalized, but may be overridden", - ), - ), - ( - "oversight_agency", - models.CharField( - blank=True, - max_length=2, - null=True, - verbose_name="Agency assigned to this not so large submission. Computed when the submisson is finalized", - ), - ), - ( - "submitted_by", - models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, - to=settings.AUTH_USER_MODEL, - ), - ), - ], - options={ - "verbose_name": "SF-SAC", - "verbose_name_plural": "SF-SACs", - }, - bases=(models.Model, audit.models.GeneralInformationMixin), - ), - migrations.CreateModel( - name="SubmissionEvent", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("timestamp", models.DateTimeField(auto_now_add=True)), - ( - "event", - models.CharField( - choices=[ - ("access-granted", "Access granted"), - ("additional-eins-updated", "Additional EINs updated"), - ("additional-ueis-updated", "Additional UEIs updated"), - ("audit-information-updated", "Audit information updated"), - ("audit-report-pdf-updated", "Audit report PDF updated"), - ( - "auditee-certification-completed", - "Auditee certification completed", - ), - ( - "auditor-certification-completed", - "Auditor certification completed", - ), - ( - "corrective-action-plan-updated", - "Corrective action plan updated", - ), - ("created", "Created"), - ("federal-awards-updated", "Federal awards updated"), - ( - "federal-awards-audit-findings-updated", - "Federal awards audit findings updated", - ), - ( - "federal-awards-audit-findings-text-updated", - "Federal awards audit findings text updated", - ), - ( - "findings-uniform-guidance-updated", - "Findings uniform guidance updated", - ), - ( - "general-information-updated", - "General information updated", - ), - ("locked-for-certification", "Locked for certification"), - ("notes-to-sefa-updated", "Notes to SEFA updated"), - ( - "secondary-auditors-updated", - "Secondary auditors updated", - ), - ("submitted", "Submitted to the FAC for processing"), - ] - ), - ), - ( - "sac", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="audit.singleauditchecklist", - ), - ), - ( - "user", - models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, - to=settings.AUTH_USER_MODEL, - ), - ), - ], - ), - migrations.CreateModel( - name="SingleAuditReportFile", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "file", - models.FileField( - upload_to=audit.models.single_audit_report_path, - validators=[audit.validators.validate_single_audit_report_file], - ), - ), - ("filename", models.CharField(max_length=255)), - ("date_created", models.DateTimeField(auto_now_add=True)), - ( - "component_page_numbers", - models.JSONField( - blank=True, - null=True, - validators=[audit.validators.validate_component_page_numbers], - ), - ), - ( - "sac", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="audit.singleauditchecklist", - ), - ), - ( - "user", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - ), - ), - ], - ), - migrations.CreateModel( - name="ExcelFile", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "file", - models.FileField( - upload_to=audit.models.excel_file_path, - validators=[audit.validators.validate_excel_file], - ), - ), - ("filename", models.CharField(max_length=255)), - ("form_section", models.CharField(max_length=255)), - ("date_created", models.DateTimeField(auto_now_add=True)), - ( - "sac", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="audit.singleauditchecklist", - ), - ), - ( - "user", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - ), - ), - ], - ), - migrations.CreateModel( - name="Access", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "role", - models.CharField( - choices=[ - ( - "certifying_auditee_contact", - "Auditee Certifying Official", - ), - ( - "certifying_auditor_contact", - "Auditor Certifying Official", - ), - ("editor", "Audit Editor"), - ], - help_text="Access type granted to this user", - max_length=50, - ), - ), - ("fullname", models.CharField(blank=True)), - ("email", models.EmailField(max_length=254)), - ( - "sac", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="audit.singleauditchecklist", - ), - ), - ( - "user", - models.ForeignKey( - help_text="User ID associated with this email address, empty if no FAC account exists", - null=True, - on_delete=django.db.models.deletion.PROTECT, - to=settings.AUTH_USER_MODEL, - ), - ), - ], - options={ - "verbose_name_plural": "accesses", - }, - ), - migrations.AddConstraint( - model_name="access", - constraint=models.UniqueConstraint( - condition=models.Q(("role", "certifying_auditee_contact")), - fields=("sac",), - name="audit_$(class)s_single_certifying_auditee", - ), - ), - migrations.AddConstraint( - model_name="access", - constraint=models.UniqueConstraint( - condition=models.Q(("role", "certifying_auditor_contact")), - fields=("sac",), - name="audit_access_single_certifying_auditor", - ), - ), - ] diff --git a/backend/audit/migrations/0001_squashed_0013_singleauditchecklistflow_and_more.py b/backend/audit/migrations/0001_squashed_0013_singleauditchecklistflow_and_more.py index ccbe6a85d..81345720c 100644 --- a/backend/audit/migrations/0001_squashed_0013_singleauditchecklistflow_and_more.py +++ b/backend/audit/migrations/0001_squashed_0013_singleauditchecklistflow_and_more.py @@ -11,22 +11,6 @@ class Migration(migrations.Migration): - replaces = [ - ("audit", "0001_initial"), - ("audit", "0002_alter_singleauditchecklist_report_id"), - ("audit", "0003_alter_singleauditchecklist_data_source_and_more"), - ("audit", "0004_alter_singleauditchecklist_cognizant_agency_and_more"), - ("audit", "0005_alter_submissionevent_event"), - ("audit", "0006_deletedaccess"), - ("audit", "0007_alter_deletedaccess_options_and_more"), - ("audit", "0008_alter_submissionevent_event"), - ("audit", "0009_ueivalidationwaiver_sacvalidationwaiver"), - ("audit", "0010_alter_ueivalidationwaiver_uei"), - ("audit", "0011_ueivalidationwaiver_expiration_and_more"), - ("audit", "0012_alter_sacvalidationwaiver_waiver_types"), - ("audit", "0013_singleauditchecklistflow_and_more"), - ] - initial = True dependencies = [ diff --git a/backend/audit/migrations/0002_alter_singleauditchecklist_report_id.py b/backend/audit/migrations/0002_alter_singleauditchecklist_report_id.py deleted file mode 100644 index c059b608b..000000000 --- a/backend/audit/migrations/0002_alter_singleauditchecklist_report_id.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-29 23:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("audit", "0001_initial"), - ] - - operations = [ - migrations.AlterField( - model_name="singleauditchecklist", - name="report_id", - field=models.CharField(unique=True), - ), - ] diff --git a/backend/audit/migrations/0003_alter_singleauditchecklist_data_source_and_more.py b/backend/audit/migrations/0003_alter_singleauditchecklist_data_source_and_more.py deleted file mode 100644 index 49f6c0c76..000000000 --- a/backend/audit/migrations/0003_alter_singleauditchecklist_data_source_and_more.py +++ /dev/null @@ -1,63 +0,0 @@ -# Generated by Django 4.2.5 on 2023-10-03 19:05 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("audit", "0002_alter_singleauditchecklist_report_id"), - ] - - operations = [ - migrations.AlterField( - model_name="singleauditchecklist", - name="data_source", - field=models.CharField(default="GSAFAC"), - ), - migrations.AlterField( - model_name="submissionevent", - name="event", - field=models.CharField( - choices=[ - ("access-granted", "Access granted"), - ("additional-eins-updated", "Additional EINs updated"), - ("additional-ueis-updated", "Additional UEIs updated"), - ("audit-information-updated", "Audit information updated"), - ("audit-report-pdf-updated", "Audit report PDF updated"), - ( - "auditee-certification-completed", - "Auditee certification completed", - ), - ( - "auditor-certification-completed", - "Auditor certification completed", - ), - ( - "corrective-action-plan-updated", - "Corrective action plan updated", - ), - ("created", "Created"), - ("federal-awards-updated", "Federal awards updated"), - ( - "federal-awards-audit-findings-updated", - "Federal awards audit findings updated", - ), - ( - "federal-awards-audit-findings-text-updated", - "Federal awards audit findings text updated", - ), - ( - "findings-uniform-guidance-updated", - "Findings uniform guidance updated", - ), - ("general-information-updated", "General information updated"), - ("locked-for-certification", "Locked for certification"), - ("notes-to-sefa-updated", "Notes to SEFA updated"), - ("secondary-auditors-updated", "Secondary auditors updated"), - ("submitted", "Submitted to the FAC for processing"), - ("disseminated", "Copied to dissemination tables"), - ("tribal-consent-updated", "Tribal audit consent updated"), - ] - ), - ), - ] diff --git a/backend/audit/migrations/0004_alter_singleauditchecklist_cognizant_agency_and_more.py b/backend/audit/migrations/0004_alter_singleauditchecklist_cognizant_agency_and_more.py deleted file mode 100644 index 8455400a6..000000000 --- a/backend/audit/migrations/0004_alter_singleauditchecklist_cognizant_agency_and_more.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 4.2.5 on 2023-10-11 15:05 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("audit", "0003_alter_singleauditchecklist_data_source_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="singleauditchecklist", - name="cognizant_agency", - field=models.CharField( - blank=True, - help_text="Agency assigned to this large submission. Computed when the submisson is finalized, but may be overridden", - max_length=2, - null=True, - verbose_name="Cog Agency", - ), - ), - migrations.AlterField( - model_name="singleauditchecklist", - name="oversight_agency", - field=models.CharField( - blank=True, - help_text="Agency assigned to this not so large submission. Computed when the submisson is finalized", - max_length=2, - null=True, - verbose_name="OSight Agency", - ), - ), - ] diff --git a/backend/audit/migrations/0005_alter_submissionevent_event.py b/backend/audit/migrations/0005_alter_submissionevent_event.py deleted file mode 100644 index 543051764..000000000 --- a/backend/audit/migrations/0005_alter_submissionevent_event.py +++ /dev/null @@ -1,59 +0,0 @@ -# Generated by Django 4.2.6 on 2023-10-24 18:58 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("audit", "0004_alter_singleauditchecklist_cognizant_agency_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="submissionevent", - name="event", - field=models.CharField( - choices=[ - ("access-granted", "Access granted"), - ("additional-eins-updated", "Additional EINs updated"), - ("additional-ueis-updated", "Additional UEIs updated"), - ("audit-information-updated", "Audit information updated"), - ("audit-report-pdf-updated", "Audit report PDF updated"), - ( - "auditee-certification-completed", - "Auditee certification completed", - ), - ( - "auditor-certification-completed", - "Auditor certification completed", - ), - ( - "corrective-action-plan-updated", - "Corrective action plan updated", - ), - ("created", "Created"), - ("federal-awards-updated", "Federal awards updated"), - ( - "federal-awards-audit-findings-updated", - "Federal awards audit findings updated", - ), - ( - "federal-awards-audit-findings-text-updated", - "Federal awards audit findings text updated", - ), - ( - "findings-uniform-guidance-updated", - "Findings uniform guidance updated", - ), - ("general-information-updated", "General information updated"), - ("locked-for-certification", "Locked for certification"), - ("unlocked-after-certification", "Unlocked after certification"), - ("notes-to-sefa-updated", "Notes to SEFA updated"), - ("secondary-auditors-updated", "Secondary auditors updated"), - ("submitted", "Submitted to the FAC for processing"), - ("disseminated", "Copied to dissemination tables"), - ("tribal-consent-updated", "Tribal audit consent updated"), - ] - ), - ), - ] diff --git a/backend/audit/migrations/0006_deletedaccess.py b/backend/audit/migrations/0006_deletedaccess.py deleted file mode 100644 index 8cad434d8..000000000 --- a/backend/audit/migrations/0006_deletedaccess.py +++ /dev/null @@ -1,84 +0,0 @@ -# Generated by Django 4.2.6 on 2023-11-17 18:47 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("audit", "0005_alter_submissionevent_event"), - ] - - operations = [ - migrations.CreateModel( - name="DeletedAccess", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "role", - models.CharField( - choices=[ - ( - "certifying_auditee_contact", - "Auditee Certifying Official", - ), - ( - "certifying_auditor_contact", - "Auditor Certifying Official", - ), - ("editor", "Audit Editor"), - ], - help_text="Access type granted to this user", - max_length=50, - ), - ), - ("fullname", models.CharField(blank=True)), - ("email", models.EmailField(max_length=254)), - ("removed_at", models.DateTimeField(auto_now_add=True)), - ("removed_by_email", models.EmailField(max_length=254)), - ( - "removal_event", - models.CharField(choices=[("access-change", "Access change")]), - ), - ( - "removed_by_user", - models.ForeignKey( - help_text="User ID used to delete this Access", - null=True, - on_delete=django.db.models.deletion.PROTECT, - related_name="access_deleted", - to=settings.AUTH_USER_MODEL, - ), - ), - ( - "sac", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="audit.singleauditchecklist", - ), - ), - ( - "user", - models.ForeignKey( - help_text="User ID associated with this email address, empty if no FAC account exists", - null=True, - on_delete=django.db.models.deletion.PROTECT, - to=settings.AUTH_USER_MODEL, - ), - ), - ], - options={ - "verbose_name_plural": "deletedaccesses", - }, - ), - ] diff --git a/backend/audit/migrations/0007_alter_deletedaccess_options_and_more.py b/backend/audit/migrations/0007_alter_deletedaccess_options_and_more.py deleted file mode 100644 index c8fd1a32c..000000000 --- a/backend/audit/migrations/0007_alter_deletedaccess_options_and_more.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 4.2.6 on 2023-11-21 23:08 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("audit", "0006_deletedaccess"), - ] - - operations = [ - migrations.AlterModelOptions( - name="deletedaccess", - options={"verbose_name_plural": "deleted accesses"}, - ), - migrations.AlterField( - model_name="deletedaccess", - name="removed_by_email", - field=models.EmailField(max_length=254, null=True), - ), - ] diff --git a/backend/audit/migrations/0008_alter_submissionevent_event.py b/backend/audit/migrations/0008_alter_submissionevent_event.py deleted file mode 100644 index 88ec8100e..000000000 --- a/backend/audit/migrations/0008_alter_submissionevent_event.py +++ /dev/null @@ -1,78 +0,0 @@ -# Generated by Django 5.0.2 on 2024-04-17 11:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("audit", "0007_alter_deletedaccess_options_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="submissionevent", - name="event", - field=models.CharField( - choices=[ - ("access-granted", "Access granted"), - ("additional-eins-updated", "Additional EINs updated"), - ("additional-eins-deleted", "Additional EINs deleted"), - ("additional-ueis-updated", "Additional UEIs updated"), - ("additional-ueis-deleted", "Additional UEIs deleted"), - ("audit-information-updated", "Audit information updated"), - ("audit-report-pdf-updated", "Audit report PDF updated"), - ( - "auditee-certification-completed", - "Auditee certification completed", - ), - ( - "auditor-certification-completed", - "Auditor certification completed", - ), - ( - "corrective-action-plan-updated", - "Corrective action plan updated", - ), - ( - "corrective-action-plan-deleted", - "Corrective action plan deleted", - ), - ("created", "Created"), - ("federal-awards-updated", "Federal awards updated"), - ( - "federal-awards-audit-findings-updated", - "Federal awards audit findings updated", - ), - ( - "federal-awards-audit-findings-deleted", - "Federal awards audit findings deleted", - ), - ( - "federal-awards-audit-findings-text-updated", - "Federal awards audit findings text updated", - ), - ( - "federal-awards-audit-findings-text-deleted", - "Federal awards audit findings text deleted", - ), - ( - "findings-uniform-guidance-updated", - "Findings uniform guidance updated", - ), - ( - "findings-uniform-guidance-deleted", - "Findings uniform guidance deleted", - ), - ("general-information-updated", "General information updated"), - ("locked-for-certification", "Locked for certification"), - ("unlocked-after-certification", "Unlocked after certification"), - ("notes-to-sefa-updated", "Notes to SEFA updated"), - ("secondary-auditors-updated", "Secondary auditors updated"), - ("secondary-auditors-deleted", "Secondary auditors deleted"), - ("submitted", "Submitted to the FAC for processing"), - ("disseminated", "Copied to dissemination tables"), - ("tribal-consent-updated", "Tribal audit consent updated"), - ] - ), - ), - ] diff --git a/backend/audit/migrations/0009_ueivalidationwaiver_sacvalidationwaiver.py b/backend/audit/migrations/0009_ueivalidationwaiver_sacvalidationwaiver.py deleted file mode 100644 index f5ca3dc37..000000000 --- a/backend/audit/migrations/0009_ueivalidationwaiver_sacvalidationwaiver.py +++ /dev/null @@ -1,143 +0,0 @@ -# Generated by Django 5.0.4 on 2024-07-02 02:13 - -import django.contrib.postgres.fields -import django.db.models.deletion -import django.utils.timezone -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("audit", "0008_alter_submissionevent_event"), - ] - - operations = [ - migrations.CreateModel( - name="UeiValidationWaiver", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("uei", models.TextField(unique=True, verbose_name="UEI")), - ( - "approver_email", - models.TextField( - verbose_name="Email address of FAC staff member approving the waiver" - ), - ), - ( - "approver_name", - models.TextField( - verbose_name="Name of FAC staff member approving the waiver" - ), - ), - ( - "requester_email", - models.TextField( - verbose_name="Email address of NSAC/KSAML requesting the waiver" - ), - ), - ( - "requester_name", - models.TextField( - verbose_name="Name of NSAC/KSAML requesting the waiver" - ), - ), - ( - "justification", - models.TextField( - verbose_name="Brief plain-text justification for the waiver" - ), - ), - ], - ), - migrations.CreateModel( - name="SacValidationWaiver", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "timestamp", - models.DateTimeField( - default=django.utils.timezone.now, - verbose_name="When the waiver was created", - ), - ), - ( - "approver_email", - models.TextField( - verbose_name="Email address of FAC staff member approving the waiver" - ), - ), - ( - "approver_name", - models.TextField( - verbose_name="Name of FAC staff member approving the waiver" - ), - ), - ( - "requester_email", - models.TextField( - verbose_name="Email address of NSAC/KSAML requesting the waiver" - ), - ), - ( - "requester_name", - models.TextField( - verbose_name="Name of NSAC/KSAML requesting the waiver" - ), - ), - ( - "justification", - models.TextField( - verbose_name="Brief plain-text justification for the waiver" - ), - ), - ( - "waiver_types", - django.contrib.postgres.fields.ArrayField( - base_field=models.CharField( - choices=[ - ( - "auditee_certifying_official", - "No auditee certifying official is available", - ), - ( - "auditor_certifying_official", - "No auditor certifying official is available", - ), - ], - max_length=50, - ), - default=list, - size=None, - verbose_name="The waiver type", - ), - ), - ( - "report_id", - models.ForeignKey( - db_column="report_id", - help_text="The report that the waiver applies to", - on_delete=django.db.models.deletion.CASCADE, - to="audit.singleauditchecklist", - to_field="report_id", - ), - ), - ], - ), - ] diff --git a/backend/audit/migrations/0010_alter_ueivalidationwaiver_uei.py b/backend/audit/migrations/0010_alter_ueivalidationwaiver_uei.py deleted file mode 100644 index 368574f50..000000000 --- a/backend/audit/migrations/0010_alter_ueivalidationwaiver_uei.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.0.4 on 2024-07-09 14:42 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("audit", "0009_ueivalidationwaiver_sacvalidationwaiver"), - ] - - operations = [ - migrations.AlterField( - model_name="ueivalidationwaiver", - name="uei", - field=models.TextField(verbose_name="UEI"), - ), - ] diff --git a/backend/audit/migrations/0011_ueivalidationwaiver_expiration_and_more.py b/backend/audit/migrations/0011_ueivalidationwaiver_expiration_and_more.py deleted file mode 100644 index ab18c1131..000000000 --- a/backend/audit/migrations/0011_ueivalidationwaiver_expiration_and_more.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 5.0.4 on 2024-07-23 15:54 - -import audit.models.models -import django.utils.timezone -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("audit", "0010_alter_ueivalidationwaiver_uei"), - ] - - operations = [ - migrations.AddField( - model_name="ueivalidationwaiver", - name="expiration", - field=models.DateTimeField( - default=audit.models.models.one_month_from_today, - verbose_name="When the waiver will expire", - ), - ), - migrations.AddField( - model_name="ueivalidationwaiver", - name="timestamp", - field=models.DateTimeField( - default=django.utils.timezone.now, - verbose_name="When the waiver was created", - ), - ), - ] diff --git a/backend/audit/migrations/0012_alter_sacvalidationwaiver_waiver_types.py b/backend/audit/migrations/0012_alter_sacvalidationwaiver_waiver_types.py deleted file mode 100644 index 2834c467d..000000000 --- a/backend/audit/migrations/0012_alter_sacvalidationwaiver_waiver_types.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 5.0.4 on 2024-08-05 17:26 - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("audit", "0011_ueivalidationwaiver_expiration_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="sacvalidationwaiver", - name="waiver_types", - field=django.contrib.postgres.fields.ArrayField( - base_field=models.CharField( - choices=[ - ( - "auditee_certifying_official", - "No auditee certifying official is available", - ), - ( - "auditor_certifying_official", - "No auditor certifying official is available", - ), - ( - "finding_reference_number", - "Report has duplicate finding reference numbers", - ), - ], - max_length=50, - ), - default=list, - size=None, - verbose_name="The waiver type", - ), - ), - ] diff --git a/backend/audit/migrations/0013_singleauditchecklistflow_and_more.py b/backend/audit/migrations/0013_singleauditchecklistflow_and_more.py deleted file mode 100644 index f5cc6b61b..000000000 --- a/backend/audit/migrations/0013_singleauditchecklistflow_and_more.py +++ /dev/null @@ -1,47 +0,0 @@ -# Generated by Django 5.1 on 2024-09-18 18:44 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("audit", "0012_alter_sacvalidationwaiver_waiver_types"), - ] - - operations = [ - migrations.CreateModel( - name="SingleAuditChecklistFlow", - fields=[ - ( - "singleauditchecklist_ptr", - models.OneToOneField( - auto_created=True, - on_delete=django.db.models.deletion.CASCADE, - parent_link=True, - primary_key=True, - serialize=False, - to="audit.singleauditchecklist", - ), - ), - ], - bases=("audit.singleauditchecklist",), - ), - migrations.AlterField( - model_name="singleauditchecklist", - name="submission_status", - field=models.CharField( - choices=[ - ("in_progress", "In Progress"), - ("ready_for_certification", "Ready for Certification"), - ("auditor_certified", "Auditor Certified"), - ("auditee_certified", "Auditee Certified"), - ("certified", "Certified"), - ("submitted", "Submitted"), - ("disseminated", "Disseminated"), - ], - default="in_progress", - ), - ), - ] From d3627f201cf7f767c37c4dfd2eb6b1a4f0d0f49d Mon Sep 17 00:00:00 2001 From: Alex Steel <130377221+asteel-gsa@users.noreply.github.com> Date: Tue, 15 Oct 2024 13:25:09 -0400 Subject: [PATCH 3/3] Bump trivy to 0.27.0 (#4384) --- .github/workflows/trivy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 100f4c89c..f0b690605 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -39,7 +39,7 @@ jobs: run: docker build -t ${{ env.DOCKER_NAME }}:${{ steps.date.outputs.date }} . - name: Run Trivy vulnerability scanner - uses: aquasecurity/trivy-action@0.26.0 + uses: aquasecurity/trivy-action@0.27.0 with: image-ref: '${{ env.DOCKER_NAME }}:${{ steps.date.outputs.date }}' scan-type: 'image' @@ -74,7 +74,7 @@ jobs: run: docker pull ${{ matrix.image.name }} - name: Run Trivy vulnerability scanner on Third Party Images - uses: aquasecurity/trivy-action@0.26.0 + uses: aquasecurity/trivy-action@0.27.0 with: image-ref: '${{ matrix.image.name }}' scan-type: 'image'