misc: remove use of settings.AUTH_USER_MODEL (#40685)

To rewrite authentic migrations we need to cut ties with
django.contrib.auth, it's simpler if AUTH_USER_MODEL is not used inside
authentic by only by django.contrib.auth code dependant upon the
effective User model. Authentic's code should directly reference
custom_user.User.
This commit is contained in:
Benjamin Dauvergne 2023-12-14 21:52:00 +01:00
parent 110d5073b9
commit 586171b000
26 changed files with 48 additions and 81 deletions

View File

@ -9,7 +9,7 @@ class Migration(migrations.Migration):
dependencies = [
('authentic2', '0004_service'),
('django_rbac', '__first__'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
('contenttypes', '0001_initial'),
]
@ -118,7 +118,7 @@ class Migration(migrations.Migration):
),
(
'members',
models.ManyToManyField(related_name='roles', to=settings.AUTH_USER_MODEL, blank=True),
models.ManyToManyField(related_name='roles', to='custom_user.User', blank=True),
),
(
'ou',

View File

@ -19,7 +19,6 @@ import os
from collections import namedtuple
from django.apps import apps
from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.contrib.postgres.fields import ArrayField
@ -362,9 +361,7 @@ class Role(AbstractBase):
null=True,
on_delete=models.CASCADE,
)
members = models.ManyToManyField(
to=settings.AUTH_USER_MODEL, swappable=True, blank=True, related_name='roles'
)
members = models.ManyToManyField(to='custom_user.User', swappable=True, blank=True, related_name='roles')
permissions = models.ManyToManyField(to=Permission, related_name='roles', blank=True)
name = models.TextField(verbose_name=_('name'))
details = models.TextField(_('Role details (frontoffice)'), blank=True)

View File

@ -3,7 +3,6 @@
import django
import django.contrib.postgres.fields
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
from django.db.models import JSONField
from django.utils import timezone
@ -13,7 +12,7 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
('authentic2', '0027_remove_deleteduser'),
('sessions', '0001_initial'),
]
@ -92,7 +91,7 @@ class Migration(migrations.Migration):
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
to=settings.AUTH_USER_MODEL,
to='custom_user.User',
verbose_name='user',
),
),

View File

@ -15,10 +15,11 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from authentic2 import app_settings
from authentic2.custom_user.models import User
def get_user_queryset():
from authentic2.custom_user.models import User
qs = User.objects.all()
qs = qs.filter()

View File

@ -40,10 +40,6 @@ PROXY_USER_MODEL = None
class ModelBackend(BaseModelBackend):
"""
Authenticates against settings.AUTH_USER_MODEL.
"""
def get_query(self, username, realm=None, ou=None):
username_field = 'username'
queries = []

View File

@ -1,4 +1,3 @@
from django.conf import settings
from django.db import migrations, models
@ -46,7 +45,7 @@ class Migration(migrations.Migration):
app_label='admin',
model_name='logentry',
name='user',
field=models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE),
field=models.ForeignKey(to='custom_user.User', on_delete=models.CASCADE),
preserve_default=True,
),
]

View File

@ -4,7 +4,6 @@ import uuid
import django
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
from django.db.models import JSONField
@ -64,7 +63,7 @@ class Migration(migrations.Migration):
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name='profiles',
to=settings.AUTH_USER_MODEL,
to='custom_user.User',
verbose_name='user',
),
),

View File

@ -44,7 +44,6 @@ from django.utils.translation import gettext_lazy as _
from gadjo.templatetags.gadjo import xstatic
from authentic2 import app_settings
from authentic2.custom_user.models import User
from authentic2.models import Attribute
from authentic2.passwords import get_password_checker
@ -377,6 +376,8 @@ class SelectAttributeWidget(forms.Select):
@staticmethod
def get_options():
from authentic2.custom_user.models import User
choices = {}
for name in ('email', 'username', 'first_name', 'last_name'):
field = User._meta.get_field(name)

View File

@ -1,10 +1,9 @@
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
('authentic2', '0002_auto_20150320_1418'),
]
@ -12,25 +11,19 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='deleteduser',
name='user',
field=models.ForeignKey(
verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE
),
field=models.ForeignKey(verbose_name='user', to='custom_user.User', on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AlterField(
model_name='passwordreset',
name='user',
field=models.ForeignKey(
verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE
),
field=models.ForeignKey(verbose_name='user', to='custom_user.User', on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AlterField(
model_name='userexternalid',
name='user',
field=models.ForeignKey(
verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE
),
field=models.ForeignKey(verbose_name='user', to='custom_user.User', on_delete=models.CASCADE),
preserve_default=True,
),
]

View File

@ -1,4 +1,3 @@
from django.conf import settings
from django.db import migrations, models
@ -12,7 +11,7 @@ class Migration(migrations.Migration):
model_name='passwordreset',
name='user',
field=models.ForeignKey(
verbose_name='user', to=settings.AUTH_USER_MODEL, unique=True, on_delete=models.CASCADE
verbose_name='user', to='custom_user.User', unique=True, on_delete=models.CASCADE
),
preserve_default=True,
),

View File

@ -1,4 +1,3 @@
from django.conf import settings
from django.db import migrations, models
@ -11,8 +10,6 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='passwordreset',
name='user',
field=models.OneToOneField(
verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE
),
field=models.OneToOneField(verbose_name='user', to='custom_user.User', on_delete=models.CASCADE),
),
]

