views.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # coding=utf-8
  2. import urllib.parse
  3. from io import BytesIO
  4. from django.db import transaction
  5. from django.http import HttpResponse
  6. from rest_framework.views import APIView
  7. from utils.permission import IsAdministrator
  8. from utils import response_error, response_ok
  9. from utils.custom_modelviewset import CustomModelViewSet
  10. from apps.system.models import SysLog
  11. from apps.examination.exampaper.models import ExamPaper
  12. from apps.examination.exampaper.filters import ExamPaperFilter
  13. from apps.examination.exampaper.serializers import ExamPaperSerializer
  14. class ExamPaperViewSet(CustomModelViewSet):
  15. permission_classes = [IsAdministrator, ]
  16. queryset = ExamPaper.objects.filter(delete=False)
  17. serializer_class = ExamPaperSerializer
  18. def filter_queryset(self, queryset):
  19. f = ExamPaperFilter(self.request.GET, queryset=queryset)
  20. return f.qs
  21. def perform_create(self, serializer):
  22. super(ExamPaperViewSet, self).perform_create(serializer)
  23. instance = serializer.instance
  24. validated_data = serializer.validated_data
  25. SysLog.objects.addnew(self.request.user, SysLog.INSERT, u'添加试卷[%s],id=%d' % (instance.name, instance.id), validated_data)
  26. def perform_update(self, serializer):
  27. super(ExamPaperViewSet, self).perform_update(serializer)
  28. instance = serializer.instance
  29. validated_data = serializer.validated_data
  30. SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改试卷[%s],id=%d' % (instance.name, instance.id), validated_data)
  31. def destroy(self, request, *args, **kwargs):
  32. with transaction.atomic():
  33. instance = self.get_object()
  34. instance.delete = True
  35. instance.save()
  36. SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除试卷[%s],id=%d' % (instance.name, instance.id))
  37. return response_ok()
  38. def export(self, request, *args, **kwargs):
  39. instance = self.get_object()
  40. doc = instance.create_docx()
  41. buffer = BytesIO()
  42. doc.save(buffer)
  43. buffer.seek(0)
  44. type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
  45. filename = f'{instance.name}试卷.docx'
  46. encoded_filename = urllib.parse.quote(filename)
  47. content_disposition = f'attachment; filename="{encoded_filename}"'
  48. response = HttpResponse(buffer, content_type=type)
  49. response['Content-Disposition'] = content_disposition
  50. return response