from datetime import timedelta from flask import Flask from flask_sqlalchemy import SQLAlchemy from management.data.shared import DataFactory from portal.database.models import User, Submission, Review, SubmissionState from portal.tools import time def init_development_data(app: Flask, db: SQLAlchemy): with app.app_context(): creator = DataFactory(db) # users create_stub_users(app, creator) # courses cpp = creator.create_course(codename='PB161', name='C++') c = creator.create_course(codename='PB071', name='C') # groups cpp_students = creator.create_group(course=cpp, name="cpp_seminar01") cpp_teachers = creator.create_group(course=cpp, name="cpp_teachers") c_students = creator.create_group(course=c, name="c_seminar01") c_teachers = creator.create_group(course=c, name="c_teachers") # projects cpp_p1 = creator.create_project( course=cpp, name="HW01", config=dict( file_whitelist="main.cpp", pre_submit_script="python for kontr pre", post_submit_script="python for kontr post", submission_scheduler_config="python for sub Q", submission_parameters="{\"type\":\"text\"}", submissions_allowed_from=time.NOW(), submissions_allowed_to=time.NOW() + timedelta(days=2), archive_from=time.NOW() + timedelta(days=30) ) ) cpp_p2 = creator.create_project( course=cpp, name="HW02", config=dict( file_whitelist="main.cpp\nfunc.hpp\nfunc.cpp", pre_submit_script="python for kontr pre", post_submit_script="python for kontr post", submission_scheduler_config="python for sub Q", submission_parameters="{\"type\":\"text\"}", submissions_allowed_from=time.NOW() - timedelta(days=1), submissions_allowed_to=time.NOW() + timedelta(days=10), archive_from=time.NOW() + timedelta(days=30) ) ) c_p1 = creator.create_project( course=c, name="HW01", config=dict( file_whitelist="main.c", pre_submit_script="python for kontr pre", post_submit_script="python for kontr post", submission_scheduler_config="python for sub Q", submission_parameters="{\"type\":\"text\"}", submissions_allowed_from=time.NOW() - timedelta(days=1), submissions_allowed_to=time.NOW() - timedelta(minutes=1), archive_from=time.NOW() + timedelta(days=30) ) ) # roles cpp_student = creator.create_role(name='student', course=cpp, permissions=dict( view_course_limited=True, create_submissions=True, read_submissions_own=True, read_reviews_own=True, write_reviews_own=True )) cpp_teacher = creator.create_role(name='teacher', course=cpp, permissions=dict( view_course_full=True, update_course=True, handle_notes_access_token=True, assign_roles=True, write_roles=True, write_groups=True, read_groups=True, write_projects=True, read_projects=True, archive_projects=True, resubmit_submissions=True, evaluate_submissions=True, read_submissions_all=True, read_all_submission_files=True, read_reviews_all=True, write_reviews_all=True )) cpp_assistant = creator.create_role(name='assistant', course=cpp) c_student = creator.create_role(name='student', course=c, permissions=dict( view_course_limited=True, create_submissions=True, read_submissions_own=True, read_reviews_own=True, write_reviews_own=True )) c_teacher = creator.create_role(name='teacher', course=c, permissions=dict( view_course_full=True, update_course=True, handle_notes_access_token=True, assign_roles=True, write_roles=True, write_groups=True, read_groups=True, write_projects=True, read_projects=True, archive_projects=True, resubmit_submissions=True, evaluate_submissions=True, read_submissions_all=True, read_all_submission_files=True, read_reviews_all=True, write_reviews_all=True )) # relationships teacher_student = User.query.filter_by(username='teacher1').first() teacher_both = User.query.filter_by(username='teacher2').first() student_cpp = User.query.filter_by(username='student1').first() student_both = User.query.filter_by(username='student2').first() # roles teacher_student.roles.append(cpp_teacher) teacher_student.roles.append(c_student) teacher_both.roles.append(cpp_teacher) teacher_both.roles.append(c_teacher) student_cpp.roles.append(cpp_student) student_both.roles.append(cpp_student) student_both.roles.append(c_student) # groups teacher_student.groups.append(cpp_teachers) teacher_student.groups.append(c_students) teacher_both.groups.append(cpp_teachers) teacher_both.groups.append(c_teachers) student_cpp.groups.append(cpp_students) student_both.groups.append(cpp_students) student_both.groups.append(c_students) # submissions c_sub1 = Submission(user=teacher_student, project=c_p1, parameters="") c_sub1.state = SubmissionState.FINISHED c_sub2 = Submission(user=student_both, project=c_p1, parameters="") c_sub2.state = SubmissionState.ABORTED cpp_sub_p1_cancel = Submission(user=student_both, project=cpp_p1, parameters="") cpp_sub_p1_cancel.state = SubmissionState.CANCELLED cpp_sub_p1_abort = Submission(user=student_cpp, project=cpp_p1, parameters="") cpp_sub_p1_abort.state = SubmissionState.ABORTED cpp_sub_p1_finished = Submission(user=student_both, project=cpp_p1, parameters="") cpp_sub_p1_finished.state = SubmissionState.FINISHED cpp_sub_p1_in_progress = Submission(user=student_cpp, project=cpp_p1, parameters="") cpp_sub_p1_in_progress.state = SubmissionState.IN_PROGRESS # Projects in groups cpp_students.projects.append(cpp_p1) c_students.projects.append(c_p1) db.session.add_all( [c_sub1, c_sub2, cpp_sub_p1_cancel, cpp_sub_p1_abort, cpp_sub_p1_finished, cpp_sub_p1_in_progress]) # reviews review = Review(c_sub1) creator.create_review_item(author=teacher_both, review=review, line=1, content="problem here") creator.create_review_item(author=teacher_both, review=review, line=5, content="good stuff") creator.create_review_item(author=teacher_student, review=review, line=1, content="oops") db.session.add_all([review]) # components create_stub_components(creator) db.session.commit() def create_stub_users(app, creator): creator.create_default_admin_user(app) creator.create_user(username='student1', uco=111) creator.create_user(username='student2', uco=222) creator.create_user(username='teacher1', password='123123', name='Teacher And Student', uco=1001) creator.create_user(username='teacher2', password='123123', name='Teacher Only', uco=1002) def create_stub_components(creator): creator.create_component(name='executor') creator.create_component(name='processing', component_type='processing')