diff --git a/django_nepkit/admin.py b/django_nepkit/admin.py index cd212bf..d04cb20 100644 --- a/django_nepkit/admin.py +++ b/django_nepkit/admin.py @@ -198,22 +198,28 @@ class NepaliAdminMixin: """Provides date formatting helpers for Admin classes.""" def _get_field_ne_setting(self, field_name): + """Return the field's ``ne`` flag, or ``None`` if the field has none. + + ``None`` distinguishes "field has no opinion" from an explicit + ``ne=False`` (English), which the caller can use to fall back to + the project default without overwriting a field-level override. + """ if not hasattr(self, "model"): - return False + return None try: field = self.model._meta.get_field(field_name) if hasattr(field, "ne"): return field.ne except (FieldDoesNotExist, AttributeError): - return False - return False + return None + return None def format_nepali_date( self, date_value, format_string="%B %d, %Y", ne=None, field_name=None ): if ne is None and field_name: ne = self._get_field_ne_setting(field_name) - elif ne is None: + if ne is None: ne = nepkit_settings.DEFAULT_LANGUAGE == "ne" return format_nepali_date(date_value, format_string, ne=ne) @@ -226,7 +232,7 @@ class NepaliAdminMixin: ): if ne is None and field_name: ne = self._get_field_ne_setting(field_name) - elif ne is None: + if ne is None: ne = nepkit_settings.DEFAULT_LANGUAGE == "ne" return format_nepali_datetime(datetime_value, format_string, ne=ne) @@ -308,7 +314,9 @@ class NepaliModelAdmin(NepaliAdminMixin, admin.ModelAdmin): if val is None: return self.get_empty_value_display() ne = self._get_field_ne_setting(field_name) - if ne is False: + if ne is None: + # Field has no ``ne`` attribute (e.g. plain ``TimeField``) + # — fall back to the project default. ne = nepkit_settings.DEFAULT_LANGUAGE == "ne" return format_nepali_time_admin(val, ne=ne) diff --git a/django_nepkit/forms.py b/django_nepkit/forms.py index bd7714c..3151382 100644 --- a/django_nepkit/forms.py +++ b/django_nepkit/forms.py @@ -3,11 +3,16 @@ from datetime import date as python_date from django import forms from django.utils.translation import gettext_lazy as _ from nepali.datetime import nepalidate +from nepali.exceptions import FormatNotMatchException -from django_nepkit.utils import try_parse_nepali_date +from django_nepkit.utils import BS_DATE_FORMAT, try_parse_nepali_date from django_nepkit.validators import validate_nepali_phone_number from django_nepkit.widgets import NepaliDatePickerWidget +# Anything ``try_parse_nepali_date`` (or ``str(value)`` coercion) might +# raise that we want to translate into a user-friendly ``ValidationError``. +_PARSE_ERRORS = (ValueError, TypeError, FormatNotMatchException) + class NepaliDateFormField(forms.DateField): """A form field for entering Nepali dates.""" @@ -32,9 +37,7 @@ class NepaliDateFormField(forms.DateField): if parsed is not None: return parsed raise ValueError("Invalid BS date format") - except Exception: - from django_nepkit.utils import BS_DATE_FORMAT - + except _PARSE_ERRORS: raise forms.ValidationError( _("Enter a valid Nepali date in %(format)s format.") % {"format": BS_DATE_FORMAT},