Skip to content

Commit

Permalink
Merge 56b6448 into b71dac9
Browse files Browse the repository at this point in the history
  • Loading branch information
jnation3406 committed Jun 12, 2019
2 parents b71dac9 + 56b6448 commit c698811
Show file tree
Hide file tree
Showing 15 changed files with 182 additions and 108 deletions.
58 changes: 23 additions & 35 deletions observation_portal/blocks/conversion.py
Expand Up @@ -268,39 +268,24 @@ def pointing_to_target(pointing):
if 'dailymot' in pointing and float(pointing['dailymot']):
target['dailymot'] = float(pointing['dailymot'])
else:
# Static or Satellite type
if pointing.get('coord_type', 'RD') == 'RD':
if 'ra' in pointing:
target['ra'] = float(pointing['ra'])
if 'dec' in pointing:
target['dec'] = float(pointing['dec'])
if 'diff_epoch_rate' in pointing and float(pointing['diff_epoch_rate']):
target['diff_epoch_rate'] = float(pointing['diff_epoch_rate'])
if 'diff_ra_rate' in pointing and float(pointing['diff_ra_rate']):
target['diff_roll_rate'] = float(pointing['diff_ra_rate'])
if 'diff_dec_rate' in pointing and float(pointing['diff_dec_rate']):
target['diff_pitch_rate'] = float(pointing['diff_dec_rate'])
if 'diff_ra_accel' in pointing and float(pointing['diff_ra_accel']):
target['diff_roll_acceleration'] = float(pointing['diff_ra_accel'])
if 'diff_dec_accel' in pointing and float(pointing['diff_dec_accel']):
target['diff_pitch_acceleration'] = float(pointing['diff_dec_accel'])
elif pointing.get('coord_type', 'RD') == 'AA':
# Satellite (Static) type
if pointing.get('coord_type', 'RD') == 'AA':
if 'az' in pointing:
target['azimuth'] = float(pointing['az'])
if 'alt' in pointing:
target['altitude'] = float(pointing['alt'])
if 'diff_epoch_rate' in pointing and float(pointing['diff_epoch_rate']):
target['diff_epoch_rate'] = float(pointing['diff_epoch_rate'])
target['diff_epoch'] = float(pointing['diff_epoch_rate'])
if 'diff_az_rate' in pointing and float(pointing['diff_az_rate']):
target['diff_roll_rate'] = float(pointing['diff_az_rate'])
target['diff_azimuth_rate'] = float(pointing['diff_az_rate'])
if 'diff_alt_rate' in pointing and float(pointing['diff_alt_rate']):
target['diff_pitch_rate'] = float(pointing['diff_alt_rate'])
target['diff_altitude_rate'] = float(pointing['diff_alt_rate'])
if 'diff_az_accel' in pointing and float(pointing['diff_az_accel']):
target['diff_roll_acceleration'] = float(pointing['diff_az_accel'])
target['diff_azimuth_acceleration'] = float(pointing['diff_az_accel'])
if 'diff_alt_accel' in pointing and float(pointing['diff_alt_accel']):
target['diff_pitch_acceleration'] = float(pointing['diff_alt_accel'])
target['diff_altitude_acceleration'] = float(pointing['diff_alt_accel'])
else:
raise PondBlockError("Only Coordinate Types RD and AA are supported for Static pointing in the shim")
raise PondBlockError("Only Coordinate Types AA are supported for Static/Satellite pointing in the shim")

extra_params = {}
if 'vmag' in pointing and float(pointing['vmag']):
Expand Down Expand Up @@ -469,18 +454,21 @@ def configuration_to_pointing(configuration):
pointing['ha'] = pointing['hour_angle']
del pointing['hour_angle']

