From 042ec3760fba1dfb8fd88ee7388f1ebbae6f4e69 Mon Sep 17 00:00:00 2001 From: Michael Bergbauer Date: Wed, 18 Jun 2025 08:04:47 +0200 Subject: [PATCH] Using Django builtin users for user management --- FloriCore/settings.py | 1 + member/management/commands/seed.py | 18 +-- ...ons_alter_useraccount_managers_and_more.py | 105 ++++++++++++++++++ member/models/UserAccount.py | 9 +- 4 files changed, 118 insertions(+), 15 deletions(-) create mode 100644 member/migrations/0002_alter_useraccount_options_alter_useraccount_managers_and_more.py diff --git a/FloriCore/settings.py b/FloriCore/settings.py index 0e39f68..b7fede5 100644 --- a/FloriCore/settings.py +++ b/FloriCore/settings.py @@ -106,6 +106,7 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] +AUTH_USER_MODEL = 'member.UserAccount' # Internationalization # https://docs.djangoproject.com/en/5.2/topics/i18n/ diff --git a/member/management/commands/seed.py b/member/management/commands/seed.py index 4538585..e6a6858 100644 --- a/member/management/commands/seed.py +++ b/member/management/commands/seed.py @@ -26,24 +26,24 @@ class Command(BaseCommand): self.stdout.write("🔐 Erstelle Benutzerkonten...") UserAccount.objects.create( person=p0, - userName="admin", - passwort_hash=make_password("adminpass1234"), + username="admin", + password=make_password("adminpass1234"), role="superadmin", - isActive=True, + is_active=True, ) UserAccount.objects.create( person=p1, - userName="maxadmin", - passwort_hash=make_password("adminpass123"), + username="maxadmin", + password=make_password("adminpass123"), role="admin", - isActive=True, + is_active=True, ) UserAccount.objects.create( person=p2, - userName="erikam", - passwort_hash=make_password("mitglied456"), + username="erikam", + password=make_password("mitglied456"), role="mitglied", - isActive=True, + is_active=True, ) self.stdout.write(self.style.SUCCESS("✅ Testdaten erfolgreich eingespielt.")) diff --git a/member/migrations/0002_alter_useraccount_options_alter_useraccount_managers_and_more.py b/member/migrations/0002_alter_useraccount_options_alter_useraccount_managers_and_more.py new file mode 100644 index 0000000..5cae317 --- /dev/null +++ b/member/migrations/0002_alter_useraccount_options_alter_useraccount_managers_and_more.py @@ -0,0 +1,105 @@ +# Generated by Django 5.2.1 on 2025-06-15 15:41 + +import django.contrib.auth.models +import django.contrib.auth.validators +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('member', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='useraccount', + options={'verbose_name': 'user', 'verbose_name_plural': 'users'}, + ), + migrations.AlterModelManagers( + name='useraccount', + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.RemoveField( + model_name='useraccount', + name='isActive', + ), + migrations.RemoveField( + model_name='useraccount', + name='lastLogin', + ), + migrations.RemoveField( + model_name='useraccount', + name='passwort_hash', + ), + migrations.RemoveField( + model_name='useraccount', + name='userName', + ), + migrations.AddField( + model_name='useraccount', + name='date_joined', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined'), + ), + migrations.AddField( + model_name='useraccount', + name='email', + field=models.EmailField(blank=True, max_length=254, verbose_name='email address'), + ), + migrations.AddField( + model_name='useraccount', + name='first_name', + field=models.CharField(blank=True, max_length=150, verbose_name='first name'), + ), + migrations.AddField( + model_name='useraccount', + name='groups', + field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups'), + ), + migrations.AddField( + model_name='useraccount', + name='is_active', + field=models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active'), + ), + migrations.AddField( + model_name='useraccount', + name='is_staff', + field=models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status'), + ), + migrations.AddField( + model_name='useraccount', + name='is_superuser', + field=models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status'), + ), + migrations.AddField( + model_name='useraccount', + name='last_login', + field=models.DateTimeField(blank=True, null=True, verbose_name='last login'), + ), + migrations.AddField( + model_name='useraccount', + name='last_name', + field=models.CharField(blank=True, max_length=150, verbose_name='last name'), + ), + migrations.AddField( + model_name='useraccount', + name='password', + field=models.CharField(default='changeme123', max_length=128, verbose_name='password'), + preserve_default=False, + ), + migrations.AddField( + model_name='useraccount', + name='user_permissions', + field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions'), + ), + migrations.AddField( + model_name='useraccount', + name='username', + field=models.CharField(default='username', error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username'), + preserve_default=False, + ), + ] diff --git a/member/models/UserAccount.py b/member/models/UserAccount.py index b314a33..15e5778 100644 --- a/member/models/UserAccount.py +++ b/member/models/UserAccount.py @@ -1,20 +1,17 @@ from django.db import models +from django.contrib.auth.models import AbstractUser from django.utils import timezone from .Person import Person -class UserAccount(models.Model): +class UserAccount(AbstractUser): person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name='benutzerkonten') - userName = models.CharField(max_length=150, unique=True) - passwort_hash = models.CharField(max_length=128) role = models.CharField(max_length=50, choices=[ ('mitglied', 'Mitglied'), ('geraetewart', 'Gerätewart'), ('kommandant', 'Kommandant'), ('admin', 'Administrator'), ]) - isActive = models.BooleanField(default=True) - lastLogin = models.DateTimeField(null=True, blank=True) - + def __str__(self): return f"{self.benutzername} ({self.rolle})"