From a8e090e64b4380fb58de484e9de8b4302575afae Mon Sep 17 00:00:00 2001 From: Elisabeth Heinrich-Josties Date: Wed, 3 Jul 2019 17:46:18 +0000 Subject: [PATCH 1/4] Protect against target not having a type field --- observation_portal/requestgroups/request_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/observation_portal/requestgroups/request_utils.py b/observation_portal/requestgroups/request_utils.py index 89273b5f..4d158668 100644 --- a/observation_portal/requestgroups/request_utils.py +++ b/observation_portal/requestgroups/request_utils.py @@ -86,7 +86,7 @@ def get_airmasses_for_request_at_sites(request_dict): rs_target = get_rise_set_target(request_dict['configurations'][0]['target']) data = {'airmass_data': {}} - if request_dict['configurations'][0]['target']['type'].upper() not in ['SATELLITE', 'HOUR_ANGLE']: + if str(request_dict['configurations'][0]['target'].get('type', '')).upper() in ['ICRS', 'ORBITAL_ELEMENTS']: for site_id, site_details in site_data.items(): night_times = [] site_lat = Angle(degrees=site_details['latitude']) From 26a5de1ba53e9d4c914630005fc9731adcebde24 Mon Sep 17 00:00:00 2001 From: Elisabeth Heinrich-Josties Date: Wed, 3 Jul 2019 17:50:17 +0000 Subject: [PATCH 2/4] Get instruments before loading a copy --- static/js/components/requestgroup.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/static/js/components/requestgroup.vue b/static/js/components/requestgroup.vue index d7de65d9..0b06c4a0 100644 --- a/static/js/components/requestgroup.vue +++ b/static/js/components/requestgroup.vue @@ -227,11 +227,11 @@ } that.available_instruments = allowed_instruments; that.update(); + }).done(function() { + if (QueryString().requestgroupid) { + that.fetchRequestGroup(QueryString().requestgroupid); + } }); - }).done(function() { - if (QueryString().requestgroupid) { - that.fetchRequestGroup(QueryString().requestgroupid); - } }); }, computed: { From 17f95895d03e98159e7440783ca2fcfad93a0f47 Mon Sep 17 00:00:00 2001 From: Elisabeth Heinrich-Josties Date: Wed, 3 Jul 2019 18:07:10 +0000 Subject: [PATCH 3/4] Return pond block validation error to user --- observation_portal/blocks/viewsets.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/observation_portal/blocks/viewsets.py b/observation_portal/blocks/viewsets.py index 2ef41044..737f62bb 100644 --- a/observation_portal/blocks/viewsets.py +++ b/observation_portal/blocks/viewsets.py @@ -8,8 +8,9 @@ from observation_portal.observations.models import Observation from observation_portal.blocks.filters import PondBlockFilter -from observation_portal.blocks.conversion import (convert_pond_blocks_to_observations, - convert_observations_to_pond_blocks) +from observation_portal.blocks.conversion import ( + convert_pond_blocks_to_observations, convert_observations_to_pond_blocks, PondBlockError +) from observation_portal.observations.serializers import ScheduleSerializer from observation_portal.common.mixins import ListAsDictMixin @@ -44,7 +45,10 @@ def perform_create(self, serializer): serializer.save(submitter=self.request.user, submitter_id=self.request.user.id) def create(self, request, *args, **kwargs): - observations = convert_pond_blocks_to_observations(request.data) + try: + observations = convert_pond_blocks_to_observations(request.data) + except PondBlockError as e: + return Response({'error': str(e)}, 400) request._full_data = observations return super().create(request, *args, **kwargs) From eb1faa8c699292b1b62584f4cbc6acacda7a6a0b Mon Sep 17 00:00:00 2001 From: Elisabeth Heinrich-Josties Date: Wed, 3 Jul 2019 18:45:56 +0000 Subject: [PATCH 4/4] Check that target is valid before computing airmass --- .../requestgroups/request_utils.py | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/observation_portal/requestgroups/request_utils.py b/observation_portal/requestgroups/request_utils.py index 4d158668..ccea5d8c 100644 --- a/observation_portal/requestgroups/request_utils.py +++ b/observation_portal/requestgroups/request_utils.py @@ -6,6 +6,7 @@ from observation_portal.common.configdb import configdb from observation_portal.common.telescope_states import TelescopeStates, filter_telescope_states_by_intervals from observation_portal.common.rise_set_utils import get_rise_set_target, get_filtered_rise_set_intervals_by_site +from observation_portal.requestgroups.target_helpers import TARGET_TYPE_HELPER_MAP # TODO: Use configuration types from configdb @@ -73,20 +74,20 @@ def date_range_from_interval(start_time, end_time, dt=timedelta(minutes=15)): def get_airmasses_for_request_at_sites(request_dict): # TODO: Change to work with multiple instrument types and multiple constraints and multiple targets + data = {'airmass_data': {}} instrument_type = request_dict['configurations'][0]['instrument_type'] constraints = request_dict['configurations'][0]['constraints'] - - site_data = configdb.get_sites_with_instrument_type_and_location( - instrument_type=instrument_type, - site_code=request_dict['location'].get('site'), - enclosure_code=request_dict['location'].get('enclosure'), - telescope_code=request_dict['location'].get('telescope') - ) - - rs_target = get_rise_set_target(request_dict['configurations'][0]['target']) - - data = {'airmass_data': {}} - if str(request_dict['configurations'][0]['target'].get('type', '')).upper() in ['ICRS', 'ORBITAL_ELEMENTS']: + target = request_dict['configurations'][0]['target'] + target_type = str(target.get('type', '')).upper() + + if target_type in ['ICRS', 'ORBITAL_ELEMENTS'] and TARGET_TYPE_HELPER_MAP[target_type](target).is_valid(): + site_data = configdb.get_sites_with_instrument_type_and_location( + instrument_type=instrument_type, + site_code=request_dict['location'].get('site'), + enclosure_code=request_dict['location'].get('enclosure'), + telescope_code=request_dict['location'].get('telescope') + ) + rs_target = get_rise_set_target(target) for site_id, site_details in site_data.items(): night_times = [] site_lat = Angle(degrees=site_details['latitude'])