日期和日期时间字段的基于javascript的小部件。
zc.datetimewidget的Python项目详细描述
这个包提供了两种类型的小部件,日期小部件 和一个日期时间小部件。
Datetime and Date Widgets
这个包提供了两种类型的小部件,日期小部件 和一个日期时间小部件。
Date Widget
Date小部件只处理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的默认date widget相同的日期标记。
>>> widget._toFieldValue('2006/12/31') datetime.date(2006, 12, 31)
Datetime Widget
日期时间总是存储有时区意识的,默认情况下是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>)
Calendar Widget
Configuration
>>> 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)
Dumping 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
Date set widget
>>> 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>
Datetime Widget Demo
这个demo packe提供了一个简单的内容类,它使用 zc.datetimewidget
>>> from zope.testbrowser.testing import Browser >>> browser = Browser() >>> browser.handleErrors = False >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw') >>> browser.open('http://localhost/@@contents.html')
可以通过单击 添加菜单。给它起个名字。
>>> 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 'http://localhost/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
CHANGES
0.8.0 (2016-01-12)
- 使用^{tt2}摆脱zope.app.form依赖关系$ >;=4.0。
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)
- 修复了对原始日期时间对象的处理,它们不再导致 异常,但显示为未更改。当他们再次得救时 与所有其他时区一样,它们与UTC时区一起保存。
- 将datetimewidget.txtdoctest添加到long_description以显示 在PYPI主页上。
- 修复了setup.py中的主页名。
- 添加了要构建的覆盖率分析工具。
- 删除了不推荐的zpkg和zcml鼻涕虫。
0.6.2 (2009-05-20)
使用++resource++而不是@@/加载资源。
重命名“lang”目录(ZPublisher由于 在{TT11} $中存在同名的视图。
有关如何使用的详细信息,请参见gocept.datetimewidget zc.dateTimeWidget和zope2。
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)
- 初次发布。