Files
we_pro_dock/BACKEND/Общие правила.md
2024-05-14 16:58:27 +03:00

66 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## ## Модель
Этот класс добавляет автоматические поля времени создания (`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` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным.