Skip to content

Commit

Permalink
Merge 3a902e3 into 8fc7d68
Browse files Browse the repository at this point in the history
  • Loading branch information
jnation3406 committed Nov 1, 2023
2 parents 8fc7d68 + 3a902e3 commit 85dd1c5
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 26 deletions.
4 changes: 2 additions & 2 deletions tom_observations/facilities/lco.py
Original file line number Diff line number Diff line change
Expand Up @@ -1076,8 +1076,8 @@ class LCOFacility(OCSFacility):
'SPECTROSCOPIC_SEQUENCE': LCOSpectroscopicSequenceForm
}

def __init__(self, facility_settings=LCOSettings('LCO')):
super().__init__(facility_settings=facility_settings)
def __init__(self, user=None, facility_settings=LCOSettings('LCO')):
super().__init__(user=user, facility_settings=facility_settings)

# TODO: this should be called get_form_class
def get_form(self, observation_type):
Expand Down
4 changes: 2 additions & 2 deletions tom_observations/facilities/ocs.py
Original file line number Diff line number Diff line change
Expand Up @@ -1235,9 +1235,9 @@ class OCSFacility(BaseRoboticObservationFacility):
'ALL': OCSFullObservationForm,
}

def __init__(self, facility_settings=OCSSettings('OCS')):
def __init__(self, user=None, facility_settings=OCSSettings('OCS')):
self.facility_settings = facility_settings
super().__init__()
super().__init__(user=user)

# TODO: this should be called get_form_class
def get_form(self, observation_type):
Expand Down
4 changes: 2 additions & 2 deletions tom_observations/facilities/soar.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ class SOARFacility(LCOFacility):
'SPECTRA': SOARSpectroscopyObservationForm
}

def __init__(self, facility_settings=SOARSettings('LCO')):
super().__init__(facility_settings=facility_settings)
def __init__(self, user=None, facility_settings=SOARSettings('LCO')):
super().__init__(user=user, facility_settings=facility_settings)

def get_form(self, observation_type):
return self.observation_forms.get(observation_type, SOARImagingObservationForm)
5 changes: 5 additions & 0 deletions tom_observations/facility.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,11 @@ class BaseObservationFacility(ABC):
"""
name = 'BaseObservation'

def __init__(self, user=None):
if self.__class__ == BaseObservationFacility:
raise Exception("Cannot instantiate abstract class BaseObservationFacility")
self.user = user

def all_data_products(self, observation_record):
from tom_dataproducts.models import DataProduct
products = {'saved': [], 'unsaved': []}
Expand Down
14 changes: 13 additions & 1 deletion tom_observations/management/commands/updatestatus.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.core.management.base import BaseCommand
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.models import User

from tom_targets.models import Target
from tom_observations import facility
Expand All @@ -18,19 +19,30 @@ def add_arguments(self, parser):
'--target_id',
help='Update observation statuses for a single target'
)
parser.add_argument(
'--username',
required=False,
help='The username of a user to use if the facility requires per user-based authentication for its API calls'
)

def handle(self, *args, **options):
target = None
user = None
if options['target_id']:
try:
target = Target.objects.get(pk=options['target_id'])
except ObjectDoesNotExist:
raise Exception('Invalid target id provided')
if options.get('username'):
try:
user = User.objects.get(username=options['username'])
except User.DoesNotExist:
raise Exception('Invalid username provided')

failed_records = {}
for facility_name in facility.get_service_classes():
clazz = facility.get_service_class(facility_name)
failed_records[facility_name] = clazz().update_all_observation_statuses(target=target)
failed_records[facility_name] = clazz(user=user).update_all_observation_statuses(target=target)
success = True
for facility_name, errors in failed_records.items():
if len(errors) > 0:
Expand Down
18 changes: 9 additions & 9 deletions tom_observations/templatetags/observation_extras.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,12 @@ def observation_type_tabs(context):
}


@register.inclusion_tag('tom_observations/partials/facility_observation_form.html')
def facility_observation_form(target, facility, observation_type):
@register.inclusion_tag('tom_observations/partials/facility_observation_form.html', takes_context=True)
def facility_observation_form(context, target, facility, observation_type):
"""
Displays a form for submitting an observation for a specific facility and observation type, e.g., imaging.
"""
facility_class = get_service_class(facility)()
facility_class = get_service_class(facility)(user=context['request'].user)
initial_fields = {
'target_id': target.id,
'facility': facility,
Expand Down Expand Up @@ -259,8 +259,8 @@ def observation_distribution(observations):
return {'figure': figure}


@register.inclusion_tag('tom_observations/partials/facility_status.html')
def facility_status():
@register.inclusion_tag('tom_observations/partials/facility_status.html', takes_context=True)
def facility_status(context):
"""
Collect the facility status from the registered facilities and pass them
to the facility_status.html partial template.
Expand All @@ -270,7 +270,7 @@ def facility_status():

