diff --git a/project/dalia/apps.py b/project/dalia/apps.py index a1402107489a8bd42c3b064972b944bb6a9cee65..87623eb88729bfbae492e5b5dc3c72306e40c986 100644 --- a/project/dalia/apps.py +++ b/project/dalia/apps.py @@ -4,3 +4,7 @@ from django.apps import AppConfig class DaliaConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'project.dalia' + + def ready(self): + # Implicitly connect signal handlers decorated with @receiver. + import project.dalia.signals # noqa diff --git a/project/dalia/migrations/0001_initial.py b/project/dalia/migrations/0001_initial.py new file mode 100644 index 0000000000000000000000000000000000000000..3eecf5478f68257c56daee8c8fb56001ad63af7f --- /dev/null +++ b/project/dalia/migrations/0001_initial.py @@ -0,0 +1,26 @@ +# Generated by Django 5.1.7 on 2025-03-27 19:31 + +import django.db.models.deletion +import uuid +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)), + ('dalia_id', models.UUIDField(default=uuid.uuid4, unique=True)), + ('orcid', models.CharField(max_length=37)), + ], + ), + ] diff --git a/project/dalia/models.py b/project/dalia/models.py index 71a836239075aa6e6e4ecb700e9c42c95c022d91..7615d3f6ec30a54fb9635612520fffc0aca89dcc 100644 --- a/project/dalia/models.py +++ b/project/dalia/models.py @@ -1,3 +1,10 @@ +import uuid + +from django.conf import settings from django.db import models -# Create your models here. + +class UserProfile(models.Model): + user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True) + dalia_id = models.UUIDField(default=uuid.uuid4, unique=True) + orcid = models.CharField(max_length=37) # "https://orcid.org/XXXX-XXXX-XXXX-XXXX" diff --git a/project/dalia/signals.py b/project/dalia/signals.py new file mode 100644 index 0000000000000000000000000000000000000000..c01ef14c62bd28ebdf1f7c37f4e28695a095da58 --- /dev/null +++ b/project/dalia/signals.py @@ -0,0 +1,12 @@ +from django.conf import settings +from django.db.models.signals import post_save +from django.dispatch import receiver + +from project.dalia.models import UserProfile + + +@receiver(post_save, sender=settings.AUTH_USER_MODEL) +def initialize_user_profile_signal(sender, instance, created, **kwargs): + if created: + UserProfile(user=instance) + instance.userprofile.save() diff --git a/tests/project/dalia/test_signals.py b/tests/project/dalia/test_signals.py new file mode 100644 index 0000000000000000000000000000000000000000..fd533e183ac97cccf7a215e237a4cd5edbad772b --- /dev/null +++ b/tests/project/dalia/test_signals.py @@ -0,0 +1,34 @@ +from django.contrib.auth import get_user_model + +from project.dalia.models import UserProfile + + +def test_initialize_user_profile_signal_initializes_user_profile_after_user_is_created(db): + user_model = get_user_model() + assert user_model.objects.count() == 0 + + user = user_model(username="test") + user.save() + + assert user_model.objects.count() == 1 + assert UserProfile.objects.count() == 1 + assert user.userprofile.orcid == "" + assert user.userprofile.dalia_id + + +def test_initialize_user_profile_signal_does_not_change_profile_after_user_is_changed(db): + user_model = get_user_model() + user = user_model(username="test") + user.save() + assert user_model.objects.count() == 1 + assert UserProfile.objects.count() == 1 + orcid = user.userprofile.orcid + dalia_id = user.userprofile.dalia_id + + user.first_name = "abc" + user.save() + + assert user_model.objects.count() == 1 + assert UserProfile.objects.count() == 1 + assert user.userprofile.orcid == orcid + assert user.userprofile.dalia_id == dalia_id