Практикум на ЭВМ (2026)/Задание 0 (бонусное)
Формулировка
Вам достался в наследство модуль от старой внутренней системы компании. В архиве есть файл legacy_db.py, где уже частично настроено подключение к базе данных и написано несколько базовых функций поиска.
В базе данных модуля три таблицы, хранящие данные о пользователях приложения. Первая таблица "users" имееет следующие колонки:
- id пользователя (число) - универсальное для каждого пользователя
- login - имя пользователя (строка)
- money_amount (число)
- card_number - (строка) номер его кредитной карты
- status - статус активен/неактивен (любой тип данных по выбору, главное, чтобы было два различимых значения).
Вторая таблица "passwords" хранит пароли пользователей, в ней две колонки: id пользователя и собственно пароль. Третья таблица "banks" хранит соответствие пользователей и их банков и имеет две колонки: id и название банка.
Веб-приложение по '/users' отдает страницу со списком активных пользователей. Реализована выборка пользователей по login и id. Параметр, по которому должен отбираться пользователь, передается в параметре query string. То есть:
- по url "/by-login?login=username" выдается страница с данными пользователя с именем "username"
- по url "/by-id?id=3" выдаются данные пользователя с id=3
Ваша задача — доработать этот модуль (нельзя удалять старый код, только добавлять свой).
Реализуйте следующие функции:
- Универсальный живой поиск (/search)
Необходимо найти всех пользователей, у которых строка поиска частично совпадает (LIKE) с их login (параметр поиска передается через query-параметр q). Если параметр q пустой или отсутствует, приложение должно выводить топ-5 самых богатых пользователей по значению money_amount.
- Аналитический срез (/analytics)
Запрос на /analytics выводит пользователей, чей баланс (money_amount) строго выше среднего баланса по всей базе данных. При этом список должен фильтроваться по статусу, который пользователь передает через query-параметр /analytics?target_status=active. Рядом с каждым пользователем в выдаче должн отображаться информация о его банке, полученная «на лету» с помощью JOIN с третьей таблицей.
- Расширение функционала
Добавьте эндпоинт /transfer_status. Он должен принимать список ID через запятую (например, ids=1,3,4) и массово обновлять их status на противоположный одним SQL-запросом.
Файлы задания
Критерии
Чтобы засчитать задание, вы должны прислать ссылку на код своего мини-приложения на почту: OkunevaA@seclab.cs.msu.ru. Если вы используете git, то первый коммит должен содержать файлы из архива, последующие - ваш добавленный код. Приложение должно запускаться и правильно отрабатывать. Автором присланного кода должны быть вы сами, запрещается присылать приложение, сделанное кем-то еще. В своем сообщении или теме письма не забудьте указать по какому поводу пишете (например "Задание по SQL по практикуму на ЭВМ" и ФИО).
Дедлайн и баллы
Те, кто пришлёт работающее и отвечающее критериям приложение до 12:30 26 сентября, получат за задание 120 баллов. (сверх тех 2000 баллов, которые будут даваться за основные задания). Приславшие между 12:30 26 сентября и 14:30 26 сентября получат за задание 80 баллов.
14:30 26 сентября- крайний срок приёма задания.
Приславшие засчитанное приложение первыми получат дополнительный бонус.