Django_Basic_Manufacturing/users/views.py
2025-08-17 21:42:40 +07:00

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)