if 'diff_pitch_rate' in pointing and pitch_converter != 'pitch':
pointing['diff_{}_rate'.format(pitch_converter)] = pointing['diff_pitch_rate']
del pointing['diff_pitch_rate']
if 'diff_pitch_acceleration' in pointing:
pointing['diff_{}_accel'.format(pitch_converter)] = pointing['diff_pitch_acceleration']
del pointing['diff_pitch_acceleration']
if 'diff_roll_rate' in pointing and roll_converter != 'roll':
pointing['diff_{}_rate'.format(roll_converter)] = pointing['diff_roll_rate']
del pointing['diff_roll_rate']
if 'diff_roll_acceleration' in pointing:
pointing['diff_{}_accel'.format(roll_converter)] = pointing['diff_roll_acceleration']
del pointing['diff_roll_acceleration']
if 'diff_altitude_rate' in pointing and pitch_converter != 'pitch':
pointing['diff_{}_rate'.format(pitch_converter)] = pointing['diff_altitude_rate']
del pointing['diff_altitude_rate']
if 'diff_altitude_acceleration' in pointing:
pointing['diff_{}_accel'.format(pitch_converter)] = pointing['diff_altitude_acceleration']
del pointing['diff_altitude_acceleration']
if 'diff_azimuth_rate' in pointing and roll_converter != 'roll':
pointing['diff_{}_rate'.format(roll_converter)] = pointing['diff_azimuth_rate']
del pointing['diff_azimuth_rate']
if 'diff_azimuth_acceleration' in pointing:
pointing['diff_{}_accel'.format(roll_converter)] = pointing['diff_azimuth_acceleration']
del pointing['diff_azimuth_acceleration']
if 'diff_epoch' in pointing:
pointing['diff_epoch_rate'] = pointint['diff_epoch']
del pointing['diff_epoch']

if 'extra_params' in pointing:
if target.get('extra_params', {}).get('v_magnitude'):
Expand Down
7 changes: 7 additions & 0 deletions observation_portal/common/configdb.py
Expand Up @@ -146,6 +146,13 @@ def get_instrument_name_tuples(self):
instrument_names.add(instrument['code'].lower())
return [(instrument_name, instrument_name) for instrument_name in instrument_names]

def get_configuration_type_tuples(self):
configuration_types = set()
for instrument in self.get_instruments():
for config_type in instrument['science_camera']['camera_type']['configuration_types']:
configuration_types.add(config_type.upper())
return [(config_type, config_type) for config_type in configuration_types]

def get_instruments_at_location(self, site_code, enclosure_code, telescope_code, only_schedulable=False):
instrument_names = set()
instrument_types = set()
Expand Down
10 changes: 5 additions & 5 deletions observation_portal/common/rise_set_utils.py
Expand Up @@ -154,11 +154,11 @@ def get_rise_set_target(target_dict):

elif target_dict['type'] == 'SATELLITE':
return make_satellite_target(alt=target_dict['altitude'], az=target_dict['azimuth'],
diff_alt_rate=target_dict['diff_pitch_rate'],
diff_az_rate=target_dict['diff_roll_rate'],
diff_alt_accel=target_dict['diff_pitch_acceleration'],
diff_az_accel=target_dict['diff_roll_acceleration'],
diff_epoch_rate=target_dict['diff_epoch_rate'])
diff_alt_rate=target_dict['diff_altitude_rate'],
diff_az_rate=target_dict['diff_azimuth_rate'],
diff_alt_accel=target_dict['diff_altitude_acceleration'],
diff_az_accel=target_dict['diff_azimuth_acceleration'],
diff_epoch_rate=target_dict['diff_epoch'])

elif target_dict['type'] == 'ORBITAL_ELEMENTS':
if target_dict['scheme'] == 'MPC_MINOR_PLANET':
Expand Down
5 changes: 5 additions & 0 deletions observation_portal/observations/filters.py
Expand Up @@ -36,6 +36,11 @@ class ObservationFilter(django_filters.FilterSet):
label='Instrument Type',
field_name='configuration_statuses__configuration__instrument_type'
)
configuration_type = django_filters.MultipleChoiceFilter(
choices=configdb.get_configuration_type_tuples(),
label='Configuration Type',
field_name='configuration_statuses__configuration__type'
)
ordering = django_filters.OrderingFilter(
fields=['start', 'end', 'modified', 'created', 'state']
)
Expand Down
60 changes: 38 additions & 22 deletions observation_portal/observations/models.py
Expand Up @@ -52,6 +52,9 @@ class Observation(models.Model):
help_text='Current State of this Observation'
)

