Skip to content
Snippets Groups Projects
Commit 5d3a3d6a authored by Dominik Seeger's avatar Dominik Seeger Committed by robinwilliam.hundt
Browse files

added ability to export instance data

added tests for new instance export
parent 16e4831f
No related branches found
No related tags found
1 merge request!125Resolve "Export Instance Data"
......@@ -10,13 +10,15 @@ def make_data():
'module_reference': 'Test Exam 01',
'total_score': 100,
'pass_score': 60,
'pass_only': True
}],
'submission_types': [
{
'name': '01. Sort',
'full_score': 35,
'description': 'Very complicated',
'solution': 'Trivial!'
'solution': 'Trivial!',
'programming_language': 'Haskell',
},
{
'name': '02. Shuffle',
......@@ -29,6 +31,9 @@ def make_data():
{'username': 'student01', 'exam': 'Test Exam 01'},
{'username': 'student02', 'exam': 'Test Exam 01'}
],
'tutors': [{
'username': 'tutor01'
}],
'reviewers': [
{'username': 'reviewer'}
],
......@@ -73,6 +78,86 @@ def make_data():
)
class ExportInstanceTest(APITestCase):
@classmethod
def setUpTestData(cls):
cls.data = make_data()
def setUp(self):
self.client = APIClient()
self.client.force_login(user=self.data['reviewers'][0])
self.response = self.client.get('/api/instance/export/')
def test_can_access(self):
self.assertEqual(status.HTTP_200_OK, self.response.status_code)
def test_data_is_correct(self):
instance = self.response.json()
# examTypes fields
self.assertIn('examTypes', instance)
self.assertIn('pk', instance['examTypes'][0])
self.assertEqual('Test Exam 01', instance['examTypes'][0]['moduleReference'])
self.assertEqual(100, instance['examTypes'][0]['totalScore'])
self.assertEqual(60, instance['examTypes'][0]['passScore'])
self.assertEqual(True, instance['examTypes'][0]['passOnly'])
# submissionTypes fields
self.assertIn('submissionTypes', instance)
self.assertEquals(2, len(instance['submissionTypes']))
self.assertIn('pk', instance['submissionTypes'][0])
self.assertEqual('01. Sort', instance['submissionTypes'][0]['name'])
self.assertEqual(35, instance['submissionTypes'][0]['fullScore'])
self.assertEqual('Very complicated', instance['submissionTypes'][0]['description'])
self.assertEqual('Trivial!', instance['submissionTypes'][0]['solution'])
self.assertEqual('Haskell', instance['submissionTypes'][0]['programmingLanguage'])
# students fields
self.assertIn('students', instance)
self.assertEqual(2, len(instance['students']))
self.assertIn('pk', instance['students'][0])
self.assertIn('userPk', instance['students'][0])
self.assertIn('exam', instance['students'][0])
self.assertEqual('student01', instance['students'][1]['user'])
self.assertLess(0, len(instance['students'][1]['submissions']))
# students[submissions] nested
self.assertIn('submissions', instance['students'][1])
self.assertLess(0, len(instance['students'][1]['submissions']))
self.assertIn('pk', instance['students'][1]['submissions'][0])
self.assertIn('function blabl', instance['students'][1]['submissions'][0]['text'])
self.assertIn('type', instance['students'][1]['submissions'][0])
self.assertIn('tests', instance['students'][1]['submissions'][0])
# students[submissions][feedback] nested
self.assertIn('feedback', instance['students'][1]['submissions'][0])
self.assertLess(0, len(instance['students'][1]['submissions'][0]['feedback']))
self.assertEqual(5, instance['students'][1]['submissions'][0]['feedback']['score'])
self.assertEqual(True, instance['students'][1]['submissions'][0]['feedback']['isFinal'])
self.assertIn('created', instance['students'][1]['submissions'][0]['feedback'])
# students[submissions][feedback][feedbackLines] nested
self.assertIn('feedbackLines', instance['students'][1]['submissions'][0]['feedback'])
self.assertLess(0, len(instance['students'][1]['submissions'][0]['feedback']['feedbackLines']))
self.assertIn('1', instance['students'][1]['submissions'][0]['feedback']['feedbackLines'])
self.assertIn('pk', instance['students'][1]['submissions'][0]['feedback']['feedbackLines']['1'][0])
self.assertEqual('This is very bad!',
instance['students'][1]['submissions'][0]['feedback']['feedbackLines']['1'][0]['text'])
self.assertEqual('reviewer',
instance['students'][1]['submissions'][0]['feedback']['feedbackLines']['1'][0]['ofTutor'])
# reviewers fields
self.assertIn('reviewers', instance)
self.assertLess(0, len(instance['reviewers']))
self.assertIn('pk', instance['reviewers'][0])
self.assertEqual('reviewer', instance['reviewers'][0]['username'])
# tutors fields
self.assertIn('tutors', instance)
self.assertLess(0, len(instance['tutors']))
self.assertEqual('tutor01', instance['tutors'][0]['username'])
class ExportJSONTest(APITestCase):
@classmethod
def setUpTestData(cls):
......
......@@ -46,6 +46,7 @@ regular_views_urlpatterns = [
path('jwt-time-delta/',
views.get_jwt_expiration_delta,
name='jwt-time-delta'),
path('instance/export/', views.InstanceExport.as_view(), name="instance-export"),
path('export/json/', views.StudentJSONExport.as_view(), name='export-json'),
re_path(r'swagger(?P<format>\.json|\.yaml)$',
schema_view.without_ui(cache_timeout=0), name='schema-json'),
......
from .feedback import FeedbackApiView, FeedbackCommentApiView # noqa
from .subscription import SubscriptionApiViewSet, AssignmentApiViewSet # noqa
from .common_views import * # noqa
from .export import StudentJSONExport # noqa
from .export import StudentJSONExport, InstanceExport # noqa
......@@ -3,8 +3,11 @@ from rest_framework.views import APIView
import xkcdpass.xkcd_password as xp
from core.models import StudentInfo, UserAccount
from core.models import StudentInfo, UserAccount, ExamType, SubmissionType
from core.permissions import IsReviewer
from core.serializers.common_serializers import SubmissionTypeSerializer, ExamSerializer, UserAccountSerializer
from core.serializers.student import StudentExportSerializer
from core.serializers.tutor import TutorSerializer
words = xp.generate_wordlist(wordfile=xp.locate_wordfile(), min_length=5, max_length=8)
......@@ -42,3 +45,24 @@ class StudentJSONExport(APIView):
} for student
in StudentInfo.get_annotated_score_submission_list()]
return Response(content)
class InstanceExport(APIView):
permission_classes = (IsReviewer, )
def get(self, request):
exam_types_serializer = ExamSerializer(ExamType.objects.all(), many=True)
submission_types_serializer = SubmissionTypeSerializer(SubmissionType.objects.all(), many=True)
tutors_serializer = TutorSerializer(UserAccount.tutors.with_feedback_count(), many=True)
reviewer_serializer = UserAccountSerializer(UserAccount.get_reviewers(), many=True)
student_serializer = StudentExportSerializer(StudentInfo.objects.all(), many=True)
content = {
"examTypes": exam_types_serializer.data,
"submissionTypes": submission_types_serializer.data,
"students": student_serializer.data,
"tutors": tutors_serializer.data,
"reviewers": reviewer_serializer.data
}
return Response(content)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment