from django import forms
from npdt.forms import NepaliDateField, NepaliDateRangeField
from npdt.holidays import (
CompositeHolidayProvider,
NepalPublicHolidays,
StaticHolidayProvider,
)
from npdt.widgets import NepaliDatePickerWidget
from .models import BankTransaction, Event, LeaveRequest, Person
class PersonForm(forms.ModelForm):
class Meta:
model = Person
fields = ["name", "birth_date_bs"]
widgets = {
"birth_date_bs": NepaliDatePickerWidget(
mode="BS",
language="np",
theme="auto",
show_today_button=False,
max_date="2081-12-30",
)
}
class EventForm(forms.ModelForm):
class Meta:
model = Event
fields = ["title", "event_type", "start_date_bs", "end_date_bs", "description"]
widgets = {
"start_date_bs": NepaliDatePickerWidget(
mode="BS", language="en", theme="light"
),
"end_date_bs": NepaliDatePickerWidget(
mode="BS", language="en", theme="light"
),
"description": forms.Textarea(attrs={"rows": 4}),
}
def clean(self):
cleaned_data = super().clean()
start = cleaned_data.get("start_date_bs")
end = cleaned_data.get("end_date_bs")
if start and end and end < start:
raise forms.ValidationError(
"End date must be after or equal to start date."
)
return cleaned_data
class LeaveRequestForm(forms.ModelForm):
class Meta:
model = LeaveRequest
fields = ["employee_name", "leave_date", "reason"]
widgets = {
"leave_date": NepaliDatePickerWidget(
disable_past_dates=True,
disable_weekends=True,
disable_holidays=True,
admin_theme=True,
),
}
class BankTransactionForm(forms.ModelForm):
class Meta:
model = BankTransaction
fields = ["transaction_date", "amount", "description"]
widgets = {
"transaction_date": NepaliDatePickerWidget(
disabled_days=[0, 6],
disable_holidays=True,
show_holidays=True,
),
}
class DateRangeSearchForm(forms.Form):
search_query = forms.CharField(
max_length=100,
required=False,
widget=forms.TextInput(attrs={"placeholder": "Search..."}),
)
date_range = NepaliDateRangeField(
mode="BS",
language="en",
required=False,
help_text="Select a date range for filtering",
widget_kwargs={
"disable_past_dates": True,
},
)
event_type = forms.ChoiceField(
choices=[("", "All")] + Event.EVENT_TYPES, required=False
)
class FutureDateOnlyForm(forms.Form):
appointment_date = NepaliDateField(
widget_kwargs={
"disable_past_dates": True,
"admin_theme": True,
}
)
class NoWeekendsForm(forms.Form):
working_date = NepaliDateField(
widget_kwargs={
"disable_weekends": True,
}
)
class CustomDisabledDatesForm(forms.Form):
booking_date = NepaliDateField(
widget_kwargs={
"disabled_dates": ["2082-01-01", "2082-09-03", "2082-10-15"],
"disable_past_dates": True,
"admin_theme": True,
}
)
class NoHolidaysForm(forms.Form):
submission_date = NepaliDateField(
widget_kwargs={
"disable_holidays": True,
"show_holidays": True,
"admin_theme": True,
}
)
class StrictBusinessDayForm(forms.Form):
report_date = NepaliDateField(
widget_kwargs={
"disable_past_dates": True,
"disable_weekends": True,
"disable_holidays": True,
"on_date_disabled": "prevent",
"admin_theme": True,
}
)