You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

131 lines
5.2 KiB

from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response
import csv
from django.http import HttpResponse, HttpResponseForbidden
from access.models.other import Progress
from journals.models import Thread, Journal
from journals.serilizers import ThreadDetailSerializer, ThreadAdminSerializer, JournalSerializer
from lms.global_decorators import transaction_decorator
from lms.tools import decode_base64
from storage.models import Storage
class ThreadAdminListView(APIView):
renderer_classes = (JSONRenderer,)
status_code = 200
def get(self, request):
return Response(
[ThreadAdminSerializer(thread).data for thread in Thread.objects.filter(is_staff=True)],
self.status_code,
)
class ThreadDetailView(APIView):
renderer_classes = (JSONRenderer,)
permission_classes = ()
status_code = 200
def post(self, request, key):
try:
thread = Thread.objects.get(key=key)
thread.text = request.JSON.get('text', thread.text)
thread.key = request.JSON.get('key', thread.key)
thread.x = request.JSON.get('x', thread.x)
thread.y = request.JSON.get('y', thread.y)
thread.save()
return Response(ThreadAdminSerializer(thread).data, self.status_code, )
except Thread.DoesNotExist:
return Response("Thread doesn't exist.", self.status_code, )
@staticmethod
def get(request, key):
try:
thread = Thread.objects.get(key=key)
if thread.check_perm(request.user):
return Response(ThreadDetailSerializer(thread).data, status=200)
return Response("permission denied", status=403)
except Thread.DoesNotExist:
return Response("Thread not found", status=404)
def get_pay_stat(request, pk):
if not request.user.is_authenticated and (request.user.groups.filter(name="supports") or request.user.is_superuser):
return HttpResponseForbidden()
date_from = request.GET.get('from', None)
date_to = request.GET.get('to', None)
file_name = "teacher_%s" % pk
file_name = file_name + "__from_%s" % date_from if date_from else file_name
file_name = file_name + "__to_%s" % date_to if date_to else file_name
journals = Journal.objects.filter(user_id=pk, action_type="yes")
journals = journals.filter(date__lt=date_to) if date_to else journals
journals = journals.filter(date__gte=date_from) if date_from else journals
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="%s"' % file_name
writer = csv.writer(response)
writer.writerow(['student_email', 'full_name', 'course', 'theme', 'task_id', 'date'])
for i in journals.order_by('-date'):
student = get_user_model().objects.get(id=i.thread.key.split('user_')[1].split('__vertex')[0])
writer.writerow([
student.email,
student.get_full_name(),
i.content_object.course.title,
i.content_object.vertex_set.all()[0].title,
i.content_object.id,
i.date,
])
return response
class JournalCreateView(APIView):
renderer_classes = (JSONRenderer,)
permission_classes = (IsAuthenticated,)
status_code = 200
@transaction_decorator
def post(self, request):
pk = request.JSON.get('thread_id', None)
try:
thread = Thread.objects.get(id=pk)
if request.user.is_authenticated and thread.check_perm(request.user):
action_type = request.JSON.get('action_type', None)
extra_data = request.JSON.get('extra_data', None)
object_id = request.JSON.get('object_id', None)
content_type__model = request.JSON.get('content_type__model', None)
content_type__app_label = request.JSON.get('content_type__app_label', None)
content_type = ContentType.objects.get(model=content_type__model, app_label=content_type__app_label)
files = request.JSON.get('files', [])
files = [{'data': decode_base64(i['data']), 'name': i['name']} for i in files]
journal = Journal.objects.create(
action_type=action_type, extra_data=extra_data, thread=thread,
content_type=content_type, object_id=object_id,
user=request.user
)
for i in files:
s = Storage.objects.create(original=decode_base64(i['data']), name=i['name'])
journal.files.add(s)
if action_type == 'yes':
p = Progress.objects.get(course=journal.content_object.course, user=journal.thread.subscribers.all()[0])
p.add_vertex(journal.content_object)
return Response(JournalSerializer(journal).data, status=200)
return Response("permission denied", status=403)
except Thread.DoesNotExist:
return Response("Thread doesn't exist.", self.status_code,)