This commit represents a comprehensive improvement of the library's architecture, developer experience, and documentation accuracy. Core Refactoring: - apply DRY principle to models.py by introducing BaseNepaliBSField and BaseLocationField - standardize widget logic in widgets.py using NepaliWidgetMixin - centralize admin filtering logic into BaseNepaliDateFilter New Features & API: - add NepaliMonthFilter for Django Admin and NepaliDateMonthFilter for DRF - implementation of HTMX-driven location chaining for dynamic address selects - extend demo project with comprehensive DRF search, ordering, and filter examples Configuration & Sync: - implement global NEPKIT settings in conf.py (DEFAULT_LANGUAGE, ADMIN_DATEPICKER, etc.) - universalize BS_DATE_FORMAT/BS_DATETIME_FORMAT across the entire stack - synchronize frontend datepicker initialization with backend date formats Documentation & DX: - complete rewrite of README.md into high-energy, factual, English-only guides - project-wide audit and simplification of comments/docstrings for beginner accessibility - expanded 'Technical Design' and 'FAQ' sections covering data integrity and storage - added docs/migration_guide.py for bulk AD-to-BS data transitions Quality & Maintenance: - fixed all E402 module-level import errors across the library - verified codebase with project-wide ruff checks (all checks passed)
89 lines
2.6 KiB
Python
89 lines
2.6 KiB
Python
from django import forms
|
|
from django.shortcuts import render, redirect
|
|
from rest_framework import viewsets, filters as drf_filters
|
|
from django_filters import rest_framework as django_filters
|
|
from django_nepkit.filters import NepaliDateYearFilter, NepaliDateMonthFilter
|
|
from .models import Person, Citizen, AuditedPerson
|
|
from .serializers import PersonSerializer, CitizenSerializer, AuditedPersonSerializer
|
|
|
|
|
|
class PersonForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Person
|
|
fields = [
|
|
"name",
|
|
"birth_date",
|
|
"birth_date_ne",
|
|
"phone_number",
|
|
"province",
|
|
"province_ne",
|
|
"district",
|
|
"district_ne",
|
|
"municipality",
|
|
"municipality_ne",
|
|
]
|
|
|
|
|
|
def person_list(request):
|
|
persons = Person.objects.all()
|
|
return render(request, "demo/person_list.html", {"persons": persons})
|
|
|
|
|
|
def person_create(request):
|
|
if request.method == "POST":
|
|
form = PersonForm(request.POST)
|
|
if form.is_valid():
|
|
form.save()
|
|
return redirect("demo:person-list")
|
|
else:
|
|
form = PersonForm()
|
|
return render(request, "demo/person_form.html", {"form": form})
|
|
|
|
|
|
# --- API Support (DRF) ---
|
|
|
|
|
|
class PersonViewSet(viewsets.ModelViewSet):
|
|
queryset = Person.objects.all()
|
|
serializer_class = PersonSerializer
|
|
|
|
# Sort and Search work automatically with BS date strings
|
|
filter_backends = [
|
|
django_filters.DjangoFilterBackend,
|
|
drf_filters.SearchFilter,
|
|
drf_filters.OrderingFilter,
|
|
]
|
|
|
|
ordering_fields = ["birth_date", "created_at"]
|
|
search_fields = ["name", "birth_date", "phone_number"]
|
|
|
|
# Simple exact date filter
|
|
filterset_fields = {
|
|
"birth_date": ["exact"],
|
|
}
|
|
|
|
class PersonFilter(django_filters.FilterSet):
|
|
year = NepaliDateYearFilter(field_name="birth_date")
|
|
month = NepaliDateMonthFilter(field_name="birth_date")
|
|
|
|
class Meta:
|
|
model = Person
|
|
fields = ["province", "district"]
|
|
|
|
filterset_class = PersonFilter
|
|
|
|
|
|
class CitizenViewSet(viewsets.ModelViewSet):
|
|
queryset = Citizen.objects.all()
|
|
serializer_class = CitizenSerializer
|
|
filter_backends = [drf_filters.OrderingFilter]
|
|
ordering_fields = ["province", "district"]
|
|
|
|
|
|
class AuditedPersonViewSet(viewsets.ModelViewSet):
|
|
queryset = AuditedPerson.objects.all()
|
|
serializer_class = AuditedPersonSerializer
|
|
filter_backends = [drf_filters.SearchFilter, drf_filters.OrderingFilter]
|
|
search_fields = ["name", "birth_date"]
|
|
ordering_fields = ["created_at"]
|