1

最近、サイトをplone 4にアップグレードしましたが、日付が1970年より古い場合、カレンダーピッカーが機能しないことに気付きました。小さなデバッグの後、この行に問題があることに気付きました。

plone.app.form.widgets.datecomponents.py -> result method

1970年未満の日付の場合、date.timeTime結果は負の値になり、現地時間の方法では正の値が期待されます。

local_zone = date.localZone(localtime(date.timeTime()))

ヘルプ、アイデア、提案は常に良いです

これがトレースバックです

Traceback (innermost last):
  Module ZPublisher.Publish, line 126, in publish
  Module ZPublisher.mapply, line 77, in mapply
  Module ZPublisher.Publish, line 46, in call_object
  Module Products.CMFFormController.ControllerPageTemplate, line 75, in __call__
  Module Products.CMFFormController.BaseControllerPageTemplate, line 31, in _call
  Module Shared.DC.Scripts.Bindings, line 322, in __call__
  Module Shared.DC.Scripts.Bindings, line 359, in _bindAndExec
  Module Products.PageTemplates.ZopePageTemplate, line 334, in _exec
  Module Products.PageTemplates.ZopePageTemplate, line 431, in pt_render
  Module Products.PageTemplates.PageTemplate, line 79, in pt_render
  Module zope.pagetemplate.pagetemplate, line 113, in pt_render
  Module zope.tal.talinterpreter, line 271, in __call__
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 888, in do_useMacro
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 533, in do_optTag_tal
  Module zope.tal.talinterpreter, line 518, in do_optTag
  Module zope.tal.talinterpreter, line 513, in no_tag
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 954, in do_defineSlot
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 533, in do_optTag_tal
  Module zope.tal.talinterpreter, line 518, in do_optTag
  Module zope.tal.talinterpreter, line 513, in no_tag
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 858, in do_defineMacro
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 954, in do_defineSlot
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 533, in do_optTag_tal
  Module zope.tal.talinterpreter, line 518, in do_optTag
  Module zope.tal.talinterpreter, line 513, in no_tag
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 946, in do_defineSlot
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 533, in do_optTag_tal
  Module zope.tal.talinterpreter, line 518, in do_optTag
  Module zope.tal.talinterpreter, line 513, in no_tag
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 821, in do_loop_tal
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 533, in do_optTag_tal
  Module zope.tal.talinterpreter, line 518, in do_optTag
  Module zope.tal.talinterpreter, line 513, in no_tag
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 888, in do_useMacro
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 583, in do_setLocal_tal
  Module zope.tales.tales, line 696, in evaluate
   - URL: calendar_macros
   - Line 12, Column 4
   - Expression: <PythonExpr date_components_support_view.result(inputvalue, 0, starting_year, ending_year, future_years)>
   - Names:
      {'container': <ATFolder at /rcseng/account>,
       'context': <ATFolder at /rcseng/account>,
       'default': <object object at 0x01DE1830>,
       'here': <ATFolder at /rcseng/account>,
       'loop': {u'record': <Products.PageTemplates.Expressions.PathIterator object at 0x0E0BEAB0>},
       'nothing': None,
       'options': {'args': (),
                   'state': <Products.CMFFormController.ControllerState.ControllerState object at 0x0E287F30>},
       'repeat': <Products.PageTemplates.Expressions.SafeMapping object at 0x0E21E810>,
       'request': <HTTPRequest, URL=http://dev.rcseng.ac.uk/account/my_details>,
       'root': <Application at >,
       'template': <ControllerPageTemplate at /rcseng/account/my_details>,
       'traverse_subpath': [],
       'user': <PloneUser '227225'>}
  Module Products.PageTemplates.ZRPythonExpr, line 48, in __call__
   - __traceback_info__: date_components_support_view.result(inputvalue, 0, starting_year, ending_year, future_years)
  Module PythonExpr, line 1, in <expression>
  Module plone.app.form.widgets.datecomponents, line 97, in result
ValueError: (22, 'Invalid argument')
4

1 に答える 1

3

これをさらに調査すると、報告した問題を実際に再現できます。Windowsを除くほとんどのプラットフォームで、エポック前(1970年1月1日)の日付を問題なく入力できました。

確かに、ZopeのDateTimeインスタンスは、エポックの前のタイムスタンプに負の2番目の値を使用しますが、Pythontime.localtime通常、負の値を適切に処理できます。

>>> import time
>>> time.localtime(-10000)
time.struct_time(tm_year=1969, tm_mon=12, tm_mday=31, tm_hour=22, tm_min=13, tm_sec=20, tm_wday=2, tm_yday=365, tm_isdst=0)

私はこれをMac、FreeBSD、Linuxのいくつかのpython2.xリリースでテストしました。ただし、これをWindowsでテストすると、実際にValueErrorが発生します。これはPythonとPloneのバージョン全体の問題であり、Windows固有の問題であることに注意してください。

問題のコードは、指定された日付のローカルタイムゾーンを決定しようとしています。これは、夏時間(夏時間)または冬時間のいずれかです。したがって、Windowsでは、この計算を機能させるために、日付の年を現在の年に交換することもできます。正確なローカルタイムゾーンによっては、DSTの計算が間違っている可能性がありますが、1970年より前の日付の正しい計算を取得できないため、これは適切な妥協案です

私は今、97行目の次の置換をgitにコミットしました(コミット63b043a7ba):

try:
    local_zone = date.localZone(localtime(date.timeTime()))
except ValueError:
    # Dates before 1970 use a negative timeTime() value, which on
    # on some platforms are not handled well and lead to a ValueError.
    # In those cases, calculate the local timezone (which is DST based)
    # from the same date in the *current year* instead. This is better
    # than failing altogether!
    timeZoneDate = DateTime(localtime().tm_year, *date.parts()[1:])
    local_zone = date.localZone(localtime(timeZoneDate.timeTime()))

これをローカルのeggで使用するか、パッケージの2.1ブランチの新しいリリースを待ちます。

于 2012-08-02T16:10:40.070 に答える