164 lines
5.8 KiB
Python
164 lines
5.8 KiB
Python
from django.shortcuts import render, redirect, get_object_or_404
|
|
from django.contrib.auth.decorators import login_required, user_passes_test
|
|
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
|
from django.contrib import messages
|
|
from django.views.generic import (
|
|
ListView, DetailView, CreateView, UpdateView, DeleteView
|
|
)
|
|
from django.urls import reverse_lazy
|
|
from django.contrib.auth import update_session_auth_hash
|
|
from django.contrib.auth.forms import PasswordChangeForm
|
|
from django.db.models import Q
|
|
|
|
from .models import CustomUser, UserGroup
|
|
from .forms import CustomUserForm, UserGroupForm
|
|
|
|
def is_admin_or_manager(user):
|
|
"""Check if user is admin or manager"""
|
|
return user.user_type in ['admin', 'manager']
|
|
|
|
def is_admin(user):
|
|
"""Check if user is admin"""
|
|
return user.user_type == 'admin'
|
|
|
|
class ProfileView(LoginRequiredMixin, DetailView):
|
|
"""User profile view"""
|
|
model = CustomUser
|
|
template_name = 'users/profile.html'
|
|
context_object_name = 'user_profile'
|
|
|
|
def get_object(self):
|
|
return self.request.user
|
|
|
|
class ProfileEditView(LoginRequiredMixin, UpdateView):
|
|
"""Edit user profile"""
|
|
model = CustomUser
|
|
template_name = 'users/profile_edit.html'
|
|
fields = ['first_name', 'last_name', 'email', 'phone', 'department', 'profile_picture']
|
|
success_url = reverse_lazy('users:profile')
|
|
|
|
def get_object(self):
|
|
return self.request.user
|
|
|
|
def form_valid(self, form):
|
|
messages.success(self.request, 'Profile updated successfully!')
|
|
return super().form_valid(form)
|
|
|
|
class ChangePasswordView(LoginRequiredMixin, UpdateView):
|
|
"""Change user password"""
|
|
model = CustomUser
|
|
template_name = 'users/change_password.html'
|
|
success_url = reverse_lazy('users:profile')
|
|
|
|
def get_object(self):
|
|
return self.request.user
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['form'] = PasswordChangeForm(self.request.user)
|
|
return context
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
form = PasswordChangeForm(request.user, request.POST)
|
|
if form.is_valid():
|
|
user = form.save()
|
|
update_session_auth_hash(request, user)
|
|
messages.success(request, 'Password changed successfully!')
|
|
return redirect('users:profile')
|
|
else:
|
|
messages.error(request, 'Please correct the errors below.')
|
|
return self.render_to_response(self.get_context_data(form=form))
|
|
|
|
class UserListView(LoginRequiredMixin, UserPassesTestMixin, ListView):
|
|
"""List all users (admin/manager only)"""
|
|
model = CustomUser
|
|
template_name = 'users/user_list.html'
|
|
context_object_name = 'users'
|
|
paginate_by = 20
|
|
|
|
def test_func(self):
|
|
return is_admin_or_manager(self.request.user)
|
|
|
|
def get_queryset(self):
|
|
queryset = CustomUser.objects.all().order_by('username')
|
|
search_query = self.request.GET.get('search', '')
|
|
if search_query:
|
|
queryset = queryset.filter(
|
|
Q(username__icontains=search_query) |
|
|
Q(first_name__icontains=search_query) |
|
|
Q(last_name__icontains=search_query) |
|
|
Q(email__icontains=search_query) |
|
|
Q(employee_id__icontains=search_query)
|
|
)
|
|
return queryset
|
|
|
|
class UserDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
|
|
"""User detail view (admin/manager only)"""
|
|
model = CustomUser
|
|
template_name = 'users/user_detail.html'
|
|
context_object_name = 'user_detail'
|
|
|
|
def test_func(self):
|
|
return is_admin_or_manager(self.request.user)
|
|
|
|
class UserCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView):
|
|
"""Create new user (admin/manager only)"""
|
|
model = CustomUser
|
|
form_class = CustomUserForm
|
|
template_name = 'users/user_form.html'
|
|
success_url = reverse_lazy('users:user_list')
|
|
|
|
def test_func(self):
|
|
return is_admin_or_manager(self.request.user)
|
|
|
|
def form_valid(self, form):
|
|
messages.success(self.request, 'User created successfully!')
|
|
return super().form_valid(form)
|
|
|
|
class UserEditView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
|
|
"""Edit user (admin/manager only)"""
|
|
model = CustomUser
|
|
form_class = CustomUserForm
|
|
template_name = 'users/user_form.html'
|
|
success_url = reverse_lazy('users:user_list')
|
|
|
|
def test_func(self):
|
|
return is_admin_or_manager(self.request.user)
|
|
|
|
def form_valid(self, form):
|
|
messages.success(self.request, 'User updated successfully!')
|
|
return super().form_valid(form)
|
|
|
|
class GroupListView(LoginRequiredMixin, UserPassesTestMixin, ListView):
|
|
"""List all user groups (admin/manager only)"""
|
|
model = UserGroup
|
|
template_name = 'users/group_list.html'
|
|
context_object_name = 'groups'
|
|
paginate_by = 20
|
|
|
|
def test_func(self):
|
|
return is_admin_or_manager(self.request.user)
|
|
|
|
class GroupDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
|
|
"""User group detail view (admin/manager only)"""
|
|
model = UserGroup
|
|
template_name = 'users/group_detail.html'
|
|
context_object_name = 'group_detail'
|
|
|
|
def test_func(self):
|
|
return is_admin_or_manager(self.request.user)
|
|
|
|
class GroupCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView):
|
|
"""Create new user group (admin/manager only)"""
|
|
model = UserGroup
|
|
form_class = UserGroupForm
|
|
template_name = 'users/group_form.html'
|
|
success_url = reverse_lazy('users:group_list')
|
|
|
|
def test_func(self):
|
|
return is_admin_or_manager(self.request.user)
|
|
|
|
def form_valid(self, form):
|
|
messages.success(self.request, 'User group created successfully!')
|
|
return super().form_valid(form)
|