Skip to content

Commit

Permalink
Merge pull request #204 from plone/datetimewidget-converteradaption
Browse files Browse the repository at this point in the history
Date/time widget: Get the dataconverter via adapter registration and …
  • Loading branch information
petschki authored May 6, 2024
2 parents 942b0c5 + b5d31fd commit 42ff108
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 22 deletions.
4 changes: 4 additions & 0 deletions news/204.internal
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Date/time widget: Fix data converter adaption.
Get the data converter for the date and datetime widgets via adaption and remove the _converter attribute hack.
This aligns the code to z3c.form standards and allows to override the data converter which was previously not easily possible.
[thet]
33 changes: 18 additions & 15 deletions plone/app/z3cform/tests/test_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from unittest.mock import Mock
from z3c.form.form import EditForm
from z3c.form.form import Form
from z3c.form.interfaces import IDataConverter
from z3c.form.interfaces import IValue
from z3c.form.interfaces import IWidget
from z3c.form.widget import FieldWidget
Expand Down Expand Up @@ -265,10 +266,14 @@ def test_widget_required(self):
pattern_options = self.widget.get_pattern_options()
self.assertEqual(pattern_options["clear"], False)

def test_data_converter(self):
from plone.app.z3cform.widgets.datetime import DateWidgetConverter
def test_datewidget_data_converter_adaption(self):
from plone.app.z3cform.converters import DateWidgetConverter

converter = getMultiAdapter((self.field, self.widget), IDataConverter)
self.assertEqual(DateWidgetConverter, converter.__class__)

converter = DateWidgetConverter(self.field, self.widget)
def test_data_converter(self):
converter = getMultiAdapter((self.field, self.widget), IDataConverter)

self.assertEqual(
converter.field.missing_value,
Expand Down Expand Up @@ -375,10 +380,14 @@ def test_widget_required(self):
pattern_options = self.widget.get_pattern_options()
self.assertEqual(pattern_options["clear"], False)

def test_data_converter(self):
from plone.app.z3cform.widgets.datetime import DatetimeWidgetConverter
def test_datetimewidget_data_converter_adaption(self):
from plone.app.z3cform.converters import DatetimeWidgetConverter

converter = DatetimeWidgetConverter(self.field, self.widget)
converter = getMultiAdapter((self.field, self.widget), IDataConverter)
self.assertEqual(DatetimeWidgetConverter, converter.__class__)

def test_data_converter(self):
converter = getMultiAdapter((self.field, self.widget), IDataConverter)

self.assertEqual(
converter.toFieldValue(""),
Expand Down Expand Up @@ -412,16 +421,14 @@ def test_data_converter(self):

def test_data_converter__no_timezone(self):
"""When no timezone is set, don't apply one."""
from plone.app.z3cform.widgets.datetime import DatetimeWidgetConverter

context = Mock()

dt = datetime(2013, 11, 13, 10, 20)
setattr(context, self.field.getName(), dt)
self.widget.context = context
self.widget.default_timezone = None

converter = DatetimeWidgetConverter(self.field, self.widget)
converter = getMultiAdapter((self.field, self.widget), IDataConverter)
self.assertEqual(
converter.toFieldValue("2013-11-13T10:20"),
datetime(2013, 11, 13, 10, 20),
Expand All @@ -433,8 +440,6 @@ def test_data_converter__no_timezone(self):

def test_data_converter__timezone_id(self):
"""When a (pytz) timezone id is set, use that."""
from plone.app.z3cform.widgets.datetime import DatetimeWidgetConverter

context = Mock()

dt = datetime(2013, 11, 13, 10, 20)
Expand All @@ -443,7 +448,7 @@ def test_data_converter__timezone_id(self):
self.widget.default_timezone = "Europe/Amsterdam"
tz = pytz.timezone("Europe/Amsterdam")

converter = DatetimeWidgetConverter(self.field, self.widget)
converter = getMultiAdapter((self.field, self.widget), IDataConverter)
self.assertEqual(
converter.toFieldValue("2013-11-13T10:20"),
tz.localize(datetime(2013, 11, 13, 10, 20)),
Expand All @@ -457,8 +462,6 @@ def test_data_converter__timezone_callback(self):
"""When a timezone callback is set, returning a (pytz) timezone id,
use that.
"""
from plone.app.z3cform.widgets.datetime import DatetimeWidgetConverter

context = Mock()

dt = datetime(2013, 11, 13, 10, 20)
Expand All @@ -467,7 +470,7 @@ def test_data_converter__timezone_callback(self):
self.widget.default_timezone = lambda context: "Europe/Amsterdam"
tz = pytz.timezone("Europe/Amsterdam")

converter = DatetimeWidgetConverter(self.field, self.widget)
converter = getMultiAdapter((self.field, self.widget), IDataConverter)
self.assertEqual(
converter.toFieldValue("2013-11-13T10:20"),
tz.localize(datetime(2013, 11, 13, 10, 20)),
Expand Down
13 changes: 6 additions & 7 deletions plone/app/z3cform/widgets/datetime.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from plone.app.z3cform.converters import DatetimeWidgetConverter
from plone.app.z3cform.converters import DateWidgetConverter
from plone.app.z3cform.interfaces import IDatetimeWidget
from plone.app.z3cform.interfaces import IDateWidget
from plone.app.z3cform.interfaces import ITimeWidget
from plone.app.z3cform.utils import dict_merge
from plone.app.z3cform.widgets.base import HTMLTextInputWidget
from plone.base import PloneMessageFactory as _
from z3c.form.interfaces import IDataConverter
from z3c.form.interfaces import IFieldWidget
from z3c.form.widget import FieldWidget
from z3c.form.widget import Widget
from zope.component import getMultiAdapter
from zope.i18n import translate
from zope.interface import implementer
from zope.interface import implementer_only
Expand All @@ -27,7 +27,6 @@ def get_date_options(request):

class DateTimeWidgetBase(HTMLTextInputWidget, Widget):
_input_type = ""
_converter = None
_formater = ""
_formater_length = ""

Expand Down Expand Up @@ -63,10 +62,12 @@ def render(self):
if not self.value:
return ""

if not self._converter:
converter = getMultiAdapter((self.field, self), IDataConverter)

if not converter:
return self.value

field_value = self._converter(self.field, self).toFieldValue(self.value)
field_value = converter.toFieldValue(self.value)
if field_value is self.field.missing_value:
return ""

Expand All @@ -82,7 +83,6 @@ class DateWidget(DateTimeWidgetBase):
"""Date widget for z3c.form."""

_input_type = "date"
_converter = DateWidgetConverter
_formater = "date"
_formater_length = "short"

Expand All @@ -100,7 +100,6 @@ class DatetimeWidget(DateTimeWidgetBase):
"""Datetime widget for z3c.form."""

_input_type = "datetime-local"
_converter = DatetimeWidgetConverter
_formater = "dateTime"
_formater_length = "short"

Expand Down

0 comments on commit 42ff108

Please sign in to comment.