core: add avatars to user api
This commit is contained in:
		| @ -1,22 +1,32 @@ | |||||||
| """User API Views""" | """User API Views""" | ||||||
| from rest_framework.serializers import BooleanField, ModelSerializer |  | ||||||
| from rest_framework.viewsets import ModelViewSet |  | ||||||
| from rest_framework.decorators import action | from rest_framework.decorators import action | ||||||
| from rest_framework.request import Request | from rest_framework.request import Request | ||||||
| from rest_framework.response import Response | from rest_framework.response import Response | ||||||
|  | from rest_framework.serializers import ( | ||||||
|  |     BooleanField, | ||||||
|  |     ModelSerializer, | ||||||
|  |     SerializerMethodField, | ||||||
|  | ) | ||||||
|  | from rest_framework.viewsets import ModelViewSet | ||||||
|  |  | ||||||
| from passbook.core.models import User | from passbook.core.models import User | ||||||
|  | from passbook.lib.templatetags.passbook_utils import avatar | ||||||
|  |  | ||||||
|  |  | ||||||
| class UserSerializer(ModelSerializer): | class UserSerializer(ModelSerializer): | ||||||
|     """User Serializer""" |     """User Serializer""" | ||||||
|  |  | ||||||
|     is_superuser = BooleanField(read_only=True) |     is_superuser = BooleanField(read_only=True) | ||||||
|  |     avatar = SerializerMethodField() | ||||||
|  |  | ||||||
|  |     def get_avatar(self, user: User) -> str: | ||||||
|  |         """Add user's avatar as URL""" | ||||||
|  |         return avatar(user) | ||||||
|  |  | ||||||
|     class Meta: |     class Meta: | ||||||
|  |  | ||||||
|         model = User |         model = User | ||||||
|         fields = ["pk", "username", "name", "is_superuser", "email"] |         fields = ["pk", "username", "name", "is_superuser", "email", "avatar"] | ||||||
|  |  | ||||||
|  |  | ||||||
| class UserViewSet(ModelViewSet): | class UserViewSet(ModelViewSet): | ||||||
| @ -26,6 +36,7 @@ class UserViewSet(ModelViewSet): | |||||||
|     serializer_class = UserSerializer |     serializer_class = UserSerializer | ||||||
|  |  | ||||||
|     @action(detail=False) |     @action(detail=False) | ||||||
|  |     # pylint: disable=invalid-name | ||||||
|     def me(self, request: Request) -> Response: |     def me(self, request: Request) -> Response: | ||||||
|         """Get information about current user""" |         """Get information about current user""" | ||||||
|         return Response(UserSerializer(request.user).data) |         return Response(UserSerializer(request.user).data) | ||||||
|  | |||||||
| @ -29,7 +29,7 @@ class TestImpersonation(TestCase): | |||||||
|  |  | ||||||
|         self.client.get(reverse("passbook_core:impersonate-end")) |         self.client.get(reverse("passbook_core:impersonate-end")) | ||||||
|  |  | ||||||
|         response = self.client.get(reverse("passbook_core:overview")) |         response = self.client.get(reverse("passbook_api:user-me")) | ||||||
|         self.assertNotIn(self.other_user.username, response.content.decode()) |         self.assertNotIn(self.other_user.username, response.content.decode()) | ||||||
|         self.assertIn(self.pbadmin.username, response.content.decode()) |         self.assertIn(self.pbadmin.username, response.content.decode()) | ||||||
|  |  | ||||||
| @ -43,7 +43,7 @@ class TestImpersonation(TestCase): | |||||||
|             ) |             ) | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         response = self.client.get(reverse("passbook_core:overview")) |         response = self.client.get(reverse("passbook_api:user-me")) | ||||||
|         self.assertIn(self.other_user.username, response.content.decode()) |         self.assertIn(self.other_user.username, response.content.decode()) | ||||||
|         self.assertNotIn(self.pbadmin.username, response.content.decode()) |         self.assertNotIn(self.pbadmin.username, response.content.decode()) | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| """passbook URL Configuration""" | """passbook URL Configuration""" | ||||||
| from django.urls import path | from django.urls import path | ||||||
|  |  | ||||||
| from passbook.core.views import impersonate, overview, user, shell | from passbook.core.views import impersonate, overview, shell, user | ||||||
|  |  | ||||||
| urlpatterns = [ | urlpatterns = [ | ||||||
|     # User views |     # User views | ||||||
|  | |||||||
							
								
								
									
										55
									
								
								swagger.yaml
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								swagger.yaml
									
									
									
									
									
								
							| @ -620,6 +620,57 @@ paths: | |||||||
|       tags: |       tags: | ||||||
|         - core |         - core | ||||||
|     parameters: [] |     parameters: [] | ||||||
|  |   /core/users/me/: | ||||||
|  |     get: | ||||||
|  |       operationId: core_users_me | ||||||
|  |       description: Get information about current user | ||||||
|  |       parameters: | ||||||
|  |         - name: ordering | ||||||
|  |           in: query | ||||||
|  |           description: Which field to use when ordering the results. | ||||||
|  |           required: false | ||||||
|  |           type: string | ||||||
|  |         - name: search | ||||||
|  |           in: query | ||||||
|  |           description: A search term. | ||||||
|  |           required: false | ||||||
|  |           type: string | ||||||
|  |         - name: limit | ||||||
|  |           in: query | ||||||
|  |           description: Number of results to return per page. | ||||||
|  |           required: false | ||||||
|  |           type: integer | ||||||
|  |         - name: offset | ||||||
|  |           in: query | ||||||
|  |           description: The initial index from which to return the results. | ||||||
|  |           required: false | ||||||
|  |           type: integer | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: '' | ||||||
|  |           schema: | ||||||
|  |             required: | ||||||
|  |               - count | ||||||
|  |               - results | ||||||
|  |             type: object | ||||||
|  |             properties: | ||||||
|  |               count: | ||||||
|  |                 type: integer | ||||||
|  |               next: | ||||||
|  |                 type: string | ||||||
|  |                 format: uri | ||||||
|  |                 x-nullable: true | ||||||
|  |               previous: | ||||||
|  |                 type: string | ||||||
|  |                 format: uri | ||||||
|  |                 x-nullable: true | ||||||
|  |               results: | ||||||
|  |                 type: array | ||||||
|  |                 items: | ||||||
|  |                   $ref: '#/definitions/User' | ||||||
|  |       tags: | ||||||
|  |         - core | ||||||
|  |     parameters: [] | ||||||
|   /core/users/{id}/: |   /core/users/{id}/: | ||||||
|     get: |     get: | ||||||
|       operationId: core_users_read |       operationId: core_users_read | ||||||
| @ -6564,6 +6615,10 @@ definitions: | |||||||
|         type: string |         type: string | ||||||
|         format: email |         format: email | ||||||
|         maxLength: 254 |         maxLength: 254 | ||||||
|  |       avatar: | ||||||
|  |         title: Avatar | ||||||
|  |         type: string | ||||||
|  |         readOnly: true | ||||||
|   CertificateKeyPair: |   CertificateKeyPair: | ||||||
|     description: CertificateKeyPair Serializer |     description: CertificateKeyPair Serializer | ||||||
|     required: |     required: | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Jens Langhammer
					Jens Langhammer