/
Zero1l
/
231
Обзор
Документация
Войти
/
Zero1l
/
231
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
README.py
131 строка
5 KB
Zero1l
update README.py
23 окт 2025, 16:56
23 окт 2025, 16:56
af3ba09
Код
Авторство
О чём код?
# 231 from django.contrib.auth.models import User from django.db import models class Advertisement(models.Model): STATUS_CHOICES = [ ('OPEN', 'Open'), ('CLOSED', 'Closed'), ('DRAFT', 'Draft'), ] title = models.CharField(max_length=255) description = models.TextField() creator = models.ForeignKey(User, on_delete=models.CASCADE, relted_name='ads') status = models.CharField(max_length=10, chices=STATUS_CHOICES, default='DRAFT') created_at = models.DteTimeField(auto_now_add=True) updated_at = models.DateTimeField(auo_now=True) class Favorite(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='favorites') advertisement = models.ForeignKey(Advertisement, on_delete=models.CASCADE, related_ame='favorited_by') added_at = models.DateTimeField(auto_now_add=True) from rest_framework import serializers from .models import Advertisement, Favorite class AdvertisementSerializer(serializers.ModelSerializer): class Meta: model = Advertisement fields = '__all__' read_only_fields = ['creator', 'created_at', 'updated_at'] class FavoriteSerializer(serializers.ModelSerializer): class Meta: model = Favorite = ['id', 'advertisement', 'added_at'] import django_filters from .models import Advertisement class AdvertisementFilter(django_filters.FilterSet): date_range = django_filters.fields.DateFromToRangeFilter(field_name='created_at') class Meta: model = Advertisement fields = { 'status': ['exact'], 'date_range': ['exact'], } from rest_framework import permissions class IsOwnerOrReadOnly(permissions.BasePermission): def has_object_permission(self, request, view, obj): if request.method in permissions.SAFE_METHODS: return True obj.creator == request.user from rest_framework import serializers class AdvertisementSerializer(serializers.ModelSerializer): def validate(self, data): user = self.context['request'].user data.get('status') == 'OPEN': open_ads_count = Advertisement.objects.filter(creator=user, status='OPEN').count() if open_ads_count >= 10: raise serializers.ValidationError("Превышен лимит открытых объявлений (10).") return data bash pip install django-ratelimit from ratelimit.decorators import ratelimit from rest_framework import viewsets from rest_framework.permissions import IsAuthenticatedOrReadOnly, IsAuthenticated from .models import Advertisement from .serializers import AdvertisementSerializer class AdvertisementViewSet(viewsets.ModelViewSet): queryset = Advertisement.objects.all serializer_class = AdvertisementSerializer filterset_class = AdvertisementFilter def get_permissions(self): if self.action in ['update', 'partial_update', 'destroy']: return [permissions.IsAuthenticated(), IsOwnerOrReadOnly()] elif self.action in ['create']: return [permissions.IsAuthenticated()] return [permissions.AllowAny()] @ratelimit(key='user', rate='20/m', block=True) def list(self, request, *args, **kwargs): return super().list(request, *args, **kwargs) @ratelimit(key='ip', rate='10/m', block=True) def dispatch(self, *args, **kwargs): return super().dispatch(*args, **kwargs) def perform_create(self, serializer): user = self.request.user if serializer.validated_data.get('status') == 'OPEN': open_ads_count = Advertisement.objects.filter(creator=user, status='OPEN').count() if open_ads_count >= 10: raise serializers.Validation("Вы достигли лимита открытых объявлений.") serializer.save(creator=user) _FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', ], def destroy(self, request, *args, **kwargs): instance = self.get_object() if instance.creator != request.user: return Response({'detail': 'Удаление чужого объявления запрещено.'}, status=403) return super().destroy(request, *args, **kwargs) from rest_framework.decorators import action class AdvertisementViewSet(viewsets.ModelViewSet): @action(detail=True, methods=['post']) def add_to_favorites(self, request, pk=None): ad = self.get_object() if ad.creator == request.user: return Response({'detail': 'Невозможно добавить свое объявление в избранное.'}, status=400) Favorite.objects(user=request.user, advertisement=ad)