140500
This commit is contained in:
103
BACKEND/TODOS.md
Normal file
103
BACKEND/TODOS.md
Normal file
@@ -0,0 +1,103 @@
|
||||
# Описание приложения
|
||||
### Кортежи статуса задачи
|
||||
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` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным.
|
||||
Reference in New Issue
Block a user