📝 Практикум 2: 18 задач

Модели (1–3) + Admin (4, 6, 10) + Связи (5) + Meta (7, 8, 11) + Files (9) + Property (12) + Actions (13–15) + Разрешения (16–17) + Fixtures (18)

⚡ Все 18 задач — кратко

  1. Модель Project: name (unique), description (TextField), created_at (auto)
  2. Модель Task: title (min 10), choices для status/priority, ForeignKey→Project, auto-даты
  3. Расширение Task: Tag (M2M), due_date
  4. Admin: list_display, search_fields, list_filter для Project/Task/Tag
  5. Связь Task→User через поле assignee (ForeignKey)
  6. Admin: добавить assignee в list_display и list_filter
  7. Meta для Project: ordering, verbose_name, unique_together
  8. Meta для Task: ordering, verbose_name, unique_together
  9. Новая модель ProjectFile, связь M2M с Project
  10. Admin для ProjectFile: list_display, search, filter
  11. Meta для ProjectFile: verbose_name, ordering
  12. Property count_of_files + отображение в Admin
  13. Admin-действие: замена пробелов на подчёркивания в Project.name
  14. Admin-действие: смена статуса задачи на "Closed"
  15. Admin-действия (4 шт.): смена приоритета Low/Medium/High/Very High
  16. Группы разрешений: Manager, Client, Developer
  17. Создание пользователя + группа Client + проверка ограничений
  18. Fixtures: dumpdata → удалить БД → migrate → loaddata

Решения →

Блок 1: Модели

Задачи 1–3: создайте модели Django и выполните миграции. Все модели помещаются в models.py вашего приложения.

Задание 1: Модель Project

Создайте модель Project со следующими полями:

  • Название проекта: строковое, уникальное
  • Описание проекта: строковое, большое поле, обязательно к заполнению
  • Дата создания проекта: должна проставляться автоматически при создании

Задание 2: Модель Task

Создайте модель Task со следующими полями:

  • Название задачи: строковое поле, уникальное, минимальная длина названия — 10 символов
  • Описание: большое строковое поле, может быть пустым
  • Статус: строковое поле максимальной длины в 15 символов, должно быть полем выбора разных статусов. По умолчанию все задачи новые
  • Приоритет: строковое поле максимальной длины в 15 символов, должно быть полем выбора разных приоритетов
  • Проект: связь с моделью Project, при удалении проекта все задачи должны удаляться
  • Дата создания задачи: поле, поддерживающее и дату, и время, заполняется автоматически только при создании
  • Дата обновления: поле, поддерживающее и дату, и время, заполняется автоматически всегда
  • Дата удаления: поле, в котором может ничего не быть

Задание 3: Расширение Task — теги и срок выполнения

Расширьте модель Task дополнительным хранением тегов:

  1. Создайте модель тегов (Tag): имя тэга — строковое поле, уникальное
  2. Добавьте поле due_date (срок выполнения) в модель Task
  3. Свяжите модель задачи с тегами через связь "Многие ко многим", добавив в модель задачи новое поле tags

Блок 2: Admin-панель

Задачи 4–6: настройка отображения моделей в Django Admin. Код помещается в admin.py.

Задание 4: Базовая настройка Admin

Настройте отображение моделей Project, Task, Tag в админ-панели. Реализуйте следующие возможности:

  1. Поиск по названию задачи для модели Task
  2. Поиск по названию проекта для модели Project
  3. У модели Task в Админ-панели должны отображаться поля: название задачи, проект, статус, приоритетность, дата создания, дата сдачи задачи (due_date)
  4. У модели Project должны отображаться поля: название проекта, дата создания проекта
  5. Для модели Task должна быть возможность фильтрации по полям: статус, приоритетность, проект, дата создания, дата сдачи задачи

Задание 5: Связь Task → User

Создайте связь модели пользователя (User) с моделью Task.

Добавьте связь к модели Task через поле assignee, которое будет ссылаться на пользователя. При выборе типа связи учтите, что на одной задаче может быть одновременно только один сотрудник.

Задание 6: Пользователь в Admin

Добавьте нового пользователя и задачи для него. Для этого выполните действия:

  1. Создайте нового пользователя через Административную панель, добавьте новые задачи и назначьте его на эти задачи
  2. Добавьте assignee в список отображаемых полей в Административной панели
  3. Добавьте в Административную панель возможность фильтрации задач по конкретному assignee

Блок 3: Класс Meta

Задание 7: Meta для модели Project

Добавьте настройки к модели Project:

  1. Добавьте порядок отображения всех проектов по их названию в порядке убывания
  2. Добавьте отображение названия модели Project во множественном и единственном числах
  3. Добавьте настройку уникальности каждого проекта сразу по нескольким полям (название и описание проекта)

Задание 8: Meta для модели Task

Добавьте настройки к модели Task:

  1. Добавьте отображение названия модели Task во множественном и единственном числах
  2. Добавьте порядок отображения всех задач по: дате сдачи задачи от самой дальней даты к самой ближайшей; закреплённому за задачей сотруднику
  3. Добавьте настройку уникальности задачи по её названию и проекту. Это должна быть одна общая категория

Блок 4: Файлы проекта

