Browse Source

moved "read all" api from categories to threads

Rafał Pitoń 8 years ago
parent
commit
b87d06c874

+ 0 - 30
misago/categories/api.py

@@ -1,15 +1,6 @@
-from django.db import transaction
-
 from rest_framework import viewsets
 from rest_framework import viewsets
-from rest_framework.decorators import detail_route
 from rest_framework.response import Response
 from rest_framework.response import Response
 
 
-from misago.core.shortcuts import get_int_or_404, get_object_or_404
-from misago.readtracker.categoriestracker import read_category
-from misago.threads.threadtypes import trees_map
-
-from .models import THREADS_ROOT_NAME, Category
-from .permissions import allow_browse_category, allow_see_category
 from .serializers import CategorySerializer
 from .serializers import CategorySerializer
 from .utils import get_categories_tree
 from .utils import get_categories_tree
 
 
@@ -18,24 +9,3 @@ class CategoryViewSet(viewsets.ViewSet):
     def list(self, request):
     def list(self, request):
         categories_tree = get_categories_tree(request.user)
         categories_tree = get_categories_tree(request.user)
         return Response(CategorySerializer(categories_tree, many=True).data)
         return Response(CategorySerializer(categories_tree, many=True).data)
-
-    @detail_route(methods=['post'])
-    @transaction.atomic
-    def read(self, request, pk):
-        request.user.lock()
-
-        category_id = get_int_or_404(pk)
-        threads_tree_id = trees_map.get_tree_id_for_root(THREADS_ROOT_NAME)
-
-        category = get_object_or_404(Category,
-            id=category_id,
-            tree_id=threads_tree_id,
-        )
-
-        if category.level:
-            allow_see_category(request.user, category)
-            allow_browse_category(request.user, category)
-
-        read_category(request.user, category)
-
-        return Response({'detail': 'ok'})

+ 0 - 77
misago/categories/tests/test_views.py

@@ -1,7 +1,4 @@
-from datetime import timedelta
-
 from django.urls import reverse
 from django.urls import reverse
-from django.utils import timezone
 
 
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
@@ -59,9 +56,6 @@ class CategoryAPIViewsTests(AuthenticatedUserTestCase):
         super(CategoryAPIViewsTests, self).setUp()
         super(CategoryAPIViewsTests, self).setUp()
 
 
         self.category = Category.objects.get(slug='first-category')
         self.category = Category.objects.get(slug='first-category')
-        self.api_link = reverse('misago:api:category-read', kwargs={
-            'pk': self.category.pk
-        })
 
 
     def test_list_renders(self):
     def test_list_renders(self):
         """api returns categories for authenticated"""
         """api returns categories for authenticated"""
@@ -104,74 +98,3 @@ class CategoryAPIViewsTests(AuthenticatedUserTestCase):
             self.assertNotContains(response, node.name)
             self.assertNotContains(response, node.name)
             if node.level > 1:
             if node.level > 1:
                 self.assertNotContains(response, node.get_absolute_url())
                 self.assertNotContains(response, node.get_absolute_url())
-
-    def test_read_category_guest(self):
-        """category read api validates that user is authenticated"""
-        self.logout_user()
-
-        response = self.client.post(self.api_link)
-        self.assertContains(response, "This action is not available to guests.", status_code=403)
-
-    def test_read_invalid_category(self):
-        """category read api validates category id"""
-        api_link = reverse('misago:api:category-read', kwargs={
-            'pk': 'abcd'
-        })
-
-        response = self.client.post(api_link)
-        self.assertEqual(response.status_code, 404)
-
-    def test_read_nonexistant_category(self):
-        """category read api validates category visibility"""
-        api_link = reverse('misago:api:category-read', kwargs={
-            'pk': self.category.pk * 2
-        })
-
-        response = self.client.post(api_link)
-        self.assertEqual(response.status_code, 404)
-
-    def test_read_category_no_permission(self):
-        """category read api validates category permission"""
-        override_acl(self.user, {'visible_categories': []})
-
-        response = self.client.post(self.api_link)
-        self.assertEqual(response.status_code, 404)
-
-    def test_read_category(self):
-        """category read api reads category"""
-        # clean reads
-        self.user.categoryread_set.all().delete()
-        self.assertEqual(self.user.categoryread_set.count(), 0)
-
-        # call api
-        response = self.client.post(self.api_link)
-        self.assertEqual(response.status_code, 200)
-
-        # assert that new read was created
-        self.assertEqual(self.user.categoryread_set.count(), 1)
-
-        read = self.user.categoryread_set.order_by('id').last()
-        self.assertEqual(read.category_id, self.category.id)
-        self.assertTrue(read.last_read_on > timezone.now() - timedelta(seconds=3))
-
-    def test_read_root_category(self):
-        """category read api reads root category"""
-        category = Category.objects.root_category()
-        api_link = reverse('misago:api:category-read', kwargs={
-            'pk': category.pk
-        })
-
-        # clean reads
-        self.user.categoryread_set.all().delete()
-        self.assertEqual(self.user.categoryread_set.count(), 0)
-
-        # call api
-        response = self.client.post(api_link)
-        self.assertEqual(response.status_code, 200)
-
-        # assert that new read for subcategory was created
-        self.assertEqual(self.user.categoryread_set.count(), 1)
-
-        read = self.user.categoryread_set.order_by('id').last()
-        self.assertEqual(read.category_id, self.category.id)
-        self.assertTrue(read.last_read_on > timezone.now() - timedelta(seconds=3))

