Skip to content

Latest commit

 

History

History
170 lines (127 loc) · 6.78 KB

File metadata and controls

170 lines (127 loc) · 6.78 KB

Практическая работа — Модуль 2

Консольное приложение «Менеджер задач»

Вы создаёте консольное CRUD-приложение для управления проектами и задачами. Приложение работает с базой данных SQLite через классы-репозитории, генерирует тестовые данные через сидер и предоставляет пользователю текстовое меню.


Часть 1. Схема базы данных

Сущности

Проекты (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 (высокий)

Часть 2. Структура проекта

task_manager/
├── database.py       ← создание таблиц и get_connection()
├── repositories.py   ← ProjectRepository и TaskRepository
├── seed.py           ← сидер с Faker
└── main.py           ← консольное меню

Часть 3. Требования к реализации

database.py

  • Функция get_connection(db_path) — возвращает соединение с row_factory = sqlite3.Row
  • Функция init_db(connection) — создаёт таблицы если они не существуют (CREATE TABLE IF NOT EXISTS)

repositories.py

ProjectRepository — методы:

  • get_all() — все проекты
  • get_by_id(project_id) — один проект или None
  • create(name, description) — создать проект, вернуть id. Обработать IntegrityError если имя уже занято
  • delete(project_id) — удалить проект, вернуть True/False

TaskRepository — методы:

  • get_all() — все задачи с названием проекта (через JOIN)
  • get_by_id(task_id) — одна задача с названием проекта или None
  • get_by_project(project_id) — все задачи проекта
  • get_by_status(status) — задачи по статусу с названием проекта
  • create(title, priority, project_id, created_at) — создать задачу, вернуть id
  • update_status(task_id, new_status) — обновить статус, вернуть True/False
  • delete(task_id) — удалить задачу, вернуть True/False

Требования к запросам

  • Все запросы с пользовательскими данными — только параметризованные (? или :name)
  • Никакой конкатенации строк или f-строк для подстановки данных в SQL

seed.py

  • Использовать библиотеку Faker с русской локалью
  • Faker.seed() — зафиксировать генератор для воспроизводимости
  • Создать 5 проектов и 20 задач
  • Задачи должны быть распределены по проектам
  • Перед заполнением — очистить таблицы в правильном порядке
  • Вывести статистику по завершении

main.py — консольное меню

Приложение должно показывать главное меню и подменю для проектов и задач:

=== Менеджер задач ===
1. Проекты
2. Задачи
0. Выход

Меню проектов:

=== Проекты ===
1. Показать все проекты
2. Создать проект
3. Удалить проект
0. Назад

Меню задач:

=== Задачи ===
1. Показать все задачи
2. Показать задачи по проекту
3. Показать задачи по статусу
4. Создать задачу
5. Изменить статус задачи
6. Удалить задачу
0. Назад

Требования к меню

  • Неверный ввод не должен ронять приложение — обрабатывать через try/except
  • При вводе несуществующего id — выводить понятное сообщение
  • Приложение работает в цикле до выбора "0. Выход"

Часть 4. Пример работы приложения

=== Менеджер задач ===
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.py
  • repositories.py
  • seed.py
  • main.py

Содержание