facility_statuses = []
for facility_class in get_service_classes().values():
facility = facility_class()
facility = facility_class(user=context['request'].user)
weather_urls = facility.get_facility_weather_urls()
status = facility.get_facility_status()

Expand All @@ -286,11 +286,11 @@ def facility_status():
return {'facilities': facility_statuses}


@register.inclusion_tag('tom_observations/partials/facility_map.html')
def facility_map():
@register.inclusion_tag('tom_observations/partials/facility_map.html', takes_context=True)
def facility_map(context):
facility_locations = []
for facility_class in get_service_classes().values():
facility = facility_class()
facility = facility_class(user=context['request'].user)
sites = facility.get_observing_sites()

# Flatten each facility site dictionary and add text label for use in facility map
Expand Down
20 changes: 10 additions & 10 deletions tom_observations/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ def get_context_data(self, **kwargs):

# allow the Facility class to add data to the context
facility_class = self.get_facility_class()
facility_context = facility_class().get_facility_context_data(target=target)
facility_context = facility_class(user=self.request.user).get_facility_context_data(target=target)
context.update(facility_context)

return context
Expand All @@ -241,7 +241,7 @@ def get_form_class(self):
elif self.request.method == 'POST':
observation_type = self.request.POST.get('observation_type')
form_class = type(f'Composite{observation_type}Form',
(self.get_facility_class()().get_form(observation_type), self.get_cadence_strategy_form()),
(self.get_facility_class()(user=self.request.user).get_form(observation_type), self.get_cadence_strategy_form()),
{})
return form_class

Expand Down Expand Up @@ -311,7 +311,7 @@ def form_valid(self, form):
# Submit the observation
facility = self.get_facility_class()
target = self.get_target()
observation_ids = facility().submit_observation(form.observation_payload())
observation_ids = facility(user=self.request.user).submit_observation(form.observation_payload())
records = []

for observation_id in observation_ids:
Expand Down Expand Up @@ -376,7 +376,7 @@ class ObservationRecordCancelView(LoginRequiredMixin, View):
def get(self, request, *args, **kwargs):
obsr_id = self.kwargs.get('pk')
obsr = ObservationRecord.objects.get(id=obsr_id)
facility = get_service_class(obsr.facility)()
facility = get_service_class(obsr.facility)(user=request.user)
try:
success = facility.cancel_observation(obsr.observation_id)
if success:
Expand Down Expand Up @@ -500,10 +500,10 @@ def get_context_data(self, *args, **kwargs):
"""
context = super().get_context_data(*args, **kwargs)
context['form'] = AddProductToGroupForm()
service_class = get_service_class(self.object.facility)
context['editable'] = isinstance(service_class(), BaseManualObservationFacility)
context['data_products'] = service_class().all_data_products(self.object)
context['can_be_cancelled'] = self.object.status not in service_class().get_terminal_observing_states()
service_class = get_service_class(self.object.facility)(user=self.request.user)
context['editable'] = isinstance(service_class, BaseManualObservationFacility)
context['data_products'] = service_class.all_data_products(self.object)
context['can_be_cancelled'] = self.object.status not in service_class.get_terminal_observing_states()
newest_image = None
for data_product in context['data_products']['saved']:
newest_image = data_product if (not newest_image or data_product.modified > newest_image.modified) and \
Expand Down Expand Up @@ -607,7 +607,7 @@ def get_form_class(self):
raise ValueError('Must provide a facility name')

# TODO: modify this to work with all LCO forms
return get_service_class(facility_name)().get_template_form(None)
return get_service_class(facility_name)(user=self.request.user).get_template_form(None)

def get_form(self, form_class=None):
form = super().get_form()
Expand Down Expand Up @@ -637,7 +637,7 @@ def get_object(self):

def get_form_class(self):
self.object = self.get_object()
return get_service_class(self.object.facility)().get_template_form(None)
return get_service_class(self.object.facility)(user=self.request.user).get_template_form(None)

def get_form(self, form_class=None):
form = super().get_form()
Expand Down

0 comments on commit 85dd1c5

Please sign in to comment.