Ejemplo n.º 1
0
async def _demote_admin(ans: bots.SimpleBotEvent):
    student_id = await redis.hget(
        "students_selected_students:{0}".format(ans.from_id),
        "student_id",
    )

    with orm.db_session:
        admin_id = students.get_system_id_of_student(ans.from_id)
        group_id = admin.get_active_group(admin_id).id

        is_admin = students.is_admin_in_group(
            student_id,
            group_id,
        )

    if int(student_id) != admin_id:
        with orm.db_session:
            models.Admin.get(student=student_id, group=group_id).delete()
            is_admin = students.is_admin_in_group(
                student_id,
                admin.get_active_group(admin_id).id,
            )
        await ans.answer(
            "Администратор разжалован",
            keyboard=kbs.students.student_card(is_admin),
        )
    else:
        await ans.answer(
            "Вы не можете разжаловать сами себя",
            keyboard=kbs.students.student_card(is_admin),
        )
Ejemplo n.º 2
0
async def _call_debtors(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id)
    group_id = admin.get_active_group(admin_id)
    state_store = managers.StateStorageManager(admin_id)
    admin_store = managers.AdminConfigManager(admin_id)
    fin_store = managers.FinancialConfigManager(admin_id)
    with orm.db_session:
        if chats.get_list_of_chats_by_group(group_id):
            category_id = fin_store.get_or_create().financial_category.id
            msgs = generate_debtors_call(category_id)
            state_store.update(state=state_store.get_id_of_state(
                "fin_confirm_debtors_call"), )
            chat_id = admin_store.get_active_chat().vk_id
            chat_title = await chat_utils.get_chat_name(api_context, chat_id)
            for msg in msgs:
                await ans.answer(msg)
            if len(msgs) > 1:
                text = "Сообщения будут отправлены в {0}"
            else:
                text = "Сообщение будет отправлено в {0}"
            await ans.answer(
                text.format(chat_title),
                keyboard=kbs.common.confirm_with_chat_update(),
            )
        else:
            await ans.answer(
                "У вашей группы нет зарегистрированных чатов. Возврат в главное меню",
                keyboard=kbs.finances.fin_category(),
            )
Ejemplo n.º 3
0
async def _delete_student(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id)
    state_store = managers.StateStorageManager(admin_id)

    student_id = await redis.hget(
        "students_selected_students:{0}".format(ans.from_id),
        "student_id",
    )
    with orm.db_session:
        student = models.Student[student_id]
        is_admin = students.is_admin_in_group(
            student_id,
            admin.get_active_group(admin_id).id,
        )
    if int(student_id) != admin_id:
        state_store.update(
            state=state_store.get_id_of_state("students_delete_student"))
        await ans.answer(
            "Удалить студента {0} {1}?".format(student.first_name,
                                               student.last_name),
            keyboard=kbs.common.prompt().get_keyboard(),
        )
    else:
        await ans.answer(
            "Вы не можете удалить сами себя",
            keyboard=kbs.students.student_card(is_admin),
        )
Ejemplo n.º 4
0
async def _register_category(ans: bots.SimpleBotEvent):
    if re.match(r"^\w+ \d+$", ans.object.object.message.text):
        message = ans.object.object.message
        student_id = students.get_system_id_of_student(message.from_id)
        category = finances.get_or_create_finances_category(
            admin.get_active_group(student_id).id,
            *message.text.split(),
        )
        admin_store = managers.AdminConfigManager(student_id)
        fin_store = managers.FinancialConfigManager(student_id)
        fin_store.update(financial_category=category.id)
        state_storage = managers.StateStorageManager(student_id)
        state_storage.update(
            state=state_storage.get_id_of_state("fin_send_alert"), )
        with orm.db_session:
            chat_id = admin_store.get_active_chat().vk_id

        chat_title = await chat_utils.get_chat_name(api_context, chat_id)

        await ans.answer(
            "Категория {0} зарегистрирована. Вы можете отправить сообщение о начале сбора в чат {1}"
            .format(
                category.name,
                chat_title,
            ),
            keyboard=kbs.common.confirm_with_chat_update(),
        )
    else:
        await ans.answer("Неверный формат данных")
Ejemplo n.º 5
0
def list_of_fin_categories(admin_id: int) -> JSONStr:
    """
    Генерирует клавитуру со списком финансовых категорий.

    Args:
        admin_id: Идентификатор администратора

    Returns:
        JSONStr: клавиатура
    """
    kb = Keyboard()
    with orm.db_session:
        categories = finances.get_fin_categories(
            admin.get_active_group(admin_id))
        for category in categories:
            if len(kb.buttons[-1]) == 2:
                kb.add_row()
            kb.add_text_button(
                category.name,
                payload={
                    "button": "fin_category",
                    "category": category.id
                },
            )
    if kb.buttons[-1]:
        kb.add_row()
    kb.add_text_button(
        "➕ Создать категорию",
        payload={"button": "create_finances_category"},
    )
    kb.add_row()
    kb.add_text_button("◀️ Назад", payload={"button": "main_menu"})

    return kb.get_keyboard()
