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.
127 lines
5.1 KiB
127 lines
5.1 KiB
from django.contrib.auth import get_user_model
|
|
from django.contrib.contenttypes.models import ContentType
|
|
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 import Progress
|
|
from journals.models import Thread, Journal
|
|
from journals.serilizers import ThreadDetailSerializer, ThreadAdminSerializer, JournalSerializer
|
|
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,)
|
|
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.date()
|
|
])
|
|
|
|
return response
|
|
|
|
|
|
class JournalCreateView(APIView):
|
|
renderer_classes = (JSONRenderer,)
|
|
status_code = 200
|
|
|
|
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 journal.action_type == 'yes':
|
|
p = Progress.objects.get(course=journal.content_object.course, user=journal.thread.subscribers.all()[0])
|
|
p.active_obj = journal.content_object.get_next(['tutorial', 'task'])
|
|
p.save()
|
|
|
|
return Response(ThreadDetailSerializer(thread).data, status=200)
|
|
return Response("permission denied", status=403)
|
|
except Thread.DoesNotExist:
|
|
return Response("Thread doesn't exist.", self.status_code,)
|
|
|