add project grade sheet view for students and project supervisor

This commit is contained in:
dominik24c 2022-12-15 20:44:03 +01:00
parent fc3d84aa80
commit 3457f76b17
9 changed files with 357 additions and 2 deletions

View File

@ -2,7 +2,7 @@ from flask import abort, current_app
from apiflask import APIBlueprint from apiflask import APIBlueprint
from flask_sqlalchemy import get_debug_queries from flask_sqlalchemy import get_debug_queries
from ...students.models import Group, Student, YearGroup from ...students.models import Group, Student, YearGroup, ProjectGradeSheet
from ...project_supervisor.models import ProjectSupervisor, YearGroupProjectSupervisors from ...project_supervisor.models import ProjectSupervisor, YearGroupProjectSupervisors
from ..schemas import GroupSchema, GroupEditSchema, GroupsPaginationSchema, \ from ..schemas import GroupSchema, GroupEditSchema, GroupsPaginationSchema, \
GroupCreateSchema, MessageSchema, GroupQuerySchema GroupCreateSchema, MessageSchema, GroupQuerySchema
@ -75,6 +75,11 @@ def create_group(year_group_id: int, data: dict) -> dict:
students = db.session.query(Student).filter(Student.index.in_(students_indexes)).all() students = db.session.query(Student).filter(Student.index.in_(students_indexes)).all()
for student in students: for student in students:
group.students.append(student) group.students.append(student)
db.session.commit()
pgs = ProjectGradeSheet(group_id=group.id)
db.session.add(pgs)
db.session.commit() db.session.commit()
return {"message": "Group was created!"} return {"message": "Group was created!"}

View File

@ -1,7 +1,9 @@
from flask import Blueprint from flask import Blueprint
from .enrollments import bp as enrollments_bp from .enrollments import bp as enrollments_bp
from .project_grade_sheet import bp as project_grade_sheet_bp
bp = Blueprint("project_supervisor", __name__, url_prefix="/project_supervisor") bp = Blueprint("project_supervisor", __name__, url_prefix="/project_supervisor")
bp.register_blueprint(enrollments_bp) bp.register_blueprint(enrollments_bp)
bp.register_blueprint(project_grade_sheet_bp)

View File

@ -0,0 +1,68 @@
from apiflask import APIBlueprint
from flask import abort
from ...dependencies import db
from ..models import ProjectSupervisor
from ..schemas import ProjectSupervisorTermQuerySchema, MessageSchema, TemporaryProjectSupervisorSchema
from ...students.schemas import ProjectGradeSheetDetailFirstTermSchema, ProjectGradeSheetDetailSecondTermSchema, \
ProjectGradeSheetEditFirstTermSchema, ProjectGradeSheetEditSecondTermSchema
from ...students.models import Group, ProjectGradeSheet
bp = APIBlueprint("project_grade_sheet_for_project_supervisor", __name__, url_prefix="/project-grade-sheet")
@bp.get('/group/<int:group_id>/')
@bp.input(ProjectSupervisorTermQuerySchema, location='query')
def detail_project_grade_sheet(group_id: int, query: dict) -> dict:
project_supervisor_id = query.get('id')
project_supervisor = ProjectSupervisor.query.filter(ProjectSupervisor.id == project_supervisor_id).first()
if project_supervisor is None:
abort(404, "ProjectSupervisor doesn't exist!")
####################################
term = query.get('term')
group = Group.query.filter(Group.project_supervisor_id == project_supervisor_id, Group.id == group_id).first()
if group is None or len(group.project_grade_sheet) == 0:
abort(400, "Group doesn't exist!")
pgs = group.project_grade_sheet[0]
if term == 1:
schema = ProjectGradeSheetDetailFirstTermSchema()
else:
schema = ProjectGradeSheetDetailSecondTermSchema()
return schema.dump(pgs)
def update_project_grade_sheet(group_id: int, query: dict, data: dict) -> None:
project_supervisor_id = query.get('id')
project_supervisor = ProjectSupervisor.query.filter(ProjectSupervisor.id == project_supervisor_id).first()
if project_supervisor is None:
abort(404, "ProjectSupervisor doesn't exist!")
####################################
if len(data) == 0:
abort(400, "You passed empty data!")
pgs_query = ProjectGradeSheet.query.filter(ProjectGradeSheet.group_id == group_id)
if pgs_query.first() is None:
abort(404, "Not found project grade sheet!")
pgs_query.update(data)
db.session.commit()
@bp.patch('/group/<int:group_id>/first-term/')
@bp.input(TemporaryProjectSupervisorSchema, location='query')
@bp.input(ProjectGradeSheetEditFirstTermSchema, location='json')
@bp.output(MessageSchema)
def update_project_grade_sheet_for_first_term(group_id: int, query: dict, data: dict) -> dict:
update_project_grade_sheet(group_id, query, data)
return {"message": "Your project grade sheet was updated!"}
@bp.patch('/group/<int:group_id>/second-term/')
@bp.input(TemporaryProjectSupervisorSchema, location='query')
@bp.input(ProjectGradeSheetEditSecondTermSchema, location='json')
@bp.output(MessageSchema)
def update_project_grade_sheet_for_second_term(group_id: int, query: dict, data: dict) -> dict:
update_project_grade_sheet(group_id, query, data)
return {"message": "Your project grade sheet was updated!"}

