Skip to content

Commit c9cd47d

Browse files
authored
Merge pull request #2571 from gtech-mulearn/(feat)/copy-reporting
(feat)/copy reporting
2 parents df47227 + 2cd8f3d commit c9cd47d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+15845
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from rest_framework import serializers
2+
3+
from db.task import TaskReport
4+
from utils.utils import DateTimeUtils
5+
from utils.types import ManagementType
6+
7+
class TaskReportSerializer(serializers.ModelSerializer):
8+
reporter = serializers.CharField(source="reporter.fullname")
9+
offender = serializers.CharField(source="offender.fullname")
10+
created_at = serializers.SerializerMethodField()
11+
updated_at = serializers.SerializerMethodField()
12+
13+
class Meta:
14+
model = TaskReport
15+
fields = [
16+
"id",
17+
"reporter",
18+
"offender",
19+
"message_id",
20+
"reason",
21+
"proof_link",
22+
"status",
23+
"created_at",
24+
"updated_at",
25+
]
26+
27+
def get_created_at(self, obj):
28+
return DateTimeUtils.format_datetime(obj.created_at)
29+
30+
def get_updated_at(self, obj):
31+
return DateTimeUtils.format_datetime(obj.updated_at)
32+
33+
34+
class TaskReportUpdateSerializer(serializers.ModelSerializer):
35+
updated_by = serializers.CharField(required=False)
36+
37+
class Meta:
38+
model = TaskReport
39+
fields = ["status", "updated_by"]
40+
41+
def update(self, instance, validated_data):
42+
instance.status = validated_data.get("status", instance.status)
43+
instance.updated_by_id = self.context.get("user_id")
44+
instance.updated_at = DateTimeUtils.get_current_utc_time()
45+
instance.save()
46+
return instance

api/dashboard/task_report/urls.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from django.urls import path
2+
from . import views
3+
4+
urlpatterns = [
5+
path('', views.TaskReportInfoView.as_view()),
6+
path('<str:report_id>/', views.TaskReportInfoView.as_view()),
7+
path('group-by-reporter/', views.TaskReportReporterGroupingView.as_view()),
8+
]

api/dashboard/task_report/views.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
from rest_framework.views import APIView
2+
from django.db.models import Count
3+
4+
from db.task import TaskReport, KarmaActivityLog
5+
from utils.response import CustomResponse
6+
from utils.permission import CustomizePermission, JWTUtils, RoleRequired
7+
from utils.types import RoleType
8+
from . import serializers
9+
10+
class TaskReportInfoView(APIView):
11+
authentication_classes = [CustomizePermission]
12+
13+
@RoleRequired(roles=[RoleType.ADMIN, RoleType.FELLOW])
14+
def get(self, request):
15+
reports = TaskReport.objects.all()
16+
17+
# Filtering
18+
if status := request.query_params.get("status"):
19+
reports = reports.filter(status=status)
20+
21+
serializer = serializers.TaskReportSerializer(reports, many=True)
22+
return CustomResponse(response=serializer.data).get_success_response()
23+
24+
@RoleRequired(roles=[RoleType.ADMIN, RoleType.FELLOW])
25+
def put(self, request, report_id):
26+
report = TaskReport.objects.filter(id=report_id).first()
27+
if not report:
28+
return CustomResponse(general_message="Report not found").get_failure_response()
29+
30+
serializer = serializers.TaskReportUpdateSerializer(
31+
report, data=request.data, context={"user_id": JWTUtils.fetch_user_id(request)}
32+
)
33+
if serializer.is_valid():
34+
serializer.save()
35+
return CustomResponse(general_message="Report status updated successfully").get_success_response()
36+
return CustomResponse(message=serializer.errors).get_failure_response()
37+
38+
39+
class TaskReportTaskGroupingView(APIView):
40+
authentication_classes = [CustomizePermission]
41+
42+
@RoleRequired(roles=[RoleType.ADMIN, RoleType.FELLOW])
43+
def get(self, request):
44+
# 1) How many people reported to each tasks
45+
# Group by message_id
46+
report_counts = (
47+
TaskReport.objects.values("message_id")
48+
.annotate(report_count=Count("id"))
49+
.order_by("-report_count")
50+
)
51+
52+
data = []
53+
for item in report_counts:
54+
res = {
55+
"message_id": item["message_id"],
56+
"report_count": item["report_count"],
57+
"task_hashtag": None
58+
}
59+
# Try to fetch hashtag from KarmaActivityLog
60+
if kal := KarmaActivityLog.objects.filter(task_message_id=item["message_id"]).first():
61+
res["task_hashtag"] = kal.task.hashtag
62+
63+
data.append(res)
64+
65+
return CustomResponse(response=data).get_success_response()
66+
67+
68+
class TaskReportReporterGroupingView(APIView):
69+
authentication_classes = [CustomizePermission]
70+
71+
@RoleRequired(roles=[RoleType.ADMIN, RoleType.FELLOW])
72+
def get(self, request):
73+
# Request #2: "How many tasks were reported by a person" - confusing phrasing
74+
# It could mean "How many reports did User X make" OR "How many times was User Y reported"
75+
# Let's provide both.
76+
77+
# Reports by Reporter
78+
reporters = (
79+
TaskReport.objects.values("reporter__id", "reporter__fullname")
80+
.annotate(report_count=Count("id"))
81+
.order_by("-report_count")
82+
)
83+
84+
# Reports against Offender
85+
offenders = (
86+
TaskReport.objects.values("offender__id", "offender__fullname")
87+
.annotate(report_count=Count("id"))
88+
.order_by("-report_count")
89+
)
90+
91+
return CustomResponse(
92+
response={"reporters": reporters, "offenders": offenders}
93+
).get_success_response()

api/dashboard/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@
2626
path("coupon/", include("api.dashboard.coupon.urls")),
2727
path("projects/", include("api.dashboard.projects.urls")),
2828
path("achievement/", include("api.dashboard.achievement.urls")),
29+
path("task-report/", include("api.dashboard.task_report.urls")),
2930
]

0 commit comments

Comments
 (0)