from datetime import datetime from flask_sqlalchemy import BaseQuery from ..dependencies import db from ..base.models import Person, Base from ..base.utils import order_by_column_name from ..examination_schedule.models import TermOfDefence class YearGroupStudents(Base): __tablename__ = 'year_group_students' year_group_id = db.Column(db.Integer, db.ForeignKey('year_groups.id', ondelete='CASCADE')) student_index = db.Column(db.Integer, db.ForeignKey('students.index', ondelete='CASCADE')) class YearGroup(Base): __tablename__ = 'year_groups' name = db.Column(db.String(50), nullable=False) mode = db.Column(db.String(1), nullable=False) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) students = db.relationship("YearGroupStudents", lazy='joined') __table__args = ( db.UniqueConstraint('name', 'mode', name='uc_name_mode_year_group') ) students_groups = db.Table('students_groups', db.Column('group_id', db.ForeignKey('groups.id'), nullable=False), db.Column('student_index', db.ForeignKey('students.index'), nullable=False)) class Group(Base): __tablename__ = "groups" name = db.Column(db.String(60), nullable=False) cdyd_kod = db.Column(db.String(60), default='2022/SZ') prz_kod = db.Column(db.String(60), default='06-DPRILI0') tzaj_kod = db.Column(db.String(60), default='LAB') project_supervisor_id = db.Column(db.Integer, db.ForeignKey('project_supervisors.id')) project_supervisor = db.relationship('ProjectSupervisor', backref='groups', lazy='joined') year_group_id = db.Column(db.Integer, db.ForeignKey('year_groups.id')) year_group = db.relationship('YearGroup', backref='groups', lazy='joined') points_for_first_term = db.Column(db.Integer, default=0, nullable=False) points_for_second_term = db.Column(db.Integer, default=0, nullable=False) students = db.relationship('Student', secondary=students_groups, back_populates='groups', lazy='joined') @classmethod def search_by_name(cls, year_group_id: int, search_name: str = None) -> BaseQuery: group_query = cls.query.filter(Group.year_group_id == year_group_id) if search_name is not None: group_query = group_query.filter(Group.name.like(f'{search_name}%')) 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): __tablename__ = "students" pesel = db.Column(db.String(11), default='') index = db.Column(db.Integer, primary_key=True) groups = db.relationship('Group', secondary=students_groups, back_populates='students', lazy='joined') year_groups = db.relationship("YearGroupStudents", lazy='joined') @classmethod def search_by_fullname_and_mode_and_order_by_first_name_or_last_name(cls, year_group_id: int, fullname: str = None, order_by_first_name: str = None, order_by_last_name: str = None) -> BaseQuery: student_query = cls.query.join(YearGroupStudents, isouter=True). \ filter(YearGroupStudents.year_group_id == year_group_id) if fullname is not None: student_query = student_query.filter((Student.first_name + ' ' + Student.last_name).like(f'{fullname}%')) student_query = order_by_column_name(student_query, Student.first_name, order_by_first_name) student_query = order_by_column_name(student_query, Student.last_name, order_by_last_name) return student_query