Добавлен функционал деактивации/реактивации ролей пользователей

This commit is contained in:
2025-12-13 01:25:19 +03:00
parent 6470fb7588
commit a1d77d778a
10 changed files with 666 additions and 60 deletions

View File

@@ -13,12 +13,24 @@ User = get_user_model()
@owner_required
def user_role_list(request):
"""Список пользователей с их ролями"""
user_roles = UserRole.objects.select_related('user', 'role', 'created_by').all()
# Фильтр по активности
show_inactive = request.GET.get('show_inactive', 'false') == 'true'
if show_inactive:
user_roles = UserRole.objects.select_related('user', 'role', 'created_by').all()
else:
# По умолчанию показываем только активных
user_roles = UserRole.objects.select_related('user', 'role', 'created_by').filter(
is_active=True,
user__is_active=True
)
roles = Role.objects.all()
context = {
'user_roles': user_roles,
'roles': roles,
'show_inactive': show_inactive,
}
return render(request, 'user_roles/user_role_list.html', context)
@@ -34,21 +46,52 @@ def user_role_create(request):
password = request.POST.get('password', User.objects.make_random_password(12))
try:
# Создаем пользователя
user = User.objects.create_user(
email=email,
name=name,
password=password,
is_email_confirmed=True,
is_staff=False, # SECURITY: Пользователи ролей НЕ имеют доступа к админке
is_superuser=False # SECURITY: Пользователи ролей НЕ суперпользователи
)
# Проверяем, не существует ли уже пользователь с таким email
existing_user = User.objects.filter(email=email).first()
if existing_user:
# Пользователь существует - проверяем его статус
if not existing_user.is_active:
# Пользователь деактивирован - предлагаем реактивировать
messages.warning(
request,
f'Пользователь {email} уже существует, но деактивирован. '
f'Используйте функцию "Реактивировать" в списке пользователей.'
)
else:
# Пользователь активен - возможно, уже имеет роль в другом тенанте
messages.error(
request,
f'Пользователь с email {email} уже существует в системе.'
)
# ВАЖНО: Возвращаемся к форме, чтобы пользователь мог исправить email
roles = Role.objects.all()
context = {'roles': roles}
return render(request, 'user_roles/user_role_create.html', context)
else:
# Создаем нового пользователя
user = User.objects.create_user(
email=email,
name=name,
password=password,
is_email_confirmed=True,
is_staff=False, # SECURITY: Пользователи ролей НЕ имеют доступа к админке
is_superuser=False # SECURITY: Пользователи ролей НЕ суперпользователи
)
# Назначаем роль
RoleService.assign_role_to_user(user, role_code, created_by=request.user)
# Назначаем роль
RoleService.assign_role_to_user(user, role_code, created_by=request.user)
messages.success(request, f'Пользователь {email} создан с ролью {role_code}. Пароль: {password}')
return redirect('user_roles:list')
# DEBUG: Проверяем, что пароль есть
print(f"DEBUG: created_user_email={email}, generated_password={password}")
# Показываем страницу с паролем
context = {
'created_user_email': email,
'generated_password': password,
'user_role': role_code,
}
return render(request, 'user_roles/user_role_created.html', context)
except Exception as e:
messages.error(request, f'Ошибка при создании пользователя: {str(e)}')
@@ -73,24 +116,55 @@ def user_role_edit(request, pk):
return redirect('user_roles:list')
if request.method == 'POST':
role_code = request.POST.get('role')
is_active = request.POST.get('is_active') == 'on'
action = request.POST.get('action', 'update')
# Обработка пересоздания пароля
if action == 'regenerate_password':
try:
new_password = User.objects.make_random_password(12)
user_role.user.set_password(new_password)
user_role.user.save()
messages.success(request, f'Пароль для пользователя {user_role.user.email} успешно обновлен')
# Показываем новый пароль в модальном окне
roles = Role.objects.all()
context = {
'user_role': user_role,
'roles': roles,
'generated_password': new_password,
}
return render(request, 'user_roles/user_role_edit.html', context)
except Exception as e:
messages.error(request, f'Ошибка при обновлении пароля: {str(e)}')
# Обычное обновление роли и имени
else:
role_code = request.POST.get('role')
is_active = request.POST.get('is_active') == 'on'
name = request.POST.get('name', '').strip()
try:
# Обновляем роль
role = RoleService.get_role_by_code(role_code)
if not role:
raise ValueError(f"Роль '{role_code}' не найдена")
try:
# Обновляем роль
role = RoleService.get_role_by_code(role_code)
if not role:
raise ValueError(f"Роль '{role_code}' не найдена")
user_role.role = role
user_role.is_active = is_active
user_role.save()
user_role.role = role
user_role.is_active = is_active
user_role.save()
# Обновляем имя пользователя
if name and name != user_role.user.name:
user_role.user.name = name
user_role.user.save()
messages.success(request, f'Роль пользователя {user_role.user.email} обновлена')
return redirect('user_roles:list')
messages.success(request, f'Данные пользователя {user_role.user.email} обновлены')
return redirect('user_roles:list')
except Exception as e:
messages.error(request, f'Ошибка при обновлении роли: {str(e)}')
except Exception as e:
messages.error(request, f'Ошибка при обновлении данных: {str(e)}')
roles = Role.objects.all()
context = {
@@ -103,7 +177,7 @@ def user_role_edit(request, pk):
@login_required
@owner_required
def user_role_delete(request, pk):
"""Удаление роли пользователя (отключение доступа)"""
"""Деактивация пользователя (soft delete)"""
user_role = get_object_or_404(UserRole, pk=pk)
# Защита от самоблокировки
@@ -114,11 +188,43 @@ def user_role_delete(request, pk):
if request.method == 'POST':
email = user_role.user.email
user_role.delete()
messages.success(request, f'Доступ пользователя {email} удален')
# Soft delete: деактивируем пользователя и его роль
user_role.is_active = False
user_role.save()
user_role.user.is_active = False
user_role.user.save()
messages.success(request, f'Пользователь {email} деактивирован')
return redirect('user_roles:list')
context = {
'user_role': user_role,
}
return render(request, 'user_roles/user_role_delete.html', context)
@login_required
@owner_required
def user_role_reactivate(request, pk):
"""Реактивация пользователя"""
user_role = get_object_or_404(UserRole, pk=pk)
if request.method == 'POST':
email = user_role.user.email
# Реактивируем пользователя и его роль
user_role.is_active = True
user_role.save()
user_role.user.is_active = True
user_role.user.save()
messages.success(request, f'Пользователь {email} успешно реактивирован')
return redirect('user_roles:list')
context = {
'user_role': user_role,
}
return render(request, 'user_roles/user_role_reactivate.html', context)