first commit
This commit is contained in:
19
core/apps/management/forms/DeviceForm.py
Normal file
19
core/apps/management/forms/DeviceForm.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from django import forms
|
||||
from ..models import Device, District
|
||||
|
||||
class DeviceForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Device
|
||||
fields = ["address", "district"]
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
user = kwargs.pop('user', None) # get the user from kwargs
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
if user is not None:
|
||||
if user.role == "manager":
|
||||
# Manager: only districts in the same region
|
||||
self.fields['district'].queryset = District.objects.filter(region=user.region)
|
||||
else:
|
||||
# Businessman: show all districts
|
||||
self.fields['district'].queryset = District.objects.all()
|
||||
62
core/apps/management/forms/ExpenseForm.py
Normal file
62
core/apps/management/forms/ExpenseForm.py
Normal file
@@ -0,0 +1,62 @@
|
||||
from django import forms
|
||||
from ..models import Expense, Device
|
||||
from core.apps.accounts.models import User
|
||||
|
||||
# Base form
|
||||
class BaseExpenseForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Expense
|
||||
fields = ["amount", "expense_type", "employee", "device"]
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
# Show all devices
|
||||
self.fields["device"].queryset = Device.objects.all()
|
||||
# Show all employees
|
||||
self.fields["employee"].queryset = User.objects.filter(role="employee")
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super().clean()
|
||||
expense_type = cleaned_data.get("expense_type")
|
||||
employee = cleaned_data.get("employee")
|
||||
device = cleaned_data.get("device")
|
||||
|
||||
# Salary requires employee
|
||||
if expense_type == Expense.ExpenseType.SALARY and not employee:
|
||||
self.add_error("employee", "Employee must be set for Salary expenses.")
|
||||
|
||||
# Device required for rent/maintenance
|
||||
if expense_type in [Expense.ExpenseType.RENT, Expense.ExpenseType.MAINTENANCE] and not device:
|
||||
self.add_error("device", "Device must be set for this type of expense.")
|
||||
|
||||
return cleaned_data
|
||||
|
||||
|
||||
# Employee form: cannot create Salary or Buy Toys
|
||||
class ExpenseFormEmployee(BaseExpenseForm):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
# Remove forbidden types for employee
|
||||
forbidden = [Expense.ExpenseType.SALARY, Expense.ExpenseType.BUY_TOYS]
|
||||
self.fields["expense_type"].choices = [
|
||||
(value, label)
|
||||
for value, label in Expense.ExpenseType.choices
|
||||
if value not in forbidden
|
||||
]
|
||||
|
||||
|
||||
# Manager form: cannot create Buy Toys
|
||||
class ExpenseFormManager(BaseExpenseForm):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
forbidden = [Expense.ExpenseType.BUY_TOYS]
|
||||
self.fields["expense_type"].choices = [
|
||||
(value, label)
|
||||
for value, label in Expense.ExpenseType.choices
|
||||
if value not in forbidden
|
||||
]
|
||||
|
||||
|
||||
# Businessman form: full access
|
||||
class ExpenseFormBusinessman(BaseExpenseForm):
|
||||
pass
|
||||
32
core/apps/management/forms/IncomeForm.py
Normal file
32
core/apps/management/forms/IncomeForm.py
Normal file
@@ -0,0 +1,32 @@
|
||||
from django import forms
|
||||
from ..models import Income, Device
|
||||
|
||||
class IncomeForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Income
|
||||
fields = ["device", "amount"]
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.user = kwargs.pop("user", None)
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
if self.user is not None:
|
||||
# Filter devices
|
||||
if self.user.role == "businessman":
|
||||
self.fields["device"].queryset = Device.objects.all()
|
||||
else: # manager or employee
|
||||
self.fields["device"].queryset = Device.objects.filter(district__region=self.user.region)
|
||||
|
||||
# Remove amount for employees
|
||||
if self.user.role == "employee":
|
||||
self.fields.pop("amount", None)
|
||||
|
||||
def save(self, commit=True):
|
||||
instance = super().save(commit=False)
|
||||
if self.user:
|
||||
instance.created_by = self.user
|
||||
if getattr(self.user, "role", None) == "employee":
|
||||
instance.amount = None
|
||||
if commit:
|
||||
instance.save()
|
||||
return instance
|
||||
11
core/apps/management/forms/RentForm.py
Normal file
11
core/apps/management/forms/RentForm.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from django import forms
|
||||
from ..models import Rent
|
||||
|
||||
class RentForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Rent
|
||||
fields = ['address', 'district', 'device', 'due_date', 'amount']
|
||||
widgets = {
|
||||
'due_date': forms.DateInput(attrs={'type': 'date'}),
|
||||
'amount': forms.NumberInput(attrs={'min': 0}),
|
||||
}
|
||||
21
core/apps/management/forms/ToyMovementEmployeeForm.py
Normal file
21
core/apps/management/forms/ToyMovementEmployeeForm.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from django import forms
|
||||
from core.apps.management.models import ToyMovement
|
||||
|
||||
class ToyMovementFormEmployee(forms.ModelForm):
|
||||
class Meta:
|
||||
model = ToyMovement
|
||||
fields = ["device", "quantity"] # remove from_warehouse
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.user = kwargs.pop("user", None) # pass user from view
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
def save(self, commit=True):
|
||||
instance = super().save(commit=False)
|
||||
instance.movement_type = "from_warehouse"
|
||||
instance.to_warehouse = None
|
||||
if self.user and hasattr(self.user, "warehouse"):
|
||||
instance.from_warehouse = self.user.warehouse
|
||||
if commit:
|
||||
instance.save()
|
||||
return instance
|
||||
30
core/apps/management/forms/ToyMovementForm.py
Normal file
30
core/apps/management/forms/ToyMovementForm.py
Normal file
@@ -0,0 +1,30 @@
|
||||
from django import forms
|
||||
from core.apps.management.models import ToyMovement, Warehouse, Device
|
||||
from core.apps.management.choice import TOY_MOVEMENT_TYPE
|
||||
|
||||
class ToyMovementForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = ToyMovement
|
||||
fields = ["movement_type", "from_warehouse", "to_warehouse", "device", "quantity"]
|
||||
widgets = {
|
||||
"movement_type": forms.Select(choices=TOY_MOVEMENT_TYPE),
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
user = kwargs.pop("user", None)
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields["from_warehouse"].queryset = Warehouse.objects.all()
|
||||
self.fields["to_warehouse"].queryset = Warehouse.objects.all()
|
||||
self.fields["device"].queryset = Device.objects.all()
|
||||
|
||||
def save(self, commit=True):
|
||||
instance = super().save(commit=False)
|
||||
|
||||
if instance.movement_type == "from_warehouse":
|
||||
instance.to_warehouse = None
|
||||
elif instance.movement_type == "between_warehouses":
|
||||
instance.device = None
|
||||
|
||||
if commit:
|
||||
instance.save()
|
||||
return instance
|
||||
78
core/apps/management/forms/UserCreateForm.py
Normal file
78
core/apps/management/forms/UserCreateForm.py
Normal file
@@ -0,0 +1,78 @@
|
||||
# from django import forms
|
||||
# from ...accounts.models import User, RoleChoice
|
||||
# from ...management.models import Region
|
||||
#
|
||||
# class UserCreateForm(forms.ModelForm):
|
||||
# role = forms.ChoiceField(
|
||||
# choices=[
|
||||
# (RoleChoice.MANAGER, "Manager"),
|
||||
# (RoleChoice.EMPLOYEE, "Employee")
|
||||
# ],
|
||||
# widget=forms.Select(attrs={"class": "form-control"})
|
||||
# )
|
||||
#
|
||||
# password = forms.CharField(
|
||||
# widget=forms.PasswordInput(attrs={"class": "form-control"}),
|
||||
# required=False,
|
||||
# label="Parol"
|
||||
# )
|
||||
#
|
||||
# region = forms.ModelChoiceField(
|
||||
# queryset=Region.objects.none(),
|
||||
# required=False,
|
||||
# widget=forms.Select(attrs={"class": "form-control"})
|
||||
# )
|
||||
#
|
||||
# class Meta:
|
||||
# model = User
|
||||
# fields = ["phone", "password", "role", "first_name", "last_name", "region"]
|
||||
# widgets = {
|
||||
# "phone": forms.TextInput(attrs={"class": "form-control"}),
|
||||
# }
|
||||
#
|
||||
# def __init__(self, *args, **kwargs):
|
||||
# self.creator = kwargs.pop("creator", None)
|
||||
# super().__init__(*args, **kwargs)
|
||||
#
|
||||
# # Password required only on create
|
||||
# if not self.instance or not self.instance.pk:
|
||||
# self.fields["password"].required = True
|
||||
# else:
|
||||
# self.fields["password"].help_text = "Leave blank to keep current password"
|
||||
#
|
||||
# # Manager logic: remove role and region from form
|
||||
# if self.creator and self.creator.role == "manager":
|
||||
# if "role" in self.fields:
|
||||
# self.fields.pop("role")
|
||||
# if "region" in self.fields:
|
||||
# self.fields.pop("region")
|
||||
#
|
||||
#
|
||||
#
|
||||
# # Businessman logic: region queryset
|
||||
# elif self.creator and self.creator.role == "businessman":
|
||||
# self.fields["region"].queryset = Region.objects.all()
|
||||
#
|
||||
# def save(self, commit=True):
|
||||
# user = super().save(commit=False)
|
||||
#
|
||||
# # Manager-created users must have region set
|
||||
# if self.creator and self.creator.role == "manager":
|
||||
# user.region = self.creator.region
|
||||
#
|
||||
# # Only force EMPLOYEE if the target user is not a manager
|
||||
# if user.role != RoleChoice.MANAGER:
|
||||
# user.role = RoleChoice.EMPLOYEE
|
||||
#
|
||||
# # Password
|
||||
# password = self.cleaned_data.get("password")
|
||||
# if password:
|
||||
# user.set_password(password)
|
||||
# else:
|
||||
# if user.pk:
|
||||
# old_user = User.objects.get(pk=user.pk)
|
||||
# user.password = old_user.password
|
||||
#
|
||||
# if commit:
|
||||
# user.save()
|
||||
# return user
|
||||
7
core/apps/management/forms/WarehouseForm.py
Normal file
7
core/apps/management/forms/WarehouseForm.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from django import forms
|
||||
from ..models import Warehouse
|
||||
|
||||
class WarehouseForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Warehouse
|
||||
fields = ["name", "region", "toys_count"]
|
||||
8
core/apps/management/forms/__init__.py
Normal file
8
core/apps/management/forms/__init__.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from .IncomeForm import *
|
||||
from .ExpenseForm import *
|
||||
from .DeviceForm import *
|
||||
from .WarehouseForm import *
|
||||
from .UserCreateForm import *
|
||||
from .ToyMovementEmployeeForm import ToyMovementFormEmployee
|
||||
from .ToyMovementForm import ToyMovementForm
|
||||
from .user import *
|
||||
50
core/apps/management/forms/user/BaseUserForm.py
Normal file
50
core/apps/management/forms/user/BaseUserForm.py
Normal file
@@ -0,0 +1,50 @@
|
||||
# forms/base.py
|
||||
from django import forms
|
||||
from core.apps.accounts.models import User
|
||||
from core.apps.accounts.choices import RoleChoice
|
||||
|
||||
class BaseUserForm(forms.ModelForm):
|
||||
password = forms.CharField(
|
||||
required=False,
|
||||
widget=forms.PasswordInput(attrs={"class": "form-control"})
|
||||
)
|
||||
role = forms.ChoiceField(
|
||||
choices=[
|
||||
(RoleChoice.MANAGER, "Manager"),
|
||||
(RoleChoice.EMPLOYEE, "Employee"),
|
||||
],
|
||||
widget=forms.Select(attrs={"class": "form-control"})
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = [
|
||||
"phone",
|
||||
"password",
|
||||
"role",
|
||||
"first_name",
|
||||
"last_name",
|
||||
"region",
|
||||
"warehouse",
|
||||
]
|
||||
|
||||
def clean_role(self):
|
||||
role = self.cleaned_data["role"]
|
||||
if role in (RoleChoice.BUSINESSMAN, RoleChoice.SUPERUSER):
|
||||
raise forms.ValidationError("This role cannot be assigned.")
|
||||
return role
|
||||
|
||||
def save(self, commit=True):
|
||||
user = super().save(commit=False)
|
||||
|
||||
password = self.cleaned_data.get("password")
|
||||
if password:
|
||||
user.set_password(password)
|
||||
else:
|
||||
if user.pk:
|
||||
old_user = User.objects.get(pk=user.pk)
|
||||
user.password = old_user.password
|
||||
|
||||
if commit:
|
||||
user.save()
|
||||
return user
|
||||
40
core/apps/management/forms/user/UserCreateFormBusinessman.py
Normal file
40
core/apps/management/forms/user/UserCreateFormBusinessman.py
Normal file
@@ -0,0 +1,40 @@
|
||||
# forms/businessman_create.py
|
||||
from .BaseUserForm import BaseUserForm
|
||||
from core.apps.accounts.models import RoleChoice
|
||||
from core.apps.management.models import Region, Warehouse
|
||||
|
||||
class UserCreateFormBusinessman(BaseUserForm):
|
||||
|
||||
class Meta(BaseUserForm.Meta):
|
||||
fields = [
|
||||
"phone",
|
||||
"password",
|
||||
"role",
|
||||
"first_name",
|
||||
"last_name",
|
||||
"region",
|
||||
"warehouse",
|
||||
]
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.fields["password"].required = True
|
||||
self.fields["region"].queryset = Region.objects.all()
|
||||
self.fields["warehouse"].queryset = Warehouse.objects.all()
|
||||
|
||||
def clean(self):
|
||||
cleaned = super().clean()
|
||||
role = cleaned.get("role")
|
||||
warehouse = cleaned.get("warehouse")
|
||||
|
||||
if role == RoleChoice.MANAGER:
|
||||
cleaned["warehouse"] = None
|
||||
|
||||
if role == RoleChoice.EMPLOYEE:
|
||||
if not warehouse:
|
||||
self.add_error("warehouse", "Warehouse is required for employee")
|
||||
else:
|
||||
cleaned["region"] = warehouse.region
|
||||
|
||||
return cleaned
|
||||
@@ -0,0 +1,48 @@
|
||||
# forms/manager_create.py
|
||||
from .BaseUserForm import BaseUserForm
|
||||
from core.apps.accounts.models import RoleChoice
|
||||
from core.apps.management.models import Warehouse
|
||||
|
||||
class UserCreateFormManagerToEmployee(BaseUserForm):
|
||||
class Meta(BaseUserForm.Meta):
|
||||
fields = [
|
||||
"phone",
|
||||
"password",
|
||||
"first_name",
|
||||
"last_name",
|
||||
"warehouse",
|
||||
]
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.manager = kwargs.pop("manager")
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Password is required for creation
|
||||
self.fields["password"].required = True
|
||||
|
||||
# Filter warehouses to manager's region
|
||||
self.fields["warehouse"].queryset = Warehouse.objects.filter(
|
||||
region=self.manager.region
|
||||
)
|
||||
|
||||
# Hide role field, manager can only create employees
|
||||
self.fields.pop("role", None)
|
||||
|
||||
def save(self, commit=True):
|
||||
user = super().save(commit=False)
|
||||
|
||||
# Always set role to EMPLOYEE
|
||||
user.role = RoleChoice.EMPLOYEE
|
||||
|
||||
# Set region from selected warehouse
|
||||
if user.warehouse:
|
||||
user.region = user.warehouse.region
|
||||
|
||||
# Only set password if provided
|
||||
password = self.cleaned_data.get("password")
|
||||
if password:
|
||||
user.set_password(password)
|
||||
|
||||
if commit:
|
||||
user.save()
|
||||
return user
|
||||
31
core/apps/management/forms/user/UserEditFormBusinessman.py
Normal file
31
core/apps/management/forms/user/UserEditFormBusinessman.py
Normal file
@@ -0,0 +1,31 @@
|
||||
# forms/businessman_edit.py
|
||||
from .BaseUserForm import BaseUserForm
|
||||
from core.apps.accounts.models import RoleChoice
|
||||
from core.apps.management.models import Warehouse
|
||||
from django import forms
|
||||
|
||||
|
||||
class UserEditFormBusinessman(BaseUserForm):
|
||||
class Meta(BaseUserForm.Meta):
|
||||
fields = BaseUserForm.Meta.fields
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.fields["warehouse"].queryset = Warehouse.objects.all()
|
||||
|
||||
if self.instance.role == RoleChoice.MANAGER:
|
||||
self.fields["warehouse"].widget = forms.HiddenInput()
|
||||
|
||||
def clean(self):
|
||||
cleaned = super().clean()
|
||||
role = cleaned.get("role")
|
||||
warehouse = cleaned.get("warehouse")
|
||||
|
||||
if role == RoleChoice.MANAGER:
|
||||
cleaned["warehouse"] = None
|
||||
|
||||
if role == RoleChoice.EMPLOYEE and warehouse:
|
||||
cleaned["region"] = warehouse.region
|
||||
|
||||
return cleaned
|
||||
@@ -0,0 +1,38 @@
|
||||
# forms/manager_edit.py
|
||||
from .BaseUserForm import BaseUserForm
|
||||
from core.apps.management.models import Warehouse
|
||||
from core.apps.accounts.choices import RoleChoice
|
||||
|
||||
class UserEditFormManagerToEmployee(BaseUserForm):
|
||||
class Meta(BaseUserForm.Meta):
|
||||
fields = [
|
||||
"phone",
|
||||
"password",
|
||||
"first_name",
|
||||
"last_name",
|
||||
"warehouse",
|
||||
]
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.manager = kwargs.pop("manager")
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.fields.pop("role", None)
|
||||
|
||||
# 👇 decision based on edited user's role
|
||||
if self.instance.role == RoleChoice.MANAGER:
|
||||
# editing manager → no warehouse
|
||||
self.fields.pop("warehouse", None)
|
||||
else:
|
||||
# editing employee → show warehouse
|
||||
self.fields["warehouse"].queryset = Warehouse.objects.filter(
|
||||
region=self.manager.region
|
||||
)
|
||||
|
||||
def save(self, commit=True):
|
||||
user = super().save(commit=False)
|
||||
user.region = user.warehouse.region
|
||||
|
||||
if commit:
|
||||
user.save()
|
||||
return user
|
||||
5
core/apps/management/forms/user/__init__.py
Normal file
5
core/apps/management/forms/user/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from .BaseUserForm import *
|
||||
from .UserEditFormBusinessman import *
|
||||
from .UserCreateFormBusinessman import *
|
||||
from .UserCreateFormManagerToEmployee import *
|
||||
from .UserEditFormManagerToEmployee import *
|
||||
Reference in New Issue
Block a user