### Кортежи статуса задачи TASK_STATUS = ( ('New', 'Новая'), ('Deleted', 'Удалено'), ('Waiting', 'Ожидание'), ('Done', 'Выполнена'), ) ### Кортеж уровня важности PRIORITY = ( ('Low', 'Низкий'), ('Medium', 'Средний'), ('High', 'Высокий'), ) ## Модель задачи 1. **`author`** (ForeignKey): Ссылка на пользователя, который создал задачу. 2. **`title`** (CharField): Название задачи (до 150 символов). 3. **`summary`** (TextField): Краткое описание задачи. 4. **`content`** (TextField): Подробное описание задачи. 5. **`is_active`** (BooleanField): Флаг, указывающий на активность задачи. 6. **`is_deleted`** (BooleanField): Флаг, указывающий на удаление задачи. 7. **`priority`** (CharField): Приоритет задачи (выбор из предустановленных значений). 8. **`status`** (CharField): Статус задачи (выбор из предустановленных значений). 9. **`is_complete`** (BooleanField): Флаг, указывающий на завершение задачи. 10. `**start_time**` (DateTimeField): Дата и время начала задачи. 11. **`end_time`** (DateTimeField): Крайний срок выполнения задачи. 12. **`created`** (DateTimeField): Время создания задачи (автоматически заполняется при создании). 13. **`updated`** (DateTimeField): Время последнего обновления задачи (автоматически обновляется при изменениях). 14. **`substacles`** (ManyToManyField): Связь между задачами, представляющая подзадачи текущей задачи. 15. `**favorites**` (ManyToManyField): Пользователи, которые добавили задачу в избранное. 16. **`suppliers`** (ManyToManyField): Пользователи, ответственные за выполнение задачи. 17. **`supporters`** (ManyToManyField): Соисполнители задачи. 18. **`observers`** (ManyToManyField): Пользователи, наблюдающие за выполнением задачи. 19. `**`tags** (TaggableManager): Теги, связанные с задачей для удобной классификации. ## Сериализатор 1. **TodoSerializer**: - `id` (IntegerField): Идентификатор задачи. - `title` (CharField): Заголовок задачи. - `description` (CharField): Описание задачи. - `body` (CharField): Текст задачи. - `tagList` (ListField): Список тегов задачи. - `is_complete` (BooleanField): Завершена ли задача. - `status` (CharField): Статус задачи. - `priority` (CharField): Приоритет задачи. - `is_deleted` (BooleanField): Удалена ли задача. - `is_active` (BooleanField): Активна ли задача. - `createdAt` (DateTimeField): Дата и время создания задачи. - `updatedAt` (DateTimeField): Дата и время последнего обновления задачи. - `startTimedAt` (DateTimeField): Дата и время начала задачи. - `endTimedAt` (DateTimeField): Дата и время завершения задачи. - `author` (AuthorSerializer): Сериализатор автора задачи. - `substacles` (ListField): Список препятствий задачи. - `favorited` (BooleanField): Понравилась ли задача. - `favoritesCount` (IntegerField): Количество пользователей, отметивших задачу как понравившуюся. - `supplierd` (IntegerField): Идентификатор поставщика. - `suppliersCount` (IntegerField): Количество поставщиков. - `supporterd` (IntegerField): Идентификатор поддержки. - `supportersCount` (IntegerField): Количество поддерживающих. - `observerd` (IntegerField): Идентификатор наблюдателя. - `observersCount` (IntegerField): Количество наблюдателей. ## Маршрутизатор - `DefaultRouter` из библиотеки `rest_framework.routers` автоматически создает маршруты для представлений на основе их названий и методов (например, GET, POST, PUT, DELETE). За вас обрабатывается большая часть создания URL-путей, что делает код более модульным и менее подверженным ошибкам. - `todo_router.register('todos', views.TodoView, basename='todos')` регистрирует представление `TodoView` для работы с задачами. Аргументы `basename='todos'` используются для создания имени маршрута, которое будет использоваться в генерации URL (например, `todos-list`, `todos-detail`, `todos-create` `todos-edit` `todos-delete`.). - `todo_router.register('tags', views.TagView)` регистрирует представление `TagView` для работы с тегами. Аналогично создаются маршруты для работы с тегами (`tags-list`, `tags-detail`, `tags-create` `tags-edit` `tags-delete`). ## Контроллер 1. **TodoView**: - Представление для работы с задачами (todos). - Использует `ModelViewSet`, который предоставляет CRUD-функциональность и многое другое. - Включает методы `list`, `create`, `retrieve`, `update`, `destroy` для обработки соответствующих HTTP-запросов. - Содержит дополнительные действия (`favorite`, `feed`) с использованием декоратора `@action`. ## Права доступа 1. **IsOwnerOrCollaborator**: - Позволяет редактирование задач только владельцу задачи или соисполнителям. - Метод `has_object_permission` проверяет, что запросы на изменение (методы, отличные от GET, HEAD и OPTIONS) выполняются только для владельца задачи или соисполнителей. 1. **CanViewTodoDetail**: - Позволяет просмотр деталей задачи автору, соисполнителям, поставщикам, наблюдателям и избранным. - Метод `has_object_permission` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным.