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)