## ## Модель Этот класс добавляет автоматические поля времени создания (`created_at`), времени обновления (`updated_at`) и ссылку на автора (`author`) ко всем моделям, которые наследуют его. 1. **TimeStampedModel:** - **created_at:** DateTimeField, автоматически устанавливает дату и время создания объекта. - **updated_at:** DateTimeField, автоматически обновляется при каждом сохранении объекта. - **author:** ForeignKey, связывает с моделью пользователя, который создал объект. ## Сериализатор 1. **ProfileSerializer**: - `username` (CharField): Никнейм пользователя. - `bio` (TextField): Биография пользователя. - `image` (URLField): URL-адрес аватара пользователя. - `following` (SerializerMethodField): Показывает, подписан ли текущий пользователь на пользователя, представленного данным профилем. - Метод `get_following`: Возвращает булево значение, указывающее, подписан ли текущий пользователь на пользователя профиля. 2. **TagSerializer**: - Сериализатор для добавления тегов. - Содержит единственное поле `tags`, которое является списком строк. ## Контроллер 1. **TagView**: - Представление для работы с тегами. - Использует `GenericViewSet` и `ListModelMixin` для обработки только GET-запросов. - Включает метод `list` для получения списка тегов. ``` class TagView(viewsets.GenericViewSet, mixins.ListModelMixin): queryset = Tag.objects.all() serializer_class = TagSerializer http_method_names = ['get',] ``` 2. Метод `favorite` с декоратором `@action` для добавления/удаления статьи из избранного. ``` @action(detail=True, methods=['post']) def favorite(self, request, id=None): article = self.get_object() if article.favorites.filter(id=request.user.id).exists(): article.favorites.remove(request.user) else: article.favorites.add(request.user) article.save() serializer = self.get_serializer(article) return Response(serializer.data) ``` ## Маршрутизатор - `DefaultRouter` из библиотеки `rest_framework.routers` автоматически создает маршруты для представлений на основе их названий и методов (например, GET, POST, PUT, DELETE). За вас обрабатывается большая часть создания URL-путей, что делает код более модульным и менее подверженным ошибкам. - **`register('tags', views.TagView)`**: Регистрация маршрута для представления `TagView` из `views.py` под именем 'tags'. ## Права доступа и разрешения 1. **IsAuthenticated**: Требует, чтобы пользователь был аутентифицирован для доступа к представлениям. 2. **IsAuthenticatedOrReadOnly**: Позволяет только чтение неаутентифицированным пользователям. 3. **IsOwnerOrCollaborator**: - Позволяет редактирование задач только владельцу задачи или соисполнителям. - Метод `has_object_permission` проверяет, что запросы на изменение (методы, отличные от GET, HEAD и OPTIONS) выполняются только для владельца задачи или соисполнителей. 4. **CanViewTodoDetail**: - Позволяет просмотр деталей задачи автору, соисполнителям, поставщикам, наблюдателям и избранным. - Метод `has_object_permission` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным.