基于JavaScript的日期和日期时间字段小部件。
项目描述
本软件包提供了两种类型的小部件,日期小部件和日期时间小部件。
日期时间和日期小部件
本软件包提供了两种类型的小部件,日期小部件和日期时间小部件。
日期小部件
日期小部件只处理datetime.date对象,这些对象没有时区感知。我们在这里使用演示包来有一个内容类。
>>> from zope import component >>> from datetime import datetime, date >>> from zc.datetimewidget import datetimewidget >>> from zc.datetimewidget.demo.content import DemoContent >>> from zc.datetimewidget.demo.interfaces import IDemoContent >>> from zope.publisher.browser import TestRequest, BrowserLanguages >>> component.provideAdapter(BrowserLanguages) >>> request = TestRequest(HTTP_ACCEPT_LANGUAGE='en-US') >>> field = IDemoContent['startDate'] >>> widget = datetimewidget.DateWidget(field,request) >>> widget._toFormValue(None) u''
现在让我们转换一个实际日期。
>>> d = date(2006,5,1) >>> formValue = widget._toFormValue(d) >>> formValue '2006-05-01'>>> parsedValue = widget._toFieldValue(formValue) >>> parsedValue datetime.date(2006, 5, 1)
小部件处理与zope默认的datewidget相同的日期表示法。
>>> widget._toFieldValue('2006/12/31') datetime.date(2006, 12, 31)
日期时间小部件
日期时间始终存储为时区感知,并且默认使用UTC时区。
为了正确处理时区,Zope实例必须提供从IBrowserRequest到ITZInfo的适配器。实例使用的实现类型由实例决定。对于这次测试,我们只是使用demo.timezone模块的实现,该模块始终返回欧洲/维也纳作为时区。
字段的空值结果为空字符串。
>>> import pytz >>> from zc.datetimewidget.demo import timezone >>> component.provideAdapter(timezone.tzinfo) >>> tz = pytz.timezone('Europe/Vienna') >>> request = TestRequest(HTTP_ACCEPT_LANGUAGE='en-US') >>> field = IDemoContent['startDatetime'] >>> widget = datetimewidget.DatetimeWidget(field,request)>>> widget._toFormValue(None) u''
现在让我们转换一个实际的日期时间。
>>> dt = datetime(2006,5,1,12,tzinfo=pytz.utc) >>> formValue = widget._toFormValue(dt) >>> formValue '2006-05-01 14:00:00' >>> parsedValue = widget._toFieldValue(formValue) >>> parsedValue datetime.datetime(2006, 5, 1, 12, 0, tzinfo=<UTC>)
日期时间可能也是一个无知的日期时间(没有时区),但它会被保存为带有UTC时区信息的。
>>> naive_dt = datetime(2006,5,1,12) >>> formValue = widget._toFormValue(naive_dt) >>> formValue '2006-05-01 12:00:00' >>> parsedValue = widget._toFieldValue(formValue) >>> parsedValue datetime.datetime(2006, 5, 1, 10, 0, tzinfo=<UTC>)
尽管小部件首先尝试解析格式为‘%Y-%m-%d %H:%M:%S’的日期,但它将回退到核心datetimewidget的特定区域设置的解析。
>>> widget._toFieldValue('May 1, 2006 2:00:00 PM') datetime.datetime(2006, 5, 1, 12, 0, tzinfo=<UTC>)
日历小部件
配置
>>> from zope.interface.verify import verifyObject >>> from zc.datetimewidget.datetimewidget import ( ... CalendarWidgetConfiguration, ICalendarWidgetConfiguration)
让我们创建一个标准配置对象
>>> conf = CalendarWidgetConfiguration('field.x') >>> verifyObject(ICalendarWidgetConfiguration, conf) True
字段具有它们的默认值
>>> conf.daFormat u'%Y/%m/%d' >>> conf.singleClick True >>> print conf.flat None
我们可以在实例化期间自定义一些属性
>>> import datetime >>> conf = CalendarWidgetConfiguration('x', date=datetime.date(2006, 8, 25)) >>> conf.date datetime.date(2006, 8, 25)
导出JavaScript
配置可以以JavaScript的形式导出。首先是一个空配置
>>> print CalendarWidgetConfiguration('field.x').dumpJS() Calendar.setup({ <BLANKLINE> });
现在让我们添加一些自定义
>>> conf = CalendarWidgetConfiguration('x', daFormat=u'%m-%d', ... inputField='inp', eventName=None, date=conf.date) >>> print conf.dumpJS() Calendar.setup({ inputField: 'inp', eventName: null, daFormat: '%m-%d', date: new Date(2006, 7, 25) });
不接受无效的参数
>>> conf = CalendarWidgetConfiguration('x', foo='bar') Traceback (most recent call last): ... ValueError: unknown arguments: foo
日期设置小部件
>>> from zc.datetimewidget.datetimewidget import DateSetWidget >>> from zope.schema import Set >>> from zope.publisher.browser import TestRequest>>> class Context(object): ... somedates = set() >>> context = Context()>>> request = TestRequest() >>> field = Set(__name__='somedates') >>> field.set(context, set([datetime.date(2006, 12, 6), ... datetime.date(2006, 12, 7)])) >>> field = field.bind(context) >>> widget = DateSetWidget(field, object(), request)>>> print widget() # doctest: +REPORT_NDIFF <BLANKLINE> <input class="textType" id="field.somedates" name="field.somedates" size="30" type="text" value="" /> <input type="button" value="..." id="field.somedates_trigger"> <script type="text/javascript"> <BLANKLINE> var multi_field_somedates = [new Date(2006, 11, 6), new Date(2006, 11, 7)]; Calendar.setup({ inputField: 'field.somedates', button: 'field.somedates_trigger', ifFormat: '%Y-%m-%d', onClose: getMultipleDateClosedHandler("field.somedates", multi_field_somedates), multiple: multi_field_somedates }); <BLANKLINE> </script> <BLANKLINE>>>> print widget.hidden() # doctest: +REPORT_NDIFF <input class="hiddenType" id="field.somedates" name="field.somedates" type="hidden" value="" /> <input type="button" value="..." id="field.somedates_trigger"> <script type="text/javascript"> <BLANKLINE> var multi_field_somedates = [new Date(2006, 11, 6), new Date(2006, 11, 7)]; Calendar.setup({ inputField: 'field.somedates', button: 'field.somedates_trigger', ifFormat: '%Y-%m-%d', onClose: getMultipleDateClosedHandler("field.somedates", multi_field_somedates), multiple: multi_field_somedates }); <BLANKLINE> </script>
日期时间小部件演示
此演示包提供了一个简单的内容类,它使用zc.datetimewidget
>>> from zope.testbrowser.testing import Browser >>> browser = Browser() >>> browser.handleErrors = False >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw') >>> browser.open('https://127.0.0.1/@@contents.html')
您可以通过在添加菜单中点击“Datetimewidget演示”链接并给它一个名称来添加它。
>>> link = browser.getLink('Datetimewidget Demo') >>> link.click() >>> nameCtrl = browser.getControl(name='new_value') >>> nameCtrl.value = 'mydemo' >>> applyCtrl = browser.getControl('Apply') >>> applyCtrl.click() >>> link = browser.getLink('mydemo') >>> link.click() >>> browser.url 'https://127.0.0.1/mydemo/@@edit.html'
我们可以填写值
>>> browser.getControl('Start Date').value = '2006-11-15' >>> browser.getControl('End Date').value = '2006-11-16' >>> browser.getControl('Start Datetime').value = '2006-11-15T07:49:31Z' >>> browser.getControl('End Datetime').value = '2006-11-16T19:46:00Z' >>> browser.getControl('Several dates').value = '2006-11-20 2006-11-21 2006-11-22' >>> browser.getControl('Change').click()
并将它们保存
>>> 'Required input is missing' in browser.contents False>>> '2006-11-15' in browser.contents True >>> '2006-11-16' in browser.contents True >>> '07:49' in browser.contents True >>> '19:46' in browser.contents True >>> '2006-11-20 2006-11-21 2006-11-22' in browser.contents True
如果我们不填写某些字段,我们将得到缺失值错误
>>> browser.getControl('Start Date').value = '' >>> browser.getControl('Change').click() >>> 'Required input is missing' in browser.contents True
让我们退一步
>>> browser.getControl('Start Date').value = '2006-11-15' >>> browser.getControl('Change').click() >>> 'Required input is missing' in browser.contents False
现在让我们尝试不填写日期集字段
>>> browser.getControl('Several dates').value = '' >>> browser.getControl('Change').click() >>> 'Required input is missing' in browser.contents True
变更记录
0.8.0 (2016-01-12)
通过使用zope.formlib >= 4.0来消除对zope.app.form的依赖。
0.7.0 (2011-06-07)
使用需要zope.login的新版zope.publisher修复测试。
通过不使用已弃用的zope.app.securitypolicy来修复测试。
删除测试依赖项zope.app.server和zope.app.authentication。使用zope.password代替。
不再使用已弃用的zope.testing.doctestunit。使用Python的内置doctest。
0.6.4 (2009-10-20)
使日历弹出和拖动行为在IE的不同浏览器模式下更一致。
0.6.3 (2009-08-24)
修复了对原始datetime对象的处理,它们不再导致异常,而是显示未更改。再次保存时,它们将与所有其他对象一样以UTC时区保存。
将datetimewidget.txt doctest添加到long_description中,以便在pypi主页上显示。
修复了setup.py中的主页名称。
向buildout添加覆盖率分析工具。
删除了已弃用的zpkg和zcml别名。
0.6.2 (2009-05-20)
使用++resource++而不是@@/来加载资源。
重命名“lang”目录(ZPublisher由于在zope.traversing.namespace中存在具有相同名称的视图而感到困惑)。
有关如何使用zc.datetimewidget与zope2一起使用的详细信息,请参阅gocept.datetimewidget。
0.6.1 (2008-05-29)
从0.5.2未更改,但发布了新版本号,归功于在野外发现的具有0.6.1dev-rBFN修订版本的包。
0.5.2 (2007-11-03)
改进包数据。
开发适当的包依赖关系。
将功能测试合并到tests.py中。
0.5.1 (2006-06-15)
包含许可证和版权标题。
0.5.0 (2006-05-24)
初始发布。
项目详细信息
zc.datetimewidget-0.8.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f6627a62bfb5fd5c55d1e076100f91d2a80e24869dd97dcbfa909a6a91b66577 |
|
MD5 | 25e6c79de29530797092cbfe7c9cf184 |
|
BLAKE2b-256 | a13205acfd667c7670ded21287f4ad327d93c704d2d27b765e178c7c7e7794c0 |