Browse Source

Basic exports list

Rafał Pitoń 7 years ago
parent
commit
6944b0f7ef

+ 11 - 1
misago/users/api/users.py

@@ -25,7 +25,8 @@ from misago.users.permissions import (
     allow_moderate_avatar, allow_rename_user, allow_see_ban_details)
     allow_moderate_avatar, allow_rename_user, allow_see_ban_details)
 from misago.users.profilefields import profilefields, serialize_profilefields_data
 from misago.users.profilefields import profilefields, serialize_profilefields_data
 from misago.users.serializers import (
 from misago.users.serializers import (
-    BanDetailsSerializer, DeleteOwnAccountSerializer, ForumOptionsSerializer, UserSerializer)
+    BanDetailsSerializer, DataExportSerializer, DeleteOwnAccountSerializer, ForumOptionsSerializer,
+    UserSerializer)
 from misago.users.viewmodels import Followers, Follows, UserPosts, UserThreads
 from misago.users.viewmodels import Followers, Follows, UserPosts, UserThreads
 
 
 from .rest_permissions import BasePermission, UnbannedAnonOnly
 from .rest_permissions import BasePermission, UnbannedAnonOnly
@@ -271,6 +272,15 @@ class UserViewSet(viewsets.GenericViewSet):
         return Response({})
         return Response({})
 
 
     @detail_route(methods=['get'])
     @detail_route(methods=['get'])
+    def data_exports(self, request, pk=None):
+        get_int_or_404(pk)
+        allow_self_only(request.user, pk, _("You can't see other users data exports history."))
+
+        queryset = request.user.dataexport_set.all()[:5]
+        serializer = DataExportSerializer(queryset, many=True)
+        return Response(serializer.data)
+
+    @detail_route(methods=['get'])
     def followers(self, request, pk=None):
     def followers(self, request, pk=None):
         profile = self.get_user(request, pk)
         profile = self.get_user(request, pk)
 
 

+ 3 - 0
misago/users/models/dataexport.py

@@ -38,3 +38,6 @@ class DataExport(models.Model):
     requested_on = models.DateTimeField(default=timezone.now)
     requested_on = models.DateTimeField(default=timezone.now)
     expires_on = models.DateTimeField(default=timezone.now)
     expires_on = models.DateTimeField(default=timezone.now)
     export_file = models.FileField(upload_to=get_export_upload_to, null=True, blank=True)
     export_file = models.FileField(upload_to=get_export_upload_to, null=True, blank=True)
+
+    class Meta:
+        ordering = ['-pk']

+ 1 - 0
misago/users/serializers/__init__.py

@@ -1,4 +1,5 @@
 from .ban import *
 from .ban import *
+from .dataexport import *
 from .moderation import *
 from .moderation import *
 from .options import *
 from .options import *
 from .rank import *
 from .rank import *

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

