Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/wtforms/fields/datetime.py: 37%

65 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-06-07 06:32 +0000

1import datetime 

2 

3from wtforms import widgets 

4from wtforms.fields.core import Field 

5from wtforms.utils import clean_datetime_format_for_strptime 

6 

7__all__ = ( 

8 "DateTimeField", 

9 "DateField", 

10 "TimeField", 

11 "MonthField", 

12 "DateTimeLocalField", 

13) 

14 

15 

16class DateTimeField(Field): 

17 """ 

18 A text field which stores a :class:`datetime.datetime` matching one or 

19 several formats. If ``format`` is a list, any input value matching any 

20 format will be accepted, and the first format in the list will be used 

21 to produce HTML values. 

22 """ 

23 

24 widget = widgets.DateTimeInput() 

25 

26 def __init__( 

27 self, label=None, validators=None, format="%Y-%m-%d %H:%M:%S", **kwargs 

28 ): 

29 super().__init__(label, validators, **kwargs) 

30 self.format = format if isinstance(format, list) else [format] 

31 self.strptime_format = clean_datetime_format_for_strptime(self.format) 

32 

33 def _value(self): 

34 if self.raw_data: 

35 return " ".join(self.raw_data) 

36 return self.data and self.data.strftime(self.format[0]) or "" 

37 

38 def process_formdata(self, valuelist): 

39 if not valuelist: 

40 return 

41 

42 date_str = " ".join(valuelist) 

43 for format in self.strptime_format: 

44 try: 

45 self.data = datetime.datetime.strptime(date_str, format) 

46 return 

47 except ValueError: 

48 self.data = None 

49 

50 raise ValueError(self.gettext("Not a valid datetime value.")) 

51 

52 

53class DateField(DateTimeField): 

54 """ 

55 Same as :class:`~wtforms.fields.DateTimeField`, except stores a 

56 :class:`datetime.date`. 

57 """ 

58 

59 widget = widgets.DateInput() 

60 

61 def __init__(self, label=None, validators=None, format="%Y-%m-%d", **kwargs): 

62 super().__init__(label, validators, format, **kwargs) 

63 

64 def process_formdata(self, valuelist): 

65 if not valuelist: 

66 return 

67 

68 date_str = " ".join(valuelist) 

69 for format in self.strptime_format: 

70 try: 

71 self.data = datetime.datetime.strptime(date_str, format).date() 

72 return 

73 except ValueError: 

74 self.data = None 

75 

76 raise ValueError(self.gettext("Not a valid date value.")) 

77 

78 

79class TimeField(DateTimeField): 

80 """ 

81 Same as :class:`~wtforms.fields.DateTimeField`, except stores a 

82 :class:`datetime.time`. 

83 """ 

84 

85 widget = widgets.TimeInput() 

86 

87 def __init__(self, label=None, validators=None, format="%H:%M", **kwargs): 

88 super().__init__(label, validators, format, **kwargs) 

89 

90 def process_formdata(self, valuelist): 

91 if not valuelist: 

92 return 

93 

94 time_str = " ".join(valuelist) 

95 for format in self.strptime_format: 

96 try: 

97 self.data = datetime.datetime.strptime(time_str, format).time() 

98 return 

99 except ValueError: 

100 self.data = None 

101 

102 raise ValueError(self.gettext("Not a valid time value.")) 

103 

104 

105class MonthField(DateField): 

106 """ 

107 Same as :class:`~wtforms.fields.DateField`, except represents a month, 

108 stores a :class:`datetime.date` with `day = 1`. 

109 """ 

110 

111 widget = widgets.MonthInput() 

112 

113 def __init__(self, label=None, validators=None, format="%Y-%m", **kwargs): 

114 super().__init__(label, validators, format, **kwargs) 

115 

116 

117class DateTimeLocalField(DateTimeField): 

118 """ 

119 Same as :class:`~wtforms.fields.DateTimeField`, but represents an 

120 ``<input type="datetime-local">``. 

121 """ 

122 

123 widget = widgets.DateTimeLocalInput() 

124 

125 def __init__(self, *args, **kwargs): 

126 kwargs.setdefault( 

127 "format", 

128 [ 

129 "%Y-%m-%d %H:%M:%S", 

130 "%Y-%m-%dT%H:%M:%S", 

131 "%Y-%m-%d %H:%M", 

132 "%Y-%m-%dT%H:%M", 

133 ], 

134 ) 

135 super().__init__(*args, **kwargs)