1. from datetime import datetime
    
  2. 
    
  3. from django.forms import CharField, DateTimeInput, Form
    
  4. from django.test import ignore_warnings
    
  5. from django.utils import translation
    
  6. from django.utils.deprecation import RemovedInDjango50Warning
    
  7. 
    
  8. from .base import WidgetTest
    
  9. 
    
  10. 
    
  11. class DateTimeInputTest(WidgetTest):
    
  12.     widget = DateTimeInput()
    
  13. 
    
  14.     def test_render_none(self):
    
  15.         self.check_html(self.widget, "date", None, '<input type="text" name="date">')
    
  16. 
    
  17.     def test_render_value(self):
    
  18.         """
    
  19.         The microseconds are trimmed on display, by default.
    
  20.         """
    
  21.         d = datetime(2007, 9, 17, 12, 51, 34, 482548)
    
  22.         self.assertEqual(str(d), "2007-09-17 12:51:34.482548")
    
  23.         self.check_html(
    
  24.             self.widget,
    
  25.             "date",
    
  26.             d,
    
  27.             html=('<input type="text" name="date" value="2007-09-17 12:51:34">'),
    
  28.         )
    
  29.         self.check_html(
    
  30.             self.widget,
    
  31.             "date",
    
  32.             datetime(2007, 9, 17, 12, 51, 34),
    
  33.             html=('<input type="text" name="date" value="2007-09-17 12:51:34">'),
    
  34.         )
    
  35.         self.check_html(
    
  36.             self.widget,
    
  37.             "date",
    
  38.             datetime(2007, 9, 17, 12, 51),
    
  39.             html=('<input type="text" name="date" value="2007-09-17 12:51:00">'),
    
  40.         )
    
  41. 
    
  42.     def test_render_formatted(self):
    
  43.         """
    
  44.         Use 'format' to change the way a value is displayed.
    
  45.         """
    
  46.         widget = DateTimeInput(
    
  47.             format="%d/%m/%Y %H:%M",
    
  48.             attrs={"type": "datetime"},
    
  49.         )
    
  50.         d = datetime(2007, 9, 17, 12, 51, 34, 482548)
    
  51.         self.check_html(
    
  52.             widget,
    
  53.             "date",
    
  54.             d,
    
  55.             html='<input type="datetime" name="date" value="17/09/2007 12:51">',
    
  56.         )
    
  57. 
    
  58.     @translation.override("de-at")
    
  59.     def test_l10n(self):
    
  60.         d = datetime(2007, 9, 17, 12, 51, 34, 482548)
    
  61.         self.check_html(
    
  62.             self.widget,
    
  63.             "date",
    
  64.             d,
    
  65.             html=('<input type="text" name="date" value="17.09.2007 12:51:34">'),
    
  66.         )
    
  67. 
    
  68.     @translation.override("de-at")
    
  69.     def test_locale_aware(self):
    
  70.         d = datetime(2007, 9, 17, 12, 51, 34, 482548)
    
  71.         # RemovedInDjango50Warning: When the deprecation ends, remove
    
  72.         # @ignore_warnings and USE_L10N=False. The assertion should remain
    
  73.         # because format-related settings will take precedence over
    
  74.         # locale-dictated formats.
    
  75.         with ignore_warnings(category=RemovedInDjango50Warning):
    
  76.             with self.settings(USE_L10N=False):
    
  77.                 with self.settings(
    
  78.                     DATETIME_INPUT_FORMATS=[
    
  79.                         "%Y-%m-%d %H:%M:%S",
    
  80.                         "%Y-%m-%d %H:%M:%S.%f",
    
  81.                         "%Y-%m-%d %H:%M",
    
  82.                     ]
    
  83.                 ):
    
  84.                     self.check_html(
    
  85.                         self.widget,
    
  86.                         "date",
    
  87.                         d,
    
  88.                         html=(
    
  89.                             '<input type="text" name="date" '
    
  90.                             'value="2007-09-17 12:51:34">'
    
  91.                         ),
    
  92.                     )
    
  93.         with translation.override("es"):
    
  94.             self.check_html(
    
  95.                 self.widget,
    
  96.                 "date",
    
  97.                 d,
    
  98.                 html='<input type="text" name="date" value="17/09/2007 12:51:34">',
    
  99.             )
    
  100. 
    
  101.     def test_fieldset(self):
    
  102.         class TestForm(Form):
    
  103.             template_name = "forms_tests/use_fieldset.html"
    
  104.             field = CharField(widget=self.widget)
    
  105. 
    
  106.         form = TestForm()
    
  107.         self.assertIs(self.widget.use_fieldset, False)
    
  108.         self.assertHTMLEqual(
    
  109.             '<div><label for="id_field">Field:</label>'
    
  110.             '<input id="id_field" name="field" required type="text"></div>',
    
  111.             form.render(),
    
  112.         )