54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
from django.shortcuts import render, get_object_or_404, redirect
|
|
from django.contrib.auth.decorators import login_required, user_passes_test
|
|
from django.contrib import messages
|
|
from django.contrib.auth import get_user_model
|
|
from django.views.generic import ListView, DetailView, UpdateView
|
|
from django.utils.decorators import method_decorator
|
|
from django.urls import reverse_lazy
|
|
from .forms import ProfileEditForm
|
|
|
|
User = get_user_model()
|
|
|
|
def is_admin_or_user_manager(user):
|
|
"""Check if user is admin or has user management permission"""
|
|
return user.is_superuser or user.has_user_management_permission
|
|
|
|
@login_required
|
|
def profile(request):
|
|
"""User profile view"""
|
|
return render(request, 'users/profile.html')
|
|
|
|
@login_required
|
|
def profile_edit(request):
|
|
"""Edit user profile"""
|
|
if request.method == 'POST':
|
|
form = ProfileEditForm(request.POST, request.FILES, instance=request.user)
|
|
if form.is_valid():
|
|
form.save()
|
|
messages.success(request, 'Profile updated successfully!')
|
|
return redirect('users:profile')
|
|
else:
|
|
form = ProfileEditForm(instance=request.user)
|
|
|
|
return render(request, 'users/profile_edit.html', {'form': form})
|
|
|
|
@method_decorator(login_required, name='dispatch')
|
|
@method_decorator(user_passes_test(is_admin_or_user_manager), name='dispatch')
|
|
class UserListView(ListView):
|
|
"""List all users (admin and user managers only)"""
|
|
model = User
|
|
template_name = 'users/user_list.html'
|
|
context_object_name = 'users'
|
|
paginate_by = 20
|
|
|
|
def get_queryset(self):
|
|
return User.objects.all().order_by('username')
|
|
|
|
@method_decorator(login_required, name='dispatch')
|
|
@method_decorator(user_passes_test(is_admin_or_user_manager), name='dispatch')
|
|
class UserDetailView(DetailView):
|
|
"""User detail view (admin and user managers only)"""
|
|
model = User
|
|
template_name = 'users/user_detail.html'
|
|
context_object_name = 'user_obj'
|