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', 'step': '0.000001' }), 'utm_y': forms.NumberInput(attrs={ 'class': 'form-control', 'placeholder': 'Y UTM', 'step': '0.000001' }), '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