from django import forms from django.conf import settings from django.templatetags.static import static from django.contrib.admin.widgets import AdminDateWidget from django.forms.fields import DateField, SplitDateTimeField, TimeField, DateTimeField from django.utils.encoding import force_str from datetime import date as datetime_date, datetime as datetime_datetime from jdatetime import GregorianToJalali, datetime as jalali_datetime import jdatetime class JalaliDateField(DateField): def __init__(self, *, input_formats=None, **kwargs): super().__init__(**kwargs) self.input_formats.insert(0, settings.JALALI_DATE_DEFAULTS['Strftime']['date']) def prepare_value(self, value): if isinstance(value, datetime_date): date_obj = jdatetime.datetime.fromgregorian(datetime=value) return date_obj.strftime(settings.JALALI_DATE_DEFAULTS['Strftime']['date']) return value def strptime(self, value, format): return jalali_datetime.strptime(force_str(value), format).togregorian().date() class CustomSelectWidget(forms.widgets.Select): option_template_name = 'widgets/select_option.html' class AdminJalaliDateWidget(AdminDateWidget): template_name = "jalali_date/widgets/date.html" # @property # def media(self): # js = settings.JALALI_DATE_DEFAULTS['Static']['js'] # css = settings.JALALI_DATE_DEFAULTS['Static']['css'] # return forms.Media(js=[static(path) for path in js], css=css) def __init__(self, attrs=None, format=None): final_attrs = {'class': 'jalali_date-date', 'size': '10'} if attrs is not None: final_attrs.update(attrs) super(AdminJalaliDateWidget, self).__init__(attrs=final_attrs, format=format) def render(self, name, value, attrs=None, renderer=None): """Render the widget as an HTML string.""" context = self.get_context(name, value, attrs) return self._render(self.template_name, context, renderer)