Changeset 8207
- Timestamp:
- 18 Apr 2012, 12:46:52 (13 years ago)
- Location:
- main/waeup.kofa/trunk/src/waeup/kofa/widgets
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
main/waeup.kofa/trunk/src/waeup/kofa/widgets/datetimewidget.py
r8198 r8207 20 20 import datetime 21 21 import pytz 22 from zope.component import queryUtility 23 from zope.datetime import parseDatetimetz 24 from zope.datetime import DateTimeError 25 from zope.formlib.i18n import _ 26 from zope.formlib.interfaces import ConversionError 22 27 from zope.formlib.textwidgets import DatetimeWidget 28 from waeup.kofa.utils.helpers import to_timezone 29 from waeup.kofa.interfaces import IKofaUtils 30 31 class _DummyUtils(object): 32 tzinfo = pytz.utc 33 34 # A fallback, if no IKofaUtils can be found 35 _DUMMY_UTILS = _DummyUtils() 23 36 24 37 class PytzDatetimeWidget(DatetimeWidget): … … 38 51 go into the DB. 39 52 53 For datetimes without any timezone set, we interpret the input to 54 be meant as local app-time. I.e. if application TZ is 55 ``Africa/Lagos``, we assume that a string like '2012-02-01 12:13' 56 (apparently not providing TZ info) was meant as 12:13 h Lagos 57 time. 58 40 59 From zope.datetime, however, we save the parser abilities to 41 60 interpret even bizarre entered data as some datetime. … … 47 66 48 67 """ 49 value = super(PytzDatetimeWidget, self)._toFieldValue(string) 68 if string == self._missing: 69 return self.context.missing_value 70 else: 71 try: 72 # Different to original implementation we do not 73 # automatically request local server time if no TZ was 74 # set in `string`. In this case we want a datetime with 75 # tzinfo set to `None` instead. 76 value = parseDatetimetz(string, local=False) 77 except (DateTimeError, ValueError, IndexError), v: 78 raise ConversionError(_("Invalid datetime data"), v) 79 50 80 if not isinstance(value, datetime.datetime): 51 81 return value 52 82 if value.tzinfo is None: 53 return pytz.utc.localize(value) 83 utils = queryUtility(IKofaUtils, default=_DUMMY_UTILS) 84 value = utils.tzinfo.localize(value) 54 85 return value.astimezone(pytz.utc) -
main/waeup.kofa/trunk/src/waeup/kofa/widgets/tests/test_datetimewidget.py
r8199 r8207 3 3 import pytz 4 4 from zope import schema 5 from zope.component import getGlobalSiteManager 5 6 from zope.formlib import form 6 7 from zope.formlib.interfaces import IInputWidget, IDisplayWidget … … 11 12 from zope.interface.verify import verifyClass, verifyObject 12 13 from zope.publisher.browser import TestRequest 14 from waeup.kofa.interfaces import IKofaUtils 13 15 from waeup.kofa.widgets.datetimewidget import PytzDatetimeWidget 14 16 … … 25 27 form_fields = form.fields(IContent) 26 28 form_fields['my_dt'].custom_widget = PytzDatetimeWidget 29 30 class FakeUtils(object): 31 # Fake app-wide set timezone. 32 implements(IKofaUtils) 33 tzinfo = pytz.timezone('America/Sao_Paulo') 34 27 35 28 36 class PytzDatetimeWidgetTests(FunctionalWidgetTestCase): … … 66 74 self.assertTrue(content.my_dt.tzinfo is pytz.utc) 67 75 return 76 77 def setUp(self): 78 super(PytzDatetimeWidgetTests, self).setUp() 79 self.gsm = getGlobalSiteManager() 80 self.utils = FakeUtils() 81 self.gsm.registerUtility(self.utils) 82 return 83 84 def tearDown(self): 85 super(PytzDatetimeWidgetTests, self).tearDown() 86 self.gsm.unregisterUtility(self.utils) 87 return 88 89 def test_datetimes_wo_tz(self): 90 # Datetimes w/o tz are considered to be meant in app-wide timezone. 91 content = Content() 92 request = TestRequest() 93 94 request.form['form.my_dt'] = u'2011-11-11 11:11:11' 95 request.form['form.actions.apply'] = u'' 96 SampleForm(content, request)() 97 98 # Sao Paulo was two hours back UTC on 2011-11-11 99 self.assertEqual(content.my_dt, datetime.datetime( 100 2011, 11, 11, 13, 11, 11, tzinfo=pytz.utc)) 101 self.assertTrue(content.my_dt.tzinfo is pytz.utc) 102 return
Note: See TracChangeset for help on using the changeset viewer.