Ejemplo n.º 6
0
    def test_get_active_group(self):

        test_student_id = 23

        group = admin.get_active_group(test_student_id)

        expect(group).is_instance_of(Group)
Ejemplo n.º 7
0
async def _call_by_ac_status(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id)
    with orm.db_session:
        active_students = students.get_students_by_academic_status(
            admin.get_active_group(admin_id),
            ans.payload.get("status"),
        )
        mentioned_list = [st.id for st in active_students]
        mention_storage = managers.MentionStorageManager(admin_id)
        if set(mentioned_list).issubset(
                mention_storage.get_mentioned_students()):
            list_ = [
                elem for elem in mention_storage.get_mentioned_students()
                if elem not in mentioned_list
            ]
            logger.debug(list_)
            mention_storage.update_mentioned_students(list_)
            await ans.answer(
                "Все студенты {0} формы обучения удалены из списка Призыва".
                format(
                    models.AcademicStatus[ans.payload.get(
                        "status")].description, ), )
        else:
            mention_storage.update_mentioned_students(mentioned_list)
            await ans.answer(
                "Все студенты {0} формы обучения выбраны для Призыва".format(
                    models.AcademicStatus[ans.payload.get(
                        "status")].description, ), )
Ejemplo n.º 8
0
async def _call_by_subgroup(ans: bots.SimpleBotEvent):
    admin_id: int = students.get_system_id_of_student(ans.from_id)
    with orm.db_session:
        active_students: list[
            models.Student] = students.get_active_students_by_subgroup(
                admin.get_active_group(admin_id),
                ans.payload.get("subgroup"),
            )
        mentioned_list: list[int] = [st.id for st in active_students]
        mention_storage = managers.MentionStorageManager(admin_id)

        if set(mentioned_list).issubset(
                mention_storage.get_mentioned_students()):
            mention_storage.update_mentioned_students([
                elem for elem in mention_storage.get_mentioned_students()
                if elem not in mentioned_list
            ], )
            await ans.answer(
                "Все студенты подгруппы {0} удалены из списка Призыва".format(
                    ans.payload.get("subgroup"), ), )
        else:
            mention_storage.update_mentioned_students(mentioned_list)
            await ans.answer(
                "Все студенты подгруппы {0} выбраны для Призыва".format(
                    ans.payload.get("subgroup"), ), )
Ejemplo n.º 9
0
async def list_of_chats(api_context, admin_id: int):
    """
    Генерирует фрагмент клавиатуры со списком подключенных чатов.

    Args:
        api_context: Объект API ВК.
        admin_id: идентификатор пользователя

    Returns:
        Keyboard: Фрагмент клавиатуры
    """
    kb = Keyboard()
    with orm.db_session:
        chat_objects = chats.get_list_of_chats_by_group(
            admin.get_active_group(admin_id), )
        for chat in chat_objects:
            chat_title = await chat_utils.get_chat_name(
                api_context,
                chat.vk_id,
            )
            kb.add_text_button(
                chat_title,
                payload={
                    "button": "chat",
                    "chat_id": chat.id,
                },
            )
    return kb
Ejemplo n.º 10
0
async def _custom_presets(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id)
    group_id = admin.get_active_group(admin_id).id
    await ans.answer(
        "Список пользовательских пресетов",
        keyboard=kbs.common.custom_presets(group_id),
    )
Ejemplo n.º 11
0
async def _select_student(ans: bots.SimpleBotEvent):
    student_id = ans.payload.get("student_id")
    admin_id = students.get_system_id_of_student(ans.from_id)

    with orm.db_session:
        student = models.Student[student_id]
        student_dict = student.to_dict()
        student_dict["subgroup"] = student.subgroup or "Не указано"
        student_dict["group"] = student.group.group_num
        student_dict["academic_status"] = student.academic_status.description

    await redis.hmset(
        "students_selected_students:{0}".format(ans.from_id),
        student_id=student_id,
    )
    with orm.db_session:
        is_admin = students.is_admin_in_group(
            student_id,
            admin.get_active_group(admin_id).id,
        )

    await ans.answer(
        "Студент {first_name} {last_name}\nГруппа: {group}\nПодгруппа: {subgroup}\nФорма обучения: {academic_status}"
        .format(**student_dict, ),
        keyboard=kbs.students.student_card(is_admin),
    )