class Meta:
ordering = ('-modified',)

@classmethod
def cancel(self, observations):
now = timezone.now()
Expand All @@ -68,28 +71,31 @@ def cancel(self, observations):

return deleted_observations.get('observations.Observation', 0) + canceled + aborted

def as_dict(self):
def as_dict(self, no_request=False):
ret_dict = model_to_dict(self)
ret_dict['request'] = self.request.as_dict(for_observation=True)
ret_dict['proposal'] = self.request.request_group.proposal.id
ret_dict['submitter'] = self.request.request_group.submitter.username
ret_dict['name'] = self.request.request_group.name
ret_dict['ipp_value'] = self.request.request_group.ipp_value
ret_dict['observation_type'] = self.request.request_group.observation_type
ret_dict['request_group_id'] = self.request.request_group.id
ret_dict['modified'] = self.modified
configuration_status_by_config = {config_status.configuration.id: config_status
for config_status in self.configuration_statuses.all()}
for configuration in ret_dict['request']['configurations']:
config_status = configuration_status_by_config[configuration['id']]
configuration['configuration_status'] = config_status.id
configuration['state'] = config_status.state
configuration['instrument_name'] = config_status.instrument_name
configuration['guide_camera_name'] = config_status.guide_camera_name
try:
configuration['summary'] = config_status.summary.as_dict()
except Exception:
configuration['summary'] = {}
if no_request:
ret_dict['configuration_statuses'] = [config_status.as_dict() for config_status in self.configuration_statuses.all()]
else:
ret_dict['request'] = self.request.as_dict(for_observation=True)
ret_dict['proposal'] = self.request.request_group.proposal.id
ret_dict['submitter'] = self.request.request_group.submitter.username
ret_dict['name'] = self.request.request_group.name
ret_dict['ipp_value'] = self.request.request_group.ipp_value
ret_dict['observation_type'] = self.request.request_group.observation_type
ret_dict['request_group_id'] = self.request.request_group.id
ret_dict['modified'] = self.modified
configuration_status_by_config = {config_status.configuration.id: config_status
for config_status in self.configuration_statuses.all()}
for configuration in ret_dict['request']['configurations']:
config_status = configuration_status_by_config[configuration['id']]
configuration['configuration_status'] = config_status.id
configuration['state'] = config_status.state
configuration['instrument_name'] = config_status.instrument_name
configuration['guide_camera_name'] = config_status.guide_camera_name
if hasattr(config_status, 'summary'):
configuration['summary'] = config_status.summary.as_dict()
else:
configuration['summary'] = {}
return ret_dict

@property
Expand All @@ -102,6 +108,8 @@ def instrument_types(self):


class ConfigurationStatus(models.Model):
SERIALIZER_EXCLUDE = ('modified', 'created', 'observation')

STATE_CHOICES = (
('PENDING', 'PENDING'),
('ATTEMPTED', 'ATTEMPTED'),
Expand Down Expand Up @@ -136,14 +144,22 @@ class ConfigurationStatus(models.Model):
help_text='Time when this Configuration Status was created'
)

def as_dict(self):
ret_dict = model_to_dict(self, exclude=self.SERIALIZER_EXCLUDE)
if hasattr(self, 'summary'):
ret_dict['summary'] = self.summary.as_dict()
else:
ret_dict['summary'] = {}
return ret_dict

class Meta:
unique_together = ('configuration', 'observation')
verbose_name_plural = 'Configuration statuses'
ordering = ['id']