View File

@ -1,7 +1,6 @@
# Generated by Django 1.11.20 on 2019-10-09 08:47
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
@ -17,7 +16,7 @@ class Migration(migrations.Migration):
field=models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
related_name='deletion',
to=settings.AUTH_USER_MODEL,
to='custom_user.User',
verbose_name='user',
),
),

View File

@ -1,13 +1,12 @@
# Generated by Django 2.2.26 on 2023-01-17 14:13
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
('authentic2', '0047_initialize_services_runtime_settings'),
]
@ -23,7 +22,7 @@ class Migration(migrations.Migration):
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
to='custom_user.User',
verbose_name='user',
),
),

View File

@ -53,7 +53,7 @@ from .utils.sms import create_sms_code
class UserExternalId(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.CASCADE)
user = models.ForeignKey('custom_user.User', verbose_name=_('user'), on_delete=models.CASCADE)
source = models.CharField(max_length=256, verbose_name=_('source'))
external_id = models.CharField(max_length=256, verbose_name=_('external id'), null=True)
external_guid = models.UUIDField(verbose_name=_('External GUID'), null=True)
@ -435,7 +435,7 @@ class AttributeValue(models.Model):
class PasswordReset(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.CASCADE)
user = models.OneToOneField('custom_user.User', verbose_name=_('user'), on_delete=models.CASCADE)
def save(self, *args, **kwargs):
if self.user_id and not self.user.has_usable_password():
@ -836,9 +836,7 @@ class SMSCode(models.Model):
phone = models.CharField(
_('phone number'), null=True, blank=True, max_length=64, validators=[PhoneNumberValidator]
)
user = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.CASCADE, null=True
)
user = models.ForeignKey('custom_user.User', verbose_name=_('user'), on_delete=models.CASCADE, null=True)
url_token = models.UUIDField(
verbose_name=_('URL token'),
default=uuid.uuid4,

View File

@ -1,11 +1,10 @@
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
('saml', '0003_merge'),
]
@ -16,7 +15,7 @@ class Migration(migrations.Migration):
field=models.ForeignKey(
on_delete=django.db.models.deletion.SET_NULL,
blank=True,
to=settings.AUTH_USER_MODEL,
to='custom_user.User',
null=True,
),
preserve_default=True,

View File

@ -554,7 +554,7 @@ class LibertyFederation(models.Model):
"""Store a federation, i.e. an identifier shared with another provider, be
it IdP or SP"""
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL)
user = models.ForeignKey('custom_user.User', null=True, blank=True, on_delete=models.SET_NULL)
sp = models.ForeignKey('LibertyServiceProvider', null=True, blank=True, on_delete=models.CASCADE)
name_id_format = models.CharField(max_length=100, verbose_name='NameIDFormat', blank=True, null=True)
name_id_content = models.CharField(max_length=100, verbose_name='NameID')

View File

