shafafiyat/wells/forms.py

154 lines
6 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django import forms
from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError
from .models import Well, WaterMeterManufacturer
from locations.models import Affairs, County, Broker
class WaterMeterManufacturerForm(forms.ModelForm):
"""فرم برای افزودن شرکت سازنده کنتور آب جدید"""
class Meta:
model = WaterMeterManufacturer
fields = ['name']
widgets = {
'name': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'نام شرکت سازنده'
}),
}
class WellForm(forms.ModelForm):
"""فرم برای ایجاد و ویرایش چاه"""
# فیلد جدید برای افزودن شرکت سازنده جدید
new_manufacturer = forms.CharField(
required=False,
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'شرکت سازنده جدید',
'style': 'display: none;' # پیش‌فرض مخفی
}),
label='شرکت سازنده جدید'
)
class Meta:
model = Well
fields = [
'representative',
'water_subscription_number',
'electricity_subscription_number',
'water_meter_serial_number',
'water_meter_old_serial_number',
'water_meter_manufacturer',
'utm_x',
'utm_y',
'utm_zone',
'utm_hemisphere',
'well_power',
'reference_letter_number',
'reference_letter_date',
'representative_letter_file',
# affairs, county, broker will be auto-filled from user profile
]
widgets = {
'representative': forms.Select(attrs={
'class': 'form-select',
}),
'water_subscription_number': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'شماره اشتراک آب',
'required': True
}),
'electricity_subscription_number': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'شماره اشتراک برق',
'required': True
}),
'water_meter_serial_number': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'سریال کنتور آب'
}),
'water_meter_old_serial_number': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'سریال کنتور قدیمی آب'
}),
'water_meter_manufacturer': forms.Select(attrs={
'class': 'form-select',
'id': 'id_water_meter_manufacturer'
}),
'utm_x': forms.NumberInput(attrs={
'class': 'form-control',
'placeholder': 'X UTM',
}),
'utm_y': forms.NumberInput(attrs={
'class': 'form-control',
'placeholder': 'Y UTM',
}),
'utm_zone': forms.NumberInput(attrs={
'class': 'form-control',
'placeholder': 'زون UTM (پیش‌فرض: 40)',
'min': '1',
'max': '60'
}),
'utm_hemisphere': forms.Select(attrs={
'class': 'form-select'
}),
'well_power': forms.NumberInput(attrs={
'class': 'form-control',
'placeholder': 'قدرت چاه',
'min': '0'
}),
'reference_letter_number': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'شماره معرفی نامه'
}),
'reference_letter_date': forms.DateInput(attrs={
'class': 'form-control',
'type': 'date'
}),
'representative_letter_file': forms.FileInput(attrs={
'class': 'form-control',
'accept': '.pdf,.doc,.docx,.jpg,.jpeg,.png'
}),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# تنظیم querysetها
self.fields['representative'].queryset = get_user_model().objects.all()
self.fields['water_meter_manufacturer'].queryset = WaterMeterManufacturer.objects.all()
# اضافه کردن گزینه خالی
self.fields['representative'].empty_label = "انتخاب نماینده"
self.fields['water_meter_manufacturer'].empty_label = "انتخاب شرکت سازنده"
def clean(self):
cleaned_data = super().clean()
new_manufacturer = cleaned_data.get('new_manufacturer')
manufacturer = cleaned_data.get('water_meter_manufacturer')
# اگر شرکت سازنده جدید وارد شده، آن را ایجاد کن
if new_manufacturer and new_manufacturer.strip():
try:
manufacturer_obj, created = WaterMeterManufacturer.objects.get_or_create(
name=new_manufacturer.strip()
)
cleaned_data['water_meter_manufacturer'] = manufacturer_obj
except Exception as e:
raise forms.ValidationError(f'خطا در ایجاد شرکت سازنده: {str(e)}')
return cleaned_data
def clean_water_subscription_number(self):
water_subscription_number = self.cleaned_data.get('water_subscription_number', '')
# چک کردن تکراری نبودن شماره اشتراک آب (فقط برای ایجاد)
if water_subscription_number and not self.instance.pk:
if Well.objects.filter(water_subscription_number=water_subscription_number).exists():
raise forms.ValidationError('شماره اشتراک آب قبلاً ثبت شده است.')
return water_subscription_number