Source code for ls.joyous.edit_handlers

# ------------------------------------------------------------------------------
# Wagtail 2.x style EditHandlers
# ------------------------------------------------------------------------------
from django.conf import settings
from django.utils import timezone
from django.utils.formats import get_format_modules
from wagtail.admin.edit_handlers import (FieldPanel, MultiFieldPanel)
from wagtail.admin.widgets import AdminDateInput, AdminTimeInput
try:
    from wagtail.admin.localization import get_available_admin_languages
except ImportError:        # pragma: no cover
    from wagtail.admin.utils import get_available_admin_languages
from .widgets import ExceptionDateInput, Time12hrInput


# ------------------------------------------------------------------------------
[docs]class TZDatePanel(FieldPanel): """ Will display the timezone of the date if it is not the current TZ """ widget = AdminDateInput object_template = "joyous/edit_handlers/tz_date_object.html" def on_instance_bound(self): super().on_instance_bound() if not self.form: # wait for the form to be set, it will eventually be return localTZ = timezone.get_current_timezone() localTZName = timezone._get_timezone_name(localTZ) myTZ = getattr(self.instance, "tz", localTZ) myTZName = timezone._get_timezone_name(myTZ) if myTZName != localTZName: self.exceptionTZ = myTZName else: self.exceptionTZ = None
# ------------------------------------------------------------------------------
[docs]class ExceptionDatePanel(TZDatePanel): """ Used to select from the dates of the recurrence """ widget = ExceptionDateInput def on_instance_bound(self): super().on_instance_bound() if not self.form: # wait for the form to be set, it will eventually be return if not self.instance.overrides: return widget = self.form[self.field_name].field.widget widget.overrides_repeat = self.instance.overrides_repeat
# ------------------------------------------------------------------------------ def _add12hrFormats(): # Time12hrInput will not work unless django.forms.fields.TimeField # can process 12hr times, so sneak them into the default and all the # selectable locales that define TIME_INPUT_FORMATS. # strptime does not accept %P, %p is for both cases here. _12hrFormats = ['%I:%M%p', # 2:30pm '%I%p'] # 7am # TIME_INPUT_FORMATS is defined in django.conf.global_settings if not # by the user's local settings. if (_12hrFormats[0] not in settings.TIME_INPUT_FORMATS or _12hrFormats[1] not in settings.TIME_INPUT_FORMATS): settings.TIME_INPUT_FORMATS += _12hrFormats # Many of the built-in locales define TIME_INPUT_FORMATS langCodes = [language[0] for language in get_available_admin_languages()] langCodes.append(settings.LANGUAGE_CODE) for lang in langCodes: for module in get_format_modules(lang): inputFormats = getattr(module, 'TIME_INPUT_FORMATS', None) if (inputFormats is not None and (_12hrFormats[0] not in inputFormats or _12hrFormats[1] not in inputFormats)): inputFormats += _12hrFormats # ------------------------------------------------------------------------------
[docs]class TimePanel(FieldPanel): """ Used to select time using either a 12 or 24 hour time widget """ if getattr(settings, "JOYOUS_TIME_INPUT", "24") in (12, "12"): widget = Time12hrInput _add12hrFormats() else: widget = AdminTimeInput
# ------------------------------------------------------------------------------ try: # Use wagtailgmaps for location if it is installed # but don't depend upon it settings.INSTALLED_APPS.index('wagtailgmaps') from wagtailgmaps.edit_handlers import MapFieldPanel MapFieldPanel.UsingWagtailGMaps = True except (ValueError, ImportError): # pragma: no cover MapFieldPanel = FieldPanel # ------------------------------------------------------------------------------
[docs]class ConcealedPanel(MultiFieldPanel): """ A panel that can be hidden """ def __init__(self, children, heading, classname='', help_text=''): super().__init__(children, '', classname, '') self._heading = heading self._help_text = help_text def clone(self): return self.__class__(children=self.children, heading=self._heading, classname=self.classname, help_text=self._help_text) def on_instance_bound(self): super().on_instance_bound() if not self.request: # wait for the request to be set, it will eventually be return if self._show(): self.heading = self._heading self.help_text = self._help_text def render(self): return super().render() if self._show() else "" def _show(self): return False
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------