from django.shortcuts import get_object_or_404 from rest_framework import generics, views, parsers, filters from rest_framework.response import Response from django_filters.rest_framework.backends import DjangoFilterBackend from core.apps.finance.models import Income from core.apps.finance.serializers import income as serializers from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.finance.filters.income import IncomeFilter from core.apps.counterparty.models import Counterparty class IncomeListApiView(generics.GenericAPIView): serializer_class = serializers.IncomeListSerializer queryset = Income.objects.select_related( 'cash_transaction', 'payment_type', 'project_folder', 'project', 'counterparty', 'type_income', 'user' ) permission_classes = [HasRolePermission] filter_backends = [DjangoFilterBackend, filters.SearchFilter] filterset_class = IncomeFilter search_fields = [ 'cash_transaction__name', 'payment_type__name', 'project_folder__name', 'project__name', 'counterparty__name', 'type_income__name', 'user__full_name' ] def get(self, request): cash_transaction_ids = request.query_params.getlist('cash_transaction') if cash_transaction_ids: self.queryset = self.queryset.filter(cash_transaction__in=cash_transaction_ids) page = self.paginate_queryset(self.filter_queryset(self.queryset)) if page is not None: serializer = self.serializer_class(page, many=True) return self.get_paginated_response(serializer.data) class IncomeCreateApiView(generics.GenericAPIView): serializer_class = serializers.IncomeCreateSerializer queryset = Income.objects.all() permission_classes = [HasRolePermission] parser_classes = [parsers.FormParser, parsers.MultiPartParser] def post(self, request): ser = self.serializer_class(data=request.data, context={'user': request.user}) if ser.is_valid(raise_exception=True): ser.save() return Response( { 'success': True, 'message': 'income created' }, status=201 ) return Response( { 'success': False, 'message': 'income create failed', 'error': ser.errors, }, status=400 ) class CounterpartyIncomeListApiView(generics.GenericAPIView): permission_classes = [HasRolePermission] queryset = Income.objects.select_related( 'cash_transaction', 'payment_type', 'project_folder', 'project', 'counterparty', 'type_income', 'user' ).exclude(counterparty__isnull=True) serializer_class = serializers.IncomeListSerializer def get(self, request, counterparty_id): counterparty = get_object_or_404(Counterparty, id=counterparty_id) page = self.paginate_queryset(self.queryset.filter(counterparty=counterparty)) if page is not None: ser = self.serializer_class(page, many=True) return self.get_paginated_response(ser.data)