diff --git a/process_manager/templates/process_manager/index.html b/process_manager/templates/process_manager/index.html index d9a67c3..09f9dda 100644 --- a/process_manager/templates/process_manager/index.html +++ b/process_manager/templates/process_manager/index.html @@ -56,9 +56,9 @@
diff --git a/process_manager/templates/process_manager/partials/message_items.html b/process_manager/templates/process_manager/partials/message_items.html new file mode 100644 index 0000000..9c603ec --- /dev/null +++ b/process_manager/templates/process_manager/partials/message_items.html @@ -0,0 +1 @@ +{% for message in messages %}
  • {{ message }}
  • {% endfor %} diff --git a/process_manager/urls.py b/process_manager/urls.py index 0378281..f37d957 100644 --- a/process_manager/urls.py +++ b/process_manager/urls.py @@ -8,6 +8,7 @@ partial_urlpatterns = [ path("process_table/", partials.process_table, name="process_table"), + path("messages/", partials.messages, name="messages"), ] urlpatterns = [ diff --git a/process_manager/views/pages.py b/process_manager/views/pages.py index a2bed55..6fd3488 100644 --- a/process_manager/views/pages.py +++ b/process_manager/views/pages.py @@ -4,7 +4,6 @@ from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.mixins import PermissionRequiredMixin -from django.db import transaction from django.http import HttpRequest, HttpResponse from django.shortcuts import render from django.urls import reverse_lazy @@ -17,16 +16,7 @@ @login_required def index(request: HttpRequest) -> HttpResponse: """View that renders the index/home page.""" - with transaction.atomic(): - # atomic to avoid race condition with kafka consumer - messages = request.session.load().get("messages", []) - request.session.pop("messages", []) - request.session.save() - - context = {"messages": messages} - return render( - request=request, context=context, template_name="process_manager/index.html" - ) + return render(request=request, template_name="process_manager/index.html") @login_required diff --git a/process_manager/views/partials.py b/process_manager/views/partials.py index ab5d5b5..e18251e 100644 --- a/process_manager/views/partials.py +++ b/process_manager/views/partials.py @@ -2,6 +2,7 @@ import django_tables2 from django.contrib.auth.decorators import login_required +from django.db import transaction from django.http import HttpRequest, HttpResponse from django.shortcuts import render from druncschema.process_manager_pb2 import ( @@ -52,3 +53,19 @@ def process_table(request: HttpRequest) -> HttpResponse: context=dict(table=table), template_name="process_manager/partials/process_table.html", ) + + +@login_required +def messages(request: HttpRequest) -> HttpResponse: + """Renders and pops Kafka messages from the user's session.""" + with transaction.atomic(): + # atomic to avoid race condition with kafka consumer + messages = request.session.load().get("messages", []) + request.session.pop("messages", []) + request.session.save() + + return render( + request=request, + context=dict(messages=messages[::-1]), + template_name="process_manager/partials/message_items.html", + ) diff --git a/tests/process_manager/views/test_page_views.py b/tests/process_manager/views/test_page_views.py index 0ad5da7..fed6031 100644 --- a/tests/process_manager/views/test_page_views.py +++ b/tests/process_manager/views/test_page_views.py @@ -18,24 +18,6 @@ def test_authenticated(self, auth_client): response = auth_client.get(self.endpoint) assert response.status_code == HTTPStatus.OK - def test_session_messages(self, auth_client): - """Test the rendering of messages from the user session into the view.""" - from django.contrib.sessions.backends.db import SessionStore - from django.contrib.sessions.models import Session - - session = Session.objects.get() - message_data = ["message 1", "message 2"] - store = SessionStore(session_key=session.session_key) - store["messages"] = message_data - store.save() - - response = auth_client.get(self.endpoint) - assert response.status_code == HTTPStatus.OK - - # messages have been removed from the session and added to the context - assert response.context["messages"] == message_data - assert "messages" not in store.load() - class TestLogsView(PermissionRequiredTest): """Tests for the logs view.""" diff --git a/tests/process_manager/views/test_partial_views.py b/tests/process_manager/views/test_partial_views.py index 55657a6..695d1cc 100644 --- a/tests/process_manager/views/test_partial_views.py +++ b/tests/process_manager/views/test_partial_views.py @@ -4,6 +4,7 @@ import pytest from django.urls import reverse +from pytest_django.asserts import assertTemplateUsed from process_manager.tables import ProcessTable @@ -47,3 +48,28 @@ def test_post_checked_rows(self, mocker, auth_client): for row in table.data.data: assert row["checked"] == (row["uuid"] in selected_uuids) + + +class TestMessagesView(LoginRequiredTest): + """Test the process_manager.views.messages view function.""" + + endpoint = reverse("process_manager:messages") + + def test_get(self, auth_client): + """Tests basic calls of view method.""" + from django.contrib.sessions.backends.db import SessionStore + from django.contrib.sessions.models import Session + + session = Session.objects.get() + message_data = ["message 1", "message 2"] + store = SessionStore(session_key=session.session_key) + store["messages"] = message_data + store.save() + + with assertTemplateUsed("process_manager/partials/message_items.html"): + response = auth_client.get(self.endpoint) + assert response.status_code == HTTPStatus.OK + + # messages have been removed from the session and added to the context + assert response.context["messages"] == message_data[::-1] + assert "messages" not in store.load()