+ 1 - 3
misago/readtracker/categoriestracker.py

@@ -99,9 +99,7 @@ def sync_record(user, category):
 
 
 
 
 def read_category(user, category):
 def read_category(user, category):
-    categories = []
-    if category.level:
-        categories.append(category.pk)
+    categories = [category.pk]
     if not category.is_leaf_node():
     if not category.is_leaf_node():
         queryset = category.get_descendants().filter(id__in=user.acl['visible_categories'])
         queryset = category.get_descendants().filter(id__in=user.acl['visible_categories'])
         categories += queryset.values_list('id', flat=True)
         categories += queryset.values_list('id', flat=True)

+ 4 - 4
misago/threads/api/threadendpoints/read.py

@@ -1,5 +1,4 @@
-from misago.categories.models import (
-    PRIVATE_THREADS_ROOT_NAME, THREADS_ROOT_NAME, Category)
+from misago.categories.models import THREADS_ROOT_NAME, Category
 from misago.categories.permissions import allow_browse_category, allow_see_category
 from misago.categories.permissions import allow_browse_category, allow_see_category
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
 from misago.readtracker.categoriestracker import read_category
 from misago.readtracker.categoriestracker import read_category
@@ -25,5 +24,6 @@ def read_threads(user, pk):
     read_category(user, category)
     read_category(user, category)
 
 
 
 
-def read_private_threads(user, category):
-    pass
+def read_private_threads(user):
+    category = Category.objects.private_threads()
+    read_category(user, category)

+ 24 - 0
misago/threads/tests/test_privatethreads_api.py

@@ -169,6 +169,30 @@ class PrivateThreadRetrieveApiTests(PrivateThreadsTestCase):
         self.assertEqual(response_json['participants'], [])
         self.assertEqual(response_json['participants'], [])
 
 
 
 
+class PrivateThreadsReadApiTests(PrivateThreadsTestCase):
+    def setUp(self):
+        super(PrivateThreadsReadApiTests, self).setUp()
+        self.api_link = self.category.get_read_api_url()
+
+    def test_read_threads_no_permission(self):
+        """api validates permission to use private threads"""
+        override_acl(self.user, {
+            'can_use_private_threads': 0
+        })
+
+        response = self.client.post(self.api_link)
+        self.assertEqual(response.status_code, 403)
+
+    def test_read_all(self):
+        """api sets all private threads as read"""
+        self.assertEqual(self.category.categoryread_set.count(), 0)
+
+        response = self.client.post(self.category.get_read_api_url())
+        self.assertEqual(response.status_code, 200)
+
+        self.category.categoryread_set.get(user=self.user)
+
+
 class PrivateThreadDeleteApiTests(PrivateThreadsTestCase):
 class PrivateThreadDeleteApiTests(PrivateThreadsTestCase):
     def setUp(self):
     def setUp(self):
         super(PrivateThreadDeleteApiTests, self).setUp()
         super(PrivateThreadDeleteApiTests, self).setUp()

+ 2 - 0
misago/threads/tests/test_threads_api.py

@@ -216,11 +216,13 @@ class ThreadsReadApiTests(ThreadsApiTestCase):
 
 
     def test_read_all(self):
     def test_read_all(self):
         """api sets all threads as read"""
         """api sets all threads as read"""
+        self.assertEqual(self.root.categoryread_set.count(), 0)
         self.assertEqual(self.category.categoryread_set.count(), 0)
         self.assertEqual(self.category.categoryread_set.count(), 0)
 
 
         response = self.client.post(self.root.get_read_api_url())
         response = self.client.post(self.root.get_read_api_url())
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
 
 
+        self.root.categoryread_set.get(user=self.user)
         self.category.categoryread_set.get(user=self.user)
         self.category.categoryread_set.get(user=self.user)