Added guides binding objects

This commit is contained in:
dormantman 2020-01-31 04:02:40 +03:00
parent 22ee06403f
commit 982a52ab96
3 changed files with 88 additions and 4 deletions

View File

@ -1,6 +1,7 @@
from rest_framework import serializers from rest_framework import serializers
from collection import models from collection import models
from collection.models import Guide
from collection.serializers.common import CollectionBaseSerializer from collection.serializers.common import CollectionBaseSerializer
from establishment.models import Establishment from establishment.models import Establishment
from location.models import Country from location.models import Country
@ -97,3 +98,54 @@ class CollectionBindObjectSerializer(serializers.Serializer):
raise RemovedBindingObjectNotFound() raise RemovedBindingObjectNotFound()
attrs['related_object'] = product attrs['related_object'] = product
return attrs return attrs
class GuideBindObjectSerializer(serializers.Serializer):
"""Serializer for binding guide and objects"""
GUIDE = 'guide'
PRODUCT = 'product'
TYPE_CHOICES = (
(GUIDE, 'Guide'),
(PRODUCT, 'Product'),
)
type = serializers.ChoiceField(TYPE_CHOICES)
object_id = serializers.IntegerField()
def validate(self, attrs):
view = self.context.get('view')
request = self.context.get('request')
obj_type = attrs.get('type')
obj_id = attrs.get('object_id')
guide = view.get_object()
attrs['guide'] = guide
if obj_type == self.GUIDE:
guide = Guide.objects.filter(pk=obj_id).first()
if not guide:
raise BindingObjectNotFound()
if request.method == 'POST' and guide.establishments.filter(pk=guide.pk).exists():
raise ObjectAlreadyAdded()
if request.method == 'DELETE' and not guide. \
establishments.filter(pk=guide.pk). \
exists():
raise RemovedBindingObjectNotFound()
attrs['related_object'] = guide
elif obj_type == self.PRODUCT:
product = Product.objects.filter(pk=obj_id).first()
if not product:
raise BindingObjectNotFound()
if request.method == 'POST' and guide.products. \
filter(pk=product.pk).exists():
raise ObjectAlreadyAdded()
if request.method == 'DELETE' and not guide.products. \
filter(pk=product.pk).exists():
raise RemovedBindingObjectNotFound()
attrs['related_object'] = product
return attrs

View File

@ -30,4 +30,6 @@ urlpatterns = [
name='guide-export-xml'), name='guide-export-xml'),
path('guides/<int:pk>/export-doc/', views.GuideElementExportDOCView.as_view(), path('guides/<int:pk>/export-doc/', views.GuideElementExportDOCView.as_view(),
name='guide-export-doc'), name='guide-export-doc'),
path('guides/<int:pk>/bind-object/', views.GuideBackOfficeList.as_view(),
name='guide-bind-object')
] + router.urls ] + router.urls

View File

@ -1,11 +1,9 @@
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework import generics from rest_framework import generics, mixins, permissions, status, viewsets
from rest_framework import mixins, permissions, viewsets
from rest_framework import status
from rest_framework.response import Response from rest_framework.response import Response
from collection import models, serializers, filters, tasks from collection import filters, models, serializers, tasks
from utils.methods import get_permission_classes from utils.methods import get_permission_classes
from utils.views import BindObjectMixin from utils.views import BindObjectMixin
@ -105,9 +103,41 @@ class GuideListCreateView(GuideBaseView,
filter_class = filters.GuideFilterSet filter_class = filters.GuideFilterSet
class GuideBackOfficeList(BindObjectMixin, GuideBaseView):
"""ViewSet for Guides list for BackOffice users"""
pagination_class = None
filter_class = filters.GuideFilterSet
bind_object_serializer_class = serializers.GuideBindObjectSerializer
def perform_binding(self, serializer):
data = serializer.validated_data
guide = data.pop('guide')
obj_type = data.get('type')
related_object = data.get('related_object')
if obj_type == self.bind_object_serializer_class.GUIDE:
guide.establishments.add(related_object)
elif obj_type == self.bind_object_serializer_class.PRODUCT:
guide.products.add(related_object)
def perform_unbinding(self, serializer):
data = serializer.validated_data
guide = data.pop('guide')
obj_type = data.get('type')
related_object = data.get('related_object')
if obj_type == self.bind_object_serializer_class.GUIDE:
guide.establishments.remove(related_object)
elif obj_type == self.bind_object_serializer_class.PRODUCT:
guide.products.remove(related_object)
class GuideFilterCreateView(GuideFilterBaseView, class GuideFilterCreateView(GuideFilterBaseView,
generics.CreateAPIView): generics.CreateAPIView):
"""View for GuideFilter model for BackOffice users.""" """View for GuideFilter model for BackOffice users."""
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
super().create(request, *args, **kwargs) super().create(request, *args, **kwargs)
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)