diff --git a/assets/src/bundles/add_forge/index.js b/assets/src/bundles/add_forge/index.js --- a/assets/src/bundles/add_forge/index.js +++ b/assets/src/bundles/add_forge/index.js @@ -24,7 +24,7 @@ 'FIRST_ORIGIN_LOADED': 'First origin loaded', 'REJECTED': 'Rejected', 'SUSPENDED': 'Suspended', - 'DENIED': 'Denied' + 'UNSUCCESSFUL': 'Unsuccessful' }; return status in statusLabel ? statusLabel[status] : status; } diff --git a/assets/src/bundles/add_forge/request-dashboard.js b/assets/src/bundles/add_forge/request-dashboard.js --- a/assets/src/bundles/add_forge/request-dashboard.js +++ b/assets/src/bundles/add_forge/request-dashboard.js @@ -105,7 +105,7 @@ 'FIRST_ORIGIN_LOADED': [], 'REJECTED': [], 'SUSPENDED': ['PENDING'], - 'DENIED': [] + 'UNSUCCESSFUL': [] }; // Determine the possible next status out of the current one diff --git a/swh/web/add_forge_now/migrations/0007_rename_denied_request_status.py b/swh/web/add_forge_now/migrations/0007_rename_denied_request_status.py new file mode 100644 --- /dev/null +++ b/swh/web/add_forge_now/migrations/0007_rename_denied_request_status.py @@ -0,0 +1,51 @@ +# Generated by Django 2.2.28 on 2022-08-16 14:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("swh_web_add_forge_now", "0006_request_add_new_fields"), + ] + + operations = [ + migrations.AlterField( + model_name="request", + name="status", + field=models.TextField( + choices=[ + ("PENDING", "Pending"), + ("WAITING_FOR_FEEDBACK", "Waiting for feedback"), + ("FEEDBACK_TO_HANDLE", "Feedback to handle"), + ("ACCEPTED", "Accepted"), + ("SCHEDULED", "Scheduled"), + ("FIRST_LISTING_DONE", "First listing done"), + ("FIRST_ORIGIN_LOADED", "First origin loaded"), + ("REJECTED", "Rejected"), + ("SUSPENDED", "Suspended"), + ("UNSUCCESSFUL", "Unsuccessful"), + ], + default="PENDING", + ), + ), + migrations.AlterField( + model_name="requesthistory", + name="new_status", + field=models.TextField( + choices=[ + ("PENDING", "Pending"), + ("WAITING_FOR_FEEDBACK", "Waiting for feedback"), + ("FEEDBACK_TO_HANDLE", "Feedback to handle"), + ("ACCEPTED", "Accepted"), + ("SCHEDULED", "Scheduled"), + ("FIRST_LISTING_DONE", "First listing done"), + ("FIRST_ORIGIN_LOADED", "First origin loaded"), + ("REJECTED", "Rejected"), + ("SUSPENDED", "Suspended"), + ("UNSUCCESSFUL", "Unsuccessful"), + ], + null=True, + ), + ), + ] diff --git a/swh/web/add_forge_now/models.py b/swh/web/add_forge_now/models.py --- a/swh/web/add_forge_now/models.py +++ b/swh/web/add_forge_now/models.py @@ -32,7 +32,7 @@ FIRST_ORIGIN_LOADED = "First origin loaded" REJECTED = "Rejected" SUSPENDED = "Suspended" - DENIED = "Denied" + UNSUCCESSFUL = "Unsuccessful" @classmethod def choices(cls): @@ -47,6 +47,7 @@ self.ACCEPTED, self.REJECTED, self.SUSPENDED, + self.UNSUCCESSFUL, ], self.ACCEPTED: [self.SCHEDULED], self.SCHEDULED: [ @@ -58,7 +59,7 @@ self.FIRST_ORIGIN_LOADED: [], self.REJECTED: [], self.SUSPENDED: [self.PENDING], - self.DENIED: [], + self.UNSUCCESSFUL: [], } return next_statuses[self] # type: ignore diff --git a/swh/web/templates/add_forge_now/help.html b/swh/web/templates/add_forge_now/help.html --- a/swh/web/templates/add_forge_now/help.html +++ b/swh/web/templates/add_forge_now/help.html @@ -81,7 +81,7 @@
  • Rejected:The request is invalid. It is rejected by a moderator with an explanation.
  • -
  • Denied:The forge administrator(s) denied the request to list their forge.
  • +
  • Unsuccessful:An issue has been encountered which currently prevents the full archival.
  • Suspended:The forge listing is not supported yet.
  • diff --git a/swh/web/tests/add_forge_now/test_migration.py b/swh/web/tests/add_forge_now/test_migration.py --- a/swh/web/tests/add_forge_now/test_migration.py +++ b/swh/web/tests/add_forge_now/test_migration.py @@ -7,6 +7,8 @@ import pytest +from django.core.exceptions import ValidationError + from swh.web.add_forge_now.apps import APP_LABEL MIGRATION_0001 = "0001_initial" @@ -14,6 +16,7 @@ MIGRATION_0003 = "0003_request_submitter_forward_username" MIGRATION_0005 = "0005_prepare_inbound_email" MIGRATION_0006 = "0006_request_add_new_fields" +MIGRATION_0007 = "0007_rename_denied_request_status" def now() -> datetime: @@ -166,3 +169,45 @@ history = history.order_by("id") assert request.last_modified_date == history.last().date assert request.last_moderator == history.last().actor + + +def test_add_forge_now_denied_status_renamed_to_unsuccesful(migrator): + + state = migrator.apply_tested_migration((APP_LABEL, MIGRATION_0006)) + Request = state.apps.get_model(APP_LABEL, "Request") + + from swh.web.add_forge_now.models import RequestStatus + + req = Request( + status=RequestStatus.UNSUCCESSFUL.name, + submitter_name="dudess", + submitter_email="dudess@orga.org", + forge_type="cgit", + forge_url="https://example.org/forge", + forge_contact_email="forge@example.org", + forge_contact_name="forge", + forge_contact_comment=( + "Discovered on the main forge homepag, following contact link." + ), + last_modified_date=datetime.now(timezone.utc), + ) + with pytest.raises(ValidationError): + req.clean_fields() + + state = migrator.apply_tested_migration((APP_LABEL, MIGRATION_0007)) + Request = state.apps.get_model(APP_LABEL, "Request") + + req = Request( + status=RequestStatus.UNSUCCESSFUL.name, + submitter_name="dudess", + submitter_email="dudess@orga.org", + forge_type="cgit", + forge_url="https://example.org/forge", + forge_contact_email="forge@example.org", + forge_contact_name="forge", + forge_contact_comment=( + "Discovered on the main forge homepag, following contact link." + ), + last_modified_date=datetime.now(timezone.utc), + ) + req.clean_fields() diff --git a/swh/web/tests/add_forge_now/test_models.py b/swh/web/tests/add_forge_now/test_models.py --- a/swh/web/tests/add_forge_now/test_models.py +++ b/swh/web/tests/add_forge_now/test_models.py @@ -20,6 +20,16 @@ ], ), (RequestStatus.WAITING_FOR_FEEDBACK, [RequestStatus.FEEDBACK_TO_HANDLE]), + ( + RequestStatus.FEEDBACK_TO_HANDLE, + [ + RequestStatus.WAITING_FOR_FEEDBACK, + RequestStatus.ACCEPTED, + RequestStatus.REJECTED, + RequestStatus.SUSPENDED, + RequestStatus.UNSUCCESSFUL, + ], + ), ], ) def test_allowed_next_statuses(current_status, allowed_next_statuses):