| 1240 | |
| 1241 | |
| 1242 | class SplitDateTimeField(MultiValueField): |
| 1243 | widget = SplitDateTimeWidget |
| 1244 | hidden_widget = SplitHiddenDateTimeWidget |
| 1245 | default_error_messages = { |
| 1246 | "invalid_date": _("Enter a valid date."), |
| 1247 | "invalid_time": _("Enter a valid time."), |
| 1248 | } |
| 1249 | |
| 1250 | def __init__(self, *, input_date_formats=None, input_time_formats=None, **kwargs): |
| 1251 | errors = self.default_error_messages.copy() |
| 1252 | if "error_messages" in kwargs: |
| 1253 | errors.update(kwargs["error_messages"]) |
| 1254 | localize = kwargs.get("localize", False) |
| 1255 | fields = ( |
| 1256 | DateField( |
| 1257 | input_formats=input_date_formats, |
| 1258 | error_messages={"invalid": errors["invalid_date"]}, |
| 1259 | localize=localize, |
| 1260 | ), |
| 1261 | TimeField( |
| 1262 | input_formats=input_time_formats, |
| 1263 | error_messages={"invalid": errors["invalid_time"]}, |
| 1264 | localize=localize, |
| 1265 | ), |
| 1266 | ) |
| 1267 | super().__init__(fields, **kwargs) |
| 1268 | |
| 1269 | def compress(self, data_list): |
| 1270 | if data_list: |
| 1271 | # Raise a validation error if time or date is empty |
| 1272 | # (possible if SplitDateTimeField has required=False). |
| 1273 | if data_list[0] in self.empty_values: |
| 1274 | raise ValidationError( |
| 1275 | self.error_messages["invalid_date"], code="invalid_date" |
| 1276 | ) |
| 1277 | if data_list[1] in self.empty_values: |
| 1278 | raise ValidationError( |
| 1279 | self.error_messages["invalid_time"], code="invalid_time" |
| 1280 | ) |
| 1281 | result = datetime.datetime.combine(*data_list) |
| 1282 | return from_current_timezone(result) |
| 1283 | return None |
| 1284 | |
| 1285 | |
| 1286 | class GenericIPAddressField(CharField): |
no outgoing calls