from django import forms from django.template.loader import render_to_string from base.forms import ModelForm from base.methods import reload_queryset from employee.filters import EmployeeFilter from employee.models import Employee from horilla_documents.models import Document, DocumentRequest from horilla_widgets.widgets.horilla_multi_select_field import HorillaMultiSelectField from horilla_widgets.widgets.select_widgets import HorillaMultiSelectWidget class DocumentRequestForm(ModelForm): """form to create a new Document Request""" class Meta: model = DocumentRequest fields = "__all__" exclude = ["is_active"] def clean(self): for field_name, field_instance in self.fields.items(): if isinstance(field_instance, HorillaMultiSelectField): self.errors.pop(field_name, None) if len(self.data.getlist(field_name)) < 1: raise forms.ValidationError({field_name: "Thif field is required"}) cleaned_data = super().clean() employee_data = self.fields[field_name].queryset.filter( id__in=self.data.getlist(field_name) ) cleaned_data[field_name] = employee_data cleaned_data = super().clean() return cleaned_data def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["employee_id"] = HorillaMultiSelectField( queryset=Employee.objects.all(), widget=HorillaMultiSelectWidget( filter_route_name="employee-widget-filter", filter_class=EmployeeFilter, filter_instance_contex_name="f", filter_template_path="employee_filters.html", required=True, instance=self.instance, ), label="Employee", ) reload_queryset(self.fields) class DocumentForm(ModelForm): """form to create a new Document""" expiry_date = forms.DateField( widget=forms.DateInput(attrs={"type": "date"}), required=False, ) verbose_name = "Document" class Meta: model = Document fields = "__all__" exclude = ["document_request_id", "status", "reject_reason", "is_active"] widgets = { "employee_id": forms.HiddenInput(), } def as_p(self): """ Render the form fields as HTML table rows with Bootstrap styling. """ context = {"form": self} table_html = render_to_string("common_form.html", context) return table_html class DocumentUpdateForm(ModelForm): """form to Update a Document""" verbose_name = "Document" expiry_date = forms.DateField( widget=forms.DateInput(attrs={"type": "date"}), required=False, ) class Meta: model = Document fields = "__all__" exclude = ["is_active"] class DocumentRejectForm(ModelForm): """form to add rejection reason while rejecting a Document""" class Meta: model = Document fields = ["reject_reason"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["reject_reason"].widget.attrs["required"] = True