diff --git a/tom_observations/templates/tom_observations/facility_status.html b/tom_observations/templates/tom_observations/facility_status.html
index 52e61db6d..b4c67cce1 100644
--- a/tom_observations/templates/tom_observations/facility_status.html
+++ b/tom_observations/templates/tom_observations/facility_status.html
@@ -5,6 +5,21 @@
Facility Status
{% facility_map %}
- {% facility_status %}
+
+
+ Refresh Facility Status
+
+
+
+
+ {% include 'tom_observations/partials/facility_status_table.html' with loading=True facilities=None %}
+
{% endblock %}
diff --git a/tom_observations/templates/tom_observations/partials/facility_status.html b/tom_observations/templates/tom_observations/partials/facility_status.html
deleted file mode 100644
index 621741421..000000000
--- a/tom_observations/templates/tom_observations/partials/facility_status.html
+++ /dev/null
@@ -1,33 +0,0 @@
-{% load tom_common_extras %}
-
-
-
-
- Facility
- Site
- Telescope
- Status
- Weather URL
-
-
-
- {% for facility in facilities %}
- {% for site in facility.sites %}
- {% for telescope in site.telescopes %}
-
- {{ facility.code }}
- {{ site.code }}
- {{ telescope.code }}
- {{ telescope.status }}
- link
-
- {% endfor %}
- {% endfor %}
- {% empty %}
-
- Facility status unknown.
-
- {% endfor %}
-
-
-
\ No newline at end of file
diff --git a/tom_observations/templates/tom_observations/partials/facility_status_table.html b/tom_observations/templates/tom_observations/partials/facility_status_table.html
new file mode 100644
index 000000000..11c305f93
--- /dev/null
+++ b/tom_observations/templates/tom_observations/partials/facility_status_table.html
@@ -0,0 +1,38 @@
+{% load tom_common_extras %}
+
+
+
+ Facility
+ Site
+ Telescope
+ Status
+ Weather URL
+
+
+
+ {% if loading %}
+
+ Fetching facility status...
+
+ {% else %}
+ {% for facility in facilities %}
+ {% for site in facility.sites %}
+ {% for telescope in site.telescopes %}
+
+ {{ facility.code }}
+ {{ site.code }}
+ {{ telescope.code }}
+ {{ telescope.status }}
+ link
+
+ {% endfor %}
+ {% endfor %}
+ {% empty %}
+
+ Facility status unknown.
+
+ {% endfor %}
+ {% endif %}
+
+
+{% include 'tom_common/partials/messages.html' %}
diff --git a/tom_observations/templatetags/observation_extras.py b/tom_observations/templatetags/observation_extras.py
index 4179ca041..ec09b24f4 100644
--- a/tom_observations/templatetags/observation_extras.py
+++ b/tom_observations/templatetags/observation_extras.py
@@ -267,34 +267,6 @@ def observation_distribution(observations):
return {'figure': figure}
-@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.
- See lco.py Facility implementation for example.
- :return:
- """
-
- facility_statuses = []
- for facility_class in get_service_classes().values():
- facility = facility_class()
- facility.set_user(context['request'].user)
- weather_urls = facility.get_facility_weather_urls()
- status = facility.get_facility_status()
-
- # add the weather_url to the site dictionary
- for site in status.get('sites', []):
- url = next((site_url['weather_url'] for site_url in weather_urls.get('sites', [])
- if site_url['code'] == site['code']), None)
- if url is not None:
- site['weather_url'] = url
-
- facility_statuses.append(status)
-
- return {'facilities': facility_statuses}
-
-
@register.inclusion_tag('tom_observations/partials/facility_map.html', takes_context=True)
def facility_map(context):
facility_locations = []
diff --git a/tom_observations/tests/tests.py b/tom_observations/tests/tests.py
index e671e9c64..8bde9c3fa 100644
--- a/tom_observations/tests/tests.py
+++ b/tom_observations/tests/tests.py
@@ -319,7 +319,8 @@ def setUp(self):
pass
def test_facility_status(self):
- response = self.client.get(reverse('tom_observations:facility-status'))
+ response = self.client.get(
+ reverse('tom_observations:render-facility-status-list'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'coj.domb.1m0a', status_code=HTTPStatus.OK)
diff --git a/tom_observations/urls.py b/tom_observations/urls.py
index 2169c37b6..76b236592 100644
--- a/tom_observations/urls.py
+++ b/tom_observations/urls.py
@@ -5,7 +5,9 @@
ObservationGroupListView, ObservationListView, ObservationRecordCancelView,
ObservationRecordDetailView, ObservationTemplateCreateView,
ObservationTemplateDeleteView, ObservationTemplateListView,
- ObservationTemplateUpdateView, ObservationCallbackView, ObservationRedirectView)
+ ObservationTemplateUpdateView,
+ ObservationCallbackView, ObservationRedirectView,
+ render_facility_status_list)
from tom_observations.api_views import ObservationRecordViewSet
from tom_common.api_router import SharedAPIRootRouter
@@ -18,6 +20,8 @@
path('add/', AddExistingObservationView.as_view(), name='add-existing'),
path('list/', ObservationListView.as_view(), name='list'),
path('status/', FacilityStatusView.as_view(), name='facility-status'),
+ path('status/list/', render_facility_status_list,
+ name='render-facility-status-list'),
path('template/list/', ObservationTemplateListView.as_view(), name='template-list'),
path('template//create/', ObservationTemplateCreateView.as_view(), name='template-create'),
path('template//update/', ObservationTemplateUpdateView.as_view(), name='template-update'),
diff --git a/tom_observations/views.py b/tom_observations/views.py
index 91804acbd..3d643f1c0 100644
--- a/tom_observations/views.py
+++ b/tom_observations/views.py
@@ -14,7 +14,7 @@
from django_filters import CharFilter, ChoiceFilter, DateTimeFromToRangeFilter, ModelMultipleChoiceFilter
from django_filters import OrderingFilter, MultipleChoiceFilter, rest_framework
from django_filters.views import FilterView
-from django.shortcuts import get_object_or_404, redirect
+from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse, reverse_lazy
from django.utils.safestring import mark_safe
from django.views.generic import View, TemplateView
@@ -842,3 +842,33 @@ class ObservationTemplateDeleteView(LoginRequiredMixin, DeleteView):
class FacilityStatusView(TemplateView):
template_name = 'tom_observations/facility_status.html'
+
+
+def render_facility_status_list(request, *args, **kwargs):
+ """
+ View function for rendering the facility status partial.
+ """
+ facility_statuses = []
+ for facility_class in get_service_classes().values():
+ facility = facility_class()
+ facility.set_user(request.user)
+ weather_urls = facility.get_facility_weather_urls()
+ status = facility.get_facility_status()
+
+ # add the weather_url to the site dictionary
+ for site in status.get('sites', []):
+ url = next((
+ site_url['weather_url'] for site_url in weather_urls.get('sites', [])
+ if site_url['code'] == site['code']), None)
+ if url is not None:
+ site['weather_url'] = url
+
+ facility_statuses.append(status)
+
+ hx_trigger = request.GET.get('hx_trigger')
+ if hx_trigger != 'load':
+ messages.info(request, "Facility statuses updated.")
+
+ return render(
+ request, 'tom_observations/partials/facility_status_table.html',
+ context={'facilities': facility_statuses, 'loading': False})