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 @@ -10,6 +10,8 @@ from django.db import models +from ..config import get_config +from ..inbound_email.utils import get_address_for_pk from .apps import APP_LABEL @@ -110,3 +112,9 @@ class Meta: app_label = APP_LABEL db_table = "add_forge_request" + + @property + def inbound_email_address(self) -> str: + """Generate an email address for correspondence related to this request.""" + base_address = get_config()["add_forge_now"]["email_address"] + return get_address_for_pk(salt=APP_LABEL, base_address=base_address, pk=self.pk) diff --git a/swh/web/api/views/add_forge_now.py b/swh/web/api/views/add_forge_now.py --- a/swh/web/api/views/add_forge_now.py +++ b/swh/web/api/views/add_forge_now.py @@ -63,6 +63,7 @@ class AddForgeNowRequestSerializer(serializers.ModelSerializer): + inbound_email_address = serializers.CharField() last_moderator = serializers.SerializerMethodField() last_modified_date = serializers.SerializerMethodField() diff --git a/swh/web/config.py b/swh/web/config.py --- a/swh/web/config.py +++ b/swh/web/config.py @@ -154,6 +154,7 @@ "instance_name": ("str", "archive-test.softwareheritage.org"), "give": ("dict", {"public_key": "", "token": ""}), "features": ("dict", {"add_forge_now": True}), + "add_forge_now": ("dict", {"email_address": "add-forge-now@example.com"}), } swhweb_config: Dict[str, Any] = {} diff --git a/swh/web/tests/api/views/test_add_forge_now.py b/swh/web/tests/api/views/test_add_forge_now.py --- a/swh/web/tests/api/views/test_add_forge_now.py +++ b/swh/web/tests/api/views/test_add_forge_now.py @@ -14,6 +14,8 @@ from swh.web.add_forge_now.models import Request from swh.web.common.utils import reverse +from swh.web.config import get_config +from swh.web.inbound_email.utils import get_address_for_pk from swh.web.tests.utils import ( check_api_get_responses, check_api_post_response, @@ -75,6 +77,15 @@ } +def inbound_email_for_pk(pk: int) -> str: + """Check that the inbound email matches the one expected for the given pk""" + + base_address = get_config()["add_forge_now"]["email_address"] + return get_address_for_pk( + salt="swh_web_add_forge_now", base_address=base_address, pk=pk + ) + + @pytest.mark.django_db(transaction=True, reset_sequences=True) @pytest.mark.parametrize( "add_forge_data", @@ -116,6 +127,7 @@ "submitter_forward_username": expected_consent_bool, "last_moderator": resp.data["last_moderator"], "last_modified_date": resp.data["last_modified_date"], + "inbound_email_address": inbound_email_for_pk(resp.data["id"]), } assert date_before < iso8601.parse_date(resp.data["submission_date"]) < date_after @@ -152,6 +164,7 @@ "submitter_email": regular_user.email, "last_moderator": resp.data["last_moderator"], "last_modified_date": resp.data["last_modified_date"], + "inbound_email_address": inbound_email_for_pk(1), } assert date_before < iso8601.parse_date(resp.data["submission_date"]) < date_after @@ -375,6 +388,7 @@ "last_moderator": resp.data[1]["last_moderator"], "last_modified_date": resp.data[1]["last_modified_date"], "id": resp.data[1]["id"], + "inbound_email_address": inbound_email_for_pk(resp.data[1]["id"]), } other_forge_request = { @@ -386,6 +400,7 @@ "last_moderator": resp.data[0]["last_moderator"], "last_modified_date": resp.data[0]["last_modified_date"], "id": resp.data[0]["id"], + "inbound_email_address": inbound_email_for_pk(resp.data[0]["id"]), } assert resp.data == [other_forge_request, add_forge_request] @@ -520,6 +535,7 @@ "submitter_email": regular_user.email, "last_moderator": add_forge_moderator.username, "last_modified_date": resp.data["history"][1]["date"], + "inbound_email_address": inbound_email_for_pk(1), }, "history": [ {