Skip to content

Commit 5e3718d

Browse files
authored
Merge pull request #1382 from TOMToolkit/1381-validate-mjd
Validate MJD for non-sidereal fields
2 parents dfb72d8 + ee177a8 commit 5e3718d

3 files changed

Lines changed: 47 additions & 0 deletions

File tree

tom_targets/forms.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from tom_targets.validators import validate_mjd
12
import datetime
23

34
from crispy_forms.layout import Layout, Div
@@ -143,6 +144,16 @@ def __init__(self, *args, **kwargs):
143144
for field in REQUIRED_NON_SIDEREAL_FIELDS:
144145
self.fields[field].required = True
145146

147+
def clean_epoch_of_perihelion(self):
148+
if value := self.cleaned_data.get('epoch_of_perihelion'):
149+
validate_mjd(value)
150+
return value
151+
152+
def clean_epoch_of_elements(self):
153+
if value := self.cleaned_data.get('epoch_of_elements'):
154+
validate_mjd(value)
155+
return value
156+
146157
def clean(self):
147158
"""
148159
Look at the 'scheme' field and check the fields required for the

tom_targets/tests/tests.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,36 @@ def test_datetime_warning(self):
389389
self.assertEqual(te.typed_value('number'), 1984.0)
390390
self.assertIsNone(te.typed_value('datetime'))
391391

392+
def test_non_sidereal_validate_mjd(self):
393+
base_data = {
394+
'name': 'nonsidereal_target',
395+
'identifier': 'nonsidereal_identifier',
396+
'type': Target.NON_SIDEREAL,
397+
'scheme': 'JPL_MAJOR_PLANET',
398+
'permissions': 'PUBLIC',
399+
'epoch_of_elements': 1_000_000,
400+
'lng_asc_node': 100,
401+
'arg_of_perihelion': 100,
402+
'eccentricity': 100,
403+
'mean_anomaly': 100,
404+
'inclination': 100,
405+
'semimajor_axis': 100,
406+
'targetextra_set-TOTAL_FORMS': 1,
407+
'targetextra_set-INITIAL_FORMS': 0,
408+
'targetextra_set-MIN_NUM_FORMS': 0,
409+
'targetextra_set-MAX_NUM_FORMS': 1000,
410+
'targetextra_set-0-key': '',
411+
'targetextra_set-0-value': '',
412+
'aliases-TOTAL_FORMS': 1,
413+
'aliases-INITIAL_FORMS': 0,
414+
'aliases-MIN_NUM_FORMS': 0,
415+
'aliases-MAX_NUM_FORMS': 1000,
416+
}
417+
create_url = reverse('targets:create') + '?type=NON_SIDEREAL'
418+
response = self.client.post(create_url, data=base_data, follow=True)
419+
errors = response.context['form'].errors['epoch_of_elements']
420+
self.assertIn('Value must be in MJD', errors[0])
421+
392422
def test_non_sidereal_required_fields(self):
393423
base_data = {
394424
'name': 'nonsidereal_target',

tom_targets/validators.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from rest_framework.serializers import ValidationError
2+
from django.forms import ValidationError as FormValidationError
23

34

45
class RequiredFieldsTogetherValidator(object):
@@ -21,3 +22,8 @@ def __call__(self, attrs):
2122

2223
if missing_fields:
2324
raise ValidationError(f'The following fields are required for {self.type_value} targets: {missing_fields}')
25+
26+
27+
def validate_mjd(value):
28+
if not (0 <= value <= 100000.0):
29+
raise FormValidationError("Value must be in MJD between 0 and 100000")

0 commit comments

Comments
 (0)