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 @@ -57,7 +57,7 @@ // Setting data for the email, now adding static data $('#contactForgeAdmin').attr('emailTo', forgeRequest.forge_contact_email); - $('#contactForgeAdmin').attr('emailSubject', `[swh-add_forge_now] Request ${forgeRequest.id}`); + $('#contactForgeAdmin').attr('emailSubject', `Software Heritage archival request for ${forgeRequest.forge_domain}`); populateRequestHistory(data.history); populateDecisionSelectOption(forgeRequest.status); } catch (response) { diff --git a/cypress/integration/add-forge-now-request-dashboard.spec.js b/cypress/integration/add-forge-now-request-dashboard.spec.js --- a/cypress/integration/add-forge-now-request-dashboard.spec.js +++ b/cypress/integration/add-forge-now-request-dashboard.spec.js @@ -5,7 +5,7 @@ * See top-level LICENSE file for more information */ -let requestId; +let requestId, forgeDomain; function createDummyRequest(urls) { cy.task('db:add_forge_now:delete'); @@ -27,8 +27,9 @@ 'X-CSRFToken': token } }).then((response) => { - // setting requestId from response + // setting requestId and forgeDomain from response requestId = response.body.id; + forgeDomain = response.body.forge_domain; // logout the user cy.visit(urls.swh_web_homepage()); cy.contains('a', 'logout').click(); @@ -87,7 +88,7 @@ cy.get('#contactForgeAdmin') .should('have.attr', 'emailsubject') - .and('include', `[swh-add_forge_now] Request ${requestId}`); + .and('include', `Software Heritage archival request for ${forgeDomain}`); }); it('should not show any error message', function() { 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 @@ -7,6 +7,7 @@ import enum from typing import List +from urllib.parse import urlparse from django.db import models @@ -118,3 +119,18 @@ """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) + + @property + def forge_domain(self) -> str: + """Get the domain/netloc out of the forge_url. + + Fallback to using the first part of the url path, if the netloc can't be found + (for instance, if the url scheme hasn't been set). + """ + + parsed_url = urlparse(self.forge_url) + domain = parsed_url.netloc + if not domain: + domain = parsed_url.path.split("/", 1)[0] + + return domain 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 @@ -64,6 +64,7 @@ class AddForgeNowRequestSerializer(serializers.ModelSerializer): inbound_email_address = serializers.CharField() + forge_domain = serializers.CharField() last_moderator = serializers.SerializerMethodField() last_modified_date = serializers.SerializerMethodField() 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 @@ -5,7 +5,7 @@ import pytest -from swh.web.add_forge_now.models import RequestStatus +from swh.web.add_forge_now.models import Request, RequestStatus @pytest.mark.parametrize( @@ -24,3 +24,15 @@ ) def test_allowed_next_statuses(current_status, allowed_next_statuses): assert current_status.allowed_next_statuses() == allowed_next_statuses + + +@pytest.mark.parametrize( + "forge_url, expected_domain", + [ + ("https://gitlab.example.com/foo/bar", "gitlab.example.com"), + ("gitlab.example.com", "gitlab.example.com"), + ("gitlab.example.com/foo/bar", "gitlab.example.com"), + ], +) +def test_request_forge_domain(forge_url, expected_domain): + assert Request(forge_url=forge_url).forge_domain == expected_domain 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 @@ -7,7 +7,7 @@ import threading import time from typing import Dict -from urllib.parse import urlencode +from urllib.parse import urlencode, urlparse import iso8601 import pytest @@ -128,6 +128,7 @@ "last_moderator": resp.data["last_moderator"], "last_modified_date": resp.data["last_modified_date"], "inbound_email_address": inbound_email_for_pk(resp.data["id"]), + "forge_domain": urlparse(add_forge_data["forge_url"]).netloc, } assert date_before < iso8601.parse_date(resp.data["submission_date"]) < date_after @@ -165,6 +166,7 @@ "last_moderator": resp.data["last_moderator"], "last_modified_date": resp.data["last_modified_date"], "inbound_email_address": inbound_email_for_pk(1), + "forge_domain": urlparse(ADD_FORGE_DATA_FORGE1["forge_url"]).netloc, } assert date_before < iso8601.parse_date(resp.data["submission_date"]) < date_after @@ -389,6 +391,7 @@ "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"]), + "forge_domain": urlparse(ADD_FORGE_DATA_FORGE1["forge_url"]).netloc, } other_forge_request = { @@ -401,6 +404,7 @@ "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"]), + "forge_domain": urlparse(ADD_FORGE_DATA_FORGE2["forge_url"]).netloc, } assert resp.data == [other_forge_request, add_forge_request] @@ -536,6 +540,7 @@ "last_moderator": add_forge_moderator.username, "last_modified_date": resp.data["history"][1]["date"], "inbound_email_address": inbound_email_for_pk(1), + "forge_domain": urlparse(ADD_FORGE_DATA_FORGE1["forge_url"]).netloc, }, "history": [ {