Files
ProjectApp/accounts/views.py
T
Felix Baumann fb47c53d52 Initial commit
2026-06-27 17:07:34 +00:00

398 lines
7.5 KiB
Python

from django.contrib.auth.views import LoginView, LogoutView
from django.contrib.auth.decorators import login_required
from accounts.decorators import permission_required
from django.contrib.auth.models import User
from django.shortcuts import render, redirect, get_object_or_404
from .forms import UserAddForm, RoleForm
from .models import Role, UserProfile
from .tables import UserTable, ArchivedUserTable, RoleTable
from django_tables2 import RequestConfig
class CustomLoginView(LoginView):
template_name = "accounts/login.html"
redirect_authenticated_user = True
class CustomLogoutView(LogoutView):
pass
@login_required
@permission_required("users_view")
def overview(request):
users = (
User.objects
.filter(is_active=True)
.select_related(
"profile",
"profile__role"
)
.order_by("username")
)
archived_users = (
User.objects
.filter(is_active=False)
.select_related(
"profile",
"profile__role"
)
.order_by("username")
)
roles = list(
Role.objects.order_by("name")
)
# ==================================================
# ROLE PERMISSIONS FÜR CHECKBOXEN
# ==================================================
permission_fields = []
for field in Role._meta.fields:
if field.get_internal_type() == "BooleanField":
permission_fields.append({
"name": field.name,
"verbose_name": field.verbose_name or field.name
})
for role in roles:
role.permissions = []
for permission in permission_fields:
role.permissions.append({
"name": permission["name"],
"verbose_name": permission["verbose_name"],
"value": getattr(
role,
permission["name"]
)
})
# ==================================================
# USER ROLLEN-PERMISSIONS
# ==================================================
for user in list(users) + list(archived_users):
role = getattr(
getattr(user, "profile", None),
"role",
None
)
user.role_permissions = []
if role:
for permission in permission_fields:
if getattr(
role,
permission["name"]
):
user.role_permissions.append(
permission["verbose_name"]
)
# ==================================================
# TABLES
# ==================================================
table = UserTable(users)
table.roles = roles
RequestConfig(
request,
paginate=False
).configure(table)
archived_table = ArchivedUserTable(archived_users)
archived_table.roles = roles
RequestConfig(
request,
paginate=False
).configure(archived_table)
role_table = RoleTable(roles)
role_table.roles = roles
RequestConfig(
request,
paginate=False
).configure(role_table)
return render(
request,
"accounts/overview.html",
{
"table": table,
"archived_table": archived_table,
"role_table": role_table,
}
)
@login_required
@permission_required("users_edit")
def user_edit(request, user_id):
user = get_object_or_404(
User.objects.select_related(
"profile"
),
id=user_id
)
if user.is_superuser:
return redirect("accounts:overview")
if request.method != "POST":
return redirect("accounts:overview")
# -------------------------
# USER
# -------------------------
user.username = request.POST.get(
"username",
user.username
)
user.first_name = request.POST.get(
"first_name",
user.first_name
)
user.last_name = request.POST.get(
"last_name",
user.last_name
)
user.email = request.POST.get(
"email",
user.email
)
user.save()
# -------------------------
# PROFILE / ROLE
# -------------------------
profile, _ = UserProfile.objects.get_or_create(
user=user
)
role_id = request.POST.get("role")
if role_id:
profile.role_id = role_id
else:
profile.role = None
profile.save()
return redirect(
"accounts:overview"
)
@login_required
@permission_required("users_archive")
def user_archive(request, user_id):
user = get_object_or_404(
User,
id=user_id
)
if user.is_superuser:
return redirect("accounts:overview")
if request.method == "POST":
user.is_active = False
user.save()
return redirect("accounts:overview")
@login_required
@permission_required("users_activate")
def user_reactivate(request, user_id):
user = get_object_or_404(
User,
id=user_id
)
if user.is_superuser:
return redirect("accounts:overview")
if request.method == "POST":
user.is_active = True
user.save()
return redirect("accounts:overview")
@login_required
@permission_required("users_add")
def user_add(request):
form = UserAddForm(
request.POST or None
)
if form.is_valid():
user = form.save(commit=False)
password = form.cleaned_data["password"]
user.set_password(password)
user.save()
UserProfile.objects.create(
user=user,
role=form.cleaned_data["role"]
)
return redirect(
"accounts:overview"
)
return render(
request,
"accounts/add.html",
{
"form": form
}
)
def get_role_permissions():
fields = []
for field in Role._meta.fields:
if field.get_internal_type() == "BooleanField":
fields.append({
"name": field.name,
"label": field.verbose_name or field.name
})
return fields
@login_required
@permission_required("users_groups_edit")
def role_edit(request, role_id):
role = get_object_or_404(
Role,
id=role_id
)
if request.method == "POST":
for field in Role._meta.fields:
if (
field.get_internal_type()
== "BooleanField"
):
setattr(
role,
field.name,
field.name in request.POST
)
role.name = request.POST.get(
"name",
role.name
)
role.save()
return redirect(
"accounts:overview"
)
@login_required
@permission_required("users_groups_delete")
def role_delete(request, role_id):
role = get_object_or_404(
Role,
id=role_id
)
if request.method == "POST":
role.delete()
return redirect(
"accounts:overview"
)
@login_required
@permission_required("users_groups_add")
def role_add(request):
if request.method == "POST":
form = RoleForm(
request.POST
)
if form.is_valid():
form.save()
return redirect(
"accounts:overview"
)
else:
form = RoleForm()
return render(
request,
"accounts/role_add.html",
{
"form": form
}
)