View File

@ -28,3 +28,7 @@ class TimeAvailabilityCreateSchema(Schema):
# temporary class it will be removed in the future # temporary class it will be removed in the future
class TemporaryProjectSupervisorSchema(Schema): class TemporaryProjectSupervisorSchema(Schema):
id = fields.Integer(required=True) id = fields.Integer(required=True)
class ProjectSupervisorTermQuerySchema(Schema):
id = fields.Integer(required=True)
term = fields.Integer(required=True, validate=validate.OneOf([1, 2]))

View File

@ -58,6 +58,73 @@ class Group(Base):
return group_query return group_query
class ProjectGradeSheet(Base):
__tablename__ = 'project_grade_sheets'
group_id = db.Column(db.Integer, db.ForeignKey('groups.id'))
group = db.relationship('Group', backref='project_grade_sheet', uselist=False, lazy='joined')
presentation_required_content_1 = db.Column(db.Integer, default=0)
presentation_required_content_2 = db.Column(db.Integer, default=0)
presentation_was_compatible_1 = db.Column(db.Integer, default=0)
presentation_was_compatible_2 = db.Column(db.Integer, default=0)
presentation_showing_1 = db.Column(db.Integer, default=0)
presentation_showing_2 = db.Column(db.Integer, default=0)
presentation_answers_to_questions_from_committee_1 = db.Column(db.Integer, default=0)
presentation_answers_to_questions_from_committee_2 = db.Column(db.Integer, default=0)
documentation_project_vision_1 = db.Column(db.Integer, default=0)
documentation_project_vision_2 = db.Column(db.Integer, default=0)
documentation_requirements_1 = db.Column(db.Integer, default=0)
documentation_requirements_2 = db.Column(db.Integer, default=0)
documentation_for_clients_1 = db.Column(db.Integer, default=0)
documentation_for_clients_2 = db.Column(db.Integer, default=0)
documentation_for_developers_1 = db.Column(db.Integer, default=0)
documentation_for_developers_2 = db.Column(db.Integer, default=0)
documentation_license_1 = db.Column(db.Integer, default=0)
documentation_license_2 = db.Column(db.Integer, default=0)
group_work_regularity_1 = db.Column(db.Integer, default=0)
group_work_regularity_2 = db.Column(db.Integer, default=0)
group_work_division_of_work_1 = db.Column(db.Integer, default=0)
group_work_division_of_work_2 = db.Column(db.Integer, default=0)
group_work_contact_with_client_1 = db.Column(db.Integer, default=0)
group_work_contact_with_client_2 = db.Column(db.Integer, default=0)
group_work_management_of_risk_1 = db.Column(db.Integer, default=0)
group_work_management_of_risk_2 = db.Column(db.Integer, default=0)
group_work_work_methodology_1 = db.Column(db.Integer, default=0)
group_work_work_methodology_2 = db.Column(db.Integer, default=0)
group_work_management_of_source_code_1 = db.Column(db.Integer, default=0)
group_work_management_of_source_code_2 = db.Column(db.Integer, default=0)
group_work_devops_1 = db.Column(db.Integer, default=0)
group_work_devops_2 = db.Column(db.Integer, default=0)
products_project_complexity_of_product_1 = db.Column(db.Integer, default=0)
products_project_complexity_of_product_2 = db.Column(db.Integer, default=0)
products_project_access_to_application_1 = db.Column(db.Integer, default=0)
products_project_access_to_application_2 = db.Column(db.Integer, default=0)
products_project_security_issues_1 = db.Column(db.Integer, default=0)
products_project_security_issues_2 = db.Column(db.Integer, default=0)
products_project_access_to_test_application_1 = db.Column(db.Integer, default=0)
products_project_access_to_test_application_2 = db.Column(db.Integer, default=0)
products_project_acceptance_criteria_1 = db.Column(db.Integer, default=0)
products_project_acceptance_criteria_2 = db.Column(db.Integer, default=0)
products_project_expected_functionality_1 = db.Column(db.Integer, default=0)
products_project_expected_functionality_2 = db.Column(db.Integer, default=0)
products_project_promises_well_1 = db.Column(db.Integer, default=0)
products_project_promises_well_2 = db.Column(db.Integer, default=0)
products_project_has_been_implemented_1 = db.Column(db.Integer, default=0)
products_project_has_been_implemented_2 = db.Column(db.Integer, default=0)
products_project_is_useful_1 = db.Column(db.Integer, default=0)
products_project_is_useful_2 = db.Column(db.Integer, default=0)
products_project_prototype_1 = db.Column(db.Integer, default=0)
products_project_prototype_2 = db.Column(db.Integer, default=0)
products_project_tests_1 = db.Column(db.Integer, default=0)
products_project_tests_2 = db.Column(db.Integer, default=0)
products_project_technology_1 = db.Column(db.Integer, default=0)
products_project_technology_2 = db.Column(db.Integer, default=0)
class Student(Person): class Student(Person):
__tablename__ = "students" __tablename__ = "students"