@@ -51,6 +51,7 @@ class AuthenticatedUserSerializer(UserSerializer, AuthFlags):
     def get_api(self, obj):
     def get_api(self, obj):
         return {
         return {
             'avatar': reverse('misago:api:user-avatar', kwargs={'pk': obj.pk}),
             'avatar': reverse('misago:api:user-avatar', kwargs={'pk': obj.pk}),
+            'data-export': reverse('misago:api:user-data-exports', kwargs={'pk': obj.pk}),
             'details': reverse('misago:api:user-details', kwargs={'pk': obj.pk}),
             'details': reverse('misago:api:user-details', kwargs={'pk': obj.pk}),
             'change_email': reverse('misago:api:user-change-email', 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}),
             'change_password': reverse('misago:api:user-change-password', kwargs={'pk': obj.pk}),

+ 18 - 0
misago/users/serializers/dataexport.py

@@ -0,0 +1,18 @@
+from rest_framework import serializers
+
+from misago.users.models import DataExport
+
+
+__all__ = ['DataExportSerializer']
+
+
+class DataExportSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = DataExport
+        fields = [
+            'id',
+            'status',
+            'requested_on',
+            'expires_on',
+            'export_file',
+        ]

+ 24 - 35
misago/users/tests/test_user_dataexport_api.py

@@ -4,57 +4,46 @@ from misago.users.dataexport import start_data_export_for_user
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 
-class UserStartDataExportApiTests(AuthenticatedUserTestCase):
+class UserDataExportApiTests(AuthenticatedUserTestCase):
     def setUp(self):
     def setUp(self):
-        super(UserStartDataExportApiTests, self).setUp()
-        self.link = '/api/users/%s/start-data-export/' % self.user.pk
+        super(UserDataExportApiTests, self).setUp()
+        self.link = '/api/users/%s/data-exports/' % self.user.pk
 
 
-    def test_start_other_user_export_anonymous(self):
+    def test_get_other_user_exports_anonymous(self):
         """requests to api fails if user is anonymous"""
         """requests to api fails if user is anonymous"""
         self.logout_user()
         self.logout_user()
 
 
-        response = self.client.post(self.link)
+        response = self.client.get(self.link)
         self.assertEqual(response.status_code, 403)
         self.assertEqual(response.status_code, 403)
         self.assertEqual(response.json(), {
         self.assertEqual(response.json(), {
-            'detail': "This action is not available to guests.",
+            'detail': "You have to sign in to perform this action.",
         })
         })
 
 
-    def test_start_other_user_export(self):
+    def test_get_other_user_exports(self):
         """requests to api fails if user tries to access other user"""
         """requests to api fails if user tries to access other user"""
         other_user = self.get_superuser()
         other_user = self.get_superuser()
-        link = '/api/users/%s/start-data-export/' % other_user.pk
+        link = '/api/users/%s/data-exports/' % other_user.pk
 
 
-        response = self.client.post(link)
+        response = self.client.get(link)
         self.assertEqual(response.status_code, 403)
         self.assertEqual(response.status_code, 403)
         self.assertEqual(response.json(), {
         self.assertEqual(response.json(), {
-            'detail': "You can\'t request data export for other users.",
+            'detail': "You can't see other users data exports history.",
         })
         })
+        
+    def test_get_empty_list(self):
+        """api returns empy list"""
+        self.assertFalse(self.user.dataexport_set.exists())
 
 
-    @override_settings(MISAGO_ENABLE_EXPORT_OWN_DATA=False)
-    def test_start_export_disabled(self):
-        """request to api fails if own data exports are disabled"""
-        response = self.client.post(self.link)
-        self.assertEqual(response.status_code, 403)
-        self.assertEqual(response.json(), {
-            'detail': "You can't export your own data.",
-        })
-
-    def test_start_export_in_progress(self):
-        """request to api fails if user already has export in progress"""
-        start_data_export_for_user(self.user)
-
-        response = self.client.post(self.link)
-        self.assertEqual(response.status_code, 403)
-        self.assertEqual(response.json(), {
-            'detail': "You already have an data export in progress.",
-        })
-
-    def test_start_export(self):
-        """request to api fails if user already has export in progress"""
-        response = self.client.post(self.link)
+        response = self.client.get(self.link)
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        self.assertEqual(response.json(), {
-            'detail': "ok",
-        })
+        self.assertEqual(response.json(), [])
 
 
+    def test_populated_list(self):
+        """api returns list"""
+        for _ in range(6):
+            start_data_export_for_user(self.user)
         self.assertTrue(self.user.dataexport_set.exists())
         self.assertTrue(self.user.dataexport_set.exists())
+
+        response = self.client.get(self.link)
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(len(response.json()), 5)

+ 60 - 0
misago/users/tests/test_user_startdataexport_api.py

@@ -0,0 +1,60 @@
+from django.test.utils import override_settings
+
+from misago.users.dataexport import start_data_export_for_user
+from misago.users.testutils import AuthenticatedUserTestCase
+
+
+class UserStartDataExportApiTests(AuthenticatedUserTestCase):
+    def setUp(self):
+        super(UserStartDataExportApiTests, self).setUp()
+        self.link = '/api/users/%s/start-data-export/' % self.user.pk
+
+    def test_start_other_user_export_anonymous(self):
+        """requests to api fails if user is anonymous"""
+        self.logout_user()
+
+        response = self.client.post(self.link)
+        self.assertEqual(response.status_code, 403)
+        self.assertEqual(response.json(), {
+            'detail': "This action is not available to guests.",
+        })
+
+    def test_start_other_user_export(self):
+        """requests to api fails if user tries to access other user"""
+        other_user = self.get_superuser()
+        link = '/api/users/%s/start-data-export/' % other_user.pk
+
+        response = self.client.post(link)
+        self.assertEqual(response.status_code, 403)
+        self.assertEqual(response.json(), {
+            'detail': "You can't request data export for other users.",
+        })
+
+    @override_settings(MISAGO_ENABLE_EXPORT_OWN_DATA=False)
+    def test_start_export_disabled(self):
+        """request to api fails if own data exports are disabled"""
+        response = self.client.post(self.link)
+        self.assertEqual(response.status_code, 403)
+        self.assertEqual(response.json(), {
+            'detail': "You can't export your own data.",
+        })
+
+    def test_start_export_in_progress(self):
+        """request to api fails if user already has export in progress"""
+        start_data_export_for_user(self.user)
+
+        response = self.client.post(self.link)
+        self.assertEqual(response.status_code, 403)
+        self.assertEqual(response.json(), {
+            'detail': "You already have an data export in progress.",
+        })
+
+    def test_start_export(self):
+        """request to api fails if user already has export in progress"""
+        response = self.client.post(self.link)
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.json(), {
+            'detail': "ok",
+        })
+
+        self.assertTrue(self.user.dataexport_set.exists())