Edgewall Software
Modify

Ticket #10505 (closed defect: fixed)

Opened 5 months ago

Last modified 5 months ago

KeyError: 's'

Reported by: lauril Owned by: jomae
Priority: normal Milestone: 0.13
Component: i18n Version: 0.13dev
Severity: normal Keywords:
Cc:
Release Notes:
API Changes:

Description

How to Reproduce

While doing a POST operation on /milestone, Trac issued an internal error.

(please provide additional details here)

Request parameters:

{'__FORM_TOKEN': u'835642a9d0422462ff43283e',
 'action': u'edit',
 'completed': u'on',
 'completeddate': u'Fed 29, 2012 4:00:00 PM',
 'description': u"'''Syfte:'''\r\nEtt f\xf6rsta steg f\xf6r att utv\xe4rdera om ",
 'due': u'on',
 'duedate': u'Dec 17, 2011 6:00:00 PM',
 'id': u'',
 'name': u'Akvik traffik plats'}

User agent: Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0

System Information

Trac 0.13dev-r10883
Babel 0.9.4
Docutils 0.6
Genshi 0.6
mod_wsgi 3.2 (WSGIProcessGroup WSGIApplicationGroup %{GLOBAL})
MySQL server: "5.1.52", client: "5.1.52", thread-safe: 0
MySQLdb 1.2.3c1
Pygments 1.1.1
Python 2.6.5 (r265:79063, Jun 25 2011, 08:36:25)
[GCC 4.4.4 20100726 (Red Hat 4.4.4-13)]
setuptools 0.6
Subversion 1.6.11 (r934486)
jQuery 1.5.1

Enabled Plugins

NavAdd 0.1
Trac-jsGantt 0.9-r10876
TracAccountManager 0.3.2
TracListOfWikiPagesMacro 0.4
TracSumStats 0.9.0
WikiTableMacro 0.1-r10442

Python Traceback

Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/Trac-0.13dev_r10883-py2.6.egg/trac/web/main.py", line 478, in _dispatch_request
    dispatcher.dispatch(req)
  File "/usr/lib/python2.6/site-packages/Trac-0.13dev_r10883-py2.6.egg/trac/web/main.py", line 198, in dispatch
    resp = chosen_handler.process_request(req)
  File "/usr/lib/python2.6/site-packages/Trac-0.13dev_r10883-py2.6.egg/trac/ticket/roadmap.py", line 679, in process_request
    return self._do_save(req, milestone)
  File "/usr/lib/python2.6/site-packages/Trac-0.13dev_r10883-py2.6.egg/trac/ticket/roadmap.py", line 754, in _do_save
    hint='datetime') if completed else None
  File "/usr/lib/python2.6/site-packages/Trac-0.13dev_r10883-py2.6.egg/trac/util/datefmt.py", line 594, in user_time
    return func(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/Trac-0.13dev_r10883-py2.6.egg/trac/util/datefmt.py", line 346, in parse_date
    dt = _i18n_parse_date(text, tzinfo, locale)
  File "/usr/lib/python2.6/site-packages/Trac-0.13dev_r10883-py2.6.egg/trac/util/datefmt.py", line 459, in _i18n_parse_date
    month_names, tzinfo)
  File "/usr/lib/python2.6/site-packages/Trac-0.13dev_r10883-py2.6.egg/trac/util/datefmt.py", line 478, in _i18n_parse_date_0
    matches.insert(order['s'], 0)
KeyError: 's'

Attachments

Change History

comment:1 Changed 5 months ago by rblank

  • Component changed from general to i18n
  • Milestone set to 0.13
  • Owner set to jomae

Mmh… No idea what what's wrong here. Jun?

comment:2 Changed 5 months ago by cboos

It's easy to reproduce:

>>> from trac.util.datefmt import *
>>> parse_date("Fed 29, 2012 4:00:00 PM", locale='en_US')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "trac\util\datefmt.py", line 346, in parse_date
    dt = _i18n_parse_date(text, tzinfo, locale)
  File "trac\util\datefmt.py", line 459, in _i18n_parse_date
    month_names, tzinfo)
  File "trac\util\datefmt.py", line 478, in _i18n_parse_date_0
    matches.insert(order['s'], 0)
KeyError: 's'

Adding a print(repr((matches, order))) just before the order['s'] line shows:

(['29', '2012', '4', '00', '00'], {'M': 1, 'd': 0, 'h': 3, 'm': 4, 's': 5, 'y': 2})
(['29', '2012', '4', '00', '00'], {'y': 2, 'M': 1, 'd': 0})

which suggests that for a locale there can be a date+time and date only patterns.
The if len(matches) == 5 check (which I suspect is there to cope with a date+time spec where the seconds are missing) will not work for date only patterns. Note that here we have seconds, but as "Fed" is not recognized as a month, the date+time pattern will not match and the date only is then tried and fails. There are also other ways to trigger the error, like with parse_date("2012 29 4:00 Feb", locale='en_US').

Suggested fix:

  • trac/util/datefmt.py

     
    474474            del matches[idx] 
    475475            break 
    476476 
    477     if len(matches) == 5: 
     477    # for date+time patterns, use 0 seconds if seconds are missing 
     478    if len(matches) == 5 and 's' in order: 
    478479        matches.insert(order['s'], 0) 
    479480 
    480481    values = {} 

Leaving final fix and say on the matter (and extra unit-tests) for Jun ;-)

comment:3 Changed 5 months ago by jomae

  • Status changed from new to assigned

Thanks, Christian :)

I'll work at this evening.

comment:4 Changed 5 months ago by jomae

  • Resolution set to fixed
  • Status changed from assigned to closed

Fixed in [10891] and added unit tests.
Thanks for the report.

View

Add a comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
The resolution will be deleted. Next status will be 'reopened'
to The owner will be changed from jomae. Next status will be 'closed'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.