class Summary(models.Model):
SERIALIZER_EXCLUDE = ('modified', 'created')
SERIALIZER_EXCLUDE = ('modified', 'created', 'configuration_status')

configuration_status = models.OneToOneField(
ConfigurationStatus, null=True, blank=True, related_name='summary', on_delete=models.CASCADE
Expand Down
Expand Up @@ -25,7 +25,7 @@
<th>Tel.</th>
<th>Start</th>
<th>End</th>
<th>State</th>
<th>Req.ID</th>
<th>Proposal</th>
<th>Instruments</th>
<th>Modified</th>
Expand All @@ -51,7 +51,7 @@
<td>{{ obs.telescope }}</td>
<td>{{ obs.start }}</td>
<td>{{ obs.end }}</td>
<td>{{ obs.state }}</td>
<td><a href="{% url 'requestgroups:request-detail' pk=obs.request.id %}" title="Request detail">{{ obs.request.id }}</a></td>
<td>{{ obs.request.request_group.proposal.id }}</td>
<td>{% for inst in obs.instrument_types %}{{ inst }}<br/>{% endfor %}</td>
<td>{{ obs.modified }}</td>
Expand All @@ -72,7 +72,7 @@
</div>
<div class="col-md-2">
<form class="form" method="GET" action="{% url 'observations:observation-list' %}">
{% bootstrap_form filter.form %}
{% bootstrap_form filter.form exclude="end_after,end_before" %}
{% buttons submit="Filter" reset="Reset" %}{% endbuttons %}
</form>
</div>
Expand Down
2 changes: 1 addition & 1 deletion observation_portal/observations/views.py
Expand Up @@ -21,7 +21,7 @@ class ObservationListView(StaffRequiredMixin, FilterView):
model = Observation
filterset_class = ObservationFilter
paginate_by = 50
ordering = '-modified'
ordering = '-start'
template_name = 'observations/observation_list.html'

def get_filterset_kwargs(self, filterset_class):
Expand Down
10 changes: 5 additions & 5 deletions observation_portal/requestgroups/admin.py
Expand Up @@ -123,11 +123,11 @@ class TargetAdmin(admin.ModelAdmin):
'proper_motion_dec',
'epoch',
'parallax',
'diff_pitch_rate',
'diff_roll_rate',
'diff_epoch_rate',
'diff_pitch_acceleration',
'diff_roll_acceleration',
'diff_altitude_rate',
'diff_azimuth_rate',
'diff_epoch',
'diff_altitude_acceleration',
'diff_azimuth_acceleration',
'scheme',
'epochofel',
'orbinc',
Expand Down
@@ -0,0 +1,58 @@
# Generated by Django 2.1.5 on 2019-06-12 00:48

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('requestgroups', '0009_auto_20190518_0023'),
]

operations = [
migrations.RemoveField(
model_name='target',
name='diff_epoch_rate',
),
migrations.RemoveField(
model_name='target',
name='diff_pitch_acceleration',
),
migrations.RemoveField(
model_name='target',
name='diff_pitch_rate',
),
migrations.RemoveField(
model_name='target',
name='diff_roll_acceleration',
),
migrations.RemoveField(
model_name='target',
name='diff_roll_rate',
),
migrations.AddField(
model_name='target',
name='diff_altitude_acceleration',
field=models.FloatField(blank=True, help_text='Differential altitude acceleration (arcsec/s^2)', null=True, verbose_name='differential altitude acceleration'),
),
migrations.AddField(
model_name='target',
name='diff_altitude_rate',
field=models.FloatField(blank=True, help_text='Differential altitude rate (arcsec/s)', null=True, verbose_name='differential altitude rate'),
),
migrations.AddField(
model_name='target',
name='diff_azimuth_acceleration',
field=models.FloatField(blank=True, help_text='Differential azimuth acceleration (arcsec/s^2)', null=True, verbose_name='differential azimuth acceleration'),
),
migrations.AddField(
model_name='target',
name='diff_azimuth_rate',
field=models.FloatField(blank=True, help_text='Differential azimuth rate (arcsec/s)', null=True, verbose_name='differential azimuth rate'),
),
migrations.AddField(
model_name='target',
name='diff_epoch',
field=models.FloatField(blank=True, help_text='Reference time for non-sidereal motion (MJD)', null=True, verbose_name='differential epoch'),
),
]
28 changes: 14 additions & 14 deletions observation_portal/requestgroups/models.py
Expand Up @@ -452,27 +452,27 @@ class Target(models.Model):
)

