Skip to content

Commit

Permalink
Merge pull request #29 from LCOGT/fixes_during_testing
Browse files Browse the repository at this point in the history
Fixes during testing
  • Loading branch information
eheinrich committed Jun 12, 2019
2 parents 4f1cbb9 + a1e78b3 commit 61efe50
Show file tree
Hide file tree
Showing 15 changed files with 689 additions and 177 deletions.
124 changes: 78 additions & 46 deletions observation_portal/common/configdb.py

Large diffs are not rendered by default.

261 changes: 258 additions & 3 deletions observation_portal/common/test_data/configdb.json
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,252 @@
]
},
"__str__": "tst.doma.1m0a.xx01-xx01"
},
{
"state": "DISABLED",
"code": "xx06",
"allow_self_guiding": true,
"autoguider_camera": {
"code": "xx07",
"camera_type": {
"code": "1M0-SCICAM-SBIG"
}
},
"science_camera": {
"code": "xx06",
"camera_type": {
"code": "1M0-SCICAM-SBIG",
"name": "1M0-SCICAM-SBIG",
"default_mode": {
"binning": 2,
"readout": 14.5
},
"configuration_types": [
"EXPOSE",
"BIAS",
"DARK",
"SCRIPT"
],
"default_acceptability_threshold": 90,
"pixels_x": 1000,
"pixels_y": 1000,
"max_rois": 1,
"config_change_time": 0,
"acquire_processing_time": 0,
"acquire_exposure_time": 0,
"front_padding": 90,
"filter_change_time": 2,
"fixed_overhead_per_exposure": 1,
"mode_set": [
{
"binning": 1,
"readout": 35.0
},
{
"binning": 2,
"readout": 14.5
},
{
"binning": 3,
"readout": 11.5
}
],
"mode_types": [
{
"type": "readout",
"default": "1m0_sbig_2",
"modes": [
{
"code": "1m0_sbig_1",
"overhead": 35.0,
"params": {
"binning": 1
}
},
{
"code": "1m0_sbig_2",
"overhead": 14.5,
"params": {
"binning": 2
}
},
{
"code": "1m0_sbig_3",
"overhead": 11.5,
"params": {
"binning": 3
}
}
]
},
{
"type": "acquisition",
"default": "OFF",
"modes": [
{
"code": "OFF",
"overhead": 0.0,
"params": {}
}
]
},
{
"type": "guiding",
"default": "OFF",
"modes": [
{
"code": "OFF",
"overhead": 0.0,
"params": {}
},
{
"code": "ON",
"overhead": 0.0,
"params": {}
}
]
}
]
},
"filters": "air",
"optical_element_groups": [
{
"type": "filters",
"element_change_overhead": 2,
"optical_elements": [
{
"name": "Air",
"code": "air",
"schedulable": false
}
]
}
]
},
"__str__": "tst.doma.1m0a.xx06-xx07"
},
{
"state": "ENABLED",
"code": "xx08",
"allow_self_guiding": true,
"autoguider_camera": {
"code": "xx09",
"camera_type": {
"code": "1M0-SCICAM-SBIG"
}
},
"science_camera": {
"code": "xx08",
"camera_type": {
"code": "1M0-SCICAM-SBIG",
"name": "1M0-SCICAM-SBIG",
"default_mode": {
"binning": 2,
"readout": 14.5
},
"configuration_types": [
"EXPOSE",
"BIAS",
"DARK",
"SCRIPT"
],
"default_acceptability_threshold": 90,
"pixels_x": 1000,
"pixels_y": 1000,
"max_rois": 1,
"config_change_time": 0,
"acquire_processing_time": 0,
"acquire_exposure_time": 0,
"front_padding": 90,
"filter_change_time": 2,
"fixed_overhead_per_exposure": 1,
"mode_set": [
{
"binning": 1,
"readout": 35.0
},
{
"binning": 2,
"readout": 14.5
},
{
"binning": 3,
"readout": 11.5
}
],
"mode_types": [
{
"type": "readout",
"default": "1m0_sbig_2",
"modes": [
{
"code": "1m0_sbig_1",
"overhead": 35.0,
"params": {
"binning": 1
}
},
{
"code": "1m0_sbig_2",
"overhead": 14.5,
"params": {
"binning": 2
}
},
{
"code": "1m0_sbig_3",
"overhead": 11.5,
"params": {
"binning": 3
}
}
]
},
{
"type": "acquisition",
"default": "OFF",
"modes": [
{
"code": "OFF",
"overhead": 0.0,
"params": {}
}
]
},
{
"type": "guiding",
"default": "OFF",
"modes": [
{
"code": "OFF",
"overhead": 0.0,
"params": {}
},
{
"code": "ON",
"overhead": 0.0,
"params": {}
}
]
}
]
},
"filters": "air",
"optical_element_groups": [
{
"type": "filters",
"element_change_overhead": 2,
"optical_elements": [
{
"name": "Air",
"code": "air",
"schedulable": false
}
]
}
]
},
"__str__": "tst.doma.1m0a.xx08-xx09"
}
]
},
Expand Down Expand Up @@ -492,7 +738,6 @@
"mode_types": [
{
"type": "readout",
"default": "1m0_nres_2",
"modes": [
{
"code": "1m0_nres_1",
Expand All @@ -516,8 +761,19 @@
"modes": [
{
"code": "WCS",
"overhead": 0.0,
"overhead": 400.0,
"params": {}
},
{
"code": "MYMODE",
"overhead": 400.0,
"params": {
"required_fields": [
"field1",
"field2",
"field3"
]
}
}
]
},
Expand Down Expand Up @@ -599,7 +855,6 @@
"mode_types": [
{
"type": "readout",
"default": "2m0_floyds_1",
"modes": [
{
"code": "2m0_floyds_1",
Expand Down
6 changes: 5 additions & 1 deletion observation_portal/observations/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,11 @@ def validate(self, data):
if (configuration['guiding_config']['mode'] != GuidingConfig.OFF or
configuration['acquisition_config']['mode'] != AcquisitionConfig.OFF):
if not configuration.get('guide_camera_name', ''):
if 'self_guide' in configuration['extra_params'] and configuration['extra_params']['self_guide']:
if (
'extra_params' in configuration
and 'self_guide' in configuration['extra_params']
and configuration['extra_params']['self_guide']
):
configuration['guide_camera_name'] = configuration['instrument_name']
else:
configuration['guide_camera_name'] = configdb.get_guider_for_instrument_name(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{% extends 'base.html' %}
{% load bootstrap4 %}
{% bootstrap_javascript jquery='full' %}
{% block title %} Proposal List {% endblock %}
{% block content %}
<div class="row">
Expand Down
17 changes: 17 additions & 0 deletions observation_portal/proposals/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,23 @@ def test_set_bad_limit(self):
self.assertEqual(membership.time_limit, 0)
self.assertContains(response, 'Please enter a valid time limit')

def test_set_bad_global_limit(self):
self.client.force_login(self.pi_user)
ci_users = mixer.cycle(5).blend(User)
mixer.cycle(5).blend(Profile, user=(ci_user for ci_user in ci_users))
memberships = mixer.cycle(5).blend(
Membership, user=(c for c in ci_users), proposal=self.proposal, role=Membership.CI, time_limit=0
)
response = self.client.post(
reverse('proposals:membership-global', kwargs={'pk': self.proposal.id}),
data={'time_limit': ''},
follow=True
)
self.assertContains(response, 'Please enter a valid time limit')
for membership in memberships:
membership.refresh_from_db()
self.assertEqual(membership.time_limit, 0)


class TestProposalInvite(TestCase):
def setUp(self):
Expand Down
10 changes: 7 additions & 3 deletions observation_portal/proposals/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,13 @@ def post(self, request, **kwargs):
proposal = request.user.membership_set.get(proposal=kwargs.get('pk'), role=Membership.PI).proposal
except Membership.DoesNotExist:
raise Http404
time_limit = float(request.POST['time_limit']) * 3600
proposal.membership_set.filter(role=Membership.CI).update(time_limit=time_limit)
messages.success(request, 'All CI time limits set to {0} hours'.format(time_limit / 3600))
try:
time_limit = float(request.POST['time_limit']) * 3600
except ValueError:
messages.error(request, 'Please enter a valid time limit')
else:
proposal.membership_set.filter(role=Membership.CI).update(time_limit=time_limit)
messages.success(request, 'All CI time limits set to {0} hours'.format(time_limit / 3600))
return HttpResponseRedirect(reverse('proposals:detail', kwargs={'pk': proposal.id}))


Expand Down
7 changes: 4 additions & 3 deletions observation_portal/requestgroups/duration_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,12 +157,13 @@ def get_request_duration(request_dict):

# Now add in optical element change time if the set of optical elements has changed
for inst_config in configuration['instrument_configs']:
optical_elements = inst_config.get('optical_elements', {})
change_overhead = 0
for oe_type, oe_value in inst_config['optical_elements'].items():
for oe_type, oe_value in optical_elements.items():
if oe_type not in previous_optical_elements or oe_value != previous_optical_elements[oe_type]:
if '{}s'.format(oe_type) in request_overheads['optical_element_change_overheads']:
change_overhead = max(request_overheads['optical_element_change_overheads']['{}s'.format(oe_type)], change_overhead)
previous_optical_elements = inst_config['optical_elements']
previous_optical_elements = optical_elements
duration += change_overhead

# Now add in the slew time between targets (configurations). Only Sidereal can be calculated based on position.
Expand All @@ -187,7 +188,7 @@ def get_request_duration(request_dict):
guide_optional = configuration['guiding_config']['optional'] if 'optional' in configuration['guiding_config'] \
else True
if configuration['guiding_config']['mode'] != 'OFF' and not guide_optional:
if (configuration['guiding_config']['mode'] in request_overheads['guiding_overheads']):
if configuration['guiding_config']['mode'] in request_overheads['guiding_overheads']:
duration += request_overheads['guiding_overheads'][configuration['guiding_config']['mode']]

# TODO: find out if we need to have a configuration type change time for spectrographs?
Expand Down
1 change: 0 additions & 1 deletion observation_portal/requestgroups/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -648,7 +648,6 @@ def as_dict(self):


class GuidingConfig(models.Model):
ON = 'ON'
OFF = 'OFF'

SERIALIZER_EXCLUDE = ('id', 'configuration')
Expand Down

0 comments on commit 61efe50

Please sign in to comment.