103 lines
7.9 KiB
Markdown
103 lines
7.9 KiB
Markdown
# Описание приложения
|
||
### Кортежи статуса задачи
|
||
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` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным. |