978 lines
36 KiB
Python
978 lines
36 KiB
Python
"""Establishment app views."""
|
|
from django.conf import settings
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.db import transaction
|
|
from django.db.models.query_utils import Q
|
|
from django.http import Http404
|
|
from django.shortcuts import get_object_or_404
|
|
from django_filters.rest_framework import DjangoFilterBackend
|
|
from rest_framework import generics, response, status
|
|
from rest_framework.response import Response
|
|
|
|
from account.models import User, Role, UserRole
|
|
from collection.models import Guide
|
|
from establishment import filters, models, serializers
|
|
from establishment.models import EstablishmentEmployee, Menu
|
|
from timetable.models import Timetable
|
|
from timetable.serialziers import ScheduleCreateSerializer, ScheduleRUDSerializer
|
|
from utils.methods import get_permission_classes
|
|
from utils.permissions import (IsEstablishmentAdministrator, IsEstablishmentManager)
|
|
from utils.views import CreateDestroyGalleryViewMixin
|
|
from main import models as main_models
|
|
from main import serializers as main_serializers
|
|
|
|
|
|
class MenuRUDMixinViews:
|
|
"""Menu mixin"""
|
|
|
|
def get_object(self):
|
|
instance = self.get_queryset().filter(
|
|
Q(establishment__slug=self.kwargs.get('slug')) | Q(establishment__id=self.kwargs.get('pk'))
|
|
).first()
|
|
|
|
if instance is None:
|
|
raise Http404
|
|
|
|
return instance
|
|
|
|
|
|
class EstablishmentMixinViews:
|
|
"""Establishment mixin."""
|
|
|
|
def get_queryset(self):
|
|
"""Overridden method 'get_queryset'."""
|
|
queryset = models.Establishment.objects.with_base_related
|
|
if hasattr(self, 'request') and \
|
|
(hasattr(self.request, 'user') and hasattr(self.request, 'country_code')):
|
|
return queryset().available_establishments(self.request.user, self.request.country_code)
|
|
return queryset().none()
|
|
|
|
|
|
class EstablishmentListCreateView(EstablishmentMixinViews, generics.ListCreateAPIView):
|
|
"""Establishment list/create view."""
|
|
|
|
filter_class = filters.EstablishmentFilter
|
|
serializer_class = serializers.EstablishmentListCreateSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class EmployeeEstablishmentPositionsView(generics.ListAPIView):
|
|
"""Establishment by employee view."""
|
|
|
|
queryset = models.EstablishmentEmployee.objects.all()
|
|
serializer_class = serializers.EstablishmentEmployeePositionsSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
def get_queryset(self):
|
|
employee_pk = self.kwargs.get('pk')
|
|
return super().get_queryset().filter(employee__id=employee_pk).all().prefetch_related(
|
|
'establishment').select_related('position')
|
|
|
|
|
|
class EmployeeEstablishmentsListView(generics.ListAPIView):
|
|
"""Establishment by employee list view."""
|
|
serializer_class = serializers.EstablishmentListCreateSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
def get_queryset(self):
|
|
pk = self.kwargs.get('pk')
|
|
employee = get_object_or_404(models.Employee, pk=pk)
|
|
return employee.establishments.with_extended_related()
|
|
|
|
|
|
class EmployeePositionsListView(generics.ListAPIView):
|
|
"""Establishment position by employee list view."""
|
|
|
|
queryset = models.Establishment.objects.all()
|
|
serializer_class = serializers.EstablishmentPositionListSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
def get_queryset(self):
|
|
pk = self.kwargs.get('pk')
|
|
employee = get_object_or_404(models.Employee, pk=pk)
|
|
return employee.establishments.with_extended_related()
|
|
|
|
|
|
class EstablishmentRUDView(EstablishmentMixinViews, generics.RetrieveUpdateDestroyAPIView):
|
|
lookup_field = 'slug'
|
|
serializer_class = serializers.EstablishmentRUDSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
def get_queryset(self):
|
|
"""Overridden get_queryset method."""
|
|
qs = super(EstablishmentRUDView, self).get_queryset()
|
|
return qs.prefetch_related(
|
|
'establishmentemployee_set',
|
|
'establishmentemployee_set__establishment',
|
|
)
|
|
|
|
|
|
class EstablishmentScheduleRUDView(EstablishmentMixinViews, generics.RetrieveUpdateDestroyAPIView):
|
|
"""Establishment schedule RUD view"""
|
|
lookup_field = 'slug'
|
|
serializer_class = ScheduleRUDSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
def get_object(self):
|
|
"""
|
|
Returns the object the view is displaying.
|
|
"""
|
|
establishment_slug = self.kwargs['slug']
|
|
schedule_id = self.kwargs['schedule_id']
|
|
|
|
establishment = get_object_or_404(klass=super(EstablishmentScheduleRUDView, self).get_queryset(),
|
|
slug=establishment_slug)
|
|
schedule = get_object_or_404(klass=establishment.schedule,
|
|
id=schedule_id)
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, establishment)
|
|
self.check_object_permissions(self.request, schedule)
|
|
|
|
return schedule
|
|
|
|
|
|
class EstablishmentScheduleCreateView(generics.CreateAPIView):
|
|
"""Establishment schedule Create view"""
|
|
lookup_field = 'slug'
|
|
serializer_class = ScheduleCreateSerializer
|
|
queryset = Timetable.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class CardAndWinesListView(generics.RetrieveAPIView):
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
serializer_class = serializers.CardAndWinesSerializer
|
|
queryset = models.Establishment.objects.with_base_related()
|
|
|
|
def get_object(self):
|
|
establishment = models.Establishment.objects.prefetch_plates()\
|
|
.filter(pk=self.kwargs['establishment_id'])\
|
|
.first()
|
|
if establishment is None:
|
|
raise Http404
|
|
plates = []
|
|
for menu in establishment.menu_set.prefetch_related('plates').exclude(type=Menu.FORMULAS):
|
|
plates += list(menu.plates.all().prefetch_related('menu'))
|
|
setattr(establishment, 'card_and_wine_plates', plates)
|
|
return establishment
|
|
|
|
|
|
class CreateMenuForCertainEstablishmentView(generics.CreateAPIView):
|
|
"""Creates formulas menu for certain establishment"""
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
# from rest_framework.permissions import AllowAny
|
|
# permission_classes = (AllowAny, )
|
|
queryset = models.Menu.objects.with_base_related().by_type(menu_type=models.Menu.FORMULAS)
|
|
serializer_class = serializers.MenuBackOfficeSerializer
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
data = request.data.copy()
|
|
data['establishment_id'] = kwargs['establishment_id']
|
|
data['type'] = models.Menu.FORMULAS
|
|
serializer = self.get_serializer(data=data)
|
|
serializer.is_valid(raise_exception=True)
|
|
with transaction.atomic():
|
|
self.perform_create(serializer)
|
|
headers = self.get_success_headers(serializer.data)
|
|
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
|
|
|
|
|
|
class MenuListCreateView(generics.ListCreateAPIView):
|
|
"""Menu list create view. This view works only with menu formulas type"""
|
|
serializer_class = serializers.MenuBackOfficeSerializer
|
|
queryset = models.Menu.objects.with_base_related().by_type(menu_type=models.Menu.FORMULAS)
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
filter_backends = (DjangoFilterBackend,)
|
|
filterset_fields = (
|
|
'establishment',
|
|
'establishment__slug',
|
|
)
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
response_data = []
|
|
with transaction.atomic():
|
|
establishment = get_object_or_404(models.Establishment, pk=next(iter(request.data))['establishment_id'])
|
|
update_ids = [menu['id'] for menu in request.data if 'id' in menu]
|
|
for menu_instance in establishment.menu_set.by_type(models.Menu.FORMULAS):
|
|
if menu_instance.pk not in update_ids:
|
|
menu_instance.delete()
|
|
for menu in request.data:
|
|
menu.update({'type': models.Menu.FORMULAS})
|
|
if 'id' in menu:
|
|
|
|
instance = get_object_or_404(Menu, pk=menu['id'])
|
|
serializer = self.get_serializer(instance, data=menu)
|
|
else:
|
|
|
|
serializer = self.get_serializer(data=menu)
|
|
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
response_data.append(serializer.data)
|
|
|
|
return Response(response_data, status=status.HTTP_201_CREATED)
|
|
|
|
|
|
class MenuRUDView(generics.UpdateAPIView, generics.DestroyAPIView):
|
|
"""Menu RUD view."""
|
|
serializer_class = serializers.MenuBackOfficeSerializer
|
|
queryset = models.Menu.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
def get_object(self):
|
|
return get_object_or_404(klass=models.Menu, pk=self.kwargs['menu_id'])
|
|
|
|
def update(self, request, *args, **kwargs):
|
|
partial = kwargs.pop('partial', False)
|
|
instance = self.get_object()
|
|
data = request.data.copy()
|
|
data['establishment_id'] = instance.establishment.pk
|
|
serializer = self.get_serializer(instance, data=data, partial=partial)
|
|
serializer.is_valid(raise_exception=True)
|
|
with transaction.atomic():
|
|
self.perform_update(serializer)
|
|
|
|
if getattr(instance, '_prefetched_objects_cache', None):
|
|
# If 'prefetch_related' has been applied to a queryset, we need to
|
|
# forcibly invalidate the prefetch cache on the instance.
|
|
instance._prefetched_objects_cache = {}
|
|
|
|
return Response(serializer.data)
|
|
|
|
|
|
class MenuUploadsRUDView(generics.RetrieveDestroyAPIView):
|
|
"""Menu uploads RUD view."""
|
|
serializer_class = serializers.MenuFilesSerializers
|
|
queryset = models.MenuFiles.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class EstablishmentWineView(generics.CreateAPIView):
|
|
"""Create and update establishment wine"""
|
|
serializer_class = serializers.EstablishmentBackOfficeWineSerializer
|
|
queryset = models.EstablishmentBackOfficeWine.objects.all()
|
|
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
data = request.data.copy()
|
|
data.update({'establishment_id': self.kwargs['establishment_id']})
|
|
if 'id' in data:
|
|
"""Update"""
|
|
instance = get_object_or_404(models.EstablishmentBackOfficeWine, pk=data['id'])
|
|
serializer = self.get_serializer(instance, data=data)
|
|
else:
|
|
"""create"""
|
|
serializer = self.get_serializer(data=data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
|
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
|
|
|
|
|
class DishCreateView(generics.CreateAPIView):
|
|
"""View for creating and binding dish to establishment"""
|
|
serializer_class = serializers.CardAndWinesPlatesSerializer
|
|
queryset = models.Plate.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class DishUpdateDeleteView(generics.UpdateAPIView, generics.DestroyAPIView):
|
|
serializer_class = serializers.CardAndWinesPlatesSerializer
|
|
queryset = models.Plate.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
def get_object(self):
|
|
return get_object_or_404(models.Plate, pk=self.kwargs['dish_id'])
|
|
|
|
def update(self, request, *args, **kwargs):
|
|
with transaction.atomic():
|
|
return super().update(request, *args, **kwargs)
|
|
|
|
|
|
class MenuUploadsCreateView(generics.CreateAPIView):
|
|
"""Menu uploads list view"""
|
|
serializer_class = serializers.MenuFilesSerializers
|
|
queryset = models.MenuFiles.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class SocialChoiceListCreateView(generics.ListCreateAPIView):
|
|
"""SocialChoice list create view."""
|
|
serializer_class = serializers.SocialChoiceSerializers
|
|
queryset = models.SocialChoice.objects.all()
|
|
pagination_class = None
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class SocialChoiceRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""SocialChoice RUD view."""
|
|
serializer_class = serializers.SocialChoiceSerializers
|
|
queryset = models.SocialChoice.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class SocialListCreateView(generics.ListCreateAPIView):
|
|
"""Social list create view."""
|
|
serializer_class = serializers.SocialNetworkSerializers
|
|
queryset = models.SocialNetwork.objects.all()
|
|
pagination_class = None
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class SocialRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""Social RUD view."""
|
|
serializer_class = serializers.SocialNetworkSerializers
|
|
queryset = models.SocialNetwork.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class PlateListCreateView(generics.ListCreateAPIView):
|
|
"""Plate list create view."""
|
|
serializer_class = serializers.PlatesSerializers
|
|
queryset = models.Plate.objects.all()
|
|
pagination_class = None
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentAdministrator,
|
|
IsEstablishmentManager,
|
|
)
|
|
|
|
|
|
class PlateRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""Plate RUD view."""
|
|
serializer_class = serializers.PlatesSerializers
|
|
queryset = models.Plate.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentAdministrator,
|
|
IsEstablishmentManager,
|
|
)
|
|
|
|
|
|
class PhonesListCreateView(generics.ListCreateAPIView):
|
|
"""Phones list create view."""
|
|
serializer_class = serializers.ContactPhoneBackSerializers
|
|
queryset = models.ContactPhone.objects.all()
|
|
pagination_class = None
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentAdministrator,
|
|
IsEstablishmentManager,
|
|
)
|
|
|
|
|
|
class PhonesRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""Phones RUD view."""
|
|
serializer_class = serializers.ContactPhoneBackSerializers
|
|
queryset = models.ContactPhone.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentAdministrator,
|
|
IsEstablishmentManager,
|
|
)
|
|
|
|
|
|
class EmailListCreateView(generics.ListCreateAPIView):
|
|
"""Email list create view."""
|
|
serializer_class = serializers.ContactEmailBackSerializers
|
|
queryset = models.ContactEmail.objects.all()
|
|
pagination_class = None
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentAdministrator,
|
|
IsEstablishmentManager,
|
|
)
|
|
|
|
|
|
class EmailRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""Email RUD view."""
|
|
serializer_class = serializers.ContactEmailBackSerializers
|
|
queryset = models.ContactEmail.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentAdministrator,
|
|
IsEstablishmentManager,
|
|
)
|
|
|
|
|
|
class EmployeeListCreateView(generics.ListCreateAPIView):
|
|
"""Employee list create view."""
|
|
filter_class = filters.EmployeeBackFilter
|
|
serializer_class = serializers.EmployeeBackSerializers
|
|
queryset = models.Employee.objects.all().distinct().with_back_office_related()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class EmployeesListSearchViews(generics.ListAPIView):
|
|
"""Employee search view"""
|
|
pagination_class = None
|
|
queryset = models.Employee.objects.all().with_back_office_related().select_related('photo')
|
|
filter_class = filters.EmployeeBackSearchFilter
|
|
serializer_class = serializers.EmployeeBackSerializers
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class EstablishmentEmployeeListView(generics.ListCreateAPIView):
|
|
"""Establishment emplyoees list view."""
|
|
serializer_class = serializers.EstEmployeeBackSerializer
|
|
pagination_class = None
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
def get_queryset(self):
|
|
establishment_id = self.kwargs['establishment_id']
|
|
establishment = get_object_or_404(models.Establishment, pk=establishment_id)
|
|
self.kwargs['establishment_instance'] = establishment
|
|
self.kwargs['establishment_instance_subtypes'] = list(establishment.establishment_subtypes.all())
|
|
self.kwargs['establishment_instance_type'] = establishment.establishment_type
|
|
return models.Employee.objects.filter(
|
|
establishmentemployee__establishment_id=establishment_id,
|
|
).distinct()
|
|
|
|
|
|
class EmployeeRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""Employee RUD view."""
|
|
serializer_class = serializers.EmployeeBackSerializers
|
|
queryset = models.Employee.objects.with_back_office_related()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator,
|
|
)
|
|
|
|
|
|
class RemoveAwardView(generics.DestroyAPIView):
|
|
lookup_field = 'pk'
|
|
serializer_class = serializers.EmployeeBackSerializers
|
|
queryset = models.Employee.objects.with_back_office_related()
|
|
permission_classes = get_permission_classes()
|
|
|
|
def get_object(self):
|
|
employee = super().get_object()
|
|
employee.remove_award(self.kwargs['award_id'])
|
|
return employee
|
|
|
|
def delete(self, request, *args, **kwargs):
|
|
instance = self.get_object()
|
|
return Response(status=status.HTTP_204_NO_CONTENT)
|
|
|
|
|
|
class EstablishmentTypeListCreateView(generics.ListCreateAPIView):
|
|
"""Establishment type list/create view."""
|
|
serializer_class = serializers.EstablishmentTypeBaseSerializer
|
|
queryset = models.EstablishmentType.objects.select_related('default_image')
|
|
pagination_class = None
|
|
permission_classes = get_permission_classes()
|
|
|
|
|
|
class EstablishmentTypeRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""Establishment type retrieve/update/destroy view."""
|
|
serializer_class = serializers.EstablishmentTypeBaseSerializer
|
|
queryset = models.EstablishmentType.objects.select_related('default_image')
|
|
permission_classes = get_permission_classes()
|
|
|
|
|
|
class EstablishmentSubtypeListCreateView(generics.ListCreateAPIView):
|
|
"""Establishment subtype list/create view."""
|
|
serializer_class = serializers.EstablishmentSubTypeBaseSerializer
|
|
queryset = models.EstablishmentSubType.objects.select_related('default_image')
|
|
pagination_class = None
|
|
permission_classes = get_permission_classes()
|
|
|
|
|
|
class EstablishmentSubtypeRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""Establishment subtype retrieve/update/destroy view."""
|
|
serializer_class = serializers.EstablishmentSubTypeBaseSerializer
|
|
queryset = models.EstablishmentSubType.objects.select_related('default_image')
|
|
permission_classes = get_permission_classes()
|
|
|
|
|
|
class EstablishmentGalleryCreateDestroyView(EstablishmentMixinViews,
|
|
CreateDestroyGalleryViewMixin):
|
|
"""Resource for a create|destroy gallery for establishment for back-office users."""
|
|
lookup_field = 'slug'
|
|
serializer_class = serializers.EstablishmentBackOfficeGallerySerializer
|
|
permission_classes = get_permission_classes()
|
|
|
|
def get_object(self):
|
|
"""
|
|
Returns the object the view is displaying.
|
|
"""
|
|
establishment_qs = self.filter_queryset(self.get_queryset())
|
|
|
|
establishment = get_object_or_404(establishment_qs, slug=self.kwargs.get('slug'))
|
|
gallery = get_object_or_404(establishment.establishment_gallery,
|
|
image_id=self.kwargs.get('image_id'))
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, gallery)
|
|
|
|
return gallery
|
|
|
|
|
|
class EstablishmentGalleryListView(EstablishmentMixinViews,
|
|
generics.ListAPIView):
|
|
"""Resource for returning gallery for establishment for back-office users."""
|
|
lookup_field = 'slug'
|
|
serializer_class = serializers.ImageBaseSerializer
|
|
permission_classes = get_permission_classes()
|
|
|
|
def get_object(self):
|
|
"""Override get_object method."""
|
|
qs = super(EstablishmentGalleryListView, self).get_queryset()
|
|
establishment = get_object_or_404(qs, slug=self.kwargs.get('slug'))
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, establishment)
|
|
|
|
return establishment
|
|
|
|
def get_queryset(self):
|
|
"""Override get_queryset method."""
|
|
return self.get_object().crop_gallery
|
|
|
|
|
|
class EstablishmentCompanyListCreateView(EstablishmentMixinViews,
|
|
generics.ListCreateAPIView):
|
|
"""List|Create establishment company view."""
|
|
|
|
lookup_field = 'slug'
|
|
serializer_class = serializers.EstablishmentCompanyListCreateSerializer
|
|
permission_classes = get_permission_classes()
|
|
|
|
def get_object(self):
|
|
"""Returns the object the view is displaying."""
|
|
establishment_qs = super(EstablishmentCompanyListCreateView, self).get_queryset()
|
|
filtered_qs = self.filter_queryset(establishment_qs)
|
|
|
|
establishment = get_object_or_404(filtered_qs, slug=self.kwargs.get('slug'))
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, establishment)
|
|
|
|
return establishment
|
|
|
|
def get_queryset(self):
|
|
"""Overridden get_queryset method."""
|
|
return self.get_object().companies.all()
|
|
|
|
|
|
class EstablishmentCompanyRUDView(EstablishmentMixinViews,
|
|
generics.RetrieveUpdateDestroyAPIView):
|
|
"""Create|Retrieve|Update|Destroy establishment company view."""
|
|
|
|
lookup_field = 'slug'
|
|
serializer_class = serializers.CompanyBaseSerializer
|
|
permission_classes = get_permission_classes()
|
|
|
|
def get_object(self):
|
|
"""Returns the object the view is displaying."""
|
|
establishment_qs = super(EstablishmentCompanyRUDView, self).get_queryset()
|
|
filtered_ad_qs = self.filter_queryset(establishment_qs)
|
|
|
|
establishment = get_object_or_404(filtered_ad_qs, slug=self.kwargs.get('slug'))
|
|
company = get_object_or_404(establishment.companies.all(), pk=self.kwargs.get('company_pk'))
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, company)
|
|
|
|
return company
|
|
|
|
|
|
class EstablishmentNoteListCreateView(EstablishmentMixinViews,
|
|
generics.ListCreateAPIView):
|
|
"""Retrieve|Update|Destroy establishment note view."""
|
|
|
|
lookup_field = 'slug'
|
|
serializer_class = serializers.EstablishmentNoteListCreateSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentAdministrator,
|
|
IsEstablishmentManager,
|
|
)
|
|
|
|
def get_object(self):
|
|
"""Returns the object the view is displaying."""
|
|
establishment_qs = super(EstablishmentNoteListCreateView, self).get_queryset()
|
|
filtered_establishment_qs = self.filter_queryset(establishment_qs)
|
|
|
|
establishment = get_object_or_404(filtered_establishment_qs, slug=self.kwargs.get('slug'))
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, establishment)
|
|
|
|
return establishment
|
|
|
|
def get_queryset(self):
|
|
"""Overridden get_queryset method."""
|
|
return self.get_object().notes.all()
|
|
|
|
|
|
class EstablishmentNoteRUDView(EstablishmentMixinViews,
|
|
generics.RetrieveUpdateDestroyAPIView):
|
|
"""Create|Retrieve|Update|Destroy establishment note view."""
|
|
|
|
lookup_field = 'slug'
|
|
serializer_class = serializers.EstablishmentNoteBaseSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentAdministrator,
|
|
IsEstablishmentManager,
|
|
)
|
|
|
|
def get_object(self):
|
|
"""Returns the object the view is displaying."""
|
|
establishment_qs = super(EstablishmentNoteRUDView, self).get_queryset()
|
|
filtered_establishment_qs = self.filter_queryset(establishment_qs)
|
|
|
|
establishment = get_object_or_404(filtered_establishment_qs, slug=self.kwargs.get('slug'))
|
|
note = get_object_or_404(establishment.notes.all(), pk=self.kwargs['note_pk'])
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, note)
|
|
|
|
return note
|
|
|
|
|
|
class EstablishmentEmployeeCreateView(generics.CreateAPIView):
|
|
serializer_class = serializers.EstablishmentEmployeeCreateSerializer
|
|
queryset = models.EstablishmentEmployee.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
|
|
class EstablishmentEmployeeDeleteView(generics.DestroyAPIView):
|
|
queryset = EstablishmentEmployee.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
|
|
class EstablishmentPositionListView(generics.ListAPIView):
|
|
"""Establishment positions list view."""
|
|
|
|
pagination_class = None
|
|
queryset = models.Position.objects.all()
|
|
serializer_class = serializers.PositionBackSerializer
|
|
filter_class = filters.PositionsByEstablishmentFilter
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
def get_queryset(self):
|
|
return super().get_queryset().order_by('priority')
|
|
|
|
|
|
class EstablishmentAdminView(generics.ListAPIView):
|
|
"""Establishment admin list view."""
|
|
serializer_class = serializers.EstablishmentAdminListSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
def get_queryset(self):
|
|
establishment = get_object_or_404(
|
|
models.Establishment, slug=self.kwargs['slug'])
|
|
return User.objects.establishment_admin(establishment).distinct()
|
|
|
|
|
|
class EstablishmentGuideCreateDestroyView(generics.GenericAPIView):
|
|
"""Add/Remove establishment from guide."""
|
|
establishment_lookup_url_kwarg = 'slug'
|
|
guide_lookup_url_kwarg = 'guide_id'
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
def get_establishment_queryset(self):
|
|
"""Get Establishment queryset."""
|
|
return EstablishmentMixinViews.get_queryset(self)
|
|
|
|
def get_guide_queryset(self):
|
|
"""Get Guide queryset."""
|
|
queryset = Guide.objects
|
|
if hasattr(self, 'request') and hasattr(self.request, 'country_code'):
|
|
return queryset.by_country_code(self.request.country_code)
|
|
return queryset.none()
|
|
|
|
def get_establishment(self):
|
|
queryset = self.get_establishment_queryset()
|
|
|
|
# Perform the lookup filtering.
|
|
lookup_url_kwarg = getattr(self, 'establishment_lookup_url_kwarg', None)
|
|
|
|
assert lookup_url_kwarg in self.kwargs, (
|
|
'Expected view %s to be called with a URL keyword argument '
|
|
'named "%s". Fix your URL conf, or set the `.lookup_field` '
|
|
'attribute on the view correctly.' %
|
|
(self.__class__.__name__, lookup_url_kwarg)
|
|
)
|
|
|
|
filters = {'klass': queryset, lookup_url_kwarg: self.kwargs.get(lookup_url_kwarg)}
|
|
obj = get_object_or_404(**filters)
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, obj)
|
|
|
|
return obj
|
|
|
|
def get_guide(self):
|
|
queryset = self.get_guide_queryset()
|
|
|
|
# Perform the lookup filtering.
|
|
lookup_url_kwarg = getattr(self, 'guide_lookup_url_kwarg', None)
|
|
|
|
assert lookup_url_kwarg in self.kwargs, (
|
|
'Expected view %s to be called with a URL keyword argument '
|
|
'named "%s". Fix your URL conf, or set the `.lookup_field` '
|
|
'attribute on the view correctly.' %
|
|
(self.__class__.__name__, lookup_url_kwarg)
|
|
)
|
|
|
|
obj = get_object_or_404(klass=queryset, id=self.kwargs.get(lookup_url_kwarg))
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, obj)
|
|
|
|
return obj
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
"""Implement GET-method."""
|
|
establishment = self.get_establishment()
|
|
guide = self.get_guide()
|
|
guide.extend_establishment_guide(establishment.id)
|
|
return Response(status=status.HTTP_200_OK)
|
|
|
|
def delete(self, request, *args, **kwargs):
|
|
"""Implement DELETE-method."""
|
|
establishment = self.get_establishment()
|
|
guide = self.get_guide()
|
|
guide.remove_establishment(establishment.id)
|
|
return Response(status=status.HTTP_204_NO_CONTENT)
|
|
|
|
|
|
class MenuDishesListCreateView(generics.ListCreateAPIView):
|
|
"""Menu (dessert, main_course, starter) list create view."""
|
|
serializer_class = serializers.MenuDishesSerializer
|
|
queryset = models.Menu.objects.with_schedule_plates_establishment().dishes().distinct()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
filter_class = filters.MenuDishesBackFilter
|
|
|
|
|
|
class MenuDishesRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""Menu (dessert, main_course, starter) RUD view."""
|
|
serializer_class = serializers.MenuDishesRUDSerializers
|
|
queryset = models.Menu.objects.dishes().distinct()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
|
|
class MenuGalleryListView(generics.ListAPIView):
|
|
"""Resource for returning gallery for menu for back-office users."""
|
|
serializer_class = serializers.ImageBaseSerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
queryset = models.Menu.objects.with_schedule_plates_establishment().with_gallery().dishes()
|
|
|
|
def get_object(self):
|
|
"""Override get_object method."""
|
|
qs = super(MenuGalleryListView, self).get_queryset()
|
|
menu = get_object_or_404(qs, pk=self.kwargs.get('pk'))
|
|
|
|
# May raise a permission denied
|
|
# self.check_object_permissions(self.request, menu)
|
|
|
|
return menu
|
|
|
|
def get_queryset(self):
|
|
"""Override get_queryset method."""
|
|
return self.get_object().crop_gallery
|
|
|
|
|
|
class MenuGalleryCreateDestroyView(CreateDestroyGalleryViewMixin):
|
|
"""Resource for a create gallery for menu for back-office users."""
|
|
serializer_class = serializers.MenuGallerySerializer
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
def get_queryset(self):
|
|
"""Override get_queryset method."""
|
|
qs = models.Menu.objects.with_schedule_plates_establishment().with_gallery().dishes()
|
|
return qs
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
_ = super().create(request, *args, **kwargs)
|
|
news_qs = self.filter_queryset(self.get_queryset())
|
|
return response.Response(
|
|
data=serializers.MenuDishesRUDSerializers(get_object_or_404(news_qs, pk=kwargs.get('pk'))).data
|
|
)
|
|
|
|
def get_object(self):
|
|
"""
|
|
Returns the object the view is displaying.
|
|
"""
|
|
menu_qs = self.filter_queryset(self.get_queryset())
|
|
|
|
menu = get_object_or_404(menu_qs, pk=self.kwargs.get('pk'))
|
|
gallery = get_object_or_404(menu.menu_gallery, image_id=self.kwargs.get('image_id'))
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, gallery)
|
|
|
|
return gallery
|
|
|
|
|
|
class StatusesListView(generics.ListAPIView):
|
|
"""Possible project establishment statuses"""
|
|
pagination_class = None
|
|
serializer_class = serializers.EstablishmentStatusesSerializer
|
|
|
|
def get_queryset(self):
|
|
return None
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
mutated_for_serializer = [{
|
|
'value': state[0],
|
|
'state_translated': state[1],
|
|
} for state in models.Establishment.STATUS_CHOICES]
|
|
serializer = self.get_serializer(mutated_for_serializer, many=True)
|
|
return response.Response(serializer.data)
|
|
|
|
|
|
class TeamMemberListView(generics.ListAPIView):
|
|
"""Show team for certain establishment"""
|
|
pagination_class = None
|
|
serializer_class = serializers.TeamMemberSerializer
|
|
queryset = User.objects.all()
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
def get_queryset(self):
|
|
establishment = get_object_or_404(klass=models.Establishment, pk=self.kwargs['establishment_id'])
|
|
return super().get_queryset().filter(roles__role=Role.ESTABLISHMENT_ADMINISTRATOR,
|
|
userrole__establishment=establishment, userrole__state=UserRole.VALIDATED)
|
|
|
|
|
|
class TeamMemberDeleteView(generics.DestroyAPIView):
|
|
"""Delete user from team"""
|
|
permission_classes = get_permission_classes(
|
|
IsEstablishmentManager,
|
|
IsEstablishmentAdministrator
|
|
)
|
|
|
|
def get_object(self):
|
|
return UserRole.objects.get(role__role=Role.ESTABLISHMENT_ADMINISTRATOR, user_id=self.kwargs['user_id'],
|
|
establishment_id=self.kwargs['establishment_id'])
|
|
|
|
def perform_destroy(self, instance):
|
|
instance.delete()
|
|
from account.tasks import team_role_revoked
|
|
establishment = models.Establishment.objects.get(pk=self.kwargs['establishment_id'])
|
|
if settings.USE_CELERY:
|
|
team_role_revoked.delay(self.kwargs['user_id'], self.request.country_code, establishment.name)
|
|
else:
|
|
team_role_revoked(self.kwargs['user_id'], self.request.country_code, establishment.name)
|
|
|
|
|
|
class EstablishmentAwardCreateAndBind(generics.CreateAPIView, generics.DestroyAPIView):
|
|
queryset = main_models.Award.objects.with_base_related().all()
|
|
permission_classes = get_permission_classes()
|
|
serializer_class = serializers.BackEstablishmentAwardCreateSerializer
|
|
|
|
def _award_list_for_establishment(self, establishment_id: int, status: int) -> Response:
|
|
awards = main_models.Award.objects.with_base_related().filter(
|
|
object_id=establishment_id,
|
|
content_type=ContentType.objects.get_for_model(models.Establishment)
|
|
)
|
|
response_serializer = main_serializers.AwardBaseSerializer(awards, many=True)
|
|
headers = self.get_success_headers(response_serializer.data)
|
|
return Response(response_serializer.data, status=status, headers=headers)
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
"""Overridden create method."""
|
|
super().create(request, args, kwargs)
|
|
return self._award_list_for_establishment(kwargs['establishment_id'], status.HTTP_201_CREATED)
|
|
|
|
def delete(self, request, *args, **kwargs):
|
|
establishment = get_object_or_404(models.Establishment, id=kwargs['establishment_id'])
|
|
establishment.remove_award(kwargs['award_id'])
|
|
return self._award_list_for_establishment(kwargs['establishment_id'], status.HTTP_200_OK) |