from actstream import action from actstream.models import user_stream, Action, actor_stream from rest_framework import views, viewsets, mixins, permissions, status from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from rest_framework.pagination import PageNumberPagination from discussion.models import Forum, Topic from .serializers import UserActionsSerializer, UserAccessSerializer, ActionSerializer from .models import AccessibleArea from ..models import Course from ..classroom.models import Classroom from cards.models import Card from courses_learning_objects.models import LearningObject from django.contrib.auth.models import User from django.contrib.auth import get_user_model User = get_user_model() class UserActionsView(views.APIView): permission_classes = [permissions.IsAuthenticated] def post(self, request, format=None): # Only models from this list are registered to be used on actions allowed_models = { 'Course': Course, 'Classroom': Classroom, 'Topic': Topic, 'Forum': Forum, 'AccessibleArea': AccessibleArea, 'LearningObject': LearningObject, 'Card': Card, } # Validate incoming data serializer = UserActionsSerializer(data=request.data) if not serializer.is_valid(): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) data = serializer.data # Get the actual model objects for action and target action_object = None target = None if 'action_object_type' in data: action_object = allowed_models[data['action_object_type']].objects.get(id=data['action_object_id']) if 'target_type' in data: target = allowed_models[data['target_type']].objects.get(id=data['target_id']) # Save the action action.send(request.user, verb=data['verb'], action_object=action_object, target=target) return Response(None, status=status.HTTP_201_CREATED) class UserAccessView(views.APIView): permission_classes = [permissions.IsAuthenticated] def post(self, request, format=None): # Validate incoming data serializer = UserAccessSerializer(data=request.data) if not serializer.is_valid(): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) data = serializer.data # Get the actual model object for action try: action_object = AccessibleArea.objects.get(slug=data['area']) except AccessibleArea.DoesNotExist: return Response({'error': 'Specified area not found'}, status=status.HTTP_404_NOT_FOUND) # Save the action action.send(request.user, verb='access', action_object=action_object) return Response(None, status=status.HTTP_201_CREATED) class ActivitiesPagination(PageNumberPagination): page_size = 30 page_size_query_param = 'page_size' max_page_size = 100 class UserActivitiesViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = ActionSerializer permission_classes = [permissions.IsAuthenticated] pagination_class = ActivitiesPagination model = Action def get_queryset(self): user_id = self.request.GET.get('user') user = User.objects.get(id=user_id) queryset = actor_stream(user) return queryset