📝 Задания мини-проекта Agile Projects ч.3
⚡ Все задачи — кратко
- Задание 1:
get_serializer_class,get_querysetс фильтром по project_name, методlistс 204 при пустом. URL /api/v1/projects/files/. Коммит + PR. - Задание 2:
ProjectFileDetailSerializer(name, created_at, project вложенный),ProjectFileDetailGenericView(GET + физическое DELETE), URL /api/v1/projects/files/<pk>/. Коммит + PR. - Задание 3:
startapp users, модель User (14 полей: username, first/last_name, email, phone, is_staff, is_active, date_joined, last_login, updated_at, deleted_at, deleted, project FK, position), USERNAME_FIELD=email, AUTH_USER_MODEL, миграции, createsuperuser. Коммит + PR. - Задание 4:
UserListSerializer(6 полей),UserListGenericViewс фильтром по project_name, URL /api/v1/users/. Коммит + PR. - Задание 5:
RegisterUserSerializer(re_password, regex-validate, validate_password, create с set_password),RegisterUserGenericView, URL /api/v1/users/register/. Коммит + PR. - Задание 6: Добавить
assignee = SlugRelatedField(slug_field='email')вCreateUpdateTaskSerializer. Коммит + PR. - Задание 7:
DownloadProjectFileViewс FileResponse, URL /api/v1/projects/files/download/<pk>/. Коммит + PR.
Контекст: Продолжаешь разработку REST API-платформы «Agile Projects». К этому моменту реализованы модели, базовый CRUD проектов и задач, загрузка файлов (задачи 4–5 из урока 30). Теперь расширяем API файлов, добавляем полноценную систему пользователей и скачивание файлов.
Задание 1 — Получить список всех файлов проекта
- Обновите существующее отображение
ProjectFileListGenericView, дописав к нему методget_serializer_class. - Добавьте в этот же класс метод
get_queryset(), добавив возможность получения всех файлов проекта с поиском по конкретному проекту (как фильтр использовать имя проекта). - Добавьте в этот же класс метод
list()на получение списка всех файлов проекта. - Протестируйте получение файлов проекта методом GET.
- Закомментируйте все изменения, сделайте запрос на слияние.
Файлы для изменений:
apps/projects/views/project_file_views.py
Задание 2 — Получение файла, возможность его удаления
- Создайте сериализатор
ProjectFileDetailSerializerдля получения подробной информации о файле:namecreated_atproject(вложенный сериализатор для отображения названия проекта)
- Напишите классовое отображение
ProjectFileDetailGenericViewдля получения информации о конкретном файле и проекте, к которому он привязан, а также возможности удаления этого файла, как из базы данных, так и из проекта (физическое удаление с диска). - Зарегистрируйте новый эндпоинт, проверьте как отрабатывают запросы GET, DELETE.
- Зафиксируйте все изменения, сделайте запрос на слияние.
Файлы для изменений:
apps/projects/serializers/project_file_serializers.py,
apps/projects/views/project_file_views.py,
apps/projects/utils/upload_file_helpers.py,
apps/projects/urls.py
Задание 3 — Создание кастомного пользователя. Часть 1 и 2
- Удалите существующую базу данных.
- Создайте новое приложение
users, зарегистрируйте его в проекте. - Создайте свою собственную модель
User, в которой будут поля:username— строковое поле, не более 50 символов, уникальное, обязательно к заполнениюfirst_name— строковое поле, не более 40 символов, обязательно к заполнениюlast_name— строковое поле, не более 40 символов, обязательно к заполнениюemail— поле email, уникальное, обязательное к заполнениюphone— строковое поле, не более 75 символов, не обязательно к заполнениюis_staff— административное логическое поле, по умолчанию Falseis_active— логическое поле, по умолчанию Truedate_joined— поле даты и времени, заполняется автоматически при созданииlast_login— поле даты и времени, заполняется при входе в системуupdated_at— поле даты и времени, заполняется автоматически при всех обновленияхdeleted_at— поле даты и времени, заполняется только если полеdeletedпереходит в состояние Truedeleted— логическое поле, по умолчанию False (soft-delete флаг)project— связь с моделью Project. При удалении проекта все сотрудники также удаляются (CASCADE), связующее поле у проекта —users, при создании пользователя проекта у него может и не бытьposition— строковое поле выбора из готовых вариантов позиций:- Ceo
- Cto
- Designer
- Programmer
- Product_owner
- Project_owner
- Project_manager
- Qa
- Укажите поле
emailкак поле для входа в систему (USERNAME_FIELD). - Добавьте дополнительные поля для регистрации (
REQUIRED_FIELDS):usernamelast_namefirst_name
- Перепишите настройки Django на работу с кастомным пользователем в файле
settings.py(AUTH_USER_MODEL). - Переопределите связь с новым пользователем в других моделях, где была связь с пользователем (модель
Task). - Проведите миграции и убедитесь, что всё работает. Создайте суперпользователя.
Файлы для создания/изменений:
python manage.py startapp users,
apps/users/models.py,
apps/users/choices/positions.py,
settings.py (AUTH_USER_MODEL),
apps/tasks/models/task_model.py
Задание 4 — Получение списка пользователей, фильтрация пользователей
- Создайте сериализатор
UserListSerializerдля отображения только лишь некоторых полей для пользователя:first_namelast_namepositionemailphonelast_login
- Создайте классовое отображение
UserListGenericViewдля получения списка пользователей.- Переопределите метод
get_querysetдля получения списка пользователей по конкретному проекту, если фильтр был передан, иначе должен отдаваться список всех пользователей.
- Переопределите метод
- Зарегистрируйте новый эндпоинт, протестируйте его, чтобы убедиться, что он работает.
- Закомментируйте все изменения, создайте запрос на слияние.
Файлы для создания:
apps/users/serializers.py,
apps/users/views.py,
apps/users/urls.py,
apps/router.py (добавить path('users/', ...))
Задание 5 — Регистрация нового пользователя
- Создайте новый сериализатор
RegisterUserSerializerдля регистрации нового пользователя. Сериализатор будет обрабатывать поля:usernamefirst_namelast_nameemailpositionpasswordre_password
Поле
re_password— искусственно созданное поле для проверки совпадения паролей:- Максимальная длина — 128 символов
- Только для записи (
write_only=True)
В параметре
extra_kwargsуказать, что полеpasswordстрого только для записи. - Создайте в этом сериализаторе метод
validate. Этот метод должен проверять:username— любые буквы из латиницы, символ нижнего подчёркивания, цифры от 0 до 9first_name— строго буквы из латиницы, любым регистромlast_name— строго буквы из латиницы, любым регистромpassword— пароль и его повторный ввод должны совпадать; также вызов базовых проверок пароля от системы Django (validate_password)
- Переопределите метод
createдля хеширования пароля и его установки для пользователя перед созданием. - Напишите классовое отображение
RegisterUserGenericView, которое будет принимать данные из запроса и создавать пользователя. - Зарегистрируйте новый эндпоинт, протестируйте его, чтобы убедиться, что он работает.
- Закомментируйте все изменения, создайте запрос на слияние.
Файлы для изменений:
apps/users/serializers.py,
apps/users/views.py,
apps/users/urls.py
Задание 6 — Обновление сериализатора для создания задач
- В сериализатор
CreateUpdateTaskSerializerдобавьте новое полеassigneeдля возможности указывать назначенного разработчика на определённую задачу при создании/обновлении задачи.- Поле заполняется по email пользователя
- Поле не обязательно к заполнению, его можно пропускать
- Запустите сервер и протестируйте добавленные изменения, чтобы убедиться, что создание и обновление задач работает.
- Закомментируйте все изменения, создайте запрос на слияние.
Файлы для изменений:
apps/tasks/serializers/task_serializers.py
Задание 7 — Скачивание конкретного файла по переданному ID
- Напишите отображение для возможности скачивания файла по переданному ID файла. Если файла с таким ID не существует — выдавать сообщение, что файл не найден.
- Зарегистрируйте новое отображение, запустите сервер и протестируйте новый функционал по скачиванию файлов.
- Закомментируйте все изменения, создайте запрос на слияние.
Файлы для изменений:
apps/projects/views/project_file_views.py,
apps/projects/urls.py