7.9 KiB
Описание приложения
Кортежи статуса задачи
TASK_STATUS = (
('New', 'Новая'),
('Deleted', 'Удалено'),
('Waiting', 'Ожидание'),
('Done', 'Выполнена'),
)
Кортеж уровня важности
PRIORITY = (
('Low', 'Низкий'),
('Medium', 'Средний'),
('High', 'Высокий'),
)
Модель задачи
- author (ForeignKey): Ссылка на пользователя, который создал задачу.
- title (CharField): Название задачи (до 150 символов).
- summary (TextField): Краткое описание задачи.
- content (TextField): Подробное описание задачи.
- is_active (BooleanField): Флаг, указывающий на активность задачи.
- is_deleted (BooleanField): Флаг, указывающий на удаление задачи.
- priority (CharField): Приоритет задачи (выбор из предустановленных значений).
- status (CharField): Статус задачи (выбор из предустановленных значений).
- is_complete (BooleanField): Флаг, указывающий на завершение задачи.
- start_time (DateTimeField): Дата и время начала задачи.
- end_time (DateTimeField): Крайний срок выполнения задачи.
- created (DateTimeField): Время создания задачи (автоматически заполняется при создании).
- updated (DateTimeField): Время последнего обновления задачи (автоматически обновляется при изменениях).
- substacles (ManyToManyField): Связь между задачами, представляющая подзадачи текущей задачи.
- favorites (ManyToManyField): Пользователи, которые добавили задачу в избранное.
- suppliers (ManyToManyField): Пользователи, ответственные за выполнение задачи.
- supporters (ManyToManyField): Соисполнители задачи.
- observers (ManyToManyField): Пользователи, наблюдающие за выполнением задачи.
- tags (TaggableManager): Теги, связанные с задачей для удобной классификации.
Сериализатор
- AuthorSerializer:
- Сериализатор для пользователя (автора задачи).
- Содержит поля:
username,bio,image,following. - Поле
followingопределяется методомget_following, который проверяет, подписан ли текущий пользователь на автора задачи.
- 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.
- 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-createtodos-edittodos-delete.). -
todo_router.register('tags', views.TagView)регистрирует представлениеTagViewдля работы с тегами. Аналогично создаются маршруты для работы с тегами (tags-list,tags-detail,tags-createtags-edittags-delete).
Контроллер
- TodoView:
- Представление для работы с задачами (todos).
- Использует
ModelViewSet, который предоставляет CRUD-функциональность и многое другое. - Включает методы
list,create,retrieve,update,destroyдля обработки соответствующих HTTP-запросов. - Содержит дополнительные действия (
favorite,feed) с использованием декоратора@action.
- 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',]
Права доступа
- IsOwnerOrCollaborator:
- Позволяет редактирование задач только владельцу задачи или соисполнителям.
- Метод
has_object_permissionпроверяет, что запросы на изменение (методы, отличные от GET, HEAD и OPTIONS) выполняются только для владельца задачи или соисполнителей.
- CanViewTodoDetail:
- Позволяет просмотр деталей задачи автору, соисполнителям, поставщикам, наблюдателям и избранным.
- Метод
has_object_permissionпроверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным.