Просмотр исходного кода

added links to new api endpoints, tested api endpoint that returns user details for display

Rafał Pitoń 8 лет назад
Родитель
Сommit
27e9c64d30

+ 28 - 0
misago/project_template/project_name/settings.py

@@ -12,6 +12,11 @@ https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/
 
 import os
 
+# Define placeholder gettext function
+# This function will mark strings in settings visible to makemessages
+# without need for Django's i18n features be initialized first.
+_ = lambda x: x
+
 
 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -331,3 +336,26 @@ MISAGO_SEARCH_CONFIG = 'simple'
 # Those galleries can be loaded by running loadavatargallery command
 
 MISAGO_AVATAR_GALLERY = os.path.join(BASE_DIR, 'avatargallery')
+
+
+# Profile fields
+
+MISAGO_PROFILE_FIELDS = [
+    {
+        'name': _("Personal"),
+        'fields': [
+            'misago.users.profilefields.default.FullNameField',
+            'misago.users.profilefields.default.GenderField',
+            'misago.users.profilefields.default.BioField',
+            'misago.users.profilefields.default.LocationField',
+        ],
+    },
+    {
+        'name': _("Contact"),
+        'fields': [
+            'misago.users.profilefields.default.TwitterHandleField',
+            'misago.users.profilefields.default.SkypeHandleField',
+            'misago.users.profilefields.default.WebsiteField',
+        ],
+    },
+]

+ 5 - 0
misago/users/api/userendpoints/changedetails.py

@@ -0,0 +1,5 @@
+from rest_framework.response import Response
+
+
+def change_details_endpoint(request, user):
+    return Response({'detail': 'TODO'})

+ 16 - 2
misago/users/api/users.py

@@ -19,13 +19,15 @@ from misago.threads.moderation import hide_post, hide_thread
 from misago.users.bans import get_user_ban
 from misago.users.online.utils import get_user_status
 from misago.users.permissions import (
-    allow_browse_users_list, allow_delete_user, allow_follow_user, allow_moderate_avatar,
-    allow_rename_user, allow_see_ban_details)
+    allow_browse_users_list, allow_delete_user, allow_edit_profile_details,
+    allow_follow_user, allow_moderate_avatar, allow_rename_user, allow_see_ban_details)
+from misago.users.profilefields import profilefields, serialize_profilefields_data
 from misago.users.serializers import BanDetailsSerializer, ForumOptionsSerializer, UserSerializer
 from misago.users.viewmodels import Followers, Follows, UserPosts, UserThreads
 
 from .rest_permissions import BasePermission, UnbannedAnonOnly
 from .userendpoints.avatar import avatar_endpoint, moderate_avatar_endpoint
+from .userendpoints.changedetails import change_details_endpoint
 from .userendpoints.changeemail import change_email_endpoint
 from .userendpoints.changepassword import change_password_endpoint
 from .userendpoints.create import create_endpoint
@@ -227,6 +229,18 @@ class UserViewSet(viewsets.GenericViewSet):
         return Response({'detail': 'ok'})
 
     @detail_route(methods=['get'])
+    def details(self, request, pk=None):
+        profile = self.get_user(request, pk)
+        data = serialize_profilefields_data(request, profilefields, profile)
+        return Response(data)
+
+    @detail_route(methods=['get', 'post'])
+    def change_details(self, request, pk=None):
+        profile = self.get_user(request, pk)
+        allow_edit_profile_details(request.user, profile)
+        return change_details_endpoint(request, profile)
+
+    @detail_route(methods=['get'])
     def followers(self, request, pk=None):
         profile = self.get_user(request, pk)
 

+ 1 - 1
misago/users/profilefields/basefields.py

@@ -53,7 +53,7 @@ class ProfileField(object):
         })
 
     def get_data(self, request, user):
-        field_data = user.profile_fields.get(self.fieldname)
+        field_data = user.profile_fields.get(self.fieldname, '')
         if not len(field_data):
             return None
 

+ 2 - 3
misago/users/profilefields/serializers.py

@@ -4,7 +4,7 @@ from misago.users.permissions import can_edit_profile_details
 def serialize_profilefields_data(request, profilefields, user):
     data = {
         'groups': [],
-        'edit': None,
+        'edit': False,
     }
 
     can_edit = can_edit_profile_details(request.user, user)
@@ -24,7 +24,6 @@ def serialize_profilefields_data(request, profilefields, user):
                 'fields': group_fields
             })
 
-    if can_edit and has_editable_fields:
-        data['edit'] = '/some-pfields-edit-url/'
+    data['edit'] = can_edit and has_editable_fields
 
     return data

+ 2 - 0
misago/users/serializers/auth.py

@@ -50,8 +50,10 @@ class AuthenticatedUserSerializer(UserSerializer, AuthFlags):
     def get_api(self, obj):
         return {
             'avatar': reverse('misago:api:user-avatar', kwargs={'pk': obj.pk}),
+            'details': reverse('misago:api:user-details', kwargs={'pk': obj.pk}),
             'options': reverse('misago:api:user-forum-options', kwargs={'pk': obj.pk}),
             'username': reverse('misago:api:user-username', kwargs={'pk': obj.pk}),
+            'change_details': reverse('misago:api:user-change-details', kwargs={'pk': obj.pk}),
             'change_email': reverse('misago:api:user-change-email', kwargs={'pk': obj.pk}),
             'change_password': reverse('misago:api:user-change-password', kwargs={'pk': obj.pk}),
         }

+ 12 - 0
misago/users/serializers/user.py

@@ -124,6 +124,18 @@ class UserSerializer(serializers.ModelSerializer, MutableFields):
                     'pk': obj.pk
                 }
             ),
+            'details': reverse(
+                'misago:api:user-details',
+                kwargs={
+                    'pk': obj.pk,
+                }
+            ),
+            'change_details': reverse(
+                'misago:api:user-change-details',
+                kwargs={
+                    'pk': obj.pk,
+                }
+            ),
             'moderate_avatar': reverse(
                 'misago:api:user-moderate-avatar',
                 kwargs={

+ 86 - 0
misago/users/tests/test_user_details_api.py

@@ -0,0 +1,86 @@
+from django.contrib.auth import get_user_model
+from django.urls import reverse
+
+from misago.acl.testutils import override_acl
+
+from misago.users.testutils import AuthenticatedUserTestCase
+
+
+UserModel = get_user_model()
+
+
+class UserDetailsApiTests(AuthenticatedUserTestCase):
+    def test_api_has_no_showstoppers(self):
+        """api outputs response for freshly created user"""
+        response = self.client.get(
+            reverse(
+                'misago:api:user-details',
+                kwargs={
+                    'pk': self.user.pk,
+                }
+            )
+        )
+
+        self.assertEqual(response.status_code, 200)
+        self.assertTrue(response.json()['edit'])
+
+    def test_api_has_no_showstoppers_old_user(self):
+        """api outputs response for freshly created user"""
+        self.user.profile_fields = {
+            'gender': 'f',
+            'bio': 'Lorem ipsum dolor met, sit amet elit, si vis pacem bellum.'
+        }
+        self.user.save()
+
+        response = self.client.get(
+            reverse(
+                'misago:api:user-details',
+                kwargs={
+                    'pk': self.user.pk,
+                }
+            )
+        )
+
+        self.assertEqual(response.status_code, 200)
+        self.assertTrue(response.json()['edit'])
+
+    def test_other_user(self):
+        """api handles scenario when its other user looking at profile"""
+        test_user = UserModel.objects.create_user('BobBoberson', 'bob@test.com', 'bob123456')
+
+        api_link = reverse(
+            'misago:api:user-details',
+            kwargs={
+                'pk': test_user.pk,
+            }
+        )
+
+        # moderator has permission to edit details
+        override_acl(self.user, {
+            'can_moderate_profile_details': True,
+        })
+
+        response = self.client.get(api_link)
+        self.assertEqual(response.status_code, 200)
+        self.assertTrue(response.json()['edit'])
+
+        # non-moderator has no permission to edit details
+        override_acl(self.user, {
+            'can_moderate_profile_details': False,
+        })
+
+        response = self.client.get(api_link)
+        self.assertEqual(response.status_code, 200)
+        self.assertFalse(response.json()['edit'])
+
+    def test_nonexistant_user(self):
+        """api handles nonexistant users"""
+        api_link = reverse(
+            'misago:api:user-details',
+            kwargs={
+                'pk': self.user.pk + 123,
+            }
+        )
+
+        response = self.client.get(api_link)
+        self.assertEqual(response.status_code, 404)