From dca64e5e07695145a66d87ec4d866178f9b157c1 Mon Sep 17 00:00:00 2001 From: Sravan Reddy Date: Wed, 9 Oct 2024 22:17:22 +0530 Subject: [PATCH] include submission time slot in opportunity API --- .../tests/test_receiver_integration.py | 15 +++------------ .../opportunity/api/serializers.py | 19 +++++++++++++++++++ .../opportunity/tests/factories.py | 4 +++- .../opportunity/tests/test_api_views.py | 4 ++++ 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/commcare_connect/form_receiver/tests/test_receiver_integration.py b/commcare_connect/form_receiver/tests/test_receiver_integration.py index c52af2a5..908fa0df 100644 --- a/commcare_connect/form_receiver/tests/test_receiver_integration.py +++ b/commcare_connect/form_receiver/tests/test_receiver_integration.py @@ -464,12 +464,9 @@ def test_reciever_verification_flags_form_submission( user_with_connectid_link: User, api_client: APIClient, opportunity: Opportunity ): verification_flags = OpportunityVerificationFlags.objects.get(opportunity=opportunity) - verification_flags.form_submission_start = datetime.time(hour=10, minute=0) - verification_flags.form_submission_end = datetime.time(hour=12, minute=0) - verification_flags.save() form_json = _create_opp_and_form_json(opportunity, user=user_with_connectid_link) - time = datetime.datetime(2024, 4, 17, 10, 0, 0) + time = datetime.datetime(2024, 4, 17, verification_flags.form_submission_start.hour, 0, 0) form_json["metadata"]["timeStart"] = time form_json["metadata"]["timeEnd"] = time + datetime.timedelta(minutes=10) make_request(api_client, form_json, user_with_connectid_link) @@ -481,12 +478,9 @@ def test_reciever_verification_flags_form_submission_start( user_with_connectid_link: User, api_client: APIClient, opportunity: Opportunity ): verification_flags = OpportunityVerificationFlags.objects.get(opportunity=opportunity) - verification_flags.form_submission_start = datetime.time(hour=10, minute=0) - verification_flags.form_submission_end = datetime.time(hour=12, minute=0) - verification_flags.save() form_json = _create_opp_and_form_json(opportunity, user=user_with_connectid_link) - time = datetime.datetime(2024, 4, 17, 9, 0, 0) + time = datetime.datetime(2024, 4, 17, verification_flags.form_submission_start.hour - 1, 0, 0) form_json["metadata"]["timeStart"] = time make_request(api_client, form_json, user_with_connectid_link) visit = UserVisit.objects.get(user=user_with_connectid_link) @@ -498,12 +492,9 @@ def test_reciever_verification_flags_form_submission_end( user_with_connectid_link: User, api_client: APIClient, opportunity: Opportunity ): verification_flags = OpportunityVerificationFlags.objects.get(opportunity=opportunity) - verification_flags.form_submission_start = datetime.time(hour=10, minute=0) - verification_flags.form_submission_end = datetime.time(hour=12, minute=0) - verification_flags.save() form_json = _create_opp_and_form_json(opportunity, user=user_with_connectid_link) - time = datetime.datetime(2024, 4, 17, 13, 0, 0) + time = datetime.datetime(2024, 4, 17, verification_flags.form_submission_end.hour + 1, 0, 0) form_json["metadata"]["timeStart"] = time make_request(api_client, form_json, user_with_connectid_link) visit = UserVisit.objects.get(user=user_with_connectid_link) diff --git a/commcare_connect/opportunity/api/serializers.py b/commcare_connect/opportunity/api/serializers.py index bf558935..cbeafe7d 100644 --- a/commcare_connect/opportunity/api/serializers.py +++ b/commcare_connect/opportunity/api/serializers.py @@ -1,3 +1,5 @@ +from functools import lru_cache + from django.conf import settings from django.db.models import Sum from rest_framework import serializers @@ -15,6 +17,7 @@ OpportunityAccess, OpportunityClaim, OpportunityClaimLimit, + OpportunityVerificationFlags, Payment, PaymentUnit, UserVisit, @@ -105,6 +108,8 @@ class OpportunitySerializer(serializers.ModelSerializer): payment_units = serializers.SerializerMethodField() is_user_suspended = serializers.SerializerMethodField() catchment_areas = serializers.SerializerMethodField() + start_time_threshold = serializers.SerializerMethodField() + end_time_threshold = serializers.SerializerMethodField() class Meta: model = Opportunity @@ -133,6 +138,8 @@ class Meta: "payment_units", "is_user_suspended", "catchment_areas", + "start_time_threshold", + "end_time_threshold", ] def get_claim(self, obj): @@ -178,6 +185,18 @@ def get_catchment_areas(self, obj): catchments = CatchmentArea.objects.filter(opportunity_access=opp_access) return CatchmentAreaSerializer(catchments, many=True).data + @lru_cache + def _get_flags(self, obj): + return OpportunityVerificationFlags.objects.filter(opportunity=obj).first() + + def get_start_time_threshold(self, obj): + flags = self._get_flags(obj) + return flags.form_submission_start + + def get_end_time_threshold(self, obj): + flags = self._get_flags(obj) + return flags.form_submission_end + @quickcache(vary_on=["user.pk", "opportunity.pk"], timeout=60 * 60) def _get_opp_access(user, opportunity): diff --git a/commcare_connect/opportunity/tests/factories.py b/commcare_connect/opportunity/tests/factories.py index daa64837..1d7bf83a 100644 --- a/commcare_connect/opportunity/tests/factories.py +++ b/commcare_connect/opportunity/tests/factories.py @@ -1,4 +1,4 @@ -from datetime import timezone +from datetime import time, timezone from factory import DictFactory, Faker, LazyAttribute, SelfAttribute, SubFactory from factory.django import DjangoModelFactory @@ -72,6 +72,8 @@ class Meta: class OpportunityVerificationFlagsFactory(DjangoModelFactory): opportunity = SubFactory(OpportunityFactory) + form_submission_start = time(10, 0, 0) + form_submission_end = time(12, 0, 0) class Meta: model = "opportunity.OpportunityVerificationFlags" diff --git a/commcare_connect/opportunity/tests/test_api_views.py b/commcare_connect/opportunity/tests/test_api_views.py index e7d26a88..c574c934 100644 --- a/commcare_connect/opportunity/tests/test_api_views.py +++ b/commcare_connect/opportunity/tests/test_api_views.py @@ -15,6 +15,7 @@ OpportunityAccess, OpportunityClaim, OpportunityClaimLimit, + OpportunityVerificationFlags, Payment, VisitValidationStatus, ) @@ -160,6 +161,9 @@ def test_opportunity_list_endpoint( assert response.data[0]["budget_per_visit"] == max([pu.amount for pu in payment_units]) claim_limits = OpportunityClaimLimit.objects.filter(opportunity_claim__opportunity_access__opportunity=opportunity) assert response.data[0]["claim"]["max_payments"] == sum([cl.max_visits for cl in claim_limits]) + verification_flags = OpportunityVerificationFlags.objects.get(opportunity=opportunity) + assert response.data[0]["start_time_threshold"] == verification_flags.form_submission_start + assert response.data[0]["end_time_threshold"] == verification_flags.form_submission_end def test_delivery_progress_endpoint(