def update_performance_reports(update_all=True): """ Update performance records updated in the last UPDATE_VISITED_MINUTES minutes. """ from mspray.apps.main.utils import performance_report time_within = UPDATE_VISITED_MINUTES time_since = timezone.now() - timedelta(minutes=time_within + 1) if update_all: submissions = SprayDay.objects.all() else: submissions = SprayDay.objects.filter( Q(created_on__gte=time_since) | Q(modified_on__gte=time_since)) sop_queryset = (SprayDay.objects.filter( Q(created_on__gte=time_since) | Q(modified_on__gte=time_since)).filter( spray_operator__isnull=False).only("spray_operator").distinct( "spray_operator")) for record in sop_queryset: performance_report( record.spray_operator, submissions.filter(spray_operator=record.spray_operator), )
def handle(self, *args, **options): missing_sprayformids = find_missing_performance_report_records() queryset = SprayDay.objects.filter( data__sprayformid__in=missing_sprayformids).distinct( 'spray_operator') for record in queryset_iterator(queryset): performance_report(record.spray_operator)
def test_mda_district_performance(self): """Test district performance view. This is done by confirming the data received in the response context is being aggregated appropriately within the view """ # first we load our test data data_setup() self._load_fixtures() rhc = Location.objects.get(name="Zemba") district = rhc.parent spray_operator = SprayOperator.objects.first() team_leader = TeamLeader.objects.first() spray_operator.team_leader = team_leader spray_operator.rhc = rhc spray_operator.district = rhc.parent spray_operator.save() # next we identify a SprayDay object for the spray operator spray_day = SprayDay.objects.filter(spray_operator=spray_operator) spray_day.update(sprayable=True) # Create performance report objects from the submissions made # by the particular sprayoperator. performance_report(spray_operator) report1 = PerformanceReport.objects.get(spray_operator=spray_operator) report1.found = 7 report1.reported_sprayed = 16 report1.reported_found = 22 report1.district = district report1.save() report2 = PerformanceReport.objects.get(spray_operator=spray_operator) report2.id = None report2.sprayformid = 7658 report2.refused = 6 report2.found = 12 report2.reported_sprayed = 6 report1.district = district report2.save() factory = RequestFactory() request = factory.get("/") view = MDADistrictPerfomanceView.as_view() response = view(request) self.assertEqual(response.status_code, 200) # Query obtains all data for the SprayOperator # including submissions made and passes this to the serializer queryset = Location.performance_queryset('sop_district', None) serializer = MDADistrictPerformanceReportSerializer(queryset, many=True) self.assertEqual(response.context_data["data"], serializer.data)
def sync_performance_reports(): """ Task to find missing performance reports and sync them back in """ from mspray.apps.main.utils import find_missing_performance_report_records from mspray.apps.main.utils import performance_report from mspray.apps.main.utils import queryset_iterator missing_sprayformids = find_missing_performance_report_records() queryset = SprayDay.objects.filter( data__sprayformid__in=missing_sprayformids).distinct("spray_operator") for record in queryset_iterator(queryset): performance_report(record.spray_operator)
def test_spray_operator_performance_report(self): # pylint: disable=C0103 """ Test that performance_report actually updates an existing record. if it receives data for the same spray_operator in the same date """ self._load_fixtures() spray_operator = SprayOperator.objects.first() team_leader = TeamLeader.objects.first() spray_operator.team_leader = team_leader spray_operator.district = team_leader.location spray_operator.save() spray_day = SprayDay.objects.filter(spray_operator=spray_operator) spray_day.update(sprayable=True) # check that the there is no performance report for that spray_operator self.assertEqual( PerformanceReport.objects.filter( spray_operator=spray_operator).count(), 0, ) # test creating a performance report for that spray operator performance_report(spray_operator) self.assertEqual( PerformanceReport.objects.filter( spray_operator=spray_operator).count(), 1, ) # test that the record updates for that particular spray operator spray_day = SprayDay.objects.filter(spray_operator=spray_operator) team_leader = TeamLeader.objects.last() spray_operator.team_leader = team_leader report = performance_report(spray_operator) self.assertEqual(report.team_leader, team_leader) self.assertEqual( PerformanceReport.objects.filter( spray_operator=spray_operator).count(), 1, )
def test_rhc_performance_view(self): """Test RHCPerformanceView.""" # first we load our test data data_setup() self._load_fixtures() rhc = Location.objects.get(name="Zemba") district = rhc.parent spray_operator = SprayOperator.objects.first() team_leader = TeamLeader.objects.first() spray_operator.team_leader = team_leader spray_operator.rhc = rhc spray_operator.district = district spray_operator.save() # next we identify a SprayDay object for the spray operator spray_day = SprayDay.objects.filter(spray_operator=spray_operator) spray_day.update(sprayable=True) # Create performance report objects from the submissions made # by the particular sprayoperator. performance_report(spray_operator) report1 = PerformanceReport.objects.get(spray_operator=spray_operator) report1.found = 7 report1.reported_sprayed = 16 report1.reported_found = 22 report1.district = district report1.save() report2 = PerformanceReport.objects.get(spray_operator=spray_operator) report2.id = None report2.sprayformid = 7658 report2.refused = 6 report2.found = 12 report2.reported_sprayed = 6 report1.district = district report2.save() request = RequestFactory().get("/mda/performance/rhcs/2") view = RHCPerformanceView.as_view() response = view(request, district_id=district.id) self.assertEqual(response.status_code, 200) # Query obtains all data for the SprayOperator # including submissions made and passes this to the serializer queryset = Location.performance_queryset("sop_rhc", district) serializer = RHCPerformanceReportSerializer(queryset, many=True) result = { "custom": {}, "days_worked": 1, "other": 0, "refused": 6, "sprayed": 2, "sprayable": 19, "not_sprayable": 0, "not_eligible": 0, "not_sprayed_total": 6, "data_quality_check": True, "found_difference": 0, "sprayed_difference": 0, "houses": 26, "no_of_days_worked": 2, "avg_structures_per_so": 0.4523809523809524, "avg_start_time": datetime.time(16, 22, 17), "avg_end_time": datetime.time(16, 38, 8), "success_rate": 0.0, } self.assertEqual(response.context_data["totals"], result) self.assertEqual(response.context_data["data"], serializer.data)
def test_mda_spray_operator_daily_view(self): # pylint: disable=C0103 """Test MDASprayOperatorDailyView. This is done by confirming the data received in the response context is being aggregated appropriately within the view """ # first we load our test data data_setup() self._load_fixtures() rhc = Location.objects.get(name="John") spray_operator = SprayOperator.objects.first() team_leader = TeamLeader.objects.first() spray_operator.team_leader = team_leader spray_operator.rhc = rhc spray_operator.district = rhc.parent spray_operator.save() # next we identify a SprayDay object for the spray operator spray_day = SprayDay.objects.filter(spray_operator=spray_operator) spray_day.update(sprayable=True) factory = RequestFactory() request = factory.get("/mda/performance/spray-operators/33/42/daily") view = MDASprayOperatorDailyView.as_view() # Create performance report objects from the submissions made # by the particular sprayoperator. performance_report(spray_operator) report1 = PerformanceReport.objects.get(spray_operator=spray_operator) report1.found = 7 report1.reported_sprayed = 16 report1.reported_found = 22 report1.save() report2 = PerformanceReport.objects.get(spray_operator=spray_operator) report2.id = None report2.sprayformid = 7658 report2.refused = 6 report2.found = 12 report2.reported_sprayed = 6 report2.save() # Query obtains all data for the SprayOperator # including submissions made and passes this to the serializer queryset = PerformanceReport.objects.filter( spray_operator=spray_operator).order_by("spray_date") serializer = PerformanceReportSerializer(queryset, many=True) response = view(request, rhc_id=rhc.id, spray_operator=spray_operator.id) self.assertEqual(response.status_code, 200) result = { "other": 0, "refused": 6, "sprayed": 2, "sprayable": 19, "not_sprayable": 0, "not_sprayed_total": 6, "data_quality_check": False, "found_difference": 25, "sprayed_difference": 20, "avg_start_time": datetime.time(16, 22, 17), "avg_end_time": datetime.time(16, 38, 8), "data": {}, "not_eligible": 0, } self.assertEqual(response.context_data["rhc_name"], "John") self.assertEqual(response.context_data["data"], serializer.data) self.assertEqual(response.context_data["totals"], result)
def test_spray_operator_summary_view(self): # pylint: disable=C0103 """Test SprayOperatorSummaryView. This is done by confirming the data received in the response context is being aggregated appropriately within the view """ # first we load our test data data_setup() self._load_fixtures() rhc = Location.objects.get(name="Chadiza_104") spray_operator = SprayOperator.objects.first() team_leader = TeamLeader.objects.first() spray_operator.team_leader = team_leader spray_operator.rhc = rhc spray_operator.district = rhc.parent spray_operator.save() # update spray day object for the particular spray operator spray_day = SprayDay.objects.filter(spray_operator=spray_operator) spray_day.update(sprayable=True) # Create performance report objects from the submissions made # by the particular sprayoperator. performance_report(spray_operator) report1 = PerformanceReport.objects.get(spray_operator=spray_operator) report1.found = 7 report1.reported_sprayed = 16 report1.reported_found = 22 report1.save() report2 = PerformanceReport.objects.get(spray_operator=spray_operator) report2.id = None report2.sprayformid = 7658 report2.refused = 6 report2.found = 12 report2.reported_sprayed = 6 report2.save() factory = RequestFactory() request = factory.get("/performance/spray-operators/2939/102/summary") view = SprayOperatorSummaryView.as_view() response = view( request, team_leader=spray_operator.team_leader.id, slug=spray_operator.id, ) self.assertEqual(response.status_code, 200) # Query obtains all data for the SprayOperator # including submissions made and passes this to the serializer queryset = SprayOperator.objects.raw( SOP_PERFORMANCE_SQL, [spray_operator.team_leader_assistant.id]) serializer = SprayOperatorPerformanceReportSerializer(queryset, many=True) result = { "other": 0, "refused": 6, "sprayed": 2, "sprayable": 19, "not_sprayable": 0, "not_sprayed_total": 6, "data_quality_check": False, "found_difference": 15, "sprayed_difference": 15, "no_of_days_worked": 2, "avg_structures_per_so": 9.5, "avg_start_time": datetime.time(5, 27, 25, 666667), "avg_end_time": datetime.time(5, 32, 42, 666667), } self.assertEqual(response.context_data["data"], serializer.data) self.assertEqual(response.context_data["totals"], result)
def test_team_leader_performance(self): """Test team leaders performance view.""" data_setup() self._load_fixtures() rhc = Location.objects.get(name="Miti") district = rhc.parent spray_operator = SprayOperator.objects.first() team_leader = TeamLeader.objects.first() spray_operator.team_leader = team_leader spray_operator.rhc = rhc spray_operator.district = rhc.parent spray_operator.save() # next we identify a SprayDay object for the spray operator spray_day = SprayDay.objects.filter(spray_operator=spray_operator) spray_day.update(sprayable=True) # Create performance report objects from the submissions made # by the particular sprayoperator. performance_report(spray_operator) report1 = PerformanceReport.objects.get(spray_operator=spray_operator) report1.found = 7 report1.reported_sprayed = 16 report1.reported_found = 22 report1.district = rhc report1.save() report2 = PerformanceReport.objects.get(spray_operator=spray_operator) report2.id = None report2.sprayformid = 7658 report2.refused = 6 report2.found = 12 report2.reported_sprayed = 6 report1.district = rhc report2.save() request = RequestFactory().get("/performance/team-leaders/458") view = TeamLeadersPerformanceView.as_view() response = view(request, slug=district.id) self.assertEqual(response.status_code, 200) self.assertTrue("Supervisor" in str(response.render().content)) queryset = TeamLeaderAssistant.objects.raw(TLA_PERFORMANCE_SQL, [district.id]) serializer = TLAPerformanceReportSerializer(queryset, many=True) result = { "other": 0, "refused": 6, "sprayed": 2, "sprayable": 19, "not_sprayable": 0, "not_eligible": 0, "not_sprayed_total": 6, "data_quality_check": False, "found_difference": 15, "sprayed_difference": 15, "no_of_days_worked": 2, "avg_structures_per_so": 0.7307692307692307, "avg_start_time": datetime.time(16, 22, 17), "avg_end_time": datetime.time(16, 38, 8), } self.assertEqual(response.context_data["data"], serializer.data) self.assertEqual(response.context_data["totals"], result)
def handle(self, *args, **options): for sop in SprayOperator.objects.all(): performance_report(sop)
def test_rhc_serializer_output(self): """Test RHCPerformanceReportSerializer.""" data_setup() self._load_fixtures() rhc = Location.objects.get(name="Bwanunkha") district = rhc.parent spray_operator = SprayOperator.objects.first() team_leader = TeamLeader.objects.first() spray_operator.team_leader = team_leader spray_operator.rhc = rhc spray_operator.district = district spray_operator.save() household = Household.objects.first() household.sprayable = True household.location = rhc household.save() spray_day = SprayDay.objects.filter(spray_operator=spray_operator) spray_day.update(sprayable=True, household=household) performance_report(spray_operator) report1 = PerformanceReport.objects.get(spray_operator=spray_operator) report1.found = 7 report1.reported_sprayed = 16 report1.reported_found = 22 report1.district = district report1.save() report2 = PerformanceReport.objects.get(spray_operator=spray_operator) report2.id = None report2.sprayformid = 7658 report2.refused = 6 report2.found = 12 report2.reported_sprayed = 6 report1.district = district report2.save() queryset = Location.performance_queryset("sop_rhc", district) serializer_instance = RHCPerformanceReportSerializer( queryset, many=True ) expected_fields = [ "id", "name", "no_of_days_worked", "spray_operator_code", "spray_operator_id", "sprayed", "not_eligible", "location", "refused", "other", "data_quality_check", "sprayable", "found_difference", "sprayed_difference", "avg_start_time", "avg_end_time", "not_sprayed_total", "avg_structures_per_so", "success_rate", "custom", "days_worked", ] self.assertEqual( set(expected_fields), set(list(serializer_instance.data[0].keys())) ) self.assertEqual(rhc.id, serializer_instance.data[0]["id"]) self.assertEqual(19, serializer_instance.data[0]["sprayable"]) self.assertEqual(0, serializer_instance.data[0]["success_rate"]) self.assertEqual(0, serializer_instance.data[0]["sprayed_difference"]) self.assertEqual( 9.5, serializer_instance.data[0]["avg_structures_per_so"] )