-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathviews.py
88 lines (76 loc) · 3.72 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from rest_framework import viewsets
from .serializers import DebtSerializer, UserDebtSerializer, UnpaidDebtsHistorySerializer
from .models import Debt
from django.contrib.auth import get_user_model
from authentication.decorators import cognito_authenticated
from rest_framework.response import Response
from rest_framework import status
from .services.debt_services import get_user_debts
from rest_framework.decorators import action
from authentication.utils import get_user_id_from_token
from .services.debt_services import (
get_related_users,
calculate_balance,
settle_debts,
toggle_debt_payment,
get_unpaid_debts_by_week,
)
User = get_user_model()
class DebtViewSet(viewsets.ModelViewSet):
queryset = Debt.objects.all()
serializer_class = DebtSerializer
def get_queryset(self):
user_id = get_user_id_from_token(self.request)
user = User.objects.get(user_id=user_id)
return get_user_debts(user)
@cognito_authenticated
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
user = self.request.user
try:
debtor = User.objects.get(user_id=self.request.data["debtor_id"])
serializer.save(user=user, debtor=debtor)
return Response(serializer.data, status=status.HTTP_201_CREATED)
except User.DoesNotExist:
return Response({"error": "Debtor not found."}, status=status.HTTP_400_BAD_REQUEST)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@cognito_authenticated
@action(detail=False, methods=["get"])
def users(self, request, *args, **kwargs):
user_id = get_user_id_from_token(request)
related_users = get_related_users(user_id)
serialized_users = UserDebtSerializer(related_users, many=True)
return Response(serialized_users.data)
@cognito_authenticated
@action(detail=False, methods=["get"], url_path="balance/(?P<other_user_id>[^/.]+)")
def balance(self, request, other_user_id=None):
user_id = get_user_id_from_token(request)
balance = calculate_balance(user_id, other_user_id)
result = {"balance": balance}
return Response(result, status=status.HTTP_200_OK)
@cognito_authenticated
@action(detail=False, methods=["post"], url_path="settle/(?P<other_user_id>[^/.]+)")
def settle(self, request, other_user_id=None):
user_id = get_user_id_from_token(request)
settle_debts(user_id, other_user_id)
return Response({"status": "Debts settled"}, status=status.HTTP_200_OK)
@cognito_authenticated
@action(detail=False, methods=["put"], url_path="toggle-payment/(?P<debt_id>[^/.]+)")
def toggle_payment(self, request, debt_id=None):
try:
debt = toggle_debt_payment(debt_id)
return Response({"is_paid": debt.is_paid}, status=status.HTTP_200_OK)
except ValueError as e:
return Response({"error": str(e)}, status=status.HTTP_404_NOT_FOUND)
@cognito_authenticated
@action(detail=False, methods=["get"], url_path="unpaid-history/(?P<other_user_id>[^/.]+)")
def unpaid_history(self, request, other_user_id=None):
user_id = get_user_id_from_token(request)
present_week_debts, last_week_debts, previous_debts = get_unpaid_debts_by_week(user_id)
response_data = {
"present_week": UnpaidDebtsHistorySerializer(present_week_debts, many=True).data,
"last_week": UnpaidDebtsHistorySerializer(last_week_debts, many=True).data,
"previous_weeks": UnpaidDebtsHistorySerializer(previous_debts, many=True).data,
}
return Response(response_data, status=status.HTTP_200_OK)