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), )
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(), )
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), )
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("Неверный формат данных")
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()
def test_get_active_group(self): test_student_id = 23 group = admin.get_active_group(test_student_id) expect(group).is_instance_of(Group)
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, ), )
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"), ), )
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
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), )
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), )
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), )
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), )
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), )
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), )
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("БДСМЛЯВКИГЖРТЗШ")))
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)
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, )
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:]
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))
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), ), )
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)
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), )
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("Все студенты выбраны для Призыва")
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()
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), )
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( "У вашей группы нет зарегистрированных чатов. Возврат в главное меню", )
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
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))
def test_get_active_group_of_non_admin(self): test_student_id = 24 with pytest.raises(UserIsNotAnAdmin): admin.get_active_group(test_student_id)