View File

@ -1,11 +1,13 @@
from flask import Blueprint from flask import Blueprint
from .enrollments import bp as enrollments_bp from .enrollments import bp as enrollments_bp
from .project_grade_sheet import bp as project_grade_sheet_bp
from .registrations import bp as registrations_bp from .registrations import bp as registrations_bp
from .year_group import bp as year_group_bp from .year_group import bp as year_group_bp
bp = Blueprint("students", __name__, url_prefix="/students") bp = Blueprint("students", __name__, url_prefix="/students")
bp.register_blueprint(enrollments_bp) bp.register_blueprint(enrollments_bp)
bp.register_blueprint(project_grade_sheet_bp)
bp.register_blueprint(registrations_bp) bp.register_blueprint(registrations_bp)
bp.register_blueprint(year_group_bp) bp.register_blueprint(year_group_bp)

View File

@ -0,0 +1,35 @@
from apiflask import APIBlueprint
from flask import abort
from ..schemas import StudentIndexQueryTempSchema, ProjectGradeSheetDetailFirstTermSchema, \
ProjectGradeSheetDetailSecondTermSchema
from ..models import Student, ProjectGradeSheet
bp = APIBlueprint("project_grade_sheet", __name__, url_prefix="/project-grade-sheet")
@bp.get('/year-group/<int:year_group_id>/')
@bp.input(StudentIndexQueryTempSchema, location='query')
def detail_project_grade_sheet(year_group_id: int, query: dict) -> dict:
index = query.get('index')
st = Student.query.filter(Student.index == index).first()
if st is None:
abort(404, "Not found student!")
####################################
term = int(query.get('term'))
groups = [g for g in st.groups if g.year_group_id == year_group_id]
if len(groups) == 0:
abort(404, "Not found group!")
group = groups[0]
pgs = ProjectGradeSheet.query.filter(ProjectGradeSheet.group_id == group.id).first()
if pgs is None:
abort(404, "Not found project grade sheet!")
if term == 1:
schema = ProjectGradeSheetDetailFirstTermSchema()
else:
schema = ProjectGradeSheetDetailSecondTermSchema()
return schema.dump(pgs)

View File

