Projet

Général

Profil

0001-custom_user-add-base-models-for-subprofile-managemen.patch

Paul Marillonnet, 21 février 2022 17:30

Télécharger (7,33 ko)

Voir les différences:

Subject: [PATCH 1/3] custom_user: add base models for subprofile management
 (#58554)

 src/authentic2/admin.py                       | 17 +++-
 .../migrations/0029_profile_profiletype.py    | 89 +++++++++++++++++++
 src/authentic2/custom_user/models.py          | 43 +++++++++
 3 files changed, 148 insertions(+), 1 deletion(-)
 create mode 100644 src/authentic2/custom_user/migrations/0029_profile_profiletype.py
src/authentic2/admin.py
30 30
from django.views.decorators.cache import never_cache
31 31

  
32 32
from . import app_settings, attribute_kinds, decorators, models
33
from .custom_user.models import DeletedUser, User
33
from .custom_user.models import DeletedUser, Profile, ProfileType, User
34 34
from .forms.profile import BaseUserForm, modelform_factory
35 35
from .nonce.models import Nonce
36 36
from .utils import misc as utils_misc
......
415 415
admin.site.register(DeletedUser, DeletedUserAdmin)
416 416

  
417 417

  
418
class ProfileTypeAdmin(admin.ModelAdmin):
419
    list_display = ['uuid', 'name', 'slug']
420
    readonly_fields = ['uuid']
421

  
422

  
423
admin.site.register(ProfileType, ProfileTypeAdmin)
424

  
425

  
426
class ProfileAdmin(admin.ModelAdmin):
427
    list_display = ['profile_type', 'user', 'identifier']
428

  
429

  
430
admin.site.register(Profile, ProfileAdmin)
431

  
432

  
418 433
@never_cache
419 434
def login(request, extra_context=None):
420 435
    return utils_misc.redirect_to_login(request, login_url=utils_misc.get_manager_login_url())
src/authentic2/custom_user/migrations/0029_profile_profiletype.py
1
# Generated by Django 2.2.24 on 2022-02-21 14:09
2

  
3
import django.contrib.postgres.fields.jsonb
4
import django.db.models.deletion
5
from django.conf import settings
6
from django.db import migrations, models
7

  
8
import authentic2.utils.misc
9

  
10

  
11
class Migration(migrations.Migration):
12

  
13
    dependencies = [
14
        ('custom_user', '0028_user_email_verified_date'),
15
    ]
16

  
17
    operations = [
18
        migrations.CreateModel(
19
            name='ProfileType',
20
            fields=[
21
                (
22
                    'id',
23
                    models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
24
                ),
25
                (
26
                    'uuid',
27
                    models.CharField(
28
                        default=authentic2.utils.misc.get_hex_uuid,
29
                        editable=False,
30
                        max_length=32,
31
                        unique=True,
32
                        verbose_name='UUID',
33
                    ),
34
                ),
35
                ('name', models.CharField(max_length=128, verbose_name='name')),
36
                ('slug', models.SlugField(max_length=256, unique=True, verbose_name='slug')),
37
            ],
38
            options={
39
                'verbose_name': 'profile type',
40
                'verbose_name_plural': 'profile types',
41
                'ordering': ('name', 'slug'),
42
            },
43
        ),
44
        migrations.CreateModel(
45
            name='Profile',
46
            fields=[
47
                (
48
                    'id',
49
                    models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
50
                ),
51
                (
52
                    'identifier',
53
                    models.CharField(default='', max_length=256, verbose_name='profile identifier'),
54
                ),
55
                (
56
                    'data',
57
                    django.contrib.postgres.fields.jsonb.JSONField(
58
                        blank=True, null=True, verbose_name='profile data'
59
                    ),
60
                ),
61
                (
62
                    'profile_type',
63
                    models.ForeignKey(
64
                        blank=True,
65
                        null=True,
66
                        on_delete=django.db.models.deletion.CASCADE,
67
                        related_name='profiles',
68
                        to='custom_user.ProfileType',
69
                        verbose_name='profile type',
70
                    ),
71
                ),
72
                (
73
                    'user',
74
                    models.ForeignKey(
75
                        on_delete=django.db.models.deletion.CASCADE,
76
                        related_name='subprofiles',
77
                        to=settings.AUTH_USER_MODEL,
78
                        verbose_name='user',
79
                    ),
80
                ),
81
            ],
82
            options={
83
                'verbose_name': 'profile',
84
                'verbose_name_plural': 'profiles',
85
                'ordering': ('user', 'profile_type'),
86
                'unique_together': {('user', 'profile_type', 'identifier')},
87
            },
88
        ),
89
    ]
src/authentic2/custom_user/models.py
42 42
from authentic2.utils.cache import RequestCache
43 43
from authentic2.validators import email_validator
44 44
from django_rbac.models import PermissionMixin
45
from django_rbac.utils import generate_slug
45 46

  
46 47
from .managers import UserManager, UserQuerySet
47 48

  
......
475 476
        verbose_name = _('deleted user')
476 477
        verbose_name_plural = _('deleted users')
477 478
        ordering = ('deleted', 'id')
479

  
480

  
481
class ProfileType(models.Model):
482
    uuid = models.CharField(
483
        verbose_name=_('UUID'), max_length=32, default=utils_misc.get_hex_uuid, editable=False, unique=True
484
    )
485
    name = models.CharField(max_length=128, verbose_name=_('name'))
486
    slug = models.SlugField(verbose_name=_('slug'), max_length=256, unique=True)
487

  
488
    def save(self, *args, **kwargs):
489
        if not self.slug:
490
            self.slug = generate_slug(self.name)
491
        if len(self.slug) > 256:
492
            self.slug = self.slug[:256]
493
        return super().save(*args, **kwargs)
494

  
495
    class Meta:
496
        verbose_name = _('profile type')
497
        verbose_name_plural = _('profile types')
498
        ordering = ('name', 'slug')
499

  
500

  
501
class Profile(models.Model):
502
    profile_type = models.ForeignKey(
503
        verbose_name=_('profile type'),
504
        to=ProfileType,
505
        related_name='profiles',
506
        blank=True,
507
        null=True,
508
        on_delete=models.CASCADE,
509
    )
510
    user = models.ForeignKey(
511
        to=User, verbose_name=_('user'), related_name='subprofiles', on_delete=models.CASCADE
512
    )
513
    identifier = models.CharField(max_length=256, verbose_name=_('profile identifier'), default='')
514
    data = JSONField(verbose_name=_('profile data'), null=True, blank=True)
515

  
516
    class Meta:
517
        unique_together = (('user', 'profile_type', 'identifier'),)
518
        verbose_name = _('profile')
519
        verbose_name_plural = _('profiles')
520
        ordering = ('user', 'profile_type')
478
-