python3.10 ./bookkeeper/Presenter.py - запуск программы
В главном окне программы Вы можете найти пустую таблицу с расходами, которая будет заполняться по мере их добавления. Ниже следует окно бюджета, который пользователь задает и обнуляет в ручную. При выходе значения в поле "Сумма" за пределы бюджета кнопка добавить блокируется.
Ниже поля бюджета следует поле ввода. Для добавления покупки необходимо выбрать категорию, ввести сумму и нажать "Добавить". В окно ввода суммы можно ввести только численные значения.
В самой нижней части интерфейса находится кнопка "Категории". При нажатии на нее открывается таблица с доступными категориями и индексами их родиетелй. Их можно свободно редактировать. Колонка с индексами от редактирования заблокирована. Если пользователь хочет добавить категорию, он может ввести информацию о ней в свободную нижнюю ячейку таблицы.
P.S. я честно не понял, что это за 1 непокрытый тестами элемент программы, но я очень старался.
Архитектура проекта строится на принципе инверсии зависимостей. Упрощенная схема классов выглядит так:
Для хранения данных используется паттерн Репозиторий. Структура файлов и каталогов (модулей и пакетов) отражает архитектуру:
📁 bookkeeper - исполняемый код
-
📁 models - модели данных
- 📄 budget.py - бюджет
- 📄 category.py - категория расходов
- 📄 expense.py - расходная операция
-
📁 repository - репозиторий для хранения данных
- 📄 abstract_repository.py - описание интерфейса
- 📄 memory_repository.py - репозиторий для хранения в оперативной памяти
- 📄 sqlite_repository.py - репозиторий для хранения в sqlite (пока не написан)
-
📁 view - графический интерфейс (пока не написан)
-
📄 simple_client.py - простая консольная утилита, позволяющая посмотреть на работу программы в действии
-
📄 utils.py - вспомогательные функции
📁 tests - тесты (структура каталога дублирует структуру bookkeeper)
Для работы с проектом нужно сделать fork и склонировать его себе на компьютер.
Проект создан с помощью poetry. Убедитесь, что poetry у вас установлена (инструкцию по установке можно посмотреть здесь). Для установки всех зависимостей, запустите (убедитесь, что вы находитесь в корневой папке проекта - там, где лежит файл pyproject.toml):
poetry install
Для запуска тестов и статических анализаторов используйте следующие команды (убедитесь, что вы находитесь в корневой папке проекта):
poetry run pytest --cov
poetry run mypy --strict bookkeeper
poetry run pylint bookkeeper
poetry run flake8 bookkeeper
При проверке работы будут использоваться эти же инструменты с теми же настройками.
Задача первого этапа:
- Сделать fork репозитория и склонировать его себе на компьютер
- Написать класс SqliteRepository
- Написать тесты к этому классу
- Подключить СУБД sqlite к simple_client (пока он работает в оперативной памяти и все забывает при выходе)
Задача второго этапа:
- Создать виджеты:
- для отображения списка расходов с возможностью редактирования
- для отображения бюджета на день/неделю/месяц с возможностью редактирования
- для добавления нового расхода
- для просмотра и редактирования списка категорий
- Собрать виджеты в главное окно
В итоге окно должно выглядеть примерно так:
Воспроизводить данный дизайн в точности не требуется, вы можете использовать другие виджеты, другую раскладку. Дизайн, представленный на скриншоте, предполагает, что редактирование списка категорий будет выполняться в отдельном окне. Вы можете сделать так же, а можете все разместить в одном окне, использовать вкладки или контекстные меню. Важно только реализовать функциональность.
Задачей этого этапа не является подключение реальной логики приложения и базы данных. Пока нужно только собрать интерфейс. Файлы, описывающие интерфейс, должны располагаться в папке bookkeeper/view.
Задача 3 этапа:
- Написать тесты для графического интерфейса
- Создать реализацию компонента Presenter модели MVP, тем самым соединив все компоненты в работающее приложение.
Итогом 3 этапа должно быть полностью работающее приложение, реализующее всю требуемую функциональность.
Задача 4 этапа:
- Доделать, отдалить и привести в порядок все, что было сделано на предыдущих этапах
- Добавить стилизацию (не влияет на оценку).
- Добавить дополнительные функции (не влияет на оценку). Например:
- возможность задать бюджет на день с переносом остатка на следующий день
- формирование отчета за произвольный период
- интерактивная визуализация данных в отчете
- возможность добавления чека по qr-коду или скану
- и т.д.
Реализация дополнительных функций и стилизация приложения не влияют на оценку, поэтому сосредоточиться следует на том, чтобы основная функциональность хорошо работала и код был хорошо написан.
Для сдачи работы достаточно прислать ссылку на свой форк в форму "Добавить ответ на задание" в ЛМС, pull-request создавать не надо.