0001-custom_user-add-base-models-for-subprofile-managemen.patch
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 |
- |