define allowed services m2m for user profile types (#60082)

This commit is contained in:
Paul Marillonnet 2022-01-06 15:46:32 +01:00 committed by Benjamin Dauvergne
parent 94b2e25d59
commit 6049dc74dc
6 changed files with 112 additions and 0 deletions

View File

@ -0,0 +1,48 @@
# Generated by Django 2.2.27 on 2022-03-04 10:36
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('authentic2', '0035_service_home_url'),
('custom_user', '0029_profile_profiletype'),
]
operations = [
migrations.CreateModel(
name='ServiceProfileType',
fields=[
(
'id',
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
(
'profile_type',
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to='custom_user.ProfileType'
),
),
(
'service',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='authentic2.Service'),
),
],
options={
'unique_together': {('service', 'profile_type')},
},
),
migrations.AddField(
model_name='profiletype',
name='services',
field=models.ManyToManyField(
blank=True,
related_name='_profiletype_services_+',
through='custom_user.ServiceProfileType',
to='authentic2.Service',
verbose_name='allowed services for this profile type',
),
),
]

View File

@ -484,6 +484,14 @@ class ProfileType(models.Model):
name = models.CharField(max_length=64, verbose_name=_('name'))
slug = models.SlugField(verbose_name=_('slug'), max_length=64, unique=True)
services = models.ManyToManyField(
to=Service,
verbose_name=_('allowed services for this profile type'),
through='ServiceProfileType',
blank=True,
related_name='profile_types+',
)
def save(self, *args, **kwargs):
if not self.slug:
cls = type(self)
@ -515,3 +523,11 @@ class Profile(models.Model):
verbose_name = _('profile')
verbose_name_plural = _('profiles')
ordering = ('user', 'profile_type')
class ServiceProfileType(models.Model):
service = models.ForeignKey(Service, on_delete=models.CASCADE)
profile_type = models.ForeignKey(ProfileType, on_delete=models.CASCADE)
class Meta:
unique_together = (('service', 'profile_type'),)

View File

@ -20,6 +20,10 @@ class Migration(migrations.Migration):
('custom_user', '0019_add_user_deleted'),
]
run_before = [
('custom_user', '0026_remove_user_deleted'),
]
operations = [
migrations.RunPython(fill_deleted, migrations.RunPython.noop),
migrations.RemoveField(

View File

@ -0,0 +1,25 @@
# Generated by Django 2.2.27 on 2022-03-04 10:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('custom_user', '0030_auto_20220304_1136'),
('authentic2', '0035_service_home_url'),
]
operations = [
migrations.AddField(
model_name='service',
name='profile_types',
field=models.ManyToManyField(
blank=True,
related_name='_service_profile_types_+',
through='custom_user.ServiceProfileType',
to='custom_user.ProfileType',
verbose_name='allowed services for this profile type',
),
),
]

View File

@ -383,6 +383,14 @@ class Service(models.Model):
)
home_url = models.URLField(verbose_name=_('Home URL'), max_length=256, null=True, blank=True)
profile_types = models.ManyToManyField(
to='custom_user.ProfileType',
verbose_name=_('allowed services for this profile type'),
through='custom_user.ServiceProfileType',
blank=True,
related_name='services+',
)
objects = managers.ServiceManager()
def clean(self):

View File

@ -154,3 +154,14 @@ def test_profile_type_model(db):
assert pft.slug == 'a' * 63
pft = ProfileType.objects.create(name='a' * 63)
assert pft.slug == 'a' * 30 + '-1-' + 'a' * 31
def test_service_profile_type(db):
from authentic2.custom_user.models import ProfileType, ServiceProfileType
from authentic2.models import Service
service = Service.objects.create(name='aaa')
pft = ProfileType.objects.create(name='bbb')
ServiceProfileType.objects.create(service=service, profile_type=pft)
assert list(service.profile_types.all()) == [pft]
assert list(pft.services.all()) == [service]