@ -1,4 +1,6 @@
from marshmallow import fields, Schema from marshmallow import fields, Schema, validate
POINTS = [0, 1, 3, 4]
class ProjectSupervisorSchema(Schema): class ProjectSupervisorSchema(Schema):
@ -69,3 +71,84 @@ class YearGroupQueryStudentSchema(Schema):
index = fields.Integer(required=True) # it will be removed index = fields.Integer(required=True) # it will be removed
page = fields.Integer() page = fields.Integer()
per_page = fields.Integer() per_page = fields.Integer()
class StudentIndexQueryTempSchema(Schema):
index = fields.Integer(required=True) # it will be removed
term = fields.Integer(required=True, validate=validate.OneOf([1, 2]))
class ProjectGradeSheetEditFirstTermSchema(Schema):
presentation_required_content_1 = fields.Integer(validate=validate.OneOf(POINTS))
presentation_was_compatible_1 = fields.Integer(validate=validate.OneOf(POINTS))
presentation_showing_1 = fields.Integer(validate=validate.OneOf(POINTS))
presentation_answers_to_questions_from_committee_1 = fields.Integer(validate=validate.OneOf(POINTS))
documentation_project_vision_1 = fields.Integer(validate=validate.OneOf(POINTS))
documentation_requirements_1 = fields.Integer(validate=validate.OneOf(POINTS))
documentation_for_clients_1 = fields.Integer(validate=validate.OneOf(POINTS))
documentation_for_developers_1 = fields.Integer(validate=validate.OneOf(POINTS))
documentation_license_1 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_regularity_1 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_division_of_work_1 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_contact_with_client_1 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_management_of_risk_1 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_work_methodology_1 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_management_of_source_code_1 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_devops_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_complexity_of_product_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_access_to_application_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_security_issues_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_access_to_test_application_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_acceptance_criteria_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_expected_functionality_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_promises_well_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_has_been_implemented_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_is_useful_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_prototype_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_tests_1 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_technology_1 = fields.Integer(validate=validate.OneOf(POINTS))
class ProjectGradeSheetDetailFirstTermSchema(ProjectGradeSheetEditFirstTermSchema):
id = fields.Integer()
class ProjectGradeSheetEditSecondTermSchema(Schema):
presentation_required_content_2 = fields.Integer(validate=validate.OneOf(POINTS))
presentation_was_compatible_2 = fields.Integer(validate=validate.OneOf(POINTS))
presentation_showing_2 = fields.Integer(validate=validate.OneOf(POINTS))
presentation_answers_to_questions_from_committee_2 = fields.Integer(validate=validate.OneOf(POINTS))
documentation_project_vision_2 = fields.Integer(validate=validate.OneOf(POINTS))
documentation_requirements_2 = fields.Integer(validate=validate.OneOf(POINTS))
documentation_for_clients_2 = fields.Integer(validate=validate.OneOf(POINTS))
documentation_for_developers_2 = fields.Integer(validate=validate.OneOf(POINTS))
documentation_license_2 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_regularity_2 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_division_of_work_2 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_contact_with_client_2 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_management_of_risk_2 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_work_methodology_2 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_management_of_source_code_2 = fields.Integer(validate=validate.OneOf(POINTS))
group_work_devops_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_complexity_of_product_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_access_to_application_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_security_issues_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_access_to_test_application_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_acceptance_criteria_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_expected_functionality_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_promises_well_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_has_been_implemented_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_is_useful_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_prototype_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_tests_2 = fields.Integer(validate=validate.OneOf(POINTS))
products_project_technology_2 = fields.Integer(validate=validate.OneOf(POINTS))
class ProjectGradeSheetDetailSecondTermSchema(ProjectGradeSheetEditSecondTermSchema):
id = fields.Integer()

View File

