Fixed #26281 -- Added a helpful error message for an invalid format specifier to dateformat.format().

This commit is contained in:
Marko Benko 2016-04-03 19:31:35 +02:00 committed by Tim Graham
parent b040ac06eb
commit 45c7acdc50
3 changed files with 18 additions and 2 deletions

View File

@ -767,10 +767,10 @@ def time(value, arg=None):
return '' return ''
try: try:
return formats.time_format(value, arg) return formats.time_format(value, arg)
except AttributeError: except (AttributeError, TypeError):
try: try:
return time_format(value, arg) return time_format(value, arg)
except AttributeError: except (AttributeError, TypeError):
return '' return ''

View File

@ -34,6 +34,11 @@ class Formatter(object):
pieces = [] pieces = []
for i, piece in enumerate(re_formatchars.split(force_text(formatstr))): for i, piece in enumerate(re_formatchars.split(force_text(formatstr))):
if i % 2: if i % 2:
if type(self.data) is datetime.date and hasattr(TimeFormat, piece):
raise TypeError(
"The format for date objects may not contain "
"time-related format specifiers (found '%s')." % piece
)
pieces.append(force_text(getattr(self, piece)())) pieces.append(force_text(getattr(self, piece)()))
elif piece: elif piece:
pieces.append(re_escaped.sub(r'\1', piece)) pieces.append(re_escaped.sub(r'\1', piece))

View File

@ -153,3 +153,14 @@ class DateFormatTests(SimpleTestCase):
# Ticket #16924 -- We don't need timezone support to test this # Ticket #16924 -- We don't need timezone support to test this
self.assertEqual(dateformat.format(aware_dt, 'O'), '-0330') self.assertEqual(dateformat.format(aware_dt, 'O'), '-0330')
def test_invalid_time_format_specifiers(self):
my_birthday = date(1984, 8, 7)
for specifier in ['a', 'A', 'f', 'g', 'G', 'h', 'H', 'i', 'P', 's', 'u']:
msg = (
"The format for date objects may not contain time-related "
"format specifiers (found '%s')." % specifier
)
with self.assertRaisesMessage(TypeError, msg):
dateformat.format(my_birthday, specifier)