from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ from django_filters.rest_framework import DjangoFilterBackend from rest_framework import generics, status from rest_framework.generics import get_object_or_404 from rest_framework.response import Response from establishment.models import Employee from establishment.serializers.back import EmployeeBackSerializers from main import serializers from main import tasks from main.filters import AwardFilter, AwardTypeFilterSet from main.models import Award, Footer, PageType, Panel, SiteFeature, Feature, AwardType, Carousel from main.serializers.back import PanelSerializer, BackCarouselListSerializer from main.views import SiteSettingsView, SiteListView from utils.methods import get_permission_classes class AwardLstView(generics.ListCreateAPIView): """ ## List of awards ### *GET* #### Description Return paginated list of awards. Available filters: * establishment_id (`int`) - Filter by establishment identifier * product_id (`int`) - Filter by product identifier * employee_id (`int`) - Filter by employee identifier * state (`enum`) - `0 (Waiting)`, `1 (Published)` * award_type (`str`) - Filter by award type identifier * vintage_year (`str`) - Filter by a vintage year ##### Response E.g.: ``` { "count": 58, "next": 2, "previous": null, "results": [ { "id": 1, ... } ] } ``` ### *POST* #### Description Create a record in Award table. ##### Request Required: * content_type (`int`) - identifier of content type entity * object_id (`int`) - identifier of content object * award_type (`int`) - identifier of award type * title (`str`) - title of an award Non required: * vintage_year (str) - vintage year in a format - `yyyy` ##### Response ``` { "id": 1, ... } ``` """ queryset = Award.objects.all().with_base_related() serializer_class = serializers.BackAwardSerializer permission_classes = get_permission_classes() filterset_class = AwardFilter class AwardCreateAndBind(generics.CreateAPIView): """ ## Creating an Award for an Employee. ### *POST* #### Description Creating an Award for an Employee and return in response serialized Employee object. ##### Response E.g. ``` { "id": 1, ... } ``` ##### Request Required: * award_type (`int`) - identifier of award type * title (`str`) - title of an award Non required: * vintage_year (str) - vintage year in a format - `yyyy` ##### Response E.g. ``` { "id": 1, ... } ``` """ queryset = Award.objects.all().with_base_related() serializer_class = serializers.BackAwardEmployeeCreateSerializer permission_classes = get_permission_classes() def create(self, request, *args, **kwargs): """Overridden create method.""" serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) response_serializer = EmployeeBackSerializers(Employee.objects.get(pk=kwargs['employee_id'])) headers = self.get_success_headers(response_serializer.data) return Response(response_serializer.data, status=status.HTTP_201_CREATED, headers=headers) class AwardRUDView(generics.RetrieveUpdateDestroyAPIView): """ ## Retrieve/Update/Destroy Award view ### *GET* #### Description Retrieving serialized object of an Award by an identifier #### Response E.g. ``` { "id": 1, ... } ``` ### *PATCH* #### Description Partially update Award object by identifier ##### Request Available: * content_type (`int`) - identifier of content type entity * object_id (`int`) - identifier of content object * award_type (`int`) - identifier of award type * title (`str`) - title of an award * vintage_year (str) - vintage year in a format - `yyyy` ##### Response E.g. ``` { "id": 1, ... } ``` ### *DELETE* #### Description Delete an Award instance by award identifier ##### Request ``` No request data ``` ##### Response E.g. ``` No content ``` """ queryset = Award.objects.all().with_base_related() serializer_class = serializers.BackAwardSerializer permission_classes = get_permission_classes() lookup_field = 'id' class AwardTypesListView(generics.ListAPIView): """ ## List of Award types view. ### *GET* #### Description Return non paginated list of Award types filtered by request country code. Available filters: * id (`int`) - award type identifier * name (`str`) - award type name ##### Response ``` [ { "id": 1, ... } ] ``` """ pagination_class = None serializer_class = serializers.AwardTypeBaseSerializer permission_classes = get_permission_classes() lookup_field = 'id' filter_class = AwardTypeFilterSet def get_queryset(self): """An overridden get_queryset method.""" if hasattr(self, 'request') and hasattr(self.request, 'country_code'): return AwardType.objects.by_country_code(self.request.country_code) return AwardType.objects.none() class ContentTypeView(generics.ListAPIView): """ContentType list view""" queryset = ContentType.objects.all() serializer_class = serializers.ContentTypeBackSerializer permission_classes = get_permission_classes() filter_backends = (DjangoFilterBackend,) ordering_fields = '__all__' lookup_field = 'id' filterset_fields = ( 'id', 'model', 'app_label', ) class FeatureBackView(generics.ListCreateAPIView): """Feature list or create View.""" serializer_class = serializers.FeatureSerializer queryset = Feature.objects.all() permission_classes = get_permission_classes() class SiteFeatureBackView(generics.ListCreateAPIView): """Feature list or create View.""" serializer_class = serializers.SiteFeatureSerializer queryset = SiteFeature.objects.all() pagination_class = None permission_classes = get_permission_classes() class FeatureRUDBackView(generics.RetrieveUpdateDestroyAPIView): """Feature RUD View.""" serializer_class = serializers.FeatureSerializer queryset = SiteFeature.objects.all() permission_classes = get_permission_classes() class SiteFeatureRUDBackView(generics.RetrieveUpdateDestroyAPIView): """Feature RUD View.""" serializer_class = serializers.SiteFeatureSerializer queryset = SiteFeature.objects.all() permission_classes = get_permission_classes() class SiteSettingsBackOfficeView(SiteSettingsView): """Site settings View.""" serializer_class = serializers.SiteSerializer permission_classes = get_permission_classes() class SiteListBackOfficeView(SiteListView): """Site settings View.""" serializer_class = serializers.SiteSerializer permission_classes = get_permission_classes() class FooterBackView(generics.ListCreateAPIView): """Footer back list/create view.""" serializer_class = serializers.FooterBackSerializer queryset = Footer.objects.all() permission_classes = get_permission_classes() class FooterRUDBackView(generics.RetrieveUpdateDestroyAPIView): """Footer back RUD view.""" serializer_class = serializers.FooterBackSerializer queryset = Footer.objects.all() permission_classes = get_permission_classes() class PageTypeListCreateView(generics.ListCreateAPIView): """PageType back office view.""" pagination_class = None serializer_class = serializers.PageTypeBaseSerializer queryset = PageType.objects.all() permission_classes = get_permission_classes() class PanelsListCreateView(generics.ListCreateAPIView): """Custom panels view.""" serializer_class = PanelSerializer queryset = Panel.objects.all() permission_classes = get_permission_classes() class PanelsRUDView(generics.RetrieveUpdateDestroyAPIView): """Custom panels view.""" serializer_class = PanelSerializer queryset = Panel.objects.all() permission_classes = get_permission_classes() class PanelsExecuteView(generics.ListAPIView): """Custom panels view.""" queryset = Panel.objects.all() permission_classes = get_permission_classes() def list(self, request, *args, **kwargs): panel = get_object_or_404(Panel, id=self.kwargs['pk']) return Response(panel.execute_query(request)) class PanelsExportCSVView(PanelsExecuteView): """Export panels via csv view.""" queryset = Panel.objects.all() permission_classes = get_permission_classes() def list(self, request, *args, **kwargs): panel = get_object_or_404(Panel, id=self.kwargs['pk']) # make task for celery tasks.send_export_to_email.delay( panel_id=panel.id, user_id=request.user.id) return Response( {"success": _('The file will be sent to your email.')}, status=status.HTTP_200_OK ) class PanelsExecuteXLSView(PanelsExecuteView): """Export panels via xlsx view.""" queryset = Panel.objects.all() permission_classes = get_permission_classes() def list(self, request, *args, **kwargs): panel = get_object_or_404(Panel, id=self.kwargs['pk']) # make task for celery tasks.send_export_to_email.delay( panel_id=panel.id, user_id=request.user.id, file_type='xls') return Response( {"success": _('The file will be sent to your email.')}, status=status.HTTP_200_OK ) class BackCarouselListView(generics.ListAPIView): """ ## List of carousel. ### *GET* #### Description Return list of carousel items. ##### Response E.g.: ``` { "id": 1, "model_name": "model_name", "name": "name", ... "awards": [ { "id": 1, ... } ] } ``` """ queryset = Carousel.objects.all() serializer_class = BackCarouselListSerializer permission_classes = get_permission_classes() pagination_class = None def get_queryset(self): country_code = self.request.country_code qs = Carousel.objects.all() if country_code: qs = qs.by_country_code(country_code) return qs