User and permission management

This commit is contained in:
Eduardo Silva
2024-02-15 11:02:22 -03:00
parent 3177eb2b8d
commit f036daf779
10 changed files with 296 additions and 10 deletions

View File

@@ -1,3 +1,9 @@
from django.contrib import admin
from user_manager.models import UserAcl
# Register your models here.
class UserAclAdmin(admin.ModelAdmin):
list_display = ('user', 'user_level', 'created', 'updated')
search_fields = ('user__username', 'user__email')
admin.site.register(UserAcl, UserAclAdmin)

46
user_manager/forms.py Normal file
View File

@@ -0,0 +1,46 @@
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from .models import UserAcl
from django.core.exceptions import ValidationError
class UserAclForm(UserCreationForm):
user_level = forms.ChoiceField(choices=UserAcl.user_level.field.choices, required=True, label="User Level")
class Meta(UserCreationForm.Meta):
model = User
fields = UserCreationForm.Meta.fields + ('user_level',)
def __init__(self, *args, **kwargs):
self.user_id = kwargs.pop('user_id', None)
super().__init__(*args, **kwargs)
if self.instance and self.instance.pk:
self.fields['password1'].required = False
self.fields['password2'].required = False
self.fields['username'].widget.attrs['readonly'] = True
def clean_username(self):
username = self.cleaned_data.get('username')
if User.objects.filter(username=username).exclude(pk=self.user_id).exists():
raise ValidationError("A user with that username already exists.")
return username
def save(self, commit=True):
user = super().save(commit=False)
new_password = self.cleaned_data.get("password1")
if new_password:
user.set_password(new_password)
user.save()
else:
if not user.id:
user.save()
if commit:
user_acl, created = UserAcl.objects.update_or_create(
user=user,
defaults={'user_level': self.cleaned_data.get('user_level')}
)
return user

View File

@@ -0,0 +1,25 @@
# Generated by Django 5.0.1 on 2024-02-14 20:54
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='UserAcl',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('user_level', models.PositiveIntegerField(choices=[(10, 'Debugging Analyst'), (20, 'View Only User'), (30, 'Peer Manager'), (40, 'Wireguard Manager'), (50, 'Administrator')], default=0)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@@ -0,0 +1,35 @@
# Generated by Django 5.0.1 on 2024-02-14 21:23
import django.utils.timezone
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('user_manager', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='useracl',
name='id',
),
migrations.AddField(
model_name='useracl',
name='created',
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AddField(
model_name='useracl',
name='updated',
field=models.DateTimeField(auto_now=True),
),
migrations.AddField(
model_name='useracl',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False),
),
]

View File

@@ -1,6 +1,6 @@
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
import uuid
class UserAcl(models.Model):
@@ -11,8 +11,11 @@ class UserAcl(models.Model):
(30, 'Peer Manager'),
(40, 'Wireguard Manager'),
(50, 'Administrator'),
))
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
def __str__(self):
return self.user.username

View File

@@ -1,9 +1,60 @@
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404
from user_manager.models import UserAcl
from .forms import UserAclForm
from django.contrib.auth.models import User
from django.contrib import messages
from django.contrib.sessions.models import Session
@login_required
def view_user_list(request):
page_title = 'User Manager'
context = {'page_title': page_title}
return render(request, 'user_manager/list.html', context)
user_acl_list = UserAcl.objects.all().order_by('user__username')
context = {'page_title': page_title, 'user_acl_list': user_acl_list}
return render(request, 'user_manager/list.html', context)
@login_required
def view_manage_user(request):
user_acl = None
user = None
if 'uuid' in request.GET:
user_acl = get_object_or_404(UserAcl, uuid=request.GET['uuid'])
user = user_acl.user
form = UserAclForm(instance=user, initial={'user_level': user_acl.user_level}, user_id=user.id)
page_title = 'Edit User '+ user.username
if request.GET.get('action') == 'delete':
username = user.username
if request.GET.get('confirm') == user.username:
user.delete()
messages.success(request, 'User deleted|The user '+ username +' has been deleted.')
return redirect('/user/list/')
user_acl.delete()
return redirect('/user/list/')
else:
form = UserAclForm()
page_title = 'Add User'
if request.method == 'POST':
if user_acl:
form = UserAclForm(request.POST, instance=user, user_id=user.id)
else:
form = UserAclForm(request.POST)
if form.is_valid():
form.save()
if form.cleaned_data.get('password1'):
user_disconnected = False
for session in Session.objects.all():
if str(user.id) == session.get_decoded().get('_auth_user_id'):
session.delete()
if not user_disconnected:
messages.warning(request, 'User Disconnected|The user '+ user.username +' has been disconnected.')
user_disconnected = True
if user_acl:
messages.success(request, 'User updated|The user '+ form.cleaned_data['username'] +' has been updated.')
else:
messages.success(request, 'User added|The user '+ form.cleaned_data['username'] +' has been added.')
return redirect('/user/list/')
return render(request, 'user_manager/manage_user.html', {'form': form, 'page_title': page_title, 'user_acl': user_acl})