feat: Add user view set
This commit is contained in:
parent
330e3c89ea
commit
9449f7e665
8 changed files with 80 additions and 35 deletions
|
@ -7,17 +7,23 @@ from userausfall.views import get_authenticated_user
|
||||||
class UserSerializer(serializers.HyperlinkedModelSerializer):
|
class UserSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
fields = ["username"]
|
fields = ["id", "trust_bridge", "url"]
|
||||||
|
|
||||||
|
|
||||||
|
class TrustBridgeUserSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = User
|
||||||
|
fields = ["id", "url", "username"]
|
||||||
# the UniqueValidator for username prevents successful validation for existing users
|
# the UniqueValidator for username prevents successful validation for existing users
|
||||||
extra_kwargs = {"username": {"validators": []}}
|
extra_kwargs = {"username": {"validators": []}}
|
||||||
|
|
||||||
|
|
||||||
class TrustBridgeSerializer(serializers.HyperlinkedModelSerializer):
|
class TrustBridgeSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
trust_giver = UserSerializer()
|
trust_giver = TrustBridgeUserSerializer()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TrustBridge
|
model = TrustBridge
|
||||||
fields = ["is_trusted", "trust_giver"]
|
fields = ["id", "is_trusted", "trust_giver", "url"]
|
||||||
read_only_fields = ["is_trusted"]
|
read_only_fields = ["is_trusted"]
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
from .auth import * # noqa: F401, F403
|
from .auth import AuthenticationTestCase # noqa: F401, F403
|
||||||
from .trust_bridges import * # noqa: F401, F403
|
from .trust_bridges import TrustBridgeTestCase # noqa: F401, F403
|
||||||
|
from .users import UserTestCase # noqa: F401, F403
|
||||||
|
|
|
@ -2,32 +2,10 @@ from rest_framework import status
|
||||||
|
|
||||||
from userausfall.models import User
|
from userausfall.models import User
|
||||||
from userausfall.rest_api.tests.userausfall import UserausfallAPITestCase
|
from userausfall.rest_api.tests.userausfall import UserausfallAPITestCase
|
||||||
|
from userausfall.rest_api.tests.users import UserMixin
|
||||||
|
|
||||||
|
|
||||||
class UserMixin:
|
class AuthenticationTestCase(UserMixin, UserausfallAPITestCase):
|
||||||
user: User
|
|
||||||
password: str
|
|
||||||
username: str
|
|
||||||
|
|
||||||
def create_user(self):
|
|
||||||
self.username = f"test{User.objects.count()}"
|
|
||||||
self.password = "test12345"
|
|
||||||
self.user = User.objects.create_user(self.username, self.password)
|
|
||||||
return self.user
|
|
||||||
|
|
||||||
def ensure_user_exists(self):
|
|
||||||
if not hasattr(self, "user"):
|
|
||||||
self.create_user()
|
|
||||||
|
|
||||||
def authenticate_user(self):
|
|
||||||
self.ensure_user_exists()
|
|
||||||
if hasattr(self.client, "force_authentication"):
|
|
||||||
self.client.force_authenticate(user=self.user)
|
|
||||||
else:
|
|
||||||
self.client.force_login(user=self.user)
|
|
||||||
|
|
||||||
|
|
||||||
class UserTestCase(UserMixin, UserausfallAPITestCase):
|
|
||||||
base_url = "/api/auth"
|
base_url = "/api/auth"
|
||||||
|
|
||||||
def test_signup(self):
|
def test_signup(self):
|
||||||
|
|
|
@ -2,7 +2,8 @@ from django.core import mail
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
|
|
||||||
from userausfall.models import TrustBridge
|
from userausfall.models import TrustBridge
|
||||||
from userausfall.rest_api.tests import UserausfallAPITestCase, UserMixin
|
from userausfall.rest_api.tests.userausfall import get_url, UserausfallAPITestCase
|
||||||
|
from userausfall.rest_api.tests.users import UserMixin
|
||||||
|
|
||||||
|
|
||||||
class TrustBridgeTestCase(UserMixin, UserausfallAPITestCase):
|
class TrustBridgeTestCase(UserMixin, UserausfallAPITestCase):
|
||||||
|
@ -37,13 +38,17 @@ class TrustBridgeTestCase(UserMixin, UserausfallAPITestCase):
|
||||||
self.authenticate_user()
|
self.authenticate_user()
|
||||||
response = self.client.get(self.get_api_url(url, pk=self.trust_bridge.pk))
|
response = self.client.get(self.get_api_url(url, pk=self.trust_bridge.pk))
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
self.assertEqual(
|
self.assertDictEqual(
|
||||||
response.data,
|
response.data,
|
||||||
{
|
{
|
||||||
|
"id": self.trust_bridge.id,
|
||||||
"is_trusted": False,
|
"is_trusted": False,
|
||||||
"trust_giver": {
|
"trust_giver": {
|
||||||
|
"id": self.trust_giver.id,
|
||||||
"username": self.trust_giver.username,
|
"username": self.trust_giver.username,
|
||||||
|
"url": get_url(response, "user", self.trust_giver),
|
||||||
},
|
},
|
||||||
|
"url": get_url(response, "trustbridge", self.trust_bridge),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
|
from rest_framework.reverse import reverse
|
||||||
from rest_framework.test import APITestCase
|
from rest_framework.test import APITestCase
|
||||||
|
|
||||||
|
|
||||||
|
def get_url(response, basename, instance):
|
||||||
|
return reverse(f"{basename}-detail", [instance.pk], request=response.wsgi_request)
|
||||||
|
|
||||||
|
|
||||||
class UserausfallAPITestCase(APITestCase):
|
class UserausfallAPITestCase(APITestCase):
|
||||||
base_url = "/api"
|
base_url = "/api"
|
||||||
|
|
||||||
|
|
44
userausfall/rest_api/tests/users.py
Normal file
44
userausfall/rest_api/tests/users.py
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
from rest_framework import status
|
||||||
|
|
||||||
|
from userausfall.models import User
|
||||||
|
from userausfall.rest_api.tests.userausfall import get_url, UserausfallAPITestCase
|
||||||
|
|
||||||
|
|
||||||
|
class UserMixin:
|
||||||
|
user: User
|
||||||
|
password: str
|
||||||
|
username: str
|
||||||
|
|
||||||
|
def create_user(self):
|
||||||
|
self.username = f"test{User.objects.count()}"
|
||||||
|
self.password = "test12345"
|
||||||
|
self.user = User.objects.create_user(self.username, self.password)
|
||||||
|
return self.user
|
||||||
|
|
||||||
|
def ensure_user_exists(self):
|
||||||
|
if not hasattr(self, "user"):
|
||||||
|
self.create_user()
|
||||||
|
|
||||||
|
def authenticate_user(self):
|
||||||
|
self.ensure_user_exists()
|
||||||
|
if hasattr(self.client, "force_authentication"):
|
||||||
|
self.client.force_authenticate(user=self.user)
|
||||||
|
else:
|
||||||
|
self.client.force_login(user=self.user)
|
||||||
|
|
||||||
|
|
||||||
|
class UserTestCase(UserMixin, UserausfallAPITestCase):
|
||||||
|
def test_retrieve_user(self):
|
||||||
|
"""Retrieve the details of the current user."""
|
||||||
|
url = "/users/{pk}/"
|
||||||
|
self.authenticate_user()
|
||||||
|
response = self.client.get(self.get_api_url(url, pk=self.user.pk))
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
self.assertDictEqual(
|
||||||
|
response.data,
|
||||||
|
{
|
||||||
|
"id": self.user.id,
|
||||||
|
"trust_bridge": None,
|
||||||
|
"url": get_url(response, "user", self.user),
|
||||||
|
},
|
||||||
|
)
|
|
@ -2,10 +2,11 @@ from django.urls import include, path
|
||||||
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
|
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
from userausfall.rest_api.views import TrustBridgeViewSet
|
from userausfall.rest_api.views import TrustBridgeViewSet, UserViewSet
|
||||||
|
|
||||||
router = routers.SimpleRouter()
|
router = routers.SimpleRouter()
|
||||||
router.register(r"trust-bridges", TrustBridgeViewSet, "trust-bridge")
|
router.register(r"trust-bridges", TrustBridgeViewSet, "trustbridge")
|
||||||
|
router.register(r"users", UserViewSet, "user")
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("", include(router.urls)),
|
path("", include(router.urls)),
|
||||||
|
|
|
@ -4,7 +4,7 @@ from rest_framework.decorators import action
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from userausfall.models import MissingUserAttribute, PasswordMismatch, TrustBridge, User
|
from userausfall.models import MissingUserAttribute, PasswordMismatch, TrustBridge, User
|
||||||
from userausfall.rest_api.serializers import TrustBridgeSerializer
|
from userausfall.rest_api.serializers import TrustBridgeSerializer, UserSerializer
|
||||||
from userausfall.views import get_authenticated_user
|
from userausfall.views import get_authenticated_user
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,7 +18,12 @@ class TrustBridgeViewSet(
|
||||||
return self.queryset.filter(trust_taker=get_authenticated_user(self.request))
|
return self.queryset.filter(trust_taker=get_authenticated_user(self.request))
|
||||||
|
|
||||||
|
|
||||||
class UserViewSet(viewsets.GenericViewSet):
|
class UserViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
|
||||||
|
serializer_class = UserSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return User.objects.filter(pk=get_authenticated_user(self.request).pk)
|
||||||
|
|
||||||
@action(detail=True, methods=["post"])
|
@action(detail=True, methods=["post"])
|
||||||
def activate(self, request, pk=None):
|
def activate(self, request, pk=None):
|
||||||
"""Create the corresponding LDAP account."""
|
"""Create the corresponding LDAP account."""
|
||||||
|
|
Reference in a new issue