Skip to content

Commit 8bca1cc

Browse files
Merge pull request #33 from Kalgoc/fix/debts-date
Fix/debts date
2 parents 316cb58 + 49507a4 commit 8bca1cc

8 files changed

+89
-16
lines changed

authentication/serializers.py

+6
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ class Meta:
88
fields = ["user_id", "first_name", "phone", "email"]
99

1010

11+
class UserMinimalSerializer(serializers.ModelSerializer):
12+
class Meta:
13+
model = User
14+
fields = ["user_id", "first_name"]
15+
16+
1117
class RegisterSerializer(serializers.Serializer):
1218
name = serializers.CharField(max_length=150)
1319
phone = serializers.CharField(max_length=15)

debt/admin.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
11
from django.contrib import admin
2+
from .models import Debt
23

3-
# Register your models here.
4+
5+
class DebtAdmin(admin.ModelAdmin):
6+
list_display = ("user", "debtor", "amount", "is_paid", "created_at", "updated_at")
7+
list_filter = ("is_paid", "created_at", "updated_at")
8+
search_fields = ("user__username", "debtor__username", "amount")
9+
readonly_fields = ("created_at", "updated_at")
10+
11+
12+
admin.site.register(Debt, DebtAdmin)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Generated by Django 5.0.6 on 2024-07-01 19:04
2+
3+
import django.utils.timezone
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
dependencies = [
9+
("debt", "0001_initial"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="debt",
15+
name="created_at",
16+
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
17+
preserve_default=False,
18+
),
19+
migrations.AddField(
20+
model_name="debt",
21+
name="description",
22+
field=models.CharField(blank=True, max_length=255, null=True),
23+
),
24+
migrations.AddField(
25+
model_name="debt",
26+
name="updated_at",
27+
field=models.DateTimeField(auto_now=True),
28+
),
29+
]

debt/models.py

+3
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@ class Debt(models.Model):
66
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="debts")
77
debtor = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="owed_debts")
88
amount = models.IntegerField()
9+
description = models.CharField(max_length=255, blank=True, null=True)
910
is_paid = models.BooleanField(default=False)
11+
created_at = models.DateTimeField(auto_now_add=True)
12+
updated_at = models.DateTimeField(auto_now=True)

debt/serializers.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from rest_framework import serializers
2-
from authentication.serializers import UserSerializer
2+
from authentication.serializers import UserSerializer, UserMinimalSerializer
33
from .models import Debt
44

55

@@ -16,3 +16,13 @@ class Meta:
1616
class UserDebtSerializer(serializers.Serializer):
1717
user_id = serializers.CharField(read_only=True)
1818
first_name = serializers.CharField(read_only=True)
19+
20+
21+
class UnpaidDebtsHistorySerializer(serializers.ModelSerializer):
22+
user = UserMinimalSerializer(read_only=True)
23+
debtor = UserMinimalSerializer(read_only=True)
24+
25+
class Meta:
26+
model = Debt
27+
fields = ["id", "user", "debtor", "amount", "description", "is_paid", "created_at"]
28+
read_only_fields = ["user", "debtor"]

debt/services/debt_services.py

+12-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from debt.models import Debt
22
from django.contrib.auth import get_user_model
3+
from datetime import timedelta
4+
from django.utils import timezone
35

46
User = get_user_model()
57

@@ -62,11 +64,15 @@ def toggle_debt_payment(debt_id):
6264
raise ValueError("Debt not found")
6365

6466

65-
def get_debt_history(user_id, other_user_id):
66-
user = User.objects.get(user_id=user_id)
67-
other_user = User.objects.get(user_id=other_user_id)
67+
def get_unpaid_debts_by_week(user_id):
68+
now = timezone.now()
69+
start_of_week = (now - timedelta(days=now.weekday())).replace(hour=0, minute=0, second=0, microsecond=0)
70+
start_of_last_week = start_of_week - timedelta(weeks=1)
6871

69-
debts_as_user = Debt.objects.filter(user=user, debtor=other_user)
70-
debts_as_debtor = Debt.objects.filter(user=other_user, debtor=user)
72+
present_week_debts = Debt.objects.filter(user__user_id=user_id, is_paid=False, created_at__gte=start_of_week)
73+
last_week_debts = Debt.objects.filter(
74+
user__user_id=user_id, is_paid=False, created_at__gte=start_of_last_week, created_at__lt=start_of_week
75+
)
76+
previous_debts = Debt.objects.filter(user__user_id=user_id, is_paid=False, created_at__lt=start_of_last_week)
7177

72-
return debts_as_user.union(debts_as_debtor)
78+
return present_week_debts, last_week_debts, previous_debts

debt/urls.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,9 @@
1313
path("balance/<str:other_user_id>/", DebtViewSet.as_view({"get": "balance"}), name="debt-balance"),
1414
path("settle/<str:other_user_id>/", DebtViewSet.as_view({"post": "settle"}), name="debt-settle"),
1515
path("toggle-payment/<str:debt_id>/", DebtViewSet.as_view({"put": "toggle_payment"}), name="debt-toggle-payment"),
16-
path("history/<str:other_user_id>/", DebtViewSet.as_view({"get": "history"}), name="debt-history"),
16+
path(
17+
"unpaid-history/<str:other_user_id>/",
18+
DebtViewSet.as_view({"get": "unpaid_history"}),
19+
name="debt-unpaid-history",
20+
),
1721
]

debt/views.py

+13-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from rest_framework import viewsets
2-
from .serializers import DebtSerializer, UserDebtSerializer
2+
from .serializers import DebtSerializer, UserDebtSerializer, UnpaidDebtsHistorySerializer
33
from .models import Debt
44
from django.contrib.auth import get_user_model
55
from authentication.decorators import cognito_authenticated
@@ -13,7 +13,7 @@
1313
calculate_balance,
1414
settle_debts,
1515
toggle_debt_payment,
16-
get_debt_history,
16+
get_unpaid_debts_by_week,
1717
)
1818

1919
User = get_user_model()
@@ -74,9 +74,15 @@ def toggle_payment(self, request, debt_id=None):
7474
return Response({"error": str(e)}, status=status.HTTP_404_NOT_FOUND)
7575

7676
@cognito_authenticated
77-
@action(detail=False, methods=["get"], url_path="history/(?P<other_user_id>[^/.]+)")
78-
def history(self, request, other_user_id=None):
77+
@action(detail=False, methods=["get"], url_path="unpaid-history/(?P<other_user_id>[^/.]+)")
78+
def unpaid_history(self, request, other_user_id=None):
7979
user_id = get_user_id_from_token(request)
80-
debts = get_debt_history(user_id, other_user_id)
81-
serializer = DebtSerializer(debts, many=True)
82-
return Response(serializer.data, status=status.HTTP_200_OK)
80+
present_week_debts, last_week_debts, previous_debts = get_unpaid_debts_by_week(user_id)
81+
82+
response_data = {
83+
"present_week": UnpaidDebtsHistorySerializer(present_week_debts, many=True).data,
84+
"last_week": UnpaidDebtsHistorySerializer(last_week_debts, many=True).data,
85+
"previous_weeks": UnpaidDebtsHistorySerializer(previous_debts, many=True).data,
86+
}
87+
88+
return Response(response_data, status=status.HTTP_200_OK)

0 commit comments

Comments
 (0)