Вы создаёте консольное CRUD-приложение для управления проектами и задачами. Приложение работает с базой данных SQLite через классы-репозитории, генерирует тестовые данные через сидер и предоставляет пользователю текстовое меню.
Проекты (projects)
id— целое, первичный ключ, автоинкрементname— текст, обязательный, уникальныйdescription— текст, необязательный
Задачи (tasks)
id— целое, первичный ключ, автоинкрементtitle— текст, обязательныйstatus— текст, обязательный, по умолчанию'new'priority— целое, обязательный,CHECKчто значение 1, 2 или 3 (1 — низкий, 2 — средний, 3 — высокий)created_at— текст, обязательныйproject_id— целое, обязательный, внешний ключ наprojects.id
projects tasks
┌──────────────────┐ ┌──────────────────────────┐
│ id INT (PK) │◄───────│ project_id INT │
│ name TEXT │ │ id INT (PK) │
│ desc TEXT │ │ title TEXT │
└──────────────────┘ │ status TEXT │
│ priority INT │
│ created_at TEXT │
└──────────────────────────┘
status:'new','in_progress','done','cancelled'priority:1(низкий),2(средний),3(высокий)
task_manager/
├── database.py ← создание таблиц и get_connection()
├── repositories.py ← ProjectRepository и TaskRepository
├── seed.py ← сидер с Faker
└── main.py ← консольное меню
- Функция
get_connection(db_path)— возвращает соединение сrow_factory = sqlite3.Row - Функция
init_db(connection)— создаёт таблицы если они не существуют (CREATE TABLE IF NOT EXISTS)
ProjectRepository — методы:
get_all()— все проектыget_by_id(project_id)— один проект илиNonecreate(name, description)— создать проект, вернутьid. ОбработатьIntegrityErrorесли имя уже занятоdelete(project_id)— удалить проект, вернутьTrue/False
TaskRepository — методы:
get_all()— все задачи с названием проекта (через JOIN)get_by_id(task_id)— одна задача с названием проекта илиNoneget_by_project(project_id)— все задачи проектаget_by_status(status)— задачи по статусу с названием проектаcreate(title, priority, project_id, created_at)— создать задачу, вернутьidupdate_status(task_id, new_status)— обновить статус, вернутьTrue/Falsedelete(task_id)— удалить задачу, вернутьTrue/False
- Все запросы с пользовательскими данными — только параметризованные (
?или:name) - Никакой конкатенации строк или f-строк для подстановки данных в SQL
- Использовать библиотеку
Fakerс русской локалью Faker.seed()— зафиксировать генератор для воспроизводимости- Создать 5 проектов и 20 задач
- Задачи должны быть распределены по проектам
- Перед заполнением — очистить таблицы в правильном порядке
- Вывести статистику по завершении
Приложение должно показывать главное меню и подменю для проектов и задач:
=== Менеджер задач ===
1. Проекты
2. Задачи
0. Выход
Меню проектов:
=== Проекты ===
1. Показать все проекты
2. Создать проект
3. Удалить проект
0. Назад
Меню задач:
=== Задачи ===
1. Показать все задачи
2. Показать задачи по проекту
3. Показать задачи по статусу
4. Создать задачу
5. Изменить статус задачи
6. Удалить задачу
0. Назад
- Неверный ввод не должен ронять приложение — обрабатывать через
try/except - При вводе несуществующего
id— выводить понятное сообщение - Приложение работает в цикле до выбора "0. Выход"
=== Менеджер задач ===
1. Проекты
2. Задачи
0. Выход
Выберите: 2
=== Задачи ===
1. Показать все задачи
...
Выберите: 3
Введите статус (new/in_progress/done/cancelled): done
Задачи со статусом "done":
[#3] Написать тесты (Проект: Разработка сайта) | Приоритет: 2 | 2024-03-10
[#7] Настроить CI/CD (Проект: DevOps) | Приоритет: 3 | 2024-04-02
Четыре файла:
database.pyrepositories.pyseed.pymain.py