Ejemplo n.º 12
0
async def _show_contacts(ans: bots.SimpleBotEvent):
    student_id = await redis.hget(
        "students_selected_students:{0}".format(ans.from_id),
        "student_id",
    )
    admin_id = students.get_system_id_of_student(ans.from_id)
    with orm.db_session:
        student = models.Student[student_id]
        is_admin = students.is_admin_in_group(
            student_id,
            admin.get_active_group(admin_id).id,
        )
    email = student.email or "Не указан"
    phone_number = student.phone_number or "Не указан"
    contacts = "Контакты {0} {1}:\nВК: @id{2}\nEmail: {3}\nТелефон: {4}".format(
        student.first_name,
        student.last_name,
        student.vk_id,
        email,
        phone_number,
    )
    await ans.answer(
        contacts,
        keyboard=kbs.students.student_card(is_admin),
    )
Ejemplo n.º 13
0
async def _academic_statuses(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id)
    group_id = admin.get_active_group(admin_id).id

    await ans.answer(
        "Выберите форму обучения",
        keyboard=kbs.common.academic_statuses(group_id),
    )
Ejemplo n.º 14
0
async def _cancel_saving_list(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id)
    state_store = managers.StateStorageManager(admin_id)
    state_store.update(state=state_store.get_id_of_state("main"))
    await ans.answer(
        "Создание списка отменено",
        keyboard=kbs.group.list_of_lists(admin.get_active_group(admin_id).id),
    )
Ejemplo n.º 15
0
async def _change_publicity(ans: bots.SimpleBotEvent):
    admin_id: int = students.get_system_id_of_student(ans.from_id)
    group_id: int = admin.get_active_group(admin_id).id
    privacy: bool = groups.get_privacy_of_group(group_id)
    await ans.answer(
        "Сейчас группа {0}".format("приватная" if privacy else "публичная"),
        keyboard=kbs.preferences.group_privacy(group_id),
    )
Ejemplo n.º 16
0
    def test_get_unique_second_name_letters_in_a_group(self):

        test_user_id = 23

        snd_names = students.get_unique_second_name_letters_in_a_group(
            admin.get_active_group(test_user_id), )

        expect(snd_names).is_equal(sorted(list("БДСМЛЯВКИГЖРТЗШ")))
Ejemplo n.º 17
0
async def _confirm_saving_list(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id)

    with orm.db_session:
        models.List(group=admin.get_active_group(admin_id), name=ans.text)

    state_store = managers.StateStorageManager(admin_id)
    state_store.update(state=state_store.get_id_of_state("main"))

    await ans.answer("Список создан")
    await _start_lists(ans)
Ejemplo n.º 18
0
async def _start_lists(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id)
    group_id = admin.get_active_group(admin_id).id

    with orm.db_session:
        kb = kbs.group.list_of_lists(group_id)

    await ans.answer(
        "Списки студентов группы",
        keyboard=kb,
    )
Ejemplo n.º 19
0
    def _get_halves_of_alphabet(self) -> t.Tuple[t.List[str], t.List[str]]:
        """
        Создает половины алфавита из списка студентов.

        Returns:
            t.Tuple[t.List[str]]: Половины алфавита
        """
        alphabet_: t.List[
            str] = students.get_unique_second_name_letters_in_a_group(
                admin.get_active_group(self.admin_id), )
        half_len = len(alphabet_) // 2

        return alphabet_[:half_len], alphabet_[half_len:]
Ejemplo n.º 20
0
async def _confirm_remove_list(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id)
    group_id = admin.get_active_group(admin_id)

    list_id = await redis.hget("current_list:{0}".format(ans.from_id),
                               "list_id")

    with orm.db_session:
        models.List[list_id].delete()

    state_store = managers.StateStorageManager(admin_id)
    state_store.update(state=state_store.get_id_of_state("main"))
    await ans.answer("Список удалён",
                     keyboard=kbs.group.list_of_lists(group_id))
Ejemplo n.º 21
0
async def _open_preferences(ans: bots.SimpleBotEvent):
    with orm.db_session:
        active_group = admin.get_active_group(
            students.get_system_id_of_student(ans.from_id), )
        group_num = active_group.group_num
        specialty = active_group.specialty

    await ans.answer(
        "Настройки\nАктивная группа: {0} ({1})".format(
            group_num,
            specialty,
        ),
        keyboard=kbs.preferences.preferences(
            students.get_system_id_of_student(ans.from_id), ),
    )
Ejemplo n.º 22
0
def get_list_of_students_by_letter(admin_id: int, letter: str) -> List[Student]:
    """
    Возвращает объекты студентов активной группы, фамилии которых начинаются на letter.

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

    Returns:
        list[Student]: список студентов
    """
    active_group = admin.get_active_group(admin_id)
    return orm.select(
        st for st in Student if st.group == active_group and st.last_name[0] == letter
    ).order_by(Student.last_name)
