Skip to content

Fix/debts date #33

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions authentication/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ class Meta:
fields = ["user_id", "first_name", "phone", "email"]


class UserMinimalSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ["user_id", "first_name"]


class RegisterSerializer(serializers.Serializer):
name = serializers.CharField(max_length=150)
phone = serializers.CharField(max_length=15)
Expand Down
11 changes: 10 additions & 1 deletion debt/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
from django.contrib import admin
from .models import Debt

# Register your models here.

class DebtAdmin(admin.ModelAdmin):
list_display = ("user", "debtor", "amount", "is_paid", "created_at", "updated_at")
list_filter = ("is_paid", "created_at", "updated_at")
search_fields = ("user__username", "debtor__username", "amount")
readonly_fields = ("created_at", "updated_at")


admin.site.register(Debt, DebtAdmin)
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Generated by Django 5.0.6 on 2024-07-01 19:04

import django.utils.timezone
from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("debt", "0001_initial"),
]

operations = [
migrations.AddField(
model_name="debt",
name="created_at",
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AddField(
model_name="debt",
name="description",
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.AddField(
model_name="debt",
name="updated_at",
field=models.DateTimeField(auto_now=True),
),
]
3 changes: 3 additions & 0 deletions debt/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,7 @@ class Debt(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="debts")
debtor = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="owed_debts")
amount = models.IntegerField()
description = models.CharField(max_length=255, blank=True, null=True)
is_paid = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
12 changes: 11 additions & 1 deletion debt/serializers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from rest_framework import serializers
from authentication.serializers import UserSerializer
from authentication.serializers import UserSerializer, UserMinimalSerializer
from .models import Debt


Expand All @@ -16,3 +16,13 @@ class Meta:
class UserDebtSerializer(serializers.Serializer):
user_id = serializers.CharField(read_only=True)
first_name = serializers.CharField(read_only=True)


class UnpaidDebtsHistorySerializer(serializers.ModelSerializer):
user = UserMinimalSerializer(read_only=True)
debtor = UserMinimalSerializer(read_only=True)

class Meta:
model = Debt
fields = ["id", "user", "debtor", "amount", "description", "is_paid", "created_at"]
read_only_fields = ["user", "debtor"]
18 changes: 12 additions & 6 deletions debt/services/debt_services.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from debt.models import Debt
from django.contrib.auth import get_user_model
from datetime import timedelta
from django.utils import timezone

User = get_user_model()

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


def get_debt_history(user_id, other_user_id):
user = User.objects.get(user_id=user_id)
other_user = User.objects.get(user_id=other_user_id)
def get_unpaid_debts_by_week(user_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)

debts_as_user = Debt.objects.filter(user=user, debtor=other_user)
debts_as_debtor = Debt.objects.filter(user=other_user, debtor=user)
present_week_debts = Debt.objects.filter(user__user_id=user_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
)
previous_debts = Debt.objects.filter(user__user_id=user_id, is_paid=False, created_at__lt=start_of_last_week)

return debts_as_user.union(debts_as_debtor)
return present_week_debts, last_week_debts, previous_debts
6 changes: 5 additions & 1 deletion debt/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,9 @@
path("balance/<str:other_user_id>/", DebtViewSet.as_view({"get": "balance"}), name="debt-balance"),
path("settle/<str:other_user_id>/", DebtViewSet.as_view({"post": "settle"}), name="debt-settle"),
path("toggle-payment/<str:debt_id>/", DebtViewSet.as_view({"put": "toggle_payment"}), name="debt-toggle-payment"),
path("history/<str:other_user_id>/", DebtViewSet.as_view({"get": "history"}), name="debt-history"),
path(
"unpaid-history/<str:other_user_id>/",
DebtViewSet.as_view({"get": "unpaid_history"}),
name="debt-unpaid-history",
),
]
20 changes: 13 additions & 7 deletions debt/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from rest_framework import viewsets
from .serializers import DebtSerializer, UserDebtSerializer
from .serializers import DebtSerializer, UserDebtSerializer, UnpaidDebtsHistorySerializer
from .models import Debt
from django.contrib.auth import get_user_model
from authentication.decorators import cognito_authenticated
Expand All @@ -13,7 +13,7 @@
calculate_balance,
settle_debts,
toggle_debt_payment,
get_debt_history,
get_unpaid_debts_by_week,
)

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

@cognito_authenticated
@action(detail=False, methods=["get"], url_path="history/(?P<other_user_id>[^/.]+)")
def history(self, request, other_user_id=None):
@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)
debts = get_debt_history(user_id, other_user_id)
serializer = DebtSerializer(debts, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
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)
Loading