first commit

This commit is contained in:
NORBOYEVSAMARIDDIN
2026-02-07 11:18:38 +05:00
commit 493cb58222
228 changed files with 10859 additions and 0 deletions

View 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()

View 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

View 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

View 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}),
}

View 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

View 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

View 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

View 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"]

View 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 *

View 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

View 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

View File

@@ -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

View 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

View File

@@ -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

View File

@@ -0,0 +1,5 @@
from .BaseUserForm import *
from .UserEditFormBusinessman import *
from .UserCreateFormBusinessman import *
from .UserCreateFormManagerToEmployee import *
from .UserEditFormManagerToEmployee import *