Add API for django messages

This commit is contained in:
Moritz Pflanzer
2023-12-30 11:54:19 +01:00
parent 2e597a7176
commit 36db77cf89
7 changed files with 174 additions and 1 deletions

View File

@@ -0,0 +1,55 @@
from django.contrib import messages
from django.contrib.auth.models import User
from django.contrib.messages.storage.fallback import FallbackStorage
from django.test import RequestFactory
from rest_framework import status
from rest_framework.test import APITestCase
from documents.tests.utils import DirectoriesMixin
from paperless.views import MessagesView
class TestApiMessages(DirectoriesMixin, APITestCase):
ENDPOINT = "/api/messages/"
def setUp(self):
super().setUp()
self.user = User.objects.create_superuser(
username="temp_admin",
first_name="firstname",
last_name="surname",
)
self.client.force_authenticate(user=self.user)
def test_get_django_messages(self):
"""
GIVEN:
- Configured user
- Pending django message
WHEN:
- API call is made to get the django messages
THEN:
- Pending message is returned
- No more messages are pending
"""
factory = RequestFactory()
request = factory.get(self.ENDPOINT)
request.user = self.user
# Fake middleware support for RequestFactory
# See https://stackoverflow.com/a/66473588/1022690
setattr(request, "session", "session")
setattr(request, "_messages", FallbackStorage(request))
msg = "Test message"
messages.error(request, msg)
response = MessagesView.as_view()(request)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]["level"], "error")
self.assertEqual(response.data[0]["message"], msg)

View File

@@ -45,6 +45,7 @@ from paperless.views import DisconnectSocialAccountView
from paperless.views import FaviconView
from paperless.views import GenerateAuthTokenView
from paperless.views import GroupViewSet
from paperless.views import MessagesView
from paperless.views import ProfileView
from paperless.views import SocialAccountProvidersView
from paperless.views import UserViewSet
@@ -147,6 +148,7 @@ urlpatterns = [
ProfileView.as_view(),
name="profile_view",
),
path("messages/", MessagesView.as_view()),
*api_router.urls,
],
),

View File

@@ -2,6 +2,7 @@ import os
from collections import OrderedDict
from allauth.socialaccount.adapter import get_adapter
from django.contrib import messages
from django.contrib.auth.models import Group
from django.contrib.auth.models import User
from django.db.models.functions import Lower
@@ -222,3 +223,18 @@ class SocialAccountProvidersView(APIView):
]
return Response(sorted(resp, key=lambda p: p["name"]))
class MessagesView(APIView):
"""
Expose django messages. This clears the messages in django
"""
permission_classes = [IsAuthenticated]
def get(self, request, *args, **kwargs):
data = [
{"level": m.level_tag, "message": m.message, "tags": m.extra_tags}
for m in messages.get_messages(request)
]
return Response(data)