# Описание приложения ### Кортежи статуса задачи 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. **AuthorSerializer**: - Сериализатор для пользователя (автора задачи). - Содержит поля: `username`, `bio`, `image`, `following`. - Поле `following` определяется методом `get_following`, который проверяет, подписан ли текущий пользователь на автора задачи. 2. **TodoSerializer**: - Основной сериализатор для модели Todo. - Поля: - `id`, `title`, `description`, `body`, `tagList`, `is_complete`, `status`, `priority`, `is_deleted`, `is_active`, `createdAt`, `updatedAt`, `startTimedAt`, `endTimedAt`, `author`, `substacles`, `favorited`, `favoritesCount`, `supplierd`, `suppliersCount`, `supporterd`, `supportersCount`, `observerd`, `observersCount`. - Некоторые поля (`description`, `body`, `tagList`, `createdAt`, `updatedAt`, `startTimedAt`, `endTimedAt`, `favorited`, `favoritesCount`, `supplierd`, `suppliersCount`, `supporterd`, `supportersCount`, `observerd`, `observersCount`) имеют методы `get_*`, которые определяют поведение для сериализации. - Методы `create` и `update` определяют, как создавать и обновлять объекты Todo. 3. **TagSerializer**: - Сериализатор для добавления тегов. - Содержит единственное поле `tags`, которое является списком строк. ## Маршрутизатор ``` todo_router = DefaultRouter(trailing_slash=False) todo_router.register('todos', views.TodoView, basename='todos') todo_router.register('tags', views.TagView) ``` Теперь давайте подробнее разберем каждую часть: - `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`. 2. **TagView**: - Представление для работы с тегами. - Использует `GenericViewSet` и `ListModelMixin` для обработки только GET-запросов. - Включает метод `list` для получения списка тегов. ``` class TodoView(viewsets.ModelViewSet): queryset = Todo.objects.all() serializer_class = TodoSerializer permission_classes = [CanViewTodoDetail] lookup_field = 'id' filterset_class = TodoFilter http_method_names = ['get', 'post', 'put', 'delete'] ``` ``` class TagView(viewsets.GenericViewSet, mixins.ListModelMixin): queryset = Tag.objects.all() serializer_class = TagSerializer http_method_names = ['get',] ``` ## Права доступа 1. **IsOwnerOrCollaborator**: - Позволяет редактирование задач только владельцу задачи или соисполнителям. - Метод `has_object_permission` проверяет, что запросы на изменение (методы, отличные от GET, HEAD и OPTIONS) выполняются только для владельца задачи или соисполнителей. 2. **CanViewTodoDetail**: - Позволяет просмотр деталей задачи автору, соисполнителям, поставщикам, наблюдателям и избранным. - Метод `has_object_permission` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным.