1
1
from rest_framework import viewsets , status
2
2
from rest_framework .response import Response
3
-
4
- # from .models import Expense
5
3
from .models import Expense
6
4
from user_expense_type .models import UserExpenseType
7
5
from categories .models import Category
10
8
import jwt
11
9
from django .db .models import Sum
12
10
from django .utils .timezone import now
11
+ from authentication .utils import get_user_id_from_token
12
+ from expenses .services .categorize_expense import categorize_expense_description
13
13
14
14
15
15
class ExpenseViewSet (viewsets .ViewSet ):
@@ -35,11 +35,9 @@ def get_user_id_from_token(self, request):
35
35
@cognito_authenticated
36
36
def list (self , request ):
37
37
try :
38
- username = self . get_user_id_from_token (request )
38
+ username = get_user_id_from_token (request )
39
39
expenses = Expense .objects .filter (username = username )
40
40
serializer = ExpenseSerializer (expenses , many = True )
41
- for ser in serializer .data :
42
- ser .pop ("username" )
43
41
return Response (serializer .data )
44
42
except Expense .DoesNotExist :
45
43
return Response ({"error" : "Expenses not found" }, status = status .HTTP_404_NOT_FOUND )
@@ -49,16 +47,10 @@ def list(self, request):
49
47
@cognito_authenticated
50
48
def retrieve (self , request , pk = None ):
51
49
try :
52
- username = self . get_user_id_from_token (request )
50
+ username = get_user_id_from_token (request )
53
51
expense = Expense .objects .get (id = pk , username = username )
54
52
serializer = ExpenseSerializer (expense )
55
- response = {
56
- "user_expense_type" : serializer .data ["user_expense_type" ],
57
- "category" : serializer .data ["category" ],
58
- "bankcard_id" : serializer .data ["bankcard_id" ],
59
- "amount" : serializer .data ["amount" ],
60
- }
61
- return Response (data = response )
53
+ return Response (serializer .data )
62
54
except Expense .DoesNotExist :
63
55
return Response ({"error" : "Expense not found" }, status = status .HTTP_404_NOT_FOUND )
64
56
except Exception as e :
@@ -67,28 +59,26 @@ def retrieve(self, request, pk=None):
67
59
@cognito_authenticated
68
60
def create (self , request ):
69
61
try :
70
- username = self . get_user_id_from_token (request )
62
+ username = get_user_id_from_token (request )
71
63
data = request .data .copy ()
72
64
data ["username" ] = username
73
65
66
+ data , error_response = categorize_expense_description (data )
67
+ if error_response :
68
+ return error_response
69
+
74
70
serializer = ExpenseSerializer (data = data )
75
71
if serializer .is_valid ():
76
72
serializer .save ()
77
- response = {
78
- "user_expense_type" : serializer .data ["user_expense_type" ],
79
- "category" : serializer .data ["category" ],
80
- "bankcard_id" : serializer .data ["bankcard_id" ],
81
- "amount" : serializer .data ["amount" ],
82
- }
83
- return Response (data = response , status = status .HTTP_201_CREATED )
73
+ return Response (serializer .data , status = status .HTTP_201_CREATED )
84
74
return Response (serializer .errors , status = status .HTTP_400_BAD_REQUEST )
85
75
except Exception as e :
86
76
return Response ({"error" : str (e )}, status = status .HTTP_500_INTERNAL_SERVER_ERROR )
87
77
88
78
@cognito_authenticated
89
79
def destroy (self , request , pk = None ):
90
80
try :
91
- username = self . get_user_id_from_token (request )
81
+ username = get_user_id_from_token (request )
92
82
expense = Expense .objects .get (id = pk , username = username )
93
83
expense .delete ()
94
84
return Response (status = status .HTTP_204_NO_CONTENT )
@@ -100,49 +90,24 @@ def destroy(self, request, pk=None):
100
90
@cognito_authenticated
101
91
def partial_update (self , request , pk = None ):
102
92
try :
103
- username = self . get_user_id_from_token (request )
93
+ username = get_user_id_from_token (request )
104
94
expense = Expense .objects .get (id = pk , username = username )
105
95
serializer = ExpenseSerializer (expense , data = request .data , partial = True )
106
- if serializer .is_valid ():
107
- serializer .save ()
108
- response = {
109
- "user_expense_type" : serializer .data ["user_expense_type" ],
110
- "category" : serializer .data ["category" ],
111
- "bankcard_id" : serializer .data ["bankcard_id" ],
112
- "amount" : serializer .data ["amount" ],
113
- }
114
- return Response (data = response )
115
- return Response (serializer .errors , status = status .HTTP_400_BAD_REQUEST )
96
+ serializer .is_valid (raise_exception = True )
97
+ serializer .save ()
98
+ return Response (serializer .data , status = status .HTTP_200_OK )
99
+
116
100
except Expense .DoesNotExist :
117
101
return Response ({"error" : "Expense not found" }, status = status .HTTP_404_NOT_FOUND )
118
102
except Exception as e :
119
103
return Response ({"error" : str (e )}, status = status .HTTP_500_INTERNAL_SERVER_ERROR )
120
104
121
105
122
106
class ExpenseGroupedByTypeAndCategoryViewSet (viewsets .ViewSet ):
123
- def get_user_id_from_token (self , request ):
124
- try :
125
- authorization_header = request .headers .get ("Authorization" )
126
- if not authorization_header :
127
- raise Exception ("Authorization header not found" )
128
-
129
- token = authorization_header .split ()[1 ]
130
- decoded_token = jwt .decode (token , options = {"verify_signature" : False })
131
- username = decoded_token .get ("username" )
132
- if not username :
133
- raise Exception ("User ID not found in token" )
134
- return username
135
- except jwt .DecodeError :
136
- raise Exception ("Invalid token" )
137
- except jwt .ExpiredSignatureError :
138
- raise Exception ("Expired token" )
139
- except Exception as e :
140
- raise Exception (f"Error decoding token: { e } " )
141
-
142
107
@cognito_authenticated
143
108
def list (self , request ):
144
109
try :
145
- username = self . get_user_id_from_token (request )
110
+ username = get_user_id_from_token (request )
146
111
expenses_grouped = {}
147
112
today = now ()
148
113
expenses = (
0 commit comments