Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion tom_observations/templates/tom_observations/facility_status.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,21 @@
<h3>Facility Status</h3>
{% facility_map %}
<div>
{% facility_status %}
<div
hx-get="{% url 'tom_observations:render-facility-status-list'%}?hx_trigger=load" hx-target="#facility-status-list"
hx-indicator=".progress"
hx-trigger="load">
<button
class="btn btn-secondary mb-3"
hx-get="{% url 'tom_observations:render-facility-status-list' %}"
hx-trigger="click"
hx-disabled-elt="this">
Refresh Facility Status
</button>
</div>
<div class="progress"><div class="indeterminate"></div></div>
<div id="facility-status-list" class="table-responsive-lg">
{% include 'tom_observations/partials/facility_status_table.html' with loading=True facilities=None %}
</div>
</div>
{% endblock %}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{% load tom_common_extras %}
<table class="table">
<thead>
<tr>
<th style="width: 20%;">Facility</th>
<th style="width: 10%;">Site</th>
<th style="width: 20%;">Telescope</th>
<th style="width: 35%;">Status</th>
<th style="width: 15%;">Weather URL</th>
</tr>
</thead>
<tbody>
{% if loading %}
<tr>
<td colspan="5" class="text-center">Fetching facility status...</td>
</tr>
{% else %}
{% for facility in facilities %}
{% for site in facility.sites %}
{% for telescope in site.telescopes %}
<tr>
<td>{{ facility.code }}</td>
<td>{{ site.code }}</td>
<td>{{ telescope.code }}</td>
<td>{{ telescope.status }}</td>
<td><a href="{{ site.weather_url }}" target="_blank">link</a></td>
</tr>
{% endfor %}
{% endfor %}
{% empty %}
<tr>
<td colspan="5" class="text-center">Facility status unknown.</td>
</tr>
{% endfor %}
{% endif %}
</tbody>
</table>
{% include 'tom_common/partials/messages.html' %}
28 changes: 0 additions & 28 deletions tom_observations/templatetags/observation_extras.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand Down
3 changes: 2 additions & 1 deletion tom_observations/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
6 changes: 5 additions & 1 deletion tom_observations/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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/<str:facility>/create/', ObservationTemplateCreateView.as_view(), name='template-create'),
path('template/<int:pk>/update/', ObservationTemplateUpdateView.as_view(), name='template-update'),
Expand Down
32 changes: 31 additions & 1 deletion tom_observations/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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})