Skip to content

Commit 6b077d3

Browse files
Merge pull request #3112 from ResearchHub/user_id_for_dashboard
Temporary User ID parameter for funding dashboards
2 parents 06ddbcb + fe59254 commit 6b077d3

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

src/purchase/services/overview_mixin.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
"""Shared query helpers for overview services."""
21
from purchase.models import Purchase
32
from purchase.related_models.usd_fundraise_contribution_model import UsdFundraiseContribution
43
from purchase.utils import rsc_and_cents_to_usd

src/purchase/views/fundraise_view.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,21 @@
1919
from purchase.services.funding_impact_service import FundingImpactService
2020
from purchase.services.funding_overview_service import FundingOverviewService
2121
from referral.services.referral_bonus_service import ReferralBonusService
22+
from user.models import User
2223
from user.permissions import IsModerator
2324
from user.related_models.follow_model import Follow
2425

26+
#Temporary function for testing different user data, will be removed before release
27+
def _resolve_target_user(request) -> User | None:
28+
"""Return the user specified by ?user_id, falling back to the requester."""
29+
user_id = request.query_params.get("user_id")
30+
if user_id:
31+
try:
32+
return User.objects.get(id=user_id)
33+
except User.DoesNotExist:
34+
return None
35+
return request.user
36+
2537

2638
class FundraiseViewSet(viewsets.ModelViewSet):
2739
queryset = Fundraise.objects.all()
@@ -302,14 +314,20 @@ def close(self, request, *args, **kwargs):
302314

303315
@action(detail=False, methods=["get"], permission_classes=[IsAuthenticated])
304316
def funding_overview(self, request, *args, **kwargs):
305-
"""Return funding overview metrics for the authenticated user."""
306-
data = self.funding_overview_service.get_funding_overview(request.user)
317+
"""Return funding overview metrics. Accepts optional ?user_id param."""
318+
user = _resolve_target_user(request)
319+
if user is None:
320+
return Response({"error": "User not found"}, status=404)
321+
data = self.funding_overview_service.get_funding_overview(user)
307322
serializer = FundingOverviewSerializer(data)
308323
return Response(serializer.data)
309324

310325
@action(detail=False, methods=["get"], permission_classes=[IsAuthenticated])
311326
def funding_impact(self, request, *args, **kwargs):
312-
"""Return funding impact metrics for the authenticated user."""
313-
data = self.funding_impact_service.get_funding_impact_overview(request.user)
327+
"""Return funding impact metrics. Accepts optional ?user_id param."""
328+
user = _resolve_target_user(request)
329+
if user is None:
330+
return Response({"error": "User not found"}, status=404)
331+
data = self.funding_impact_service.get_funding_impact_overview(user)
314332
serializer = FundingImpactSerializer(data)
315333
return Response(serializer.data)

src/purchase/views/grant_view.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,20 @@
1111
from purchase.services.funding_overview_service import GrantOverviewService
1212
from researchhub_document.related_models.constants.document_type import PREREGISTRATION
1313
from researchhub_document.related_models.researchhub_post_model import ResearchhubPost
14+
from user.models import User
1415
from user.permissions import IsModerator
1516

17+
#Temporary function for testing different user data, will be removed before release
18+
def _resolve_target_user(request) -> User | None:
19+
"""Return the user specified by ?user_id, falling back to the requester."""
20+
user_id = request.query_params.get("user_id")
21+
if user_id:
22+
try:
23+
return User.objects.get(id=user_id)
24+
except User.DoesNotExist:
25+
return None
26+
return request.user
27+
1628

1729
class GrantViewSet(viewsets.ModelViewSet):
1830
queryset = Grant.objects.all()
@@ -202,11 +214,14 @@ def application(self, request, pk=None):
202214

203215
@action(detail=True, methods=["get"], permission_classes=[IsAuthenticated])
204216
def overview(self, request, pk=None, *args, **kwargs):
205-
"""Return dashboard metrics for a grant, looked up by its post ID."""
217+
"""Return dashboard metrics for a grant. Accepts optional ?user_id param."""
206218
grant = Grant.objects.filter(unified_document__posts__id=pk).first()
207219
if not grant:
208220
return Response(status=404)
209-
data = self.grant_overview_service.get_grant_overview(request.user, grant)
221+
user = _resolve_target_user(request)
222+
if user is None:
223+
return Response({"error": "User not found"}, status=404)
224+
data = self.grant_overview_service.get_grant_overview(user, grant)
210225
serializer = GrantOverviewSerializer(data)
211226
return Response(serializer.data)
212227

0 commit comments

Comments
 (0)