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 @@
- {% if messages %}
- {% for message in messages %}- {{ message }}
{% endfor %}
- {% endif %}
+
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()