Ejemplo n.º 23
0
async def _make_admin(ans: bots.SimpleBotEvent):
    student_id = await redis.hget(
        "students_selected_students:{0}".format(ans.from_id),
        "student_id",
    )

    with orm.db_session:
        admin_id = students.get_system_id_of_student(ans.from_id)
        group_id = admin.get_active_group(admin_id).id
        models.Admin(student=student_id, group=group_id)
        is_admin = students.is_admin_in_group(
            student_id,
            group_id,
        )
    await ans.answer(
        "Студент назначен администратором",
        keyboard=kbs.students.student_card(is_admin),
    )
Ejemplo n.º 24
0
async def _call_them_all(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(
        ans.object.object.message.peer_id)
    with orm.db_session:
        active_students = students.get_active_students(
            admin.get_active_group(admin_id))
        mentioned_list = [st.id for st in active_students]
        mention_storage = managers.MentionStorageManager(admin_id)
        if set(mentioned_list).issubset(
                mention_storage.get_mentioned_students()):
            list_ = [
                elem for elem in mention_storage.get_mentioned_students()
                if elem not in mentioned_list
            ]
            mention_storage.update_mentioned_students(list_)
            await ans.answer("Все студенты удалены из списка Призыва")
        else:
            mention_storage.update_mentioned_students(mentioned_list)
            await ans.answer("Все студенты выбраны для Призыва")
Ejemplo n.º 25
0
    def submenu(self, half: int) -> str:
        alphabet = students.get_unique_second_name_letters_in_a_group(
            admin.get_active_group(self.admin_id), )
        half_len = len(alphabet) // 2
        halfs = alphabet[:half_len], alphabet[half_len:]

        kb = Keyboard()

        for letter in halfs[half]:
            if len(kb.buttons[-1]) == 4:
                kb.add_row()
            kb.add_text_button(letter,
                               payload={
                                   "button": "letter",
                                   "value": letter
                               })
        if kb.buttons[-1]:
            kb.add_row()
        kb.add_text_button("◀️ Назад", payload={"button": self.return_to})

        return kb.get_keyboard()
Ejemplo n.º 26
0
async def _cancel_delete_student(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id, )
    state_store = managers.StateStorageManager(admin_id)
    state_store.update(
        state=state_store.get_id_of_state("students_select_student"))

    student_id = await redis.hget(
        "students_selected_students:{0}".format(ans.from_id),
        "student_id",
    )

    with orm.db_session:
        is_admin = students.is_admin_in_group(
            student_id,
            admin.get_active_group(admin_id).id,
        )

    await ans.answer(
        "Операция отменена",
        keyboard=kbs.students.student_card(is_admin),
    )
Ejemplo n.º 27
0
async def _start_call(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.object.object.message.from_id)
    group_id = admin.get_active_group(admin_id)
    mention_store = managers.MentionStorageManager(admin_id)
    with orm.db_session:
        if chats.get_list_of_chats_by_group(group_id):
            state_store = managers.StateStorageManager(admin_id)
            state_store.update(
                state=state_store.get_id_of_state("mention_wait_text"),
            )
            await ans.answer(
                "Отправьте сообщение к призыву. Поддерживаются фотографии и документы",
                keyboard=kbs.call.skip_call_message(),
            )
            mention_text = mention_store.get_text()
            if mention_text:
                await ans.answer("Текущее сообщение:")
                await ans.answer(mention_text)
        else:
            await ans.answer(
                "У вашей группы нет зарегистрированных чатов. Возврат в главное меню",
            )
Ejemplo n.º 28
0
def alphabet(admin_id: int) -> Keyboard:
    """
    Генерирует фрагмент клавиатуры с половинами алфавита фамилиий студентов.

    Args:
        admin_id: Идентификатор администратора

    Returns:
        Keyboard: Фрагмент клавиатуры
    """
    kb = Keyboard()
    alphabet = students.get_unique_second_name_letters_in_a_group(
        admin.get_active_group(admin_id), )
    half_len = len(alphabet) // 2
    f_alphabet, s_alphabet = alphabet[:half_len], alphabet[half_len:]
    for index, half in enumerate([f_alphabet, s_alphabet]):
        if half[0] == half[-1]:
            title = f"{half[0]}"
        else:
            title = f"{half[0]}..{half[-1]}"
        kb.add_text_button(title, payload={"button": "half", "half": index})

    return kb
Ejemplo n.º 29
0
async def _subgroups(ans: bots.SimpleBotEvent):
    admin_id = students.get_system_id_of_student(ans.from_id)
    group_id = admin.get_active_group(admin_id).id

    await ans.answer("Выберите подгруппу",
                     keyboard=kbs.common.subgroups(group_id))
Ejemplo n.º 30
0
    def test_get_active_group_of_non_admin(self):

        test_student_id = 24

        with pytest.raises(UserIsNotAnAdmin):
            admin.get_active_group(test_student_id)