Validate range of geo_lat/geo_lon values

This commit is contained in:
Raphael Michel
2021-01-04 10:34:47 +01:00
parent 6cf1074b8d
commit be413693ce
4 changed files with 34 additions and 4 deletions

View File

@@ -10,7 +10,9 @@ from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from django.core.mail import get_connection from django.core.mail import get_connection
from django.core.validators import RegexValidator from django.core.validators import (
MaxValueValidator, MinValueValidator, RegexValidator,
)
from django.db import models from django.db import models
from django.db.models import Exists, OuterRef, Prefetch, Q, Subquery, Value from django.db.models import Exists, OuterRef, Prefetch, Q, Subquery, Value
from django.template.defaultfilters import date as _date from django.template.defaultfilters import date as _date
@@ -393,10 +395,18 @@ class Event(EventMixin, LoggedModel):
geo_lat = models.FloatField( geo_lat = models.FloatField(
verbose_name=_("Latitude"), verbose_name=_("Latitude"),
null=True, blank=True, null=True, blank=True,
validators=[
MinValueValidator(-90),
MaxValueValidator(90),
]
) )
geo_lon = models.FloatField( geo_lon = models.FloatField(
verbose_name=_("Longitude"), verbose_name=_("Longitude"),
null=True, blank=True, null=True, blank=True,
validators=[
MinValueValidator(-180),
MaxValueValidator(180),
]
) )
plugins = models.TextField( plugins = models.TextField(
null=False, blank=True, null=False, blank=True,
@@ -1121,10 +1131,18 @@ class SubEvent(EventMixin, LoggedModel):
geo_lat = models.FloatField( geo_lat = models.FloatField(
verbose_name=_("Latitude"), verbose_name=_("Latitude"),
null=True, blank=True, null=True, blank=True,
validators=[
MinValueValidator(-90),
MaxValueValidator(90),
]
) )
geo_lon = models.FloatField( geo_lon = models.FloatField(
verbose_name=_("Longitude"), verbose_name=_("Longitude"),
null=True, blank=True null=True, blank=True,
validators=[
MinValueValidator(-180),
MaxValueValidator(180),
]
) )
frontpage_text = I18nTextField( frontpage_text = I18nTextField(
null=True, blank=True, null=True, blank=True,

View File

@@ -134,6 +134,8 @@ class EventWizardBasicsForm(I18nModelForm):
'presale_start': SplitDateTimePickerWidget(), 'presale_start': SplitDateTimePickerWidget(),
'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_basics-presale_start_0'}), 'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_basics-presale_start_0'}),
'slug': SlugWidget, 'slug': SlugWidget,
'geo_lat': forms.NumberInput(attrs={'min': '-90', 'max': '90'}),
'geo_lon': forms.NumberInput(attrs={'min': '-180', 'max': '180'}),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -392,7 +394,9 @@ class EventUpdateForm(I18nModelForm):
'date_admission': SplitDateTimePickerWidget(attrs={'data-date-default': '#id_date_from_0'}), 'date_admission': SplitDateTimePickerWidget(attrs={'data-date-default': '#id_date_from_0'}),
'presale_start': SplitDateTimePickerWidget(), 'presale_start': SplitDateTimePickerWidget(),
'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}), 'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}),
'sales_channels': CheckboxSelectMultiple() 'sales_channels': CheckboxSelectMultiple(),
'geo_lat': forms.NumberInput(attrs={'min': '-90', 'max': '90'}),
'geo_lon': forms.NumberInput(attrs={'min': '-180', 'max': '180'}),
} }

View File

@@ -55,6 +55,8 @@ class SubEventForm(I18nModelForm):
'date_admission': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_date_from_0'}), 'date_admission': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_date_from_0'}),
'presale_start': SplitDateTimePickerWidget(), 'presale_start': SplitDateTimePickerWidget(),
'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}), 'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}),
'geo_lat': forms.NumberInput(attrs={'min': '-90', 'max': '90'}),
'geo_lon': forms.NumberInput(attrs={'min': '-180', 'max': '180'}),
} }

View File

@@ -68,7 +68,13 @@ $(function () {
function getpoint() { function getpoint() {
if ($lat.val() !== "" && $lon.val() !== "") { if ($lat.val() !== "" && $lon.val() !== "") {
return [parseFloat($lat.val().replace(",", ".")), parseFloat($lon.val().replace(",", "."))]; var p = [parseFloat($lat.val().replace(",", ".")), parseFloat($lon.val().replace(",", "."))];
// Clip to valid ranges. Very invalid lon/lat values can even lead to browser crashes in leaflet apparently
if (p[0] < -90) p[0] = -90
if (p[0] > 90) p[0] = 90
if (p[1] < -180) p[1] = -180
if (p[1] > 180) p[1] = 180
return p
} else { } else {
return [0.0, 0.0]; return [0.0, 0.0];
} }