|
@@ -4,74 +4,49 @@ from django.utils.translation import gettext as _
|
|
|
|
|
|
from rest_framework import viewsets
|
|
from rest_framework import viewsets
|
|
from rest_framework.decorators import detail_route, list_route
|
|
from rest_framework.decorators import detail_route, list_route
|
|
-from rest_framework.parsers import JSONParser
|
|
|
|
from rest_framework.response import Response
|
|
from rest_framework.response import Response
|
|
|
|
|
|
from misago.acl import add_acl
|
|
from misago.acl import add_acl
|
|
from misago.categories.models import CATEGORIES_TREE_ID, Category
|
|
from misago.categories.models import CATEGORIES_TREE_ID, Category
|
|
-from misago.categories.permissions import (
|
|
|
|
- allow_see_category, allow_browse_category)
|
|
|
|
|
|
+from misago.categories.permissions import allow_see_category, allow_browse_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
|
|
-from misago.readtracker.threadstracker import make_read_aware
|
|
|
|
-from misago.users.rest_permissions import IsAuthenticatedOrReadOnly
|
|
|
|
|
|
|
|
from misago.threads.api.threadendpoints.list import threads_list_endpoint
|
|
from misago.threads.api.threadendpoints.list import threads_list_endpoint
|
|
from misago.threads.api.threadendpoints.merge import threads_merge_endpoint
|
|
from misago.threads.api.threadendpoints.merge import threads_merge_endpoint
|
|
from misago.threads.api.threadendpoints.patch import thread_patch_endpoint
|
|
from misago.threads.api.threadendpoints.patch import thread_patch_endpoint
|
|
-from misago.threads.models import Thread, Subscription
|
|
|
|
|
|
+from misago.threads.models import Subscription
|
|
from misago.threads.moderation import threads as moderation
|
|
from misago.threads.moderation import threads as moderation
|
|
-from misago.threads.permissions.threads import allow_see_thread
|
|
|
|
-from misago.threads.serializers import ThreadSerializer
|
|
|
|
from misago.threads.subscriptions import make_subscription_aware
|
|
from misago.threads.subscriptions import make_subscription_aware
|
|
|
|
+from misago.threads.viewmodels.thread import ForumThread
|
|
|
|
|
|
|
|
|
|
-class ThreadViewSet(viewsets.ViewSet):
|
|
|
|
- permission_classes = (IsAuthenticatedOrReadOnly, )
|
|
|
|
- parser_classes=(JSONParser, )
|
|
|
|
|
|
+class ViewSet(viewsets.ViewSet):
|
|
|
|
+ thread = None
|
|
|
|
+ TREE_ID = None
|
|
|
|
|
|
- TREE_ID = CATEGORIES_TREE_ID
|
|
|
|
-
|
|
|
|
- def validate_thread_visible(self, user, thread):
|
|
|
|
- allow_see_thread(user, thread)
|
|
|
|
-
|
|
|
|
- def get_thread(self, user, thread_id):
|
|
|
|
- thread = get_object_or_404(Thread.objects.select_related('category'),
|
|
|
|
- id=get_int_or_404(thread_id),
|
|
|
|
- category__tree_id=self.TREE_ID,
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- add_acl(user, thread.category)
|
|
|
|
- add_acl(user, thread)
|
|
|
|
-
|
|
|
|
- self.validate_thread_visible(user, thread)
|
|
|
|
-
|
|
|
|
- return thread
|
|
|
|
|
|
+ def get_thread(self, request, pk):
|
|
|
|
+ return self.thread(request, get_int_or_404(pk))
|
|
|
|
|
|
def list(self, request):
|
|
def list(self, request):
|
|
return threads_list_endpoint(request)
|
|
return threads_list_endpoint(request)
|
|
|
|
|
|
- def retrieve(self, request, pk=None):
|
|
|
|
- thread = self.get_thread(request.user, pk)
|
|
|
|
|
|
+ def retrieve(self, request, pk):
|
|
|
|
+ thread = self.get_thread(request, pk)
|
|
|
|
+ return Response(thread.get_frontend_context())
|
|
|
|
|
|
- make_read_aware(request.user, thread)
|
|
|
|
- make_subscription_aware(request.user, thread)
|
|
|
|
|
|
+ def partial_update(self, request, pk):
|
|
|
|
+ thread = self.get_thread(request, pk)
|
|
|
|
+ return thread_patch_endpoint.dispatch(request, thread.thread)
|
|
|
|
|
|
- return Response(ThreadSerializer(thread).data)
|
|
|
|
-
|
|
|
|
- def partial_update(self, request, pk=None):
|
|
|
|
- thread = self.get_thread(request.user, pk)
|
|
|
|
- return thread_patch_endpoint.dispatch(request, thread)
|
|
|
|
-
|
|
|
|
- def destroy(self, request, pk=None):
|
|
|
|
- thread = self.get_thread(request.user, pk)
|
|
|
|
|
|
+ def destroy(self, request, pk):
|
|
|
|
+ thread = self.get_thread(request, pk).thread
|
|
|
|
|
|
if thread.acl.get('can_hide') == 2:
|
|
if thread.acl.get('can_hide') == 2:
|
|
moderation.delete_thread(request.user, thread)
|
|
moderation.delete_thread(request.user, thread)
|
|
return Response({'detail': 'ok'})
|
|
return Response({'detail': 'ok'})
|
|
else:
|
|
else:
|
|
- raise PermissionDenied(
|
|
|
|
- _("You don't have permission to delete this thread."))
|
|
|
|
|
|
+ raise PermissionDenied(_("You don't have permission to delete this thread."))
|
|
|
|
|
|
@list_route(methods=['post'])
|
|
@list_route(methods=['post'])
|
|
def read(self, request):
|
|
def read(self, request):
|
|
@@ -90,6 +65,11 @@ class ThreadViewSet(viewsets.ViewSet):
|
|
read_category(request.user, category)
|
|
read_category(request.user, category)
|
|
return Response({'detail': 'ok'})
|
|
return Response({'detail': 'ok'})
|
|
|
|
|
|
|
|
+
|
|
|
|
+class ThreadViewSet(ViewSet):
|
|
|
|
+ thread = ForumThread
|
|
|
|
+ TREE_ID = CATEGORIES_TREE_ID
|
|
|
|
+
|
|
@list_route(methods=['post'])
|
|
@list_route(methods=['post'])
|
|
def merge(self, request):
|
|
def merge(self, request):
|
|
return threads_merge_endpoint(request)
|
|
return threads_merge_endpoint(request)
|