From 4f8959dbd87f01e8e479871e09c086329d60bee3 Mon Sep 17 00:00:00 2001 From: Dan LaManna Date: Tue, 18 Feb 2025 14:45:44 -0500 Subject: [PATCH] Store slugs for DOIs --- isic/core/migrations/0006_doi_slug.py | 17 ++++++++++++ isic/core/migrations/0007_alter_doi_slug.py | 29 +++++++++++++++++++++ isic/core/models/doi.py | 2 +- isic/core/services/collection/doi.py | 5 +++- 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 isic/core/migrations/0006_doi_slug.py create mode 100644 isic/core/migrations/0007_alter_doi_slug.py diff --git a/isic/core/migrations/0006_doi_slug.py b/isic/core/migrations/0006_doi_slug.py new file mode 100644 index 00000000..07822109 --- /dev/null +++ b/isic/core/migrations/0006_doi_slug.py @@ -0,0 +1,17 @@ +# Generated by Django 5.1.5 on 2025-02-18 15:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("core", "0005_doi_bundle"), + ] + + operations = [ + migrations.AddField( + model_name="doi", + name="slug", + field=models.SlugField(blank=True, max_length=150, null=True, unique=True), + ), + ] diff --git a/isic/core/migrations/0007_alter_doi_slug.py b/isic/core/migrations/0007_alter_doi_slug.py new file mode 100644 index 00000000..71f1900d --- /dev/null +++ b/isic/core/migrations/0007_alter_doi_slug.py @@ -0,0 +1,29 @@ +# Generated by Django 5.1.5 on 2025-02-18 15:09 + +from django.db import migrations, models +from django.utils.text import slugify + + +def populate_doi_slugs(apps, schema_editor): + Doi = apps.get_model("core", "Doi") + for doi in Doi.objects.all(): + doi.slug = slugify(doi.collection.name) + doi.save() + + +class Migration(migrations.Migration): + dependencies = [ + ("core", "0006_doi_slug"), + ] + + operations = [ + migrations.RunPython( + populate_doi_slugs, + elidable=True, + ), + migrations.AlterField( + model_name="doi", + name="slug", + field=models.SlugField(max_length=150, unique=True), + ), + ] diff --git a/isic/core/models/doi.py b/isic/core/models/doi.py index 8cb24721..1de0928d 100644 --- a/isic/core/models/doi.py +++ b/isic/core/models/doi.py @@ -5,10 +5,10 @@ class Doi(TimeStampedModel): - # TODO: figure out which fields to store here id = models.CharField( max_length=30, primary_key=True, validators=[RegexValidator(r"^\d+\.\d+/\d+$")] ) + slug = models.SlugField(max_length=150, unique=True) creator = models.ForeignKey(User, on_delete=models.RESTRICT) url = models.CharField(max_length=200) diff --git a/isic/core/services/collection/doi.py b/isic/core/services/collection/doi.py index 11ce8ecb..dc27e910 100644 --- a/isic/core/services/collection/doi.py +++ b/isic/core/services/collection/doi.py @@ -13,6 +13,7 @@ from django.core.files import File from django.db import connection, transaction from django.template.loader import render_to_string +from django.utils.text import slugify import requests from requests.exceptions import HTTPError @@ -138,7 +139,9 @@ def collection_create_doi(*, user: User, collection: Collection) -> Doi: with transaction.atomic(): # First, create the local DOI record to validate uniqueness within our known set - doi = Doi(id=doi_id, creator=user, url=f"https://doi.org/{doi_id}") + doi = Doi( + id=doi_id, slug=slugify(collection.name), creator=user, url=f"https://doi.org/{doi_id}" + ) doi.full_clean() doi.save()