Files
we_pro_dock/BACKEND/TODOS.md
2024-05-14 11:39:33 +03:00

103 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Описание приложения
### Кортежи статуса задачи
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` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным.