跳转到主要内容

基于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.serverzope.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 (54.8 kB 查看哈希值)

上传时间

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面