Loading app.py +4 −3 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ manager = DataManagement(app, db) @click.pass_context def cli_run_devel(ctx, port): manager.reset_db() manager.create_admin_user('admin', '789789') manager.init_data() ctx.forward(run_command, port) Loading @@ -45,10 +46,10 @@ def cli_run_devel(ctx, port): # @data_cli.command('init', help='Initializes sample data') def cli_init_data(): @click.argument('env') def cli_init_data(env): log.info("[CMD] Initializing data") data.init_data(db=db, app=app) manager.init_data(env) # # Users related commands Loading management/data/__init__.py +5 −11 Original line number Diff line number Diff line Loading @@ -2,7 +2,8 @@ from flask import Flask from flask_sqlalchemy import SQLAlchemy from management.data import shared from management.data.data_dev import init_development_data from management.data.data_test import init_test_data from management.data.data_dev import init_dev_data from management.data.data_prod import init_prod_data from portal.database.models import Course, Role, User from portal.service import general Loading Loading @@ -33,8 +34,10 @@ class DataManagement(object): env = env if env == 'prod': init_prod_data(db=self.db, app=self.app) if env == 'test': init_test_data(db=self.db, app=self.app) else: init_development_data(db=self.db, app=self.app) init_dev_data(db=self.db, app=self.app) def delete_user(self, name): """Deletes user Loading Loading @@ -101,12 +104,3 @@ class DataManagement(object): self.db.session.commit() return role def init_data(app: Flask, db: SQLAlchemy, env=None): """Creates sample data Args: app(Flask): Flask application db(SQLAlchemy): Db instance env(str): Name of the environment """ DataManagement(app, db).init_data(env) management/data/data_dev.py +150 −176 Original line number Diff line number Diff line Loading @@ -3,31 +3,40 @@ 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.database.models import Review, Submission, SubmissionState from portal.tools import time def init_development_data(app: Flask, db: SQLAlchemy): def init_dev_data(app: Flask, db: SQLAlchemy): with app.app_context(): creator = DataFactory(db) factory = DataFactory(db) # users create_stub_users(app, creator) student1 = factory.create_user(username='student1', uco=111) student2 = factory.create_user(username='student2', uco=222) teacher1 = factory.create_user(username='teacher1', password='123123', name='Teacher And Student', uco=1001) teacher2 = factory.create_user(username='teacher2', password='123123', name='Teacher Only', uco=1002) lecturer1 = factory.create_user( username='lecturer1', name='Courses Owner', password='654321', uco=1010 ) # courses cpp = creator.create_course(codename='PB161', name='C++') c = creator.create_course(codename='PB071', name='C') test_course1 = factory.create_course(codename='TestCourse1', name='Test Course One') test_course2 = factory.create_course(codename='TestCourse2', name='test Course Two') # 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") tc1_students = factory.create_group(course=test_course1, name="seminar01") tc1_teachers = factory.create_group(course=test_course1, name="teachers") tc2_students = factory.create_group(course=test_course2, name="seminar01") tc2_teachers = factory.create_group(course=test_course2, name="teachers") # projects cpp_p1 = creator.create_project( course=cpp, name="HW01", config=dict( tc1_hw01 = factory.create_project( course=test_course1, name="HW01", config=dict( file_whitelist="main.cpp", pre_submit_script="python for kontr pre", post_submit_script="python for kontr post", Loading @@ -38,8 +47,8 @@ def init_development_data(app: Flask, db: SQLAlchemy): archive_from=time.NOW() + timedelta(days=30) ) ) cpp_p2 = creator.create_project( course=cpp, name="HW02", config=dict( tc1_hw02 = factory.create_project( course=test_course1, 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", Loading @@ -51,8 +60,8 @@ def init_development_data(app: Flask, db: SQLAlchemy): ) ) c_p1 = creator.create_project( course=c, name="HW01", config=dict( tc2_hw01 = factory.create_project( course=test_course2, 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", Loading @@ -64,113 +73,78 @@ def init_development_data(app: Flask, db: SQLAlchemy): ) # roles tc1_student = factory.scaffold_role(role_type='student', course=test_course1) tc1_teacher = factory.scaffold_role(role_type='teacher', course=test_course1) tc1_owner = factory.scaffold_role(role_type='owner', course=test_course1) 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 )) tc2_student = factory.scaffold_role(role_type='student', course=test_course2) tc2_teacher = factory.scaffold_role(role_type='teacher', course=test_course2) tc2_owner = factory.scaffold_role(role_type='owner', course=test_course2) # 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() teacher_student = teacher1 teacher_both = teacher2 student_tc1 = student1 student_both = student2 # 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) lecturer1.roles.append(tc1_owner) lecturer1.roles.append(tc2_owner) teacher_student.roles.append(tc1_teacher) teacher_student.roles.append(tc2_student) teacher_both.roles.append(tc1_teacher) teacher_both.roles.append(tc2_teacher) student_tc1.roles.append(tc1_student) student_both.roles.append(tc1_student) student_both.roles.append(tc2_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) teacher_student.groups.append(tc1_teachers) teacher_student.groups.append(tc2_students) teacher_both.groups.append(tc1_teachers) teacher_both.groups.append(tc2_teachers) student_tc1.groups.append(tc1_students) student_both.groups.append(tc1_students) student_both.groups.append(tc2_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 tc2_sub1 = Submission(user=teacher_student, project=tc2_hw01, parameters="") tc2_sub1.state = SubmissionState.FINISHED tc2_sub2 = Submission(user=student_both, project=tc2_hw01, parameters="") tc2_sub2.state = SubmissionState.ABORTED tc1_sub_p1_cancel = Submission(user=student_both, project=tc1_hw01, parameters="") tc1_sub_p1_cancel.state = SubmissionState.CANCELLED tc1_sub_p1_abort = Submission(user=student_tc1, project=tc1_hw01, parameters="") tc1_sub_p1_abort.state = SubmissionState.ABORTED tc1_sub_p1_finished = Submission(user=student_both, project=tc1_hw01, parameters="") tc1_sub_p1_finished.state = SubmissionState.FINISHED tc1_sub_p1_in_progress = Submission(user=student_tc1, project=tc1_hw01, parameters="") tc1_sub_p1_in_progress.state = SubmissionState.IN_PROGRESS # Projects in groups cpp_students.projects.append(cpp_p1) c_students.projects.append(c_p1) tc1_students.projects.append(tc1_hw01) tc2_students.projects.append(tc2_hw01) 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]) [tc2_sub1, tc2_sub2, tc1_sub_p1_cancel, tc1_sub_p1_abort, tc1_sub_p1_finished, tc1_sub_p1_in_progress]) # reviews review = Review(c_sub1) creator.create_review_item(author=teacher_both, review=review, line=1, review = Review(tc2_sub1) factory.create_review_item(author=teacher_both, review=review, line=1, content="problem here") creator.create_review_item(author=teacher_both, review=review, line=5, factory.create_review_item(author=teacher_both, review=review, line=5, content="good stuff") creator.create_review_item(author=teacher_student, review=review, factory.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() factory.create_component(name='executor') factory.create_component(name='processing', component_type='processing') # Commit to the DB 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') management/data/data_test.py 0 → 100644 +150 −0 Original line number Diff line number Diff line from datetime import timedelta from flask import Flask from flask_sqlalchemy import SQLAlchemy from management.data.shared import DataFactory from portal.database.models import Review, Submission, SubmissionState from portal.tools import time def init_test_data(app: Flask, db: SQLAlchemy): with app.app_context(): factory = DataFactory(db) # users student1 = factory.create_user(username='student1', uco=111) student2 = factory.create_user(username='student2', uco=222) teacher1 = factory.create_user(username='teacher1', password='123123', name='Teacher And Student', uco=1001) teacher2 = factory.create_user(username='teacher2', password='123123', name='Teacher Only', uco=1002) lecturer1 = factory.create_user( username='lecturer1', name='Courses Owner', password='654321', uco=1010 ) # courses test_course1 = factory.create_course(codename='TestCourse1', name='Test Course One') test_course2 = factory.create_course(codename='TestCourse2', name='test Course Two') # groups tc1_students = factory.create_group(course=test_course1, name="seminar01") tc1_teachers = factory.create_group(course=test_course1, name="teachers") tc2_students = factory.create_group(course=test_course2, name="seminar01") tc2_teachers = factory.create_group(course=test_course2, name="teachers") tc1_hw01 = factory.create_project( course=test_course1, 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) ) ) tc1_hw02 = factory.create_project( course=test_course1, 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) ) ) tc2_hw01 = factory.create_project( course=test_course2, 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 tc1_student = factory.scaffold_role(role_type='student', course=test_course1) tc1_teacher = factory.scaffold_role(role_type='teacher', course=test_course1) tc1_owner = factory.scaffold_role(role_type='owner', course=test_course1) tc2_student = factory.scaffold_role(role_type='student', course=test_course2) tc2_teacher = factory.scaffold_role(role_type='teacher', course=test_course2) tc2_owner = factory.scaffold_role(role_type='owner', course=test_course2) # relationships teacher_student = teacher1 teacher_both = teacher2 student_tc1 = student1 student_both = student2 # roles lecturer1.roles.append(tc1_owner) lecturer1.roles.append(tc2_owner) teacher_student.roles.append(tc1_teacher) teacher_student.roles.append(tc2_student) teacher_both.roles.append(tc1_teacher) teacher_both.roles.append(tc2_teacher) student_tc1.roles.append(tc1_student) student_both.roles.append(tc1_student) student_both.roles.append(tc2_student) # groups teacher_student.groups.append(tc1_teachers) teacher_student.groups.append(tc2_students) teacher_both.groups.append(tc1_teachers) teacher_both.groups.append(tc2_teachers) student_tc1.groups.append(tc1_students) student_both.groups.append(tc1_students) student_both.groups.append(tc2_students) # submissions tc2_sub1 = Submission(user=teacher_student, project=tc2_hw01, parameters="") tc2_sub1.state = SubmissionState.FINISHED tc2_sub2 = Submission(user=student_both, project=tc2_hw01, parameters="") tc2_sub2.state = SubmissionState.ABORTED tc1_sub_p1_cancel = Submission(user=student_both, project=tc1_hw01, parameters="") tc1_sub_p1_cancel.state = SubmissionState.CANCELLED tc1_sub_p1_abort = Submission(user=student_tc1, project=tc1_hw01, parameters="") tc1_sub_p1_abort.state = SubmissionState.ABORTED tc1_sub_p1_finished = Submission(user=student_both, project=tc1_hw01, parameters="") tc1_sub_p1_finished.state = SubmissionState.FINISHED tc1_sub_p1_in_progress = Submission(user=student_tc1, project=tc1_hw01, parameters="") tc1_sub_p1_in_progress.state = SubmissionState.IN_PROGRESS # Projects in groups tc1_students.projects.append(tc1_hw01) tc2_students.projects.append(tc2_hw01) db.session.add_all( [tc2_sub1, tc2_sub2, tc1_sub_p1_cancel, tc1_sub_p1_abort, tc1_sub_p1_finished, tc1_sub_p1_in_progress]) # reviews review = Review(tc2_sub1) factory.create_review_item(author=teacher_both, review=review, line=1, content="problem here") factory.create_review_item(author=teacher_both, review=review, line=5, content="good stuff") factory.create_review_item(author=teacher_student, review=review, line=1, content="oops") db.session.add_all([review]) # components factory.create_component(name='executor') factory.create_component(name='processing', component_type='processing') # Commit to the DB db.session.commit() management/data/shared.py +10 −14 Original line number Diff line number Diff line """ Factory to create sample data """ import logging import random import string Loading Loading @@ -29,15 +33,10 @@ PERM_TEACHER = dict( 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 ) Loading @@ -45,7 +44,6 @@ PERM_STUDENT = dict( view_course_limited=True, create_submissions=True, read_submissions_own=True, read_reviews_own=True, write_reviews_own=True ) Loading @@ -56,15 +54,12 @@ PERM_OWNER = dict( 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 ) Loading @@ -83,7 +78,8 @@ class DataFactory(object): def session(self): return self._db.session def create_user(self, username: str, uco=0, name=None, password=None, email=None, admin=False): def create_user(self, username: str, uco=0, name=None, password=None, email=None, admin=False) -> User: email = email or f"{username}@example.com" password = password or "123456" user = self.__create_entity(User, uco=uco, username=username, is_admin=admin, email=email) Loading @@ -91,11 +87,11 @@ class DataFactory(object): user.set_password(password=password) return user def create_default_admin_user(self, app): def create_test_admin_user(self) -> User: return self.create_user( username=app.config.get('PORTAL_ADMIN_USER_USERNAME', 'admin'), password=app.config.get('PORTAL_ADMIN_USER_PASSWORD', password_generator()), email=app.config.get('PORTAL_ADMIN_USER_EMAIL', 'admin@example.com'), username='admin', password='789789', email='admin@example.com', name='Kontr Admin', uco=0, admin=True, Loading Loading
app.py +4 −3 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ manager = DataManagement(app, db) @click.pass_context def cli_run_devel(ctx, port): manager.reset_db() manager.create_admin_user('admin', '789789') manager.init_data() ctx.forward(run_command, port) Loading @@ -45,10 +46,10 @@ def cli_run_devel(ctx, port): # @data_cli.command('init', help='Initializes sample data') def cli_init_data(): @click.argument('env') def cli_init_data(env): log.info("[CMD] Initializing data") data.init_data(db=db, app=app) manager.init_data(env) # # Users related commands Loading
management/data/__init__.py +5 −11 Original line number Diff line number Diff line Loading @@ -2,7 +2,8 @@ from flask import Flask from flask_sqlalchemy import SQLAlchemy from management.data import shared from management.data.data_dev import init_development_data from management.data.data_test import init_test_data from management.data.data_dev import init_dev_data from management.data.data_prod import init_prod_data from portal.database.models import Course, Role, User from portal.service import general Loading Loading @@ -33,8 +34,10 @@ class DataManagement(object): env = env if env == 'prod': init_prod_data(db=self.db, app=self.app) if env == 'test': init_test_data(db=self.db, app=self.app) else: init_development_data(db=self.db, app=self.app) init_dev_data(db=self.db, app=self.app) def delete_user(self, name): """Deletes user Loading Loading @@ -101,12 +104,3 @@ class DataManagement(object): self.db.session.commit() return role def init_data(app: Flask, db: SQLAlchemy, env=None): """Creates sample data Args: app(Flask): Flask application db(SQLAlchemy): Db instance env(str): Name of the environment """ DataManagement(app, db).init_data(env)
management/data/data_dev.py +150 −176 Original line number Diff line number Diff line Loading @@ -3,31 +3,40 @@ 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.database.models import Review, Submission, SubmissionState from portal.tools import time def init_development_data(app: Flask, db: SQLAlchemy): def init_dev_data(app: Flask, db: SQLAlchemy): with app.app_context(): creator = DataFactory(db) factory = DataFactory(db) # users create_stub_users(app, creator) student1 = factory.create_user(username='student1', uco=111) student2 = factory.create_user(username='student2', uco=222) teacher1 = factory.create_user(username='teacher1', password='123123', name='Teacher And Student', uco=1001) teacher2 = factory.create_user(username='teacher2', password='123123', name='Teacher Only', uco=1002) lecturer1 = factory.create_user( username='lecturer1', name='Courses Owner', password='654321', uco=1010 ) # courses cpp = creator.create_course(codename='PB161', name='C++') c = creator.create_course(codename='PB071', name='C') test_course1 = factory.create_course(codename='TestCourse1', name='Test Course One') test_course2 = factory.create_course(codename='TestCourse2', name='test Course Two') # 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") tc1_students = factory.create_group(course=test_course1, name="seminar01") tc1_teachers = factory.create_group(course=test_course1, name="teachers") tc2_students = factory.create_group(course=test_course2, name="seminar01") tc2_teachers = factory.create_group(course=test_course2, name="teachers") # projects cpp_p1 = creator.create_project( course=cpp, name="HW01", config=dict( tc1_hw01 = factory.create_project( course=test_course1, name="HW01", config=dict( file_whitelist="main.cpp", pre_submit_script="python for kontr pre", post_submit_script="python for kontr post", Loading @@ -38,8 +47,8 @@ def init_development_data(app: Flask, db: SQLAlchemy): archive_from=time.NOW() + timedelta(days=30) ) ) cpp_p2 = creator.create_project( course=cpp, name="HW02", config=dict( tc1_hw02 = factory.create_project( course=test_course1, 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", Loading @@ -51,8 +60,8 @@ def init_development_data(app: Flask, db: SQLAlchemy): ) ) c_p1 = creator.create_project( course=c, name="HW01", config=dict( tc2_hw01 = factory.create_project( course=test_course2, 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", Loading @@ -64,113 +73,78 @@ def init_development_data(app: Flask, db: SQLAlchemy): ) # roles tc1_student = factory.scaffold_role(role_type='student', course=test_course1) tc1_teacher = factory.scaffold_role(role_type='teacher', course=test_course1) tc1_owner = factory.scaffold_role(role_type='owner', course=test_course1) 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 )) tc2_student = factory.scaffold_role(role_type='student', course=test_course2) tc2_teacher = factory.scaffold_role(role_type='teacher', course=test_course2) tc2_owner = factory.scaffold_role(role_type='owner', course=test_course2) # 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() teacher_student = teacher1 teacher_both = teacher2 student_tc1 = student1 student_both = student2 # 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) lecturer1.roles.append(tc1_owner) lecturer1.roles.append(tc2_owner) teacher_student.roles.append(tc1_teacher) teacher_student.roles.append(tc2_student) teacher_both.roles.append(tc1_teacher) teacher_both.roles.append(tc2_teacher) student_tc1.roles.append(tc1_student) student_both.roles.append(tc1_student) student_both.roles.append(tc2_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) teacher_student.groups.append(tc1_teachers) teacher_student.groups.append(tc2_students) teacher_both.groups.append(tc1_teachers) teacher_both.groups.append(tc2_teachers) student_tc1.groups.append(tc1_students) student_both.groups.append(tc1_students) student_both.groups.append(tc2_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 tc2_sub1 = Submission(user=teacher_student, project=tc2_hw01, parameters="") tc2_sub1.state = SubmissionState.FINISHED tc2_sub2 = Submission(user=student_both, project=tc2_hw01, parameters="") tc2_sub2.state = SubmissionState.ABORTED tc1_sub_p1_cancel = Submission(user=student_both, project=tc1_hw01, parameters="") tc1_sub_p1_cancel.state = SubmissionState.CANCELLED tc1_sub_p1_abort = Submission(user=student_tc1, project=tc1_hw01, parameters="") tc1_sub_p1_abort.state = SubmissionState.ABORTED tc1_sub_p1_finished = Submission(user=student_both, project=tc1_hw01, parameters="") tc1_sub_p1_finished.state = SubmissionState.FINISHED tc1_sub_p1_in_progress = Submission(user=student_tc1, project=tc1_hw01, parameters="") tc1_sub_p1_in_progress.state = SubmissionState.IN_PROGRESS # Projects in groups cpp_students.projects.append(cpp_p1) c_students.projects.append(c_p1) tc1_students.projects.append(tc1_hw01) tc2_students.projects.append(tc2_hw01) 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]) [tc2_sub1, tc2_sub2, tc1_sub_p1_cancel, tc1_sub_p1_abort, tc1_sub_p1_finished, tc1_sub_p1_in_progress]) # reviews review = Review(c_sub1) creator.create_review_item(author=teacher_both, review=review, line=1, review = Review(tc2_sub1) factory.create_review_item(author=teacher_both, review=review, line=1, content="problem here") creator.create_review_item(author=teacher_both, review=review, line=5, factory.create_review_item(author=teacher_both, review=review, line=5, content="good stuff") creator.create_review_item(author=teacher_student, review=review, factory.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() factory.create_component(name='executor') factory.create_component(name='processing', component_type='processing') # Commit to the DB 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')
management/data/data_test.py 0 → 100644 +150 −0 Original line number Diff line number Diff line from datetime import timedelta from flask import Flask from flask_sqlalchemy import SQLAlchemy from management.data.shared import DataFactory from portal.database.models import Review, Submission, SubmissionState from portal.tools import time def init_test_data(app: Flask, db: SQLAlchemy): with app.app_context(): factory = DataFactory(db) # users student1 = factory.create_user(username='student1', uco=111) student2 = factory.create_user(username='student2', uco=222) teacher1 = factory.create_user(username='teacher1', password='123123', name='Teacher And Student', uco=1001) teacher2 = factory.create_user(username='teacher2', password='123123', name='Teacher Only', uco=1002) lecturer1 = factory.create_user( username='lecturer1', name='Courses Owner', password='654321', uco=1010 ) # courses test_course1 = factory.create_course(codename='TestCourse1', name='Test Course One') test_course2 = factory.create_course(codename='TestCourse2', name='test Course Two') # groups tc1_students = factory.create_group(course=test_course1, name="seminar01") tc1_teachers = factory.create_group(course=test_course1, name="teachers") tc2_students = factory.create_group(course=test_course2, name="seminar01") tc2_teachers = factory.create_group(course=test_course2, name="teachers") tc1_hw01 = factory.create_project( course=test_course1, 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) ) ) tc1_hw02 = factory.create_project( course=test_course1, 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) ) ) tc2_hw01 = factory.create_project( course=test_course2, 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 tc1_student = factory.scaffold_role(role_type='student', course=test_course1) tc1_teacher = factory.scaffold_role(role_type='teacher', course=test_course1) tc1_owner = factory.scaffold_role(role_type='owner', course=test_course1) tc2_student = factory.scaffold_role(role_type='student', course=test_course2) tc2_teacher = factory.scaffold_role(role_type='teacher', course=test_course2) tc2_owner = factory.scaffold_role(role_type='owner', course=test_course2) # relationships teacher_student = teacher1 teacher_both = teacher2 student_tc1 = student1 student_both = student2 # roles lecturer1.roles.append(tc1_owner) lecturer1.roles.append(tc2_owner) teacher_student.roles.append(tc1_teacher) teacher_student.roles.append(tc2_student) teacher_both.roles.append(tc1_teacher) teacher_both.roles.append(tc2_teacher) student_tc1.roles.append(tc1_student) student_both.roles.append(tc1_student) student_both.roles.append(tc2_student) # groups teacher_student.groups.append(tc1_teachers) teacher_student.groups.append(tc2_students) teacher_both.groups.append(tc1_teachers) teacher_both.groups.append(tc2_teachers) student_tc1.groups.append(tc1_students) student_both.groups.append(tc1_students) student_both.groups.append(tc2_students) # submissions tc2_sub1 = Submission(user=teacher_student, project=tc2_hw01, parameters="") tc2_sub1.state = SubmissionState.FINISHED tc2_sub2 = Submission(user=student_both, project=tc2_hw01, parameters="") tc2_sub2.state = SubmissionState.ABORTED tc1_sub_p1_cancel = Submission(user=student_both, project=tc1_hw01, parameters="") tc1_sub_p1_cancel.state = SubmissionState.CANCELLED tc1_sub_p1_abort = Submission(user=student_tc1, project=tc1_hw01, parameters="") tc1_sub_p1_abort.state = SubmissionState.ABORTED tc1_sub_p1_finished = Submission(user=student_both, project=tc1_hw01, parameters="") tc1_sub_p1_finished.state = SubmissionState.FINISHED tc1_sub_p1_in_progress = Submission(user=student_tc1, project=tc1_hw01, parameters="") tc1_sub_p1_in_progress.state = SubmissionState.IN_PROGRESS # Projects in groups tc1_students.projects.append(tc1_hw01) tc2_students.projects.append(tc2_hw01) db.session.add_all( [tc2_sub1, tc2_sub2, tc1_sub_p1_cancel, tc1_sub_p1_abort, tc1_sub_p1_finished, tc1_sub_p1_in_progress]) # reviews review = Review(tc2_sub1) factory.create_review_item(author=teacher_both, review=review, line=1, content="problem here") factory.create_review_item(author=teacher_both, review=review, line=5, content="good stuff") factory.create_review_item(author=teacher_student, review=review, line=1, content="oops") db.session.add_all([review]) # components factory.create_component(name='executor') factory.create_component(name='processing', component_type='processing') # Commit to the DB db.session.commit()
management/data/shared.py +10 −14 Original line number Diff line number Diff line """ Factory to create sample data """ import logging import random import string Loading Loading @@ -29,15 +33,10 @@ PERM_TEACHER = dict( 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 ) Loading @@ -45,7 +44,6 @@ PERM_STUDENT = dict( view_course_limited=True, create_submissions=True, read_submissions_own=True, read_reviews_own=True, write_reviews_own=True ) Loading @@ -56,15 +54,12 @@ PERM_OWNER = dict( 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 ) Loading @@ -83,7 +78,8 @@ class DataFactory(object): def session(self): return self._db.session def create_user(self, username: str, uco=0, name=None, password=None, email=None, admin=False): def create_user(self, username: str, uco=0, name=None, password=None, email=None, admin=False) -> User: email = email or f"{username}@example.com" password = password or "123456" user = self.__create_entity(User, uco=uco, username=username, is_admin=admin, email=email) Loading @@ -91,11 +87,11 @@ class DataFactory(object): user.set_password(password=password) return user def create_default_admin_user(self, app): def create_test_admin_user(self) -> User: return self.create_user( username=app.config.get('PORTAL_ADMIN_USER_USERNAME', 'admin'), password=app.config.get('PORTAL_ADMIN_USER_PASSWORD', password_generator()), email=app.config.get('PORTAL_ADMIN_USER_EMAIL', 'admin@example.com'), username='admin', password='789789', email='admin@example.com', name='Kontr Admin', uco=0, admin=True, Loading