Exemplo n.º 1
0
def lessons():
    group_id = request.args.get('group_id', 0, type=int)
    selected_date = parse_date_or_none(request.args.get('selected_date'))
    page = request.args.get('page', 1, type=int)

    sigs = current_user.student.students_in_groups
    if group_id > 0: sigs = sigs.filter(StudentInGroup.group_id == group_id)

    lessons_queries = [
        sig.group.lessons
            .filter(Lesson.date >= start_date_of_month(sig.enter_month),
                    Lesson.date <= end_date_of_month(sig.exit_month))
        for sig in sigs
    ]

    pagination = Lesson.query.filter(False)

    for q in lessons_queries:
        pagination = pagination.union(q)

    if selected_date is not None: pagination = pagination.filter(Lesson.date <= selected_date)
    pagination = pagination.order_by(Lesson.date.desc())
    pagination = pagination.paginate(page, per_page=20, error_out=False)

    groups = current_user.student.groups \
        .order_by(Group.start_month.desc(), Group.name) \
        .all()

    return render_template('student/lessons_list.html', group_id=group_id, selected_date=selected_date,
                           pagination=pagination, lessons=pagination.items, groups=groups)
Exemplo n.º 2
0
def delete_attendings_was_not_out_of_months_period_student(student_in_group):
    attendings_was_not = Attending.query \
        .filter(Attending.student_id == student_in_group.student_id) \
        .filter(or_(Attending.state == attending_was_not, Attending.state == attending_was_not_ill)) \
        .join(Lesson, Lesson.id == Attending.lesson_id) \
        .filter(Lesson.group_id == student_in_group.group_id) \
        .filter(or_(Lesson.date < start_date_of_month(student_in_group.enter_month),
                    Lesson.date > end_date_of_month(student_in_group.exit_month))) \
        .all()
    for a in attendings_was_not:
        db.session.delete(a)
Exemplo n.º 3
0
def fill_group_by_schedule(group, new_dows):
    existing_lessons = group.lessons.filter(
        Lesson.date > datetime.date.today()).all()
    for lesson in existing_lessons:
        for a in lesson.attendings:
            db.session.delete(a)
        db.session.delete(lesson)
    start_date_1 = datetime.date.today() + datetime.timedelta(days=1)
    start_date_2 = start_date_of_month(group.start_month)
    for date in days_of_dows(start_date=max(start_date_1, start_date_2),
                             end_date=end_date_of_month(group.end_month),
                             dows=new_dows):
        db.session.add(
            Lesson(group_id=group.id, teacher_id=group.teacher_id, date=date))
Exemplo n.º 4
0
def create_lesson(group_id):
    group = Group.query.get_or_404(group_id)
    if 'submit' in request.form:
        date = parse_date_or_none(request.form.get('date'))
        if date is None or date < start_date_of_month(
                group.start_month) or date > end_date_of_month(
                    group.end_month):
            abort(409)
        if current_user.is_teacher and date < datetime.date.today():
            abort(409)
        db.session.add(
            Lesson(group_id=group_id, teacher_id=group.teacher_id, date=date))
        flash('занятие создано: {}'.format(date))
        return redirect(
            url_for('.lessons_in_month',
                    group_id=group_id,
                    month_number=number_of_month_for_date(date)))
    return render_template('lessons/create_lesson.html', group=group)
Exemplo n.º 5
0
 def lessons_in_group_in_month(group_id, month_number):
     return Lesson.query.filter(
         Lesson.group_id == group_id,
         Lesson.date >= start_date_of_month(month_number),
         Lesson.date <= end_date_of_month(month_number))
