diff --git a/debt/services/debt_services.py b/debt/services/debt_services.py index cfe62be..c23bde5 100644 --- a/debt/services/debt_services.py +++ b/debt/services/debt_services.py @@ -2,6 +2,7 @@ from django.contrib.auth import get_user_model from datetime import timedelta from django.utils import timezone +from django.db.models import Q User = get_user_model() @@ -64,15 +65,22 @@ def toggle_debt_payment(debt_id): raise ValueError("Debt not found") -def get_unpaid_debts_by_week(user_id): +def get_unpaid_debts_by_week(user_id, piggy_id): now = timezone.now() start_of_week = (now - timedelta(days=now.weekday())).replace(hour=0, minute=0, second=0, microsecond=0) start_of_last_week = start_of_week - timedelta(weeks=1) - present_week_debts = Debt.objects.filter(user__user_id=user_id, is_paid=False, created_at__gte=start_of_week) + present_week_debts = Debt.objects.filter( + (Q(user__user_id=user_id) | Q(user__user_id=piggy_id)), is_paid=False, created_at__gte=start_of_week + ) last_week_debts = Debt.objects.filter( - user__user_id=user_id, is_paid=False, created_at__gte=start_of_last_week, created_at__lt=start_of_week + (Q(user__user_id=user_id) | Q(user__user_id=piggy_id)), + is_paid=False, + created_at__gte=start_of_last_week, + created_at__lt=start_of_week, + ) + previous_debts = Debt.objects.filter( + (Q(user__user_id=user_id) | Q(user__user_id=piggy_id)), is_paid=False, created_at__lt=start_of_last_week ) - previous_debts = Debt.objects.filter(user__user_id=user_id, is_paid=False, created_at__lt=start_of_last_week) return present_week_debts, last_week_debts, previous_debts diff --git a/debt/views.py b/debt/views.py index f9166bf..75fcf6c 100644 --- a/debt/views.py +++ b/debt/views.py @@ -77,7 +77,7 @@ def toggle_payment(self, request, debt_id=None): @action(detail=False, methods=["get"], url_path="unpaid-history/(?P[^/.]+)") 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) + present_week_debts, last_week_debts, previous_debts = get_unpaid_debts_by_week(user_id, other_user_id) response_data = { "present_week": UnpaidDebtsHistorySerializer(present_week_debts, many=True).data, diff --git a/piggies/admin.py b/piggies/admin.py index e69de29..6e0202d 100644 --- a/piggies/admin.py +++ b/piggies/admin.py @@ -0,0 +1,20 @@ +from django.contrib import admin +from .models import Piggies + + +@admin.register(Piggies) +class PiggiesAdmin(admin.ModelAdmin): + list_display = ( + "user_first_name", + "piggy_first_name", + ) + + def user_first_name(self, obj): + return obj.username.first_name + + user_first_name.short_description = "User First Name" + + def piggy_first_name(self, obj): + return obj.piggy.first_name + + piggy_first_name.short_description = "Piggy First Name" diff --git a/piggies/views.py b/piggies/views.py index ede7d42..6a0da96 100644 --- a/piggies/views.py +++ b/piggies/views.py @@ -4,35 +4,17 @@ from django.contrib.auth import get_user_model from authentication.decorators import cognito_authenticated +from authentication.utils import get_user_id_from_token from .models import Piggies from .serializers import PiggiesSerializer class PiggiesViewSet(viewsets.ViewSet): - def get_user_id_from_token(self, request): - try: - authorization_header = request.headers.get("Authorization") - if not authorization_header: - raise Exception("Authorization header not found") - - token = authorization_header.split()[1] - decoded_token = jwt.decode(token, options={"verify_signature": False}) - username = decoded_token.get("username") - if not username: - raise Exception("User ID not found in token") - return username - except jwt.DecodeError: - raise Exception("Invalid token") - except jwt.ExpiredSignatureError: - raise Exception("Expired token") - except Exception as e: - raise Exception(f"Error decoding token: {e}") - @cognito_authenticated def list(self, request): try: - username = self.get_user_id_from_token(request) + username = get_user_id_from_token(request) User = get_user_model() users = [{"user_id": str(x.user_id), "first_name": x.first_name} for x in User.objects.all()] @@ -60,46 +42,34 @@ def list(self, request): @cognito_authenticated def create(self, request): try: - username = self.get_user_id_from_token(request) + username = get_user_id_from_token(request) data = request.data.copy() data["username"] = username serializer = PiggiesSerializer(data=data) + if serializer.is_valid(): serializer.save() response = { "username": serializer.data["username"], "piggy": serializer.data["piggy"], } - return Response(data=response, status=status.HTTP_201_CREATED) + + serializer = PiggiesSerializer(data={"username": data["piggy"], "piggy": username}) + + if serializer.is_valid(): + serializer.save() + + return Response(data=response, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) except Exception as e: return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) class NotPiggiesViewSet(viewsets.ViewSet): - def get_user_id_from_token(self, request): - try: - authorization_header = request.headers.get("Authorization") - if not authorization_header: - raise Exception("Authorization header not found") - - token = authorization_header.split()[1] - decoded_token = jwt.decode(token, options={"verify_signature": False}) - username = decoded_token.get("username") - if not username: - raise Exception("User ID not found in token") - return username - except jwt.DecodeError: - raise Exception("Invalid token") - except jwt.ExpiredSignatureError: - raise Exception("Expired token") - except Exception as e: - raise Exception(f"Error decoding token: {e}") - def users(self, request): try: - username = self.get_user_id_from_token(request) + username = get_user_id_from_token(request) User = get_user_model() users = [ {"user_id": str(x.user_id), "first_name": x.first_name, "email": x.email} for x in User.objects.all()