# Nonsidereal rate
diff_pitch_rate = models.FloatField(
verbose_name='differential pitch rate', null=True, blank=True,
help_text='Differential pitch rate (arcsec/s)'
diff_altitude_rate = models.FloatField(
verbose_name='differential altitude rate', null=True, blank=True,
help_text='Differential altitude rate (arcsec/s)'
)
diff_roll_rate = models.FloatField(
verbose_name='differential roll rate', null=True, blank=True,
help_text='Differential roll rate (arcsec/s)'
diff_azimuth_rate = models.FloatField(
verbose_name='differential azimuth rate', null=True, blank=True,
help_text='Differential azimuth rate (arcsec/s)'
)
diff_epoch_rate = models.FloatField(
verbose_name='differential epoch rate', null=True, blank=True,
diff_epoch = models.FloatField(
verbose_name='differential epoch', null=True, blank=True,
help_text='Reference time for non-sidereal motion (MJD)'
)

# Satellite Fields
diff_pitch_acceleration = models.FloatField(
verbose_name='differential pitch acceleration', null=True, blank=True,
help_text='Differential pitch acceleration (arcsec/s^2)'
diff_altitude_acceleration = models.FloatField(
verbose_name='differential altitude acceleration', null=True, blank=True,
help_text='Differential altitude acceleration (arcsec/s^2)'
)
diff_roll_acceleration = models.FloatField(
verbose_name='differential roll acceleration', null=True, blank=True,
help_text='Differential role acceleration (arcsec/s^2)'
diff_azimuth_acceleration = models.FloatField(
verbose_name='differential azimuth acceleration', null=True, blank=True,
help_text='Differential azimuth acceleration (arcsec/s^2)'
)

# Orbital elements
Expand Down
2 changes: 1 addition & 1 deletion observation_portal/requestgroups/serializers.py
Expand Up @@ -264,7 +264,7 @@ def validate(self, data):
if guide_mode_error_msg:
raise serializers.ValidationError(_(guide_mode_error_msg))

if configdb.is_spectrograph(instrument_type) and data['type'] not in ['LAMP_FLAT', 'ARC']:
if configdb.is_spectrograph(instrument_type) and data['type'] not in ['LAMP_FLAT', 'ARC', 'NRES_BIAS', 'NRES_DARK']:
if 'optional' in guiding_config and guiding_config['optional']:
raise serializers.ValidationError(_(
"Guiding cannot be optional on spectrograph instruments for types that are not ARC or LAMP_FLAT."
Expand Down
4 changes: 2 additions & 2 deletions observation_portal/requestgroups/target_helpers.py
Expand Up @@ -100,8 +100,8 @@ def validate(self):
class SatelliteTargetHelper(BaseTargetHelper):
def __init__(self, target):
self.fields = (
'name', 'type', 'altitude', 'azimuth', 'diff_pitch_rate', 'diff_roll_rate',
'diff_epoch_rate', 'diff_pitch_acceleration', 'diff_roll_acceleration'
'name', 'type', 'altitude', 'azimuth', 'diff_altitude_rate', 'diff_azimuth_rate',
'diff_epoch', 'diff_altitude_acceleration', 'diff_azimuth_acceleration'
)
self.required_fields = self.fields
self.fields += ()
Expand Down

0 comments on commit c698811

Please sign in to comment.