コード例 #1
0
ファイル: tasks.py プロジェクト: Frazerbesa/mspray
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),
        )
コード例 #2
0
    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)
コード例 #3
0
ファイル: test_performance.py プロジェクト: Frazerbesa/mspray
    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)
コード例 #4
0
ファイル: tasks.py プロジェクト: Frazerbesa/mspray
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)
コード例 #5
0
ファイル: test_utils.py プロジェクト: Frazerbesa/mspray
    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,
        )
コード例 #6
0
ファイル: test_performance.py プロジェクト: Frazerbesa/mspray
    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)
コード例 #7
0
ファイル: test_performance.py プロジェクト: Frazerbesa/mspray
    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)
コード例 #8
0
ファイル: test_performance.py プロジェクト: Frazerbesa/mspray
    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)
コード例 #9
0
ファイル: test_performance.py プロジェクト: Frazerbesa/mspray
    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)
コード例 #10
0
 def handle(self, *args, **options):
     for sop in SprayOperator.objects.all():
         performance_report(sop)
コード例 #11
0
    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"]
        )