from apps.herd.web.api.v1.serializers import HerdSerializer, RancherSerializer from apps.core.mixins.search_mixin import DynamicSearchMixin from apps.authentication.api.v1.api import UserViewSet from apps.livestock.web.api.v1.serializers import LiveStockSerializer from common.helpers import get_organization_by_user from rest_framework.exceptions import APIException from rest_framework.response import Response from rest_framework.decorators import action from common.tools import CustomOperations from rest_framework import viewsets from apps.herd.models import Herd, Rancher from django.db import transaction from rest_framework import status class HerdViewSet(viewsets.ModelViewSet): """ Herd ViewSet """ queryset = Herd.objects.all() serializer_class = HerdSerializer @transaction.atomic def create(self, request, *args, **kwargs): """ create herd with user """ organization = get_organization_by_user(request.user) if 'user' in request.data.keys(): # create user if owner of herd is not exist user = CustomOperations().custom_create( request=request, view=UserViewSet(), data_key='user' ) owner = user['id'] request.data.update({'owner': owner}) # if cooperative do not send in request, set my organization in it if 'cooperative' not in request.data.keys(): request.data.update({'cooperative': organization.id}) serializer = self.serializer_class(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) else: return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) @action( methods=['get'], detail=False, url_name='my_herds', url_path='my_herds', name='my_herds' ) @transaction.atomic def my_herds(self, request): """ get current user herds """ serializer = self.serializer_class(self.queryset.filter(owner=request.user.id), many=True) if serializer.data: return Response(serializer.data, status=status.HTTP_200_OK) else: return Response(status=status.HTTP_204_NO_CONTENT) @action( methods=['post'], detail=True, url_path='trash', url_name='trash', name='trash' ) @transaction.atomic def trash(self, request, pk=None): """ Sent herd to trash """ try: herd = self.queryset.get(id=pk) herd.trash = True herd.save() return Response(status=status.HTTP_200_OK) except APIException as e: return Response(e, status=status.HTTP_204_NO_CONTENT) @action( methods=['post'], detail=True, url_path='delete', url_name='delete', name='delete' ) @transaction.atomic def delete(self, request, pk=None): """ full delete of herd """ try: herd = self.queryset.get(id=pk) herd.delete() return Response(status=status.HTTP_200_OK) except APIException as e: return Response(e, status=status.HTTP_204_NO_CONTENT) @action( methods=['get'], detail=True, url_path='live_stocks', url_name='live_stocks', name='live_stocks' ) def live_stocks(self, request, pk=None): """ list of herd live_stocks""" herd = self.get_object() queryset = herd.live_stock_herd.all() # get herd live_stocks # paginate queryset page = self.paginate_queryset(queryset) if page is not None: serializer = LiveStockSerializer(page, many=True) return self.get_paginated_response(serializer.data) class RancherViewSet(viewsets.ModelViewSet, DynamicSearchMixin): queryset = Rancher.objects.all() serializer_class = RancherSerializer search_fields = [ "ranching_farm", "first_name", "last_name", "mobile", "national_code", "birthdate", "nationality", "address", "province__name", "city__name", ] def list(self, request, *args, **kwargs): """ list of ranchers """ search = self.filter_query(self.queryset.order_by('-modify_date')) # search & filter page = self.paginate_queryset(search) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) @action( methods=['get'], detail=True, url_path='herds', url_name='herds', name='herds' ) def herds_by_rancher(self, request, pk=None): """ list of rancher herds """ rancher = self.get_object() queryset = rancher.herd.all() # get rancher herds # paginate queryset page = self.paginate_queryset(queryset) if page is not None: serializer = HerdSerializer(page, many=True) return self.get_paginated_response(serializer.data)