165 lines
4.7 KiB
Python
165 lines
4.7 KiB
Python
import json
|
|
|
|
from django import forms
|
|
from django.conf import settings
|
|
from django.forms import widgets
|
|
from django.utils.formats import get_format
|
|
|
|
from wagtail.admin.datetimepicker import to_datetimepicker_format
|
|
from wagtail.admin.staticfiles import versioned_static
|
|
from wagtail.telepath import register
|
|
from wagtail.widget_adapters import WidgetAdapter
|
|
|
|
DEFAULT_DATE_FORMAT = "%Y-%m-%d"
|
|
DEFAULT_DATETIME_FORMAT = "%Y-%m-%d %H:%M"
|
|
DEFAULT_TIME_FORMAT = "%H:%M"
|
|
|
|
|
|
class AdminDateInput(widgets.DateInput):
|
|
template_name = "wagtailadmin/widgets/date_input.html"
|
|
|
|
def __init__(self, attrs=None, format=None):
|
|
default_attrs = {"autocomplete": "off"}
|
|
fmt = format
|
|
if attrs:
|
|
default_attrs.update(attrs)
|
|
if fmt is None:
|
|
fmt = getattr(settings, "WAGTAIL_DATE_FORMAT", DEFAULT_DATE_FORMAT)
|
|
self.js_format = to_datetimepicker_format(fmt)
|
|
super().__init__(attrs=default_attrs, format=fmt)
|
|
|
|
def get_config(self):
|
|
return {
|
|
"dayOfWeekStart": get_format("FIRST_DAY_OF_WEEK"),
|
|
"format": self.js_format,
|
|
}
|
|
|
|
def get_context(self, name, value, attrs):
|
|
context = super().get_context(name, value, attrs)
|
|
|
|
context["widget"]["config_json"] = json.dumps(self.get_config())
|
|
|
|
return context
|
|
|
|
@property
|
|
def media(self):
|
|
return forms.Media(
|
|
js=[
|
|
versioned_static("wagtailadmin/js/date-time-chooser.js"),
|
|
]
|
|
)
|
|
|
|
|
|
class AdminDateInputAdapter(WidgetAdapter):
|
|
js_constructor = "wagtail.widgets.AdminDateInput"
|
|
|
|
def js_args(self, widget):
|
|
return [
|
|
widget.get_config(),
|
|
]
|
|
|
|
|
|
register(AdminDateInputAdapter(), AdminDateInput)
|
|
|
|
|
|
class AdminTimeInput(widgets.TimeInput):
|
|
template_name = "wagtailadmin/widgets/time_input.html"
|
|
|
|
def __init__(self, attrs=None, format=None):
|
|
default_attrs = {"autocomplete": "off"}
|
|
if attrs:
|
|
default_attrs.update(attrs)
|
|
fmt = format
|
|
if fmt is None:
|
|
fmt = getattr(settings, "WAGTAIL_TIME_FORMAT", DEFAULT_TIME_FORMAT)
|
|
self.js_format = to_datetimepicker_format(fmt)
|
|
super().__init__(attrs=default_attrs, format=fmt)
|
|
|
|
def get_config(self):
|
|
return {"format": self.js_format, "formatTime": self.js_format}
|
|
|
|
def get_context(self, name, value, attrs):
|
|
context = super().get_context(name, value, attrs)
|
|
context["widget"]["config_json"] = json.dumps(self.get_config())
|
|
return context
|
|
|
|
@property
|
|
def media(self):
|
|
return forms.Media(
|
|
js=[
|
|
versioned_static("wagtailadmin/js/date-time-chooser.js"),
|
|
]
|
|
)
|
|
|
|
|
|
class AdminTimeInputAdapter(WidgetAdapter):
|
|
js_constructor = "wagtail.widgets.AdminTimeInput"
|
|
|
|
def js_args(self, widget):
|
|
return [
|
|
widget.get_config(),
|
|
]
|
|
|
|
|
|
register(AdminTimeInputAdapter(), AdminTimeInput)
|
|
|
|
|
|
class AdminDateTimeInput(widgets.DateTimeInput):
|
|
template_name = "wagtailadmin/widgets/datetime_input.html"
|
|
|
|
def __init__(
|
|
self,
|
|
attrs=None,
|
|
format=None,
|
|
time_format=None,
|
|
js_overlay_parent_selector="body",
|
|
):
|
|
default_attrs = {"autocomplete": "off"}
|
|
fmt = format
|
|
if attrs:
|
|
default_attrs.update(attrs)
|
|
if fmt is None:
|
|
fmt = getattr(settings, "WAGTAIL_DATETIME_FORMAT", DEFAULT_DATETIME_FORMAT)
|
|
time_fmt = time_format
|
|
if time_fmt is None:
|
|
time_fmt = getattr(settings, "WAGTAIL_TIME_FORMAT", DEFAULT_TIME_FORMAT)
|
|
self.js_format = to_datetimepicker_format(fmt)
|
|
self.js_time_format = to_datetimepicker_format(time_fmt)
|
|
self.js_overlay_parent_selector = js_overlay_parent_selector
|
|
super().__init__(attrs=default_attrs, format=fmt)
|
|
|
|
def get_config(self):
|
|
return {
|
|
"dayOfWeekStart": get_format("FIRST_DAY_OF_WEEK"),
|
|
"format": self.js_format,
|
|
"formatTime": self.js_time_format,
|
|
# The parentID option actually takes a CSS selector instead of an ID
|
|
"parentID": self.js_overlay_parent_selector,
|
|
}
|
|
|
|
def get_context(self, name, value, attrs):
|
|
context = super().get_context(name, value, attrs)
|
|
|
|
context["widget"]["config_json"] = json.dumps(self.get_config())
|
|
|
|
return context
|
|
|
|
@property
|
|
def media(self):
|
|
return forms.Media(
|
|
js=[
|
|
versioned_static("wagtailadmin/js/date-time-chooser.js"),
|
|
]
|
|
)
|
|
|
|
|
|
class AdminDateTimeInputAdapter(WidgetAdapter):
|
|
js_constructor = "wagtail.widgets.AdminDateTimeInput"
|
|
|
|
def js_args(self, widget):
|
|
return [
|
|
widget.get_config(),
|
|
]
|
|
|
|
|
|
register(AdminDateTimeInputAdapter(), AdminDateTimeInput)
|