Compare commits

...
1 Commits
Author SHA1 Message Date
Raphael Michel b382f30995 Make it harder for dates way in the past to enter the system
The input components even allow adding setting dates before christus,
but then retrieving the rows back from the DB is impossible:

    File "django/db/models/sql/compiler.py", line 1661, in execute_sql
      return list(result)
    File "django/db/models/sql/compiler.py", line 2171, in cursor_iter
      for rows in iter((lambda: cursor.fetchmany(itersize)), sentinel):
    File "django/db/models/sql/compiler.py", line 2171, in <lambda>
      for rows in iter((lambda: cursor.fetchmany(itersize)), sentinel):
    File "django/db/utils.py", line 98, in inner
      return func(*args, **kwargs)
    ValueError: year -1 is out of range
2026-11-13 10:11:44 +01:00
6 changed files with 60 additions and 1 deletions

No files matched your search

+1 -1
View File
@@ -27,4 +27,4 @@ class PretixApiConfig(AppConfig):
label = 'pretixapi'
def ready(self):
from . import signals, webhooks # noqa
from . import monkeypatches, signals, webhooks # noqa
+27
View File
@@ -0,0 +1,27 @@
import datetime
from django.db import models
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
class CustomDateField(serializers.DateField):
def to_internal_value(self, value):
val = super().to_internal_value(value)
if val < datetime.date(1900, 1, 1):
raise ValidationError("Do not pass dates before 1900-01-01")
return val
class CustomDateTimeField(serializers.DateTimeField):
def to_internal_value(self, value):
val = super().to_internal_value(value)
if val < datetime.datetime(1900, 1, 1, tzinfo=datetime.timezone.utc):
raise ValidationError("Do not pass dates before 1900-01-01")
return val
serializers.ModelSerializer.serializer_field_mapping.update({
models.DateField: CustomDateField,
models.DateTimeField: CustomDateTimeField,
})
+2
View File
@@ -424,6 +424,8 @@ class SplitDateTimeField(forms.SplitDateTimeField):
return None
if data_list[1] in self.empty_values:
raise ValidationError(self.error_messages['invalid_date'], code='invalid_date')
if data_list[0] < datetime.date(1900, 1, 1):
raise ValidationError(self.error_messages['invalid_date'], code='invalid_date')
result = datetime.datetime.combine(*data_list)
return from_current_timezone(result)
return None
@@ -166,6 +166,8 @@ let form_handlers = function (el) {
if ($(this).is('[data-min]')) {
opts['minDate'] = $(this).attr('data-min')
opts['viewDate'] = $(this).attr('data-min')
} else {
opts['minDate'] = '1900-01-01'
}
if ($(this).is('[data-max]')) {
opts['maxDate'] = $(this).attr('data-max')
@@ -54,6 +54,8 @@ let form_handlers = function (el) {
if ($(this).is('[data-min]')) {
opts['minDate'] = $(this).attr('data-min')
opts['viewDate'] = $(this).attr('data-min')
} else {
opts['minDate'] = '1900-01-01'
}
if ($(this).is('[data-max]')) {
opts['maxDate'] = $(this).attr('data-max')
+26
View File
@@ -365,6 +365,32 @@ def test_event_create(team, token_client, organizer, event, meta_prop):
assert resp.status_code == 400
assert resp.content.decode() == '{"slug":["This slug has already been used for a different event."]}'
resp = token_client.post(
'/api/v1/organizers/{}/events/'.format(organizer.slug),
{
"name": {
"de": "Demo Konference 2020 Test",
"en": "Demo Conference 2020 Test"
},
"live": False,
"currency": "EUR",
"date_from": "1817-12-27T10:00:00Z",
"date_to": "1817-12-28T10:00:00Z",
"date_admission": None,
"is_public": False,
"presale_start": None,
"presale_end": None,
"location": None,
"slug": "newslug",
"meta_data": {
"type": "Conference"
}
},
format='json'
)
assert resp.status_code == 400
assert resp.content.decode() == '{"date_from":["Do not pass dates before 1900-01-01"],"date_to":["Do not pass dates before 1900-01-01"]}'
resp = token_client.post(
'/api/v1/organizers/{}/events/'.format(organizer.slug),
{