✨(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:
@@ -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)
|
||||||
|
|||||||
39
src/backend/core/tests/test_api_config.py
Normal file
39
src/backend/core/tests/test_api_config.py
Normal 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},
|
||||||
|
}
|
||||||
@@ -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()),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user