Skip to content

Commit c23f2de

Browse files
committed
add get total rebate days per caterer action for long rebate
1 parent 58fe132 commit c23f2de

2 files changed

Lines changed: 75 additions & 20 deletions

File tree

home/admin.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import csv
88

99
from django.contrib import admin
10-
from django.http import HttpResponse
10+
from django.http import HttpRequest, HttpResponse
1111
from import_export.admin import ImportExportMixin, ImportExportModelAdmin
1212

1313
from home.models import (
@@ -49,7 +49,7 @@
4949
UnregisteredStudentResource,
5050
)
5151
from .utils.django_email_server import caterer_mail, long_rebate_query_mail
52-
from .utils.month import fill_periods
52+
from .utils.month import fill_periods, map_periods_to_long_rebate
5353
from .utils.rebate_bills_saver import (
5454
fix_all_bills,
5555
save_long_bill,
@@ -353,7 +353,14 @@ class about_Admin(ImportExportModelAdmin, admin.ModelAdmin):
353353
},
354354
),
355355
)
356-
actions = ["export_as_csv", "disapprove", "approve", "send_mail", "clean"]
356+
actions = [
357+
"export_as_csv",
358+
"disapprove",
359+
"approve",
360+
"send_mail",
361+
"clean",
362+
"get_rebate_days_per_caterer",
363+
]
357364

358365
@admin.action(description="Disapprove the students")
359366
def disapprove(self, request, queryset):
@@ -393,20 +400,13 @@ def send_mail(self, request, queryset):
393400
for obj in queryset:
394401
long_rebate_query_mail(obj.start_date, obj.end_date, obj.email.email)
395402

396-
# @admin.action(description="Clean left long rebate data")
397-
# def clean(self, request, queryset):
398-
# """
399-
# Clean left long rebate data
400-
# """
401-
# for obj in queryset:
402-
# if(obj.approved==True):
403-
# if(obj.end_date>datetime.date(2023,12,7)):
404-
# print(obj.end_date)
405-
# obj.approved=False
406-
# obj.save()
407-
# print(obj.approved)
408-
# obj.approved=True
409-
# obj.save()
403+
@admin.action(description="Get total rebate days per caterer")
404+
def get_rebate_days_per_caterer(self, request, queryset: list[LongRebate]):
405+
longRebates = []
406+
for obj in queryset:
407+
if obj.approved:
408+
longRebates.append(obj)
409+
return map_periods_to_long_rebate(longRebates, request.user)
410410

411411

412412
@admin.register(Rebate)
@@ -454,7 +454,7 @@ class about_Admin(ImportExportModelAdmin, admin.ModelAdmin):
454454
),
455455
)
456456

457-
def get_queryset(self, request):
457+
def get_queryset(self, request: HttpRequest):
458458
qs = super().get_queryset(request)
459459
if request.user.is_superuser:
460460
return qs

home/utils/month.py

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
from datetime import timedelta
1+
import csv
2+
from datetime import date, timedelta
3+
4+
from django.contrib.auth.base_user import AbstractBaseUser
5+
from django.contrib.auth.models import AnonymousUser
6+
from django.db.models import Q
7+
from django.http import HttpResponse
28

39
from ..models.allocation import Allocation, Period
4-
from ..models.students import Student
10+
from ..models.students import LongRebate, Student
511

612

713
def fill_periods(email, start_date, end_date):
@@ -29,3 +35,52 @@ def fill_periods(email, start_date, end_date):
2935
print(f"{period_no}: {days} days")
3036

3137
return days_per_period
38+
39+
40+
def map_periods_to_long_rebate(
41+
longRebate: list[LongRebate], user: AbstractBaseUser | AnonymousUser
42+
):
43+
periods = Period.objects.filter(semester__name="Autumn 2024")
44+
period_to_long_rebate_map = {period.Sno: {} for period in periods}
45+
periods_to_email = {period.Sno: [] for period in periods}
46+
for rebate in longRebate:
47+
for period in periods:
48+
if (
49+
rebate.start_date <= period.end_date
50+
and rebate.end_date > period.start_date
51+
):
52+
start_date: date = max(rebate.start_date, period.start_date)
53+
end_date: date = min(rebate.end_date, period.end_date)
54+
if period_to_long_rebate_map[period.Sno].get(rebate.email) is None:
55+
period_to_long_rebate_map[period.Sno][rebate.email] = 0
56+
period_to_long_rebate_map[period.Sno][rebate.email] += (
57+
end_date - start_date
58+
).days + 1
59+
periods_to_email[period.Sno].append(rebate.email)
60+
61+
response = HttpResponse(content_type="text/csv")
62+
response["Content-Disposition"] = 'attachment; filename="Rebate.csv"'
63+
64+
writer = csv.writer(response)
65+
writer.writerow(["Email", "Period", "caterer", "Days"])
66+
67+
for period_no, emails in periods_to_email.items():
68+
period = periods[period_no - 1]
69+
allocations = Allocation.objects.filter(Q(email__in=emails), period=period)
70+
for allocation in allocations:
71+
if (
72+
not user.is_superuser
73+
and not user.groups.filter(name="College Administration")
74+
and not user.username == allocation.caterer.name
75+
):
76+
continue
77+
writer.writerow(
78+
[
79+
allocation.email,
80+
period_no,
81+
allocation.caterer.name,
82+
period_to_long_rebate_map[period_no][allocation.email],
83+
]
84+
)
85+
86+
return response

0 commit comments

Comments
 (0)