@ -0,0 +1,89 @@
"""empty message
Revision ID: 13d387439f43
Revises: 7deb011753b2
Create Date: 2022-12-15 18:06:57.906228
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '13d387439f43'
down_revision = '7deb011753b2'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('project_grade_sheets',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('group_id', sa.Integer(), nullable=True),
sa.Column('presentation_required_content_1', sa.Integer(), nullable=True),
sa.Column('presentation_required_content_2', sa.Integer(), nullable=True),
sa.Column('presentation_was_compatible_1', sa.Integer(), nullable=True),
sa.Column('presentation_was_compatible_2', sa.Integer(), nullable=True),
sa.Column('presentation_showing_1', sa.Integer(), nullable=True),
sa.Column('presentation_showing_2', sa.Integer(), nullable=True),
sa.Column('presentation_answers_to_questions_from_committee_1', sa.Integer(), nullable=True),
sa.Column('presentation_answers_to_questions_from_committee_2', sa.Integer(), nullable=True),
sa.Column('documentation_project_vision_1', sa.Integer(), nullable=True),
sa.Column('documentation_project_vision_2', sa.Integer(), nullable=True),
sa.Column('documentation_requirements_1', sa.Integer(), nullable=True),
sa.Column('documentation_requirements_2', sa.Integer(), nullable=True),
sa.Column('documentation_for_clients_1', sa.Integer(), nullable=True),
sa.Column('documentation_for_clients_2', sa.Integer(), nullable=True),
sa.Column('documentation_for_developers_1', sa.Integer(), nullable=True),
sa.Column('documentation_for_developers_2', sa.Integer(), nullable=True),
sa.Column('documentation_license_1', sa.Integer(), nullable=True),
sa.Column('documentation_license_2', sa.Integer(), nullable=True),
sa.Column('group_work_regularity_1', sa.Integer(), nullable=True),
sa.Column('group_work_regularity_2', sa.Integer(), nullable=True),
sa.Column('group_work_division_of_work_1', sa.Integer(), nullable=True),
sa.Column('group_work_division_of_work_2', sa.Integer(), nullable=True),
sa.Column('group_work_contact_with_client_1', sa.Integer(), nullable=True),
sa.Column('group_work_contact_with_client_2', sa.Integer(), nullable=True),
sa.Column('group_work_management_of_risk_1', sa.Integer(), nullable=True),
sa.Column('group_work_management_of_risk_2', sa.Integer(), nullable=True),
sa.Column('group_work_work_methodology_1', sa.Integer(), nullable=True),
sa.Column('group_work_work_methodology_2', sa.Integer(), nullable=True),
sa.Column('group_work_management_of_source_code_1', sa.Integer(), nullable=True),
sa.Column('group_work_management_of_source_code_2', sa.Integer(), nullable=True),
sa.Column('group_work_devops_1', sa.Integer(), nullable=True),
sa.Column('group_work_devops_2', sa.Integer(), nullable=True),
sa.Column('products_project_complexity_of_product_1', sa.Integer(), nullable=True),
sa.Column('products_project_complexity_of_product_2', sa.Integer(), nullable=True),
sa.Column('products_project_access_to_application_1', sa.Integer(), nullable=True),
sa.Column('products_project_access_to_application_2', sa.Integer(), nullable=True),
sa.Column('products_project_security_issues_1', sa.Integer(), nullable=True),
sa.Column('products_project_security_issues_2', sa.Integer(), nullable=True),
sa.Column('products_project_access_to_test_application_1', sa.Integer(), nullable=True),
sa.Column('products_project_access_to_test_application_2', sa.Integer(), nullable=True),
sa.Column('products_project_acceptance_criteria_1', sa.Integer(), nullable=True),
sa.Column('products_project_acceptance_criteria_2', sa.Integer(), nullable=True),
sa.Column('products_project_expected_functionality_1', sa.Integer(), nullable=True),
sa.Column('products_project_expected_functionality_2', sa.Integer(), nullable=True),
sa.Column('products_project_promises_well_1', sa.Integer(), nullable=True),
sa.Column('products_project_promises_well_2', sa.Integer(), nullable=True),
sa.Column('products_project_has_been_implemented_1', sa.Integer(), nullable=True),
sa.Column('products_project_has_been_implemented_2', sa.Integer(), nullable=True),
sa.Column('products_project_is_useful_1', sa.Integer(), nullable=True),
sa.Column('products_project_is_useful_2', sa.Integer(), nullable=True),
sa.Column('products_project_prototype_1', sa.Integer(), nullable=True),
sa.Column('products_project_prototype_2', sa.Integer(), nullable=True),
sa.Column('products_project_tests_1', sa.Integer(), nullable=True),
sa.Column('products_project_tests_2', sa.Integer(), nullable=True),
sa.Column('products_project_technology_1', sa.Integer(), nullable=True),
sa.Column('products_project_technology_2', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['group_id'], ['groups.id'], ),
sa.PrimaryKeyConstraint('id')
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('project_grade_sheets')
# ### end Alembic commands ###