Unverified Commit 671a0be1 authored by Peter Stanko's avatar Peter Stanko
Browse files

Sample data split + minor fixes

parent 2d02d1b9
Loading
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -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)

@@ -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
+5 −11
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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)
+150 −176
Original line number Diff line number Diff line
@@ -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",
@@ -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",
@@ -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",
@@ -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')
+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()


+10 −14
Original line number Diff line number Diff line
"""
Factory to create sample data
"""

import logging
import random
import string
@@ -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
    )

@@ -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
    )

@@ -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
    )

@@ -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)
@@ -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