Exemplo n.º 6
0
def check_db_integrity():
    problems = list()

    for master in Master.query.all():
        if master.system_user.system_role.name != role_master_name:
            problems.append(
                'у мастера id={} ({}) неверная системная роль'.format(
                    master.id, master.fio))
    for teacher in Teacher.query.all():
        if teacher.system_user.system_role.name != role_teacher_name:
            problems.append(
                'у учителя id={} ({}) неверная системная роль'.format(
                    teacher.id, teacher.fio))
    for student in Student.query.all():
        if student.system_user.system_role.name != role_student_name:
            problems.append(
                'у ученика id={} ({}) неверная системная роль'.format(
                    student.id, student.fio))
    for bot in Bot.query.all():
        if bot.system_user.system_role.name != role_bot_name:
            problems.append('у бота id={} ({}) неверная системная роль'.format(
                bot.id, bot.fio))
    for developer in Developer.query.all():
        if developer.system_user.system_role.name != role_developer_name:
            problems.append(
                'у разработчика id={} ({}) неверная системная роль'.format(
                    developer.id, developer.fio))

    system_role_id_master = SystemRole.query.filter(
        SystemRole.name == role_master_name).first().id
    system_role_id_teacher = SystemRole.query.filter(
        SystemRole.name == role_teacher_name).first().id
    system_role_id_student = SystemRole.query.filter(
        SystemRole.name == role_student_name).first().id
    system_role_id_bot = SystemRole.query.filter(
        SystemRole.name == role_bot_name).first().id
    system_role_id_developer = SystemRole.query.filter(
        SystemRole.name == role_developer_name).first().id

    if SystemUser.query.filter(
            SystemUser.system_role_id ==
            system_role_id_master).count() != Master.query.count():
        problems.append('неверное кол-во мастеров')
    if SystemUser.query.filter(
            SystemUser.system_role_id ==
            system_role_id_teacher).count() != Teacher.query.count():
        problems.append('неверное кол-во учителей')
    if SystemUser.query.filter(
            SystemUser.system_role_id ==
            system_role_id_student).count() != Student.query.count():
        problems.append('неверное кол-во учеников')
    if SystemUser.query.filter(SystemUser.system_role_id == system_role_id_bot
                               ).count() != Bot.query.count():
        problems.append('неверное кол-во ботов')
    if SystemUser.query \
            .filter(SystemUser.system_role_id == system_role_id_developer).count() != Developer.query.count():
        problems.append('неверное кол-во разработчиков')

    if SystemUser.query.count() != Master.query.count() + Teacher.query.count() + Student.query.count() \
            + Bot.query.count() + Developer.query.count():
        problems.append(
            'кол-во системных пользователей не равно кол-ву пользователей')

    for group in Group.query.all():
        if group.start_month > group.end_month:
            problems.append('группа id={} ({}) - конец раньше начала'.format(
                group.id, group.name))
        if group.end_month - group.start_month >= 12:
            problems.append(
                'группа id={} ({}) функционирует больше 12 месяцев'.format(
                    group.id, group.name))
        start_date = start_date_of_month(group.start_month)
        end_date = end_date_of_month(group.end_month)
        for lesson in group.lessons.all():
            if lesson.date < start_date or lesson.date > end_date:
                problems.append(
                    'занятие id={} ({} / {}) выходит за рамки функционирования группы'
                    .format(lesson.id, group.name, lesson.date))
            for attending in lesson.attendings.all():
                if attending.state not in attending_states:
                    problems.append(
                        'неизвестный статус посещения id={} ({} / {} / {})'.
                        format(attending.id, attending.student.fio,
                               attending.lesson.date, group.name))
        for student_in_group in group.students_in_group.all():
            if student_in_group.enter_month < group.start_month or student_in_group.exit_month > group.end_month \
                    or student_in_group.enter_month > student_in_group.exit_month:
                problems.append(
                    'ученик в группе id={} ({} / {}) выходит за рамки функционирования группы'
                    .format(student_in_group.id, student_in_group.student.fio,
                            group.name))
            for payment in student_in_group.payments.all():
                if payment.month < student_in_group.enter_month or payment.month > student_in_group.exit_month:
                    problems.append(
                        'платеж id={} ({} / {} / {}) выходит за рамки нахождения ученика в группе'
                        .format(payment.id, group.name,
                                student_in_group.student.fio,
                                get_month_name(payment.month)))
                if payment.value < 0 or payment.value > payment.max_value:
                    problems.append(
                        'неверная сумма платежа id={} ({} / {} / {})'.format(
                            payment.id, group.name,
                            student_in_group.student.fio,
                            get_month_name(payment.month)))
    notification_types_overflow = 1
    for i in range(0, len(notification_types_list)):
        notification_types_overflow <<= 1
    for parent in Parent.query.all():
        if parent.notification_types < 0 or parent.notification_types >= notification_types_overflow:
            problems.append(
                'у родителя id={} неверные типы уведомлений: {}'.format(
                    parent.id, parent.notification_types))

    return render_template('check_db_integrity.html', problems=problems)