Задание 9: Модель ProjectFile

  1. Создайте новую модель ProjectFile для файлов проекта. Модель должна включать поля:
    • Название файла: обязательно к заполнению, максимальная длина имени — 120 символов
    • Файл: должен загружаться в папку "проекты"
    • Дата создания файла: заполняется автоматически только при создании
  2. Добавьте новое поле для файлов в модель Project, свяжите его с новой моделью ProjectFile. Предполагается, что одни и те же файлы могут быть в разных проектах, каждый проект может иметь много файлов

Задание 10: Admin для ProjectFile

Настройте новую модель ProjectFile:

  1. Настройте отображение полей в Административной модели: имя файла, сам файл, дата создания
  2. Добавьте возможность искать нужный файл по его имени
  3. Добавьте возможность фильтровать файлы по дате создания

Задание 11: Meta для ProjectFile

Настройте дополнительные настройки для модели ProjectFile:

  1. Настройте возможность отображения названия модели во множественном и единственном числах
  2. Настройте порядок отображения файлов в Административной панели по дате создания (от самого последнего созданного файла к самому первому созданному)

Блок 5: Вычисляемые поля

Задание 12: Property + Admin

Добавьте отображение количества файлов для каждого проекта. Для этого выполните действия:

  1. Добавьте property поле для модели Project, которое позволит получать количество файлов для конкретного объекта Project
  2. Добавьте в Административный класс ProjectAdmin возможность отображения нового поля "count of Files", которое будет содержать количество файлов для конкретного проекта
  3. Добавьте полученную логику в список отображаемых полей

Блок 6: Admin-действия

Задачи 13–15: реализуйте пользовательские admin-действия (bulk actions), которые применяются к выделенным объектам в списке Admin.

Задание 13: Замена пробелов на подчёркивания

Добавьте возможность заменять пробелы на нижние подчёркивания для объектов проекта. Для этого выполните действия:

  1. Создайте Админ-действие, которое позволит к выделенным объектам применять операцию по замене одного символа на другой
  2. Дайте этому Админ-действию более понятное название
  3. Зарегистрируйте это действие для модели Project в Админ-панели

Задание 14: Смена статуса на "Closed"

Добавьте возможность обновления статуса всех выделенных задач на "Закрыто". Для этого выполните действия:

  1. Создайте Админ-действие, которое позволит к выделенным объектам задач применять операцию по обновлению статуса на какой-то определённый ("Выполнено")
  2. Задайте этому действию укороченное название
  3. Зарегистрируйте это действие для модели Task в Админ-панели

Задание 15: Смена приоритета (4 действия)

Добавьте возможность обновления приоритетности всех выделенных задач на "Низкий", "Средний", "Высокий" и на "Очень высокий". Для этого выполните действия:

  1. Создайте разные Админ-действия, которые позволят к выделенным объектам задач применять операцию по обновлению приоритетности:
    • Отдельно на "Низкий"
    • Отдельно на "Средний"
    • Отдельно на "Высокий"
    • Отдельно на "Очень высокий"
  2. Задайте этим действиям укороченное название
  3. Зарегистрируйте все эти действия для модели Task в Админ-панели

Блок 7: Разрешения и Fixtures

Задание 16: Группы разрешений

Создайте группы разрешений:

Группа "Manager". Менеджер может:

  • Просматривать все группы
  • Просматривать все разрешения
  • Добавлять новые разрешения
  • Добавлять новых пользователей, просматривать всех пользователей
  • Создавать, изменять, удалять, просматривать все проекты
  • Создавать, изменять, удалять, просматривать все файлы проектов
  • Добавлять, изменять, просматривать все тэги
  • Добавлять, изменять, просматривать все задачи

Группа "Client". Клиент может:

  • Создавать, изменять, просматривать список всех пользователей
  • Создавать, изменять, просматривать список всех проектов
  • Создавать, просматривать список всех файлов проектов
  • Создавать, изменять, удалять, просматривать список всех тегов
  • Создавать, изменять, удалять, просматривать список всех задач

Группа "Developer". Разработчик может:

  • Добавлять, изменять, удалять, просматривать список пользователей
  • Создавать, изменять, удалять, просматривать все проекты
  • Создавать, изменять, удалять, просматривать все файлы проектов
  • Создавать, изменять, удалять, просматривать все теги
  • Создавать, изменять, удалять, просматривать все задачи

Задание 17: Пользователь с группой Client

  1. Создайте нового пользователя
  2. После создания измените его, добавив ему поле is_staff, чтобы он смог заходить в Административную панель
  3. Добавьте пользователю группу разрешений "Client"
  4. Зайдите под пользователем Клиента
  5. Попробуйте выполнить те действия, которые клиенту не должны быть доступны. Например: удалить проект, удалить пользователя, изменить файл проекта

Задание 18: Fixtures

Создайте снимки базы данных для всех пользователей и групп пользователей. Для этого выполните действия:

  1. К уже готовым пользователям и группам разрешений примените создание снимка данных, чтобы избежать повторных заполнений данных с нуля при удалении базы
  2. Удалите базу данных
  3. Примените миграции с нуля
  4. Воспроизведите "заснятые" данные к пользователям и группам разрешений через команду в консоли