@ -47,7 +47,6 @@ from django.utils.formats import localize
from django.utils.translation import gettext_lazy as _
from django.utils.translation import ngettext
from authentic2.custom_user.models import User
from authentic2.saml.saml2utils import filter_attribute_private_key, filter_element_private_key
from authentic2.validators import EmailValidator
@ -808,6 +807,8 @@ def send_registration_mail(request, email, ou, template_names=None, next_url=Non
Can raise an smtplib.SMTPException
"""
from authentic2.custom_user.models import User
logger = logging.getLogger(__name__)
if not template_names:
@ -1196,6 +1197,8 @@ def get_manager_login_url():
def send_email_change_email(user, email, request=None, context=None, template_names=None):
'''Send an email to verify that user can take email as its new email'''
from authentic2.custom_user.models import User
assert user
assert email

View File

@ -1,10 +1,9 @@
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
]
operations = [
@ -23,7 +22,7 @@ class Migration(migrations.Migration):
models.ForeignKey(
related_name='fc_accounts',
verbose_name='user',
to=settings.AUTH_USER_MODEL,
to='custom_user.User',
on_delete=models.CASCADE,
),
),

View File

@ -16,7 +16,6 @@
import json
from django.conf import settings
from django.contrib.postgres.fields import ArrayField
from django.db import models
from django.utils.functional import cached_property
@ -143,7 +142,7 @@ class FcAccount(models.Model):
created = models.DateTimeField(verbose_name=_('created'), auto_now_add=True)
modified = models.DateTimeField(verbose_name=_('modified'), auto_now=True)
user = models.ForeignKey(
to=settings.AUTH_USER_MODEL,
to='custom_user.User',
verbose_name=_('user'),
related_name='fc_accounts',
on_delete=models.CASCADE,

View File

@ -7,7 +7,7 @@ import authentic2_auth_oidc.models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
migrations.swappable_dependency(settings.RBAC_OU_MODEL),
]
@ -155,7 +155,7 @@ class Migration(migrations.Migration):
field=models.OneToOneField(
related_name='oidc_account',
verbose_name='user',
to=settings.AUTH_USER_MODEL,
to='custom_user.User',
on_delete=models.CASCADE,
),
),

View File

@ -1,12 +1,11 @@
# Generated by Django 2.2.17 on 2020-11-02 10:42
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
('authentic2_auth_oidc', '0007_auto_20200317_1732'),
]

View File

@ -19,7 +19,6 @@ import logging
from datetime import datetime, timedelta
import requests
from django.conf import settings
from django.core.exceptions import ValidationError
from django.db import models, transaction
from django.db.models import JSONField
@ -482,7 +481,7 @@ class OIDCAccount(models.Model):
to='OIDCProvider', verbose_name=_('provider'), related_name='accounts', on_delete=models.CASCADE
)
user = models.OneToOneField(
to=settings.AUTH_USER_MODEL,
to='custom_user.User',
verbose_name=_('user'),
related_name='oidc_account',
on_delete=models.CASCADE,

View File

@ -1,10 +1,9 @@
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
('authentic2_idp_cas', '0001_initial'),
]
@ -14,7 +13,7 @@ class Migration(migrations.Migration):
name='user',
field=models.ForeignKey(
blank=True,
to=settings.AUTH_USER_MODEL,
to='custom_user.User',
max_length=128,
null=True,
verbose_name='user',

View File

@ -1,4 +1,3 @@
from django.conf import settings
from django.db import migrations, models
import authentic2_idp_oidc.models
@ -6,7 +5,7 @@ import authentic2_idp_oidc.models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
('authentic2', '0016_attribute_disabled'),
]
@ -143,9 +142,7 @@ class Migration(migrations.Migration):
),
(
'user',
models.ForeignKey(
verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE
),
models.ForeignKey(verbose_name='user', to='custom_user.User', on_delete=models.CASCADE),
),
],
),
@ -159,9 +156,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='oidcauthorization',
name='user',
field=models.ForeignKey(
verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE
),
field=models.ForeignKey(verbose_name='user', to='custom_user.User', on_delete=models.CASCADE),
),
migrations.AddField(
model_name='oidcaccesstoken',
@ -173,8 +168,6 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='oidcaccesstoken',
name='user',
field=models.ForeignKey(
verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE
),
field=models.ForeignKey(verbose_name='user', to='custom_user.User', on_delete=models.CASCADE),
),
]

View File

@ -290,7 +290,7 @@ class OIDCAuthorization(models.Model):
)
client_id = models.PositiveIntegerField(verbose_name=_('client id'))
client = GenericForeignKey('client_ct', 'client_id')
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.CASCADE)
user = models.ForeignKey(to='custom_user.User', verbose_name=_('user'), on_delete=models.CASCADE)
scopes = models.TextField(blank=False, verbose_name=_('scopes'))
profile = models.ForeignKey(to=Profile, verbose_name=_('profile'), on_delete=models.CASCADE, null=True)
@ -356,7 +356,7 @@ class OIDCCode(SessionMixin, models.Model):
uuid = models.CharField(max_length=128, verbose_name=_('uuid'), default=generate_uuid)
client = models.ForeignKey(to=OIDCClient, verbose_name=_('client'), on_delete=models.CASCADE)
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.CASCADE)
user = models.ForeignKey(to='custom_user.User', verbose_name=_('user'), on_delete=models.CASCADE)
profile = models.ForeignKey(
to=Profile, verbose_name=_('user selected profile'), null=True, on_delete=models.CASCADE
)
@ -405,7 +405,7 @@ class OIDCCode(SessionMixin, models.Model):
class OIDCAccessToken(SessionMixin, models.Model):
uuid = models.CharField(max_length=128, verbose_name=_('uuid'), default=generate_uuid, db_index=True)
client = models.ForeignKey(to=OIDCClient, verbose_name=_('client'), on_delete=models.CASCADE)
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.CASCADE)
user = models.ForeignKey(to='custom_user.User', verbose_name=_('user'), on_delete=models.CASCADE)
scopes = models.TextField(verbose_name=_('scopes'))
session_key = models.CharField(verbose_name=_('session key'), max_length=128, blank=True)
profile = models.ForeignKey(to=Profile, verbose_name=_('profile'), on_delete=models.CASCADE, null=True)

View File

@ -6,7 +6,7 @@ import authentic2.a2_rbac
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('custom_user', '__first__'),
migrations.swappable_dependency(settings.RBAC_OU_MODEL),
migrations.swappable_dependency(settings.RBAC_PERMISSION_MODEL),
migrations.swappable_dependency(settings.RBAC_ROLE_MODEL),
@ -102,7 +102,7 @@ class Migration(migrations.Migration):
('description', models.TextField(verbose_name='description', blank=True)),
(
'members',
models.ManyToManyField(related_name='roles', to=settings.AUTH_USER_MODEL, blank=True),
models.ManyToManyField(related_name='roles', to='custom_user.User', blank=True),
),
(
'ou',