from django.contrib.auth import get_user_model from django.contrib.auth.views import LoginView from django.shortcuts import render from django.urls import reverse_lazy from django.utils.decorators import method_decorator from django.views.generic import TemplateView, FormView, ListView, UpdateView from accounts.forms import LoginForm, RegisterForm from accounts.models import DepotUser from django.contrib.auth.decorators import login_required, user_passes_test from django.contrib.auth.mixins import AccessMixin # Create your views here. class DepotLoginView(LoginView): template_name = 'registration/login.html' # success_url = reverse_lazy('dashboard') form_class = LoginForm next_page = reverse_lazy('dashboard') def is_company_admin(user): return user.is_authenticated and user.is_company_admin @method_decorator(login_required, name='dispatch') class RegisterView(AccessMixin, FormView): template_name = 'registration/register.html' form_class = RegisterForm # model = get_user_model() success_url = reverse_lazy('dashboard') def dispatch(self, request, *args, **kwargs): user: DepotUser = request.user if not (user.is_superuser or user.user_type == DepotUser.UserType.COMPANY_ADMIN): return self.handle_no_permission() return super().dispatch(request, *args, **kwargs) def form_valid(self, form): # Create user from form data user = form.save(commit=False) user_type = form.cleaned_data['user_type'] # Clear irrelevant permissions based on user type if user_type == DepotUser.UserType.CLIENT: user.employee_permissions.clear() elif user_type == DepotUser.UserType.EMPLOYEE: user.company_permissions.clear() # user.set_password(form.cleaned_data['password']) user.save() return super().form_valid(form) def get_form(self, form_class = None): form = super().get_form(form_class) user: DepotUser = self.request.user if user.is_superuser: # Superuser can manage all permissions and user types form.fields['user_type'].widget.attrs['disabled'] = False form.fields['company_permissions'].widget.attrs['disabled'] = False form.fields['employee_permissions'].widget.attrs['disabled'] = False # Show relevant permissions based on selected user type if form.initial.get('user_type') == DepotUser.UserType.CLIENT: form.fields['employee_permissions'].widget.attrs['disabled'] = True elif form.initial.get('user_type') == DepotUser.UserType.EMPLOYEE: form.fields['company_permissions'].widget.attrs['disabled'] = True elif user.user_type == DepotUser.UserType.COMPANY_ADMIN: form.fields['company'].queryset = form.fields['company'].queryset.filter(pk=user.company.pk) form.fields['company'].initial = user.company form.fields['company'].widget.readonly = True # form.fields['line'].widget.attrs['disabled'] = True form.fields['line'].queryset = form.fields['line'].queryset.filter(company=user.company.pk) form.fields['user_type'].choices = [ (DepotUser.UserType.CLIENT, 'Client') ] form.fields['user_type'].initial = DepotUser.UserType.CLIENT form.fields['company_permissions'].widget.attrs['disabled'] = False form.fields['employee_permissions'].widget.attrs['disabled'] = True return form class UserListView(ListView): template_name = 'registration/register.html' # form_class = RegisterForm model = get_user_model() success_url = reverse_lazy('dashboard') class UserEditView(UpdateView): template_name = 'registration/register.html' form_class = RegisterForm model = get_user_model() success_url = reverse_lazy('dashboard')