This commit is contained in:
2024-05-14 16:58:27 +03:00
parent 2762ac794a
commit 7988103495
13 changed files with 403 additions and 356 deletions

View File

@@ -1,4 +1,3 @@
# Описание приложения
### Кортежи статуса задачи
TASK_STATUS = (
('New', 'Новая'),
@@ -13,51 +12,55 @@ PRIORITY = (
('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. **`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`, которое является списком строк.
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): Количество наблюдателей.
## Маршрутизатор
```
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`.).
@@ -71,33 +74,12 @@ todo_router.register('todos', views.TodoView, basename='todos') todo_router.regi
- Использует `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**:
1. **CanViewTodoDetail**:
- Позволяет просмотр деталей задачи автору, соисполнителям, поставщикам, наблюдателям и избранным.
- Метод `has_object_permission` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным.