diff --git a/util/factories.py b/util/factories.py index e007428f603ee8ec48fdd059ff1eed21921aa42f..969f60f97053e6614c7e72a42fd4fbf810953783 100644 --- a/util/factories.py +++ b/util/factories.py @@ -2,8 +2,9 @@ import configparser import secrets import string +from core.models import (Reviewer, Student, Tutor, ExamType, + SubmissionType, Submission, Feedback) from core.models import UserAccount as User -from core.models import Reviewer, Student, Tutor STUDENTS = 'students' TUTORS = 'tutors' @@ -44,7 +45,7 @@ class GradyUserFactory: def _get_random_name(prefix='', suffix='', k=1): return ''.join((prefix, get_random_password(k), suffix)) - def _make_base_user(self, username, groupname, store_pw=False, **kwargs): + def _make_base_user(self, username, groupname, password=None, store_pw=False, **kwargs): """ This is a specific wrapper for the django update_or_create method of objects. * A new user is created and password and group are set accordingly @@ -62,7 +63,7 @@ class GradyUserFactory: defaults=kwargs) if created: - password = self.password_generator_func() + password = self.password_generator_func() if password is None else password user.set_password(password) user.save() @@ -98,9 +99,10 @@ class GradyUserFactory: relation managers objects.update method. """ user = self._make_user_generic(username, STUDENTS, **kwargs) if matrikel_no: - user.objects.update(matrikel_no=matrikel_no) + user.matrikel_no = matrikel_no if exam: - user.objects.update(exam=exam) + user.exam = exam + user.save() return user def make_tutor(self, username=None, **kwargs): @@ -110,3 +112,162 @@ class GradyUserFactory: def make_reviewer(self, username=None, **kwargs): """ Creates or updates a reviewer if needed with defaults """ return self._make_user_generic(username, REVIEWERS, **kwargs) + + +def make_exams(exams=[], **kwargs): + return [ExamType.objects.get_or_create( + module_reference=exam['module_reference'], + defaults=exam)[0] for exam in exams] + + +def make_submission_types(submission_types=[], **kwargs): + return [SubmissionType.objects.get_or_create( + name=submission_type['name'], defaults=submission_type)[0] + for submission_type in submission_types] + + +def make_students(students=[], **kwargs): + return [GradyUserFactory().make_student( + username=student['username'], + exam=ExamType.objects.get(module_reference=student['exam']) + ) for student in students] + + +def make_tutors(tutors=[], **kwargs): + return [GradyUserFactory().make_tutor(**tutor) + for tutor in tutors] + + +def make_reviewers(reviewers=[], **kwargs): + return [GradyUserFactory().make_tutor(**reviewer) + for reviewer in reviewers] + + +def make_feedback(feedback, submission_object): + tutor = User.objects.get( + username=feedback['of_tutor']).get_associated_user() + return Feedback.objects.update_or_create( + of_submission=submission_object, + of_tutor=tutor, + defaults={ + 'text': feedback['text'], + 'score': feedback['score'] + })[0] + + +def make_submissions(submissions=[], **kwargs): + submission_objects = [] + for submission in submissions: + submission_type, _ = SubmissionType.objects.get_or_create( + name=submission.get('type', 'Auto generated type')) + student, _ = Student.objects.get_or_create(user=User.objects.get( + username=submission.get('user', 'default_user') + )) + submission_object, _ = Submission.objects.get_or_create( + type=submission_type, student=student, defaults={ + 'seen_by_student': submission.get('seen_by_student', False), + 'text': submission.get('text', ''), + }) + if 'feedback' in submission: + make_feedback(submission['feedback'], submission_object) + submission_objects.append(submission_object) + return submission_objects + + +def make_test_data(data_dict): + return { + 'exams': make_exams(**data_dict), + 'submission_types': make_submission_types(**data_dict), + 'students': make_students(**data_dict), + 'tutors': make_tutors(**data_dict), + 'reviewers': make_reviewers(**data_dict), + 'submissions': make_submissions(**data_dict) + } + + +def init_test_instance(): + return make_test_data( + data_dict={ + 'exams': [{ + 'module_reference': 'Test Exam 01', + 'total_score': 100, + 'pass_score': 60, + }], + 'submission_types': [ + { + 'name': '01. Sort this or that', + 'full_score': 35, + 'description': 'Very complicated', + 'solution': 'Trivial!' + }, + { + 'name': '02. Merge this or that or maybe even this', + 'full_score': 35, + 'description': 'Very complicated', + 'solution': 'Trivial!' + }, + { + 'name': '03. This one exists for the sole purpose to test', + 'full_score': 30, + 'description': 'Very complicated', + 'solution': 'Trivial!' + } + ], + 'students': [{ + 'username': 'student01', + 'exam': 'Test Exam 01', + }], + 'tutors': [{ + 'username': 'tutor01' + }], + 'reviewers': [{ + 'username': 'reviewer01' + }], + 'submissions': [ + { + 'text': 'function blabl\n' + ' on multi lines\n' + ' for blabla in bla:\n' + ' arrrgh\n' + ' asasxasx\n' + ' lorem ipsum und so\n', + 'type': '01. Sort this or that', + 'user': 'student01', + 'feedback': { + 'text': 'Not good!', + 'score': 5, + 'of_tutor': 'tutor01', + } + }, + { + 'text': 'function blabl\n' + ' on multi lines\n' + ' for blabla in bla:\n' + ' arrrgh\n' + ' asasxasx\n' + ' lorem ipsum und so\n', + 'type': '02. Merge this or that or maybe even this', + 'user': 'student01', + 'feedback': { + 'text': 'A little bit better!', + 'score': 10, + 'of_tutor': 'tutor01', + }, + }, + { + 'text': 'function blabl\n' + ' on multi lines\n' + ' for blabla in bla:\n' + ' arrrgh\n' + ' asasxasx\n' + ' lorem ipsum und so\n', + 'type': '03. This one exists for the sole purpose to test', + 'user': 'student01', + 'feedback': { + 'text': 'Awesome!', + 'score': 30, + 'of_tutor': 'tutor01', + }, + }, + ],} + )