|
@@ -1,17 +1,19 @@
|
|
|
|
|
+"""
|
|
|
|
|
+Transaction
|
|
|
|
|
+"""
|
|
|
import coreschema
|
|
import coreschema
|
|
|
|
|
+import coreapi
|
|
|
from django.http import Http404
|
|
from django.http import Http404
|
|
|
from rest_framework import viewsets, mixins
|
|
from rest_framework import viewsets, mixins
|
|
|
-from rest_framework import permissions
|
|
|
|
|
-import coreapi
|
|
|
|
|
|
|
+from django.contrib.auth import get_user_model
|
|
|
from rest_framework.schemas import AutoSchema
|
|
from rest_framework.schemas import AutoSchema
|
|
|
from rest_framework.response import Response
|
|
from rest_framework.response import Response
|
|
|
-from .mixins import TransactionsMixin
|
|
|
|
|
from django.db.models import (Sum, F, Case, FloatField,
|
|
from django.db.models import (Sum, F, Case, FloatField,
|
|
|
When)
|
|
When)
|
|
|
|
|
+from .mixins import TransactionsMixin
|
|
|
from .serializers import (CreateTransactionSerializer,
|
|
from .serializers import (CreateTransactionSerializer,
|
|
|
BalanceByAccountSerializer)
|
|
BalanceByAccountSerializer)
|
|
|
from .models import Transaction
|
|
from .models import Transaction
|
|
|
-from django.contrib.auth import get_user_model
|
|
|
|
|
|
|
|
|
|
User = get_user_model()
|
|
User = get_user_model()
|
|
|
|
|
|
|
@@ -27,19 +29,21 @@ class CustomSchema(AutoSchema):
|
|
|
|
|
|
|
|
Add Manual Fields
|
|
Add Manual Fields
|
|
|
"""
|
|
"""
|
|
|
- super(AutoSchema, self).__init__()
|
|
|
|
|
|
|
+ super().__init__(manual_fields=manual_fields)
|
|
|
self._manual_fields = [
|
|
self._manual_fields = [
|
|
|
coreapi.Field(
|
|
coreapi.Field(
|
|
|
name='date_from',
|
|
name='date_from',
|
|
|
location='query',
|
|
location='query',
|
|
|
required=False,
|
|
required=False,
|
|
|
- schema=coreschema.Integer(title='date_from', description='Date Format: `YYYY-MM-DD`')
|
|
|
|
|
|
|
+ schema=coreschema.Integer(title='date_from',
|
|
|
|
|
+ description='Date Format: `YYYY-MM-DD`')
|
|
|
),
|
|
),
|
|
|
coreapi.Field(
|
|
coreapi.Field(
|
|
|
name='date_to',
|
|
name='date_to',
|
|
|
location='query',
|
|
location='query',
|
|
|
required=False,
|
|
required=False,
|
|
|
- schema=coreschema.Integer(title='date_from', description='Date Format: `YYYY-MM-DD`')
|
|
|
|
|
|
|
+ schema=coreschema.Integer(title='date_from',
|
|
|
|
|
+ description='Date Format: `YYYY-MM-DD`')
|
|
|
)
|
|
)
|
|
|
]
|
|
]
|
|
|
|
|
|
|
@@ -48,7 +52,8 @@ class CustomSchema(AutoSchema):
|
|
|
name='user_id',
|
|
name='user_id',
|
|
|
location='path',
|
|
location='path',
|
|
|
required=True,
|
|
required=True,
|
|
|
- schema=coreschema.Integer(title='user_id', description='A unique integer value identifying this user.')
|
|
|
|
|
|
|
+ schema=coreschema.Integer(title='user_id',
|
|
|
|
|
+ description='A unique integer value identifying this user.')
|
|
|
)
|
|
)
|
|
|
return [field]
|
|
return [field]
|
|
|
|
|
|
|
@@ -113,20 +118,23 @@ class AccountBalanceViewSet(viewsets.ViewSet, TransactionsMixin):
|
|
|
lookup_field = 'user_id'
|
|
lookup_field = 'user_id'
|
|
|
schema = CustomSchema()
|
|
schema = CustomSchema()
|
|
|
|
|
|
|
|
- def retrieve(self, request, format=None, user_id=None, *args, **kwargs):
|
|
|
|
|
|
|
+ def retrieve(self, request, user_id=None, *args, **kwargs):
|
|
|
try:
|
|
try:
|
|
|
self.user = User.objects.get(pk=user_id)
|
|
self.user = User.objects.get(pk=user_id)
|
|
|
except User.DoesNotExist:
|
|
except User.DoesNotExist:
|
|
|
raise Http404
|
|
raise Http404
|
|
|
transactions = self.get_filtered_transactions()
|
|
transactions = self.get_filtered_transactions()
|
|
|
- with_annotations = transactions.values('account').annotate(balance=Sum('amount'),
|
|
|
|
|
- total_inflow=Sum(Case(
|
|
|
|
|
- When(type='inflow', then=F('amount')),
|
|
|
|
|
- output_field=FloatField(),
|
|
|
|
|
- )), total_outflow=Sum(Case(
|
|
|
|
|
- When(type='outflow', then=F('amount')),
|
|
|
|
|
- output_field=FloatField(),
|
|
|
|
|
- )), )
|
|
|
|
|
|
|
+ with_annotations = transactions.values('account').\
|
|
|
|
|
+ annotate(balance=Sum('amount'),
|
|
|
|
|
+ total_inflow=Sum(Case(
|
|
|
|
|
+ When(type='inflow', then=F('amount')),
|
|
|
|
|
+ output_field=FloatField(),
|
|
|
|
|
+ )),
|
|
|
|
|
+ total_outflow=Sum(Case(
|
|
|
|
|
+ When(type='outflow', then=F('amount')),
|
|
|
|
|
+ output_field=FloatField(),
|
|
|
|
|
+ )),
|
|
|
|
|
+ )
|
|
|
serializer = BalanceByAccountSerializer(with_annotations, many=True)
|
|
serializer = BalanceByAccountSerializer(with_annotations, many=True)
|
|
|
return Response(serializer.data)
|
|
return Response(serializer.data)
|
|
|
|
|
|
|
@@ -149,18 +157,18 @@ class CashflowViewSet(viewsets.ViewSet, TransactionsMixin):
|
|
|
permission_classes = []
|
|
permission_classes = []
|
|
|
lookup_field = 'user_id'
|
|
lookup_field = 'user_id'
|
|
|
|
|
|
|
|
- def retrieve(self, request, format=None, user_id=None, *args, **kwargs):
|
|
|
|
|
|
|
+ def retrieve(self, request, user_id=None, *args, **kwargs):
|
|
|
try:
|
|
try:
|
|
|
self.user = User.objects.get(pk=user_id)
|
|
self.user = User.objects.get(pk=user_id)
|
|
|
except User.DoesNotExist:
|
|
except User.DoesNotExist:
|
|
|
raise Http404
|
|
raise Http404
|
|
|
transactions = self.get_filtered_transactions()
|
|
transactions = self.get_filtered_transactions()
|
|
|
inflows_qs = list(
|
|
inflows_qs = list(
|
|
|
- transactions.filter(type='inflow').values('category').annotate(amount=Sum('amount')).values('category',
|
|
|
|
|
- 'amount'))
|
|
|
|
|
|
|
+ transactions.filter(type='inflow').values('category').\
|
|
|
|
|
+ annotate(amount=Sum('amount')).values('category', 'amount'))
|
|
|
outflow_qs = list(
|
|
outflow_qs = list(
|
|
|
- transactions.filter(type='outflow').values('category').annotate(amount=Sum('amount')).values('category',
|
|
|
|
|
- 'amount'))
|
|
|
|
|
|
|
+ transactions.filter(type='outflow').values('category').\
|
|
|
|
|
+ annotate(amount=Sum('amount')).values('category', 'amount'))
|
|
|
inflow = {inf['category']: inf['amount'] for inf in inflows_qs}
|
|
inflow = {inf['category']: inf['amount'] for inf in inflows_qs}
|
|
|
outflow = {outf['category']: outf['amount'] for outf in outflow_qs}
|
|
outflow = {outf['category']: outf['amount'] for outf in outflow_qs}
|
|
|
return Response({'inflow': inflow, 'outflow': outflow})
|
|
return Response({'inflow': inflow, 'outflow': outflow})
|