import os import random import tarfile from braces.views import LoginRequiredMixin from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404 from django.views.generic.detail import DetailView from rest_framework import viewsets from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response import requests from .models import Answer, Activity from .serializers import AnswerSerializer, ActivityImageSerializer class ActivityImageViewSet(viewsets.ModelViewSet): model = Activity queryset = Activity.objects.all() serializer_class = ActivityImageSerializer permission_classes = [IsAuthenticated] def put(self, request, **kwargs): activity = self.get_object() serializer = ActivityImageSerializer(activity, request.FILES) if serializer.is_valid(): serializer.save() return Response(status=200) else: return Response(serializer.errors, status=400) class AnswerViewSet(viewsets.ModelViewSet): model = Answer serializer_class = AnswerSerializer filter_fields = ('activity', 'user',) lookup_field = 'activity' def perform_create(self, serializer): activity = Activity.objects.get(id=self.request.data['activity']) if activity.type == 'slidesreveal' and len(activity.answers.filter(user=self.request.user)) > 0: return Response(status=200) serializer.save(user=self.request.user) def get_queryset(self): return Answer.objects.filter(user=self.request.user) def get_object(self): if 'activity' in self.kwargs: activity = self.kwargs['activity'] try: return self.get_queryset().filter(activity=activity).latest('timestamp') except Answer.DoesNotExist: # Raises Http404 to create a new object when the request is a PUT and the Answer does not exist # see django-rest-framework UpdateMixin for details raise Http404 return super(AnswerViewSet, self).get_object() # This view return the raw html inside data['content'] of an activity # It is used to closely emulate the embed behavior for iframes in slidesreveal activities # Also, it's worth noting that such raw html is always created outside of Timtec and uploaded through an administrative interface class SlidesRevealView(LoginRequiredMixin, DetailView): def get_queryset(self): raise Http404 def get(self, request, pk): activity = get_object_or_404(Activity, pk=pk) if activity.type != 'slidesreveal': raise Http404 else: # Send HTML ready to use with reveal.js return HttpResponse(activity.data['content'])