Пример #1
0
async def register_students(ans: SimpleBotEvent):
    with logger.contextualize(user_id=ans.object.object.message.from_id):
        payload = hyperjson.loads(ans.object.object.message.payload)
        data = []
        raw_html = requests.get(payload["students"])
        soup = BeautifulSoup(raw_html.text, "html.parser")
        students_ids = list(map(int, soup.find_all("pre")[1].text.split(",")))
        students = await api.users.get(user_ids=students_ids)
        student_last_id = Student.select().order_by(Student.id.desc()).get().id
        for student in students.response:
            student_last_id += 1
            data.append(
                {
                    "id": student_last_id,
                    "first_name": student.first_name,
                    "second_name": student.last_name,
                    "vk_id": student.id,
                    "group_id": payload["group"],
                    "academic_status": 1,
                },
            )
        query = Student.insert_many(data).execute()

        await ans.answer(
            f"{len(query)} студент(ов) зарегистрировано",
            keyboard=kbs.preferences.configure_chat(payload["chat_id"]),
        )
Пример #2
0
def get_unique_second_name_letters_in_a_group(group_id: int) -> list:
    """
    Возвращает список первых букв фамилий в активной группе.

    Args:
        group_id: Идентификатор группы

    Returns:
        list: список первых букв фамилий
    """
    query = (Student.select(Student.second_name).where(
        Student.group_id == group_id).order_by(Student.second_name).distinct())
    snd_names = [name.second_name[0] for name in query]
    if snd_names:
        return list(dict.fromkeys(snd_names))
Пример #3
0
def get_list_of_students_by_letter(admin_id: int,
                                   letter: str) -> t.List[Student]:
    """
    Возвращает объекты студентов активной группы, фамилии которых начинаются на letter.

    Args:
        admin_id: идентификатор пользователся
        letter: первая буква фамилий

    Returns:
        list[Student]: список студентов
    """
    active_group = admin.get_active_group(admin_id)
    query = (Student.select().where(
        (Student.second_name.startswith(letter))
        & (Student.group_id == active_group), ).order_by(
            Student.second_name.asc()))
    return shortcuts.generate_list(query)
Пример #4
0
def get_active_students(group_id: int) -> t.List[Student]:
    """
    Возвращает список активных (не отчисленных студентов) конкретной группы.

    Args:
        group_id: идентфикатор группы

    Raises:
        StudentNotFound: Когда в группе нет активных студентов

    Returns:
        list[Student]: набор активных студентов группы
    """
    query = Student.select().where(
        Student.group_id == group_id,
        Student.academic_status > 0,
    )
    students = shortcuts.generate_list(query)
    if students:
        return students
    raise StudentNotFound(f"В группе {group_id} нет активных студентов")