diff --git a/swh/deposit/api/collection.py b/swh/deposit/api/collection.py --- a/swh/deposit/api/collection.py +++ b/swh/deposit/api/collection.py @@ -21,6 +21,7 @@ ParsedRequestHeaders, Receipt, get_collection_by_name, + guess_deposit_origin_url, ) @@ -132,9 +133,11 @@ # then no parent for that deposit, deposit_parent already None pass - return Deposit( + deposit = Deposit( collection=collection, external_id=external_id or "", client=client, parent=deposit_parent, ) + deposit.origin_url = guess_deposit_origin_url(deposit) + return deposit diff --git a/swh/deposit/api/common.py b/swh/deposit/api/common.py --- a/swh/deposit/api/common.py +++ b/swh/deposit/api/common.py @@ -137,6 +137,11 @@ return collection +def guess_deposit_origin_url(deposit: Deposit): + """Guesses an origin url for the given deposit.""" + return "%s/%s" % (deposit.client.provider_url.rstrip("/"), deposit.external_id,) + + class AuthenticatedAPIView(APIView): """Mixin intended as a based API view to enforce the basic authentication check diff --git a/swh/deposit/migrations/0021_deposit_origin_url_20201124_1438.py b/swh/deposit/migrations/0021_deposit_origin_url_20201124_1438.py new file mode 100644 --- /dev/null +++ b/swh/deposit/migrations/0021_deposit_origin_url_20201124_1438.py @@ -0,0 +1,28 @@ +from django.db import migrations, models + +from swh.deposit.api.common import guess_deposit_origin_url +from swh.deposit.models import Deposit + + +def fill_origin_url(apps, schema_editor): + for deposit in Deposit.objects.all(): + if deposit.origin_url is None: + deposit.origin_url = guess_deposit_origin_url() + deposit.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ("deposit", "0020_auto_20200929_0855"), + ] + + operations = [ + migrations.AddField( + model_name="deposit", name="origin_url", field=models.TextField(null=True), + ), + migrations.RunPython(fill_origin_url), + migrations.AlterField( + model_name="deposit", name="external_id", field=models.TextField(null=True), + ), + ] diff --git a/swh/deposit/models.py b/swh/deposit/models.py --- a/swh/deposit/models.py +++ b/swh/deposit/models.py @@ -121,8 +121,10 @@ complete_date = models.DateTimeField(null=True) # collection concerned by the deposit collection = models.ForeignKey("DepositCollection", models.DO_NOTHING) - # Deposit's external identifier + # Deprecated: Deposit's external identifier external_id = models.TextField() + # URL of the origin of this deposit, null if this is a metadata-only deposit + origin_url = models.TextField(null=True) # Deposit client client = models.ForeignKey("DepositClient", models.DO_NOTHING) # SWH's loading result identifier @@ -149,6 +151,7 @@ "reception_date": self.reception_date, "collection": self.collection.name, "external_id": self.external_id, + "origin_url": self.origin_url, "client": self.client.username, "status": self.status, } @@ -157,10 +160,6 @@ d["status_detail"] = self.status_detail return str(d) - @property - def origin_url(self): - return "%s/%s" % (self.client.provider_url.rstrip("/"), self.external_id) - def client_directory_path(instance: "DepositRequest", filename: str) -> str: """Callable to determine the upload archive path. This defaults to diff --git a/swh/deposit/tests/api/test_deposit_private_read_metadata.py b/swh/deposit/tests/api/test_deposit_private_read_metadata.py --- a/swh/deposit/tests/api/test_deposit_private_read_metadata.py +++ b/swh/deposit/tests/api/test_deposit_private_read_metadata.py @@ -44,6 +44,7 @@ """ deposit = partial_deposit deposit.external_id = "some-external-id" + deposit.origin_url = f"https://hal-test.archives-ouvertes.fr/{deposit.external_id}" deposit.save() metadata_xml_atoms = [ @@ -107,6 +108,7 @@ """ deposit = partial_deposit deposit.external_id = "some-external-id" + deposit.origin_url = f"https://hal-test.archives-ouvertes.fr/{deposit.external_id}" deposit.save() metadata_xml_atoms = [ atom_dataset[atom_key] for atom_key in ["entry-data2", "entry-data3"] @@ -179,6 +181,7 @@ """ deposit = partial_deposit deposit.external_id = "hal-01243065" + deposit.origin_url = f"https://hal-test.archives-ouvertes.fr/{deposit.external_id}" deposit.save() # add metadata to the deposit with datePublished and dateCreated