(backend) add public endpoint /api/v1.0/config/

Add public endpoint /api/v1.0/config/ to
share some public configuration values
with the frontend.
This commit is contained in:
Anthony LC
2024-08-20 10:20:32 +02:00
committed by Anthony LC
parent 85c789bb1a
commit 03bfef6061
4 changed files with 67 additions and 0 deletions

View File

@@ -1,5 +1,6 @@
"""API endpoints""" """API endpoints"""
from django.conf import settings
from django.contrib.postgres.search import TrigramSimilarity from django.contrib.postgres.search import TrigramSimilarity
from django.db.models import Func, Max, OuterRef, Q, Subquery, Value from django.db.models import Func, Max, OuterRef, Q, Subquery, Value
from django.db.models.functions import Coalesce from django.db.models.functions import Coalesce
@@ -12,8 +13,10 @@ from rest_framework import (
pagination, pagination,
response, response,
throttling, throttling,
views,
viewsets, viewsets,
) )
from rest_framework.permissions import AllowAny
from core import models from core import models
@@ -491,3 +494,21 @@ class InvitationViewset(
.distinct() .distinct()
) )
return queryset return queryset
class ConfigView(views.APIView):
"""API ViewSet for sharing some public settings."""
permission_classes = [AllowAny]
def get(self, request):
"""
GET /api/v1.0/config/
Return a dictionary of public settings.
"""
array_settings = ["LANGUAGES", "FEATURES"]
dict_settings = {}
for setting in array_settings:
dict_settings[setting] = getattr(settings, setting)
return response.Response(dict_settings)

View File

@@ -0,0 +1,39 @@
"""
Test users API endpoints in the People core app.
"""
import pytest
from rest_framework.status import (
HTTP_200_OK,
)
from rest_framework.test import APIClient
from core import factories
pytestmark = pytest.mark.django_db
def test_api_config_anonymous():
"""Anonymous users should be allowed to get the configuration."""
client = APIClient()
response = client.get("/api/v1.0/config/")
assert response.status_code == HTTP_200_OK
assert response.json() == {
"LANGUAGES": [["en-us", "English"], ["fr-fr", "French"]],
"FEATURES": {"TEAMS": True},
}
def test_api_config_authenticated():
"""Authenticated users should be allowed to get the configuration."""
user = factories.UserFactory()
client = APIClient()
client.force_login(user)
response = client.get("/api/v1.0/config/")
assert response.status_code == HTTP_200_OK
assert response.json() == {
"LANGUAGES": [["en-us", "English"], ["fr-fr", "French"]],
"FEATURES": {"TEAMS": True},
}

View File

@@ -44,4 +44,5 @@ urlpatterns = [
), ),
), ),
path(f"api/{settings.API_VERSION}/", include("mailbox_manager.urls")), path(f"api/{settings.API_VERSION}/", include("mailbox_manager.urls")),
path(f"api/{settings.API_VERSION}/config/", viewsets.ConfigView.as_view()),
] ]

View File

@@ -371,6 +371,12 @@ class Base(Configuration):
environ_prefix=None, environ_prefix=None,
) )
FEATURES = {
"TEAMS": values.BooleanValue(
default=True, environ_name="FEATURE_TEAMS", environ_prefix=None
),
}
# pylint: disable=invalid-name # pylint: disable=invalid-name
@property @property
def ENVIRONMENT(self): def ENVIRONMENT(self):