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"]), )
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))
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)
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} нет активных студентов")