def test_end_lt_start(self):
        rp_data = {
            'title': 'Test Response Plan',
            'plan_type': 'HRP',
            'start': '2018-01-01',
            'end': '2013-01-01',
            'clusters': [
                CLUSTER_TYPES.cccm,
                CLUSTER_TYPES.nutrition,
            ],
        }

        url = reverse("response-plan-create",
                      kwargs={'workspace_id': self.workspace.id})
        response = self.client.post(url, data=rp_data, format='json')
        self.assertEquals(response.status_code,
                          status.HTTP_400_BAD_REQUEST,
                          msg=response.content)

        # Cluster system admin should also be able to create response plan
        self.admin_user = factories.NonPartnerUserFactory()
        factories.ClusterPRPRoleFactory(
            user=self.admin_user,
            workspace=None,
            cluster=None,
            role=PRP_ROLE_TYPES.cluster_system_admin)
        self.client.force_authenticate(self.admin_user)

        rp_data['title'] += ' 2'
        response = self.client.post(url, data=rp_data, format='json')
        self.assertEquals(response.status_code,
                          status.HTTP_400_BAD_REQUEST,
                          msg=response.content)
    def test_list_api_by_user(self):
        url = reverse('workspace')
        response = self.client.get(url, format='json')

        self.assertEquals(response.status_code, status.HTTP_200_OK)
        self.assertEquals(
            len(response.data),
            Workspace.objects.prefetch_related('locations').filter(
                locations__isnull=False).distinct().count())

        # Cluster system admin should also be able to query workspaces
        self.admin_user = factories.NonPartnerUserFactory()
        factories.ClusterPRPRoleFactory(
            user=self.admin_user,
            workspace=None,
            cluster=None,
            role=PRP_ROLE_TYPES.cluster_system_admin)
        self.client.force_authenticate(self.admin_user)

        url = reverse('workspace')
        response = self.client.get(url, format='json')

        self.assertEquals(response.status_code, status.HTTP_200_OK)
        self.assertEquals(
            len(response.data),
            Workspace.objects.prefetch_related('locations').filter(
                locations__isnull=False).distinct().count())
    def setUp(self):
        self.workspace = factories.WorkspaceFactory()
        self.response_plan = factories.ResponsePlanFactory(workspace=self.workspace)
        self.cluster = factories.ClusterFactory(type='cccm', response_plan=self.response_plan)
        self.carto_table = factories.CartoDBTableFactory()
        self.user = factories.NonPartnerUserFactory()
        self.prp_role = factories.ClusterPRPRoleFactory(user=self.user, workspace=self.workspace, cluster=self.cluster, role=PRP_ROLE_TYPES.cluster_imo)
        self.loc1 = factories.LocationFactory()
        self.loc2 = factories.LocationFactory()
        self.loc1.workspaces.add(self.workspace)
        self.loc2.workspaces.add(self.workspace)

        self.objective = factories.ClusterObjectiveFactory(
            cluster=self.cluster,
            locations=[
                self.loc1,
                self.loc2,
            ]
        )

        self.activity = factories.ClusterActivityFactory(
            cluster_objective=self.objective,
            locations=[
                self.loc1, self.loc2
            ]
        )

        self.partner = factories.PartnerFactory(country_code=faker.country_code())

        self.project = factories.PartnerProjectFactory(
            partner=self.partner,
            clusters=[self.cluster],
            locations=[self.loc1, self.loc2],
        )

        self.p_activity = factories.ClusterActivityPartnerActivityFactory(
            partner=self.partner,
            cluster_activity=self.activity,
        )
        self.project_context = factories.PartnerActivityProjectContextFactory(
            project=self.project,
            activity=self.p_activity,
        )

        self.sample_disaggregation_value_map = {
            "height": ["tall", "medium", "short", "extrashort"],
            "age": ["1-2m", "3-4m", "5-6m", '7-10m', '11-13m', '14-16m'],
            "gender": ["male", "female", "other"],
        }

        # Create the disaggregations and values in the db for all response plans
        # including one for no response plan as well
        for disagg_name, values in self.sample_disaggregation_value_map.items():
            for value in values:
                factories.DisaggregationValueFactory(
                    disaggregation=factories.DisaggregationFactory(name=disagg_name, response_plan=self.response_plan),
                    value=value
                )

        super().setUp()
    def setUp(self):
        self.workspace = factories.WorkspaceFactory()
        self.user = factories.NonPartnerUserFactory()
        self.response_plan = factories.ResponsePlanFactory(
            workspace=self.workspace)
        self.cluster = factories.ClusterFactory(
            type='cccm', response_plan=self.response_plan)
        self.prp_role = factories.ClusterPRPRoleFactory(
            user=self.user,
            workspace=self.workspace,
            cluster=self.cluster,
            role=PRP_ROLE_TYPES.cluster_imo)

        super().setUp()
Ejemplo n.º 5
0
    def test_user_type(self):
        user = factories.PartnerUserFactory()
        self.assertFalse(user.prp_roles.exists())
        self.assertIsNone(user.user_type)

        # partner role
        factories.IPPRPRoleFactory(user=user, workspace=self.workspace)
        self.assertEqual(user.user_type, USER_TYPES.partner)

        # cluster im role
        factories.ClusterPRPRoleFactory(
            user=user,
            workspace=self.workspace,
            role=PRP_ROLE_TYPES.cluster_imo,
        )
        self.assertEqual(user.user_type, USER_TYPES.imo)

        # cluster admin
        factories.ClusterPRPRoleFactory(
            user=user,
            workspace=self.workspace,
            role=PRP_ROLE_TYPES.cluster_system_admin,
        )
        self.assertEqual(user.user_type, USER_TYPES.cluster_admin)
    def setUp(self):

        self.workspace = factories.WorkspaceFactory()
        self.response_plan = factories.ResponsePlanFactory(
            workspace=self.workspace,
            start=beginning_of_this_year,
            end=end_of_this_year,
        )
        self.cluster = factories.ClusterFactory(type='cccm', response_plan=self.response_plan)

        self.carto_table = factories.CartoDBTableFactory()
        self.loc1 = factories.LocationFactory()
        self.loc2 = factories.LocationFactory()
        self.loc1.workspaces.add(self.workspace)
        self.loc2.workspaces.add(self.workspace)
        self.unicef_officer = factories.PersonFactory()
        self.unicef_focal_point = factories.PersonFactory()
        self.partner_focal_point = factories.PersonFactory()
        self.objective = factories.ClusterObjectiveFactory(
            cluster=self.cluster,
            locations=[
                self.loc1,
                self.loc2,
            ]
        )
        self.activity = factories.ClusterActivityFactory(
            cluster_objective=self.objective,
            locations=[
                self.loc1, self.loc2
            ]
        )
        self.partner = factories.PartnerFactory(country_code=faker.country_code(), clusters=[self.cluster, ])
        self.user = factories.NonPartnerUserFactory()
        self.partner_user = factories.PartnerUserFactory(partner=self.partner)
        factories.ClusterPRPRoleFactory(user=self.user, workspace=self.workspace, cluster=self.cluster, role=PRP_ROLE_TYPES.cluster_imo)
        factories.IPPRPRoleFactory(user=self.partner_user, workspace=self.workspace, role=PRP_ROLE_TYPES.ip_authorized_officer)
        factories.IPPRPRoleFactory(user=self.partner_user, workspace=self.workspace, cluster=None, role=PRP_ROLE_TYPES.cluster_member)
        self.project = factories.PartnerProjectFactory(
            partner=self.partner,
            clusters=[self.cluster],
            locations=[self.loc1, self.loc2],
            start_date=datetime.date(today.year, 3, 1),
            end_date=datetime.date(today.year, 10, 25),
        )
        super().setUp()
    def test_list_response_plan(self):
        url = reverse("response-plan",
                      kwargs={'workspace_id': self.workspace.id})
        response = self.client.get(url, format='json')

        self.assertEquals(response.status_code, status.HTTP_200_OK)
        self.assertEquals(len(response.data),
                          self.workspace.response_plans.count())

        # Cluster system admin should also be able to query response plans
        self.admin_user = factories.NonPartnerUserFactory()
        factories.ClusterPRPRoleFactory(
            user=self.admin_user,
            workspace=None,
            cluster=None,
            role=PRP_ROLE_TYPES.cluster_system_admin)
        self.client.force_authenticate(self.admin_user)

        self.assertEquals(response.status_code, status.HTTP_200_OK)
        self.assertEquals(len(response.data),
                          self.workspace.response_plans.count())
    def setUp(self):

        self.workspace = factories.WorkspaceFactory()
        self.response_plan = factories.ResponsePlanFactory(
            workspace=self.workspace,
            start=beginning_of_this_year,
            end=end_of_this_year,
        )
        self.cluster = factories.ClusterFactory(type='cccm', response_plan=self.response_plan)

        self.carto_table = factories.CartoDBTableFactory()
        self.loc1 = factories.LocationFactory()
        self.loc2 = factories.LocationFactory()
        self.loc1.workspaces.add(self.workspace)
        self.loc2.workspaces.add(self.workspace)
        self.unicef_officer = factories.PersonFactory()
        self.unicef_focal_point = factories.PersonFactory()
        self.partner_focal_point = factories.PersonFactory()
        self.objective = factories.ClusterObjectiveFactory(
            cluster=self.cluster,
            locations=[
                self.loc1,
                self.loc2,
            ]
        )
        self.activity = factories.ClusterActivityFactory(
            cluster_objective=self.objective,
            locations=[
                self.loc1, self.loc2
            ]
        )
        self.partner = factories.PartnerFactory(country_code=faker.country_code(), clusters=[self.cluster, ])
        self.user = factories.NonPartnerUserFactory()
        self.partner_user = factories.PartnerUserFactory(partner=self.partner)
        factories.ClusterPRPRoleFactory(user=self.user, workspace=self.workspace, cluster=self.cluster, role=PRP_ROLE_TYPES.cluster_imo)
        factories.IPPRPRoleFactory(user=self.partner_user, workspace=self.workspace, role=PRP_ROLE_TYPES.ip_authorized_officer)
        factories.IPPRPRoleFactory(user=self.partner_user, workspace=self.workspace, cluster=None, role=PRP_ROLE_TYPES.cluster_member)
        self.project = factories.PartnerProjectFactory(
            partner=self.partner,
            clusters=[self.cluster],
            locations=[self.loc1, self.loc2],
        )
        self.p_activity = factories.ClusterActivityPartnerActivityFactory(
            partner=self.partner,
            cluster_activity=self.activity,
        )
        self.project_context = factories.PartnerActivityProjectContextFactory(
            project=self.project,
            activity=self.p_activity,
            start_date=datetime.date(today.year, 3, 1),
            end_date=datetime.date(today.year, 10, 25),
        )
        self.sample_disaggregation_value_map = {
            "height": ["tall", "medium", "short", "extrashort"],
            "age": ["1-2m", "3-4m", "5-6m", '7-10m', '11-13m', '14-16m'],
            "gender": ["male", "female", "other"],
        }

        blueprint = factories.QuantityTypeIndicatorBlueprintFactory(
            unit=IndicatorBlueprint.NUMBER,
            calculation_formula_across_locations=IndicatorBlueprint.SUM,
            calculation_formula_across_periods=IndicatorBlueprint.SUM,
        )
        self.partneractivity_reportable = factories.QuantityReportableToPartnerActivityProjectContextFactory(
            content_object=self.project_context, blueprint=blueprint
        )

        factories.LocationWithReportableLocationGoalFactory(
            location=self.loc1,
            reportable=self.partneractivity_reportable,
        )

        factories.LocationWithReportableLocationGoalFactory(
            location=self.loc2,
            reportable=self.partneractivity_reportable,
        )

        self.pd = factories.ProgrammeDocumentFactory(
            workspace=self.workspace,
            partner=self.partner,
            sections=[factories.SectionFactory(), ],
            unicef_officers=[self.unicef_officer, ],
            unicef_focal_point=[self.unicef_focal_point, ],
            partner_focal_point=[self.partner_focal_point, ]
        )

        for idx in range(2):
            qpr_period = factories.QPRReportingPeriodDatesFactory(programme_document=self.pd)
            factories.ProgressReportFactory(
                start_date=qpr_period.start_date,
                end_date=qpr_period.end_date,
                due_date=qpr_period.due_date,
                report_number=idx + 1,
                report_type=qpr_period.report_type,
                is_final=False,
                programme_document=self.pd,
                submitted_by=self.user,
                submitting_user=self.user,
            )

        for idx in range(6):
            hr_period = factories.HRReportingPeriodDatesFactory(programme_document=self.pd)
            factories.ProgressReportFactory(
                start_date=hr_period.start_date,
                end_date=hr_period.end_date,
                due_date=hr_period.due_date,
                report_number=idx + 1,
                report_type=hr_period.report_type,
                is_final=False,
                programme_document=self.pd,
                submitted_by=self.user,
                submitting_user=self.user,
            )

        self.cp_output = factories.PDResultLinkFactory(
            programme_document=self.pd,
        )
        self.llo = factories.LowerLevelOutputFactory(
            cp_output=self.cp_output,
        )
        self.llo_reportable = factories.QuantityReportableToLowerLevelOutputFactory(
            content_object=self.llo,
            blueprint=factories.QuantityTypeIndicatorBlueprintFactory(
                unit=IndicatorBlueprint.NUMBER,
                calculation_formula_across_locations=IndicatorBlueprint.SUM,
            )
        )

        self.llo_reportable.disaggregations.clear()
        self.partneractivity_reportable.disaggregations.clear()

        # Create the disaggregations and values in the db for all response plans
        # including one for no response plan as well
        for disagg_name, values in self.sample_disaggregation_value_map.items():
            disagg = factories.IPDisaggregationFactory(name=disagg_name)
            cluster_disagg = factories.DisaggregationFactory(name=disagg_name, response_plan=self.response_plan)

            self.llo_reportable.disaggregations.add(disagg)
            self.partneractivity_reportable.disaggregations.add(cluster_disagg)

            for value in values:
                factories.DisaggregationValueFactory(
                    disaggregation=cluster_disagg,
                    value=value
                )
                factories.DisaggregationValueFactory(
                    disaggregation=disagg,
                    value=value
                )

        factories.LocationWithReportableLocationGoalFactory(
            location=self.loc1,
            reportable=self.llo_reportable,
        )

        factories.LocationWithReportableLocationGoalFactory(
            location=self.loc2,
            reportable=self.llo_reportable,
        )

        for _ in range(2):
            factories.ClusterIndicatorReportFactory(
                reportable=self.partneractivity_reportable,
                report_status=INDICATOR_REPORT_STATUS.submitted,
            )

        # Creating Level-3 disaggregation location data for all locations
        generate_3_num_disagg_data(self.partneractivity_reportable, indicator_type="quantity")

        for loc_data in IndicatorLocationData.objects.filter(indicator_report__reportable=self.partneractivity_reportable):
            QuantityIndicatorDisaggregator.post_process(loc_data)

        for pr in self.pd.progress_reports.all():
            factories.ProgressReportIndicatorReportFactory(
                progress_report=pr,
                reportable=self.llo_reportable,
                report_status=INDICATOR_REPORT_STATUS.submitted,
                overall_status=OVERALL_STATUS.met,
            )

        # Creating Level-3 disaggregation location data for all locations
        generate_3_num_disagg_data(self.llo_reportable, indicator_type="quantity")

        for loc_data in IndicatorLocationData.objects.filter(indicator_report__reportable=self.llo_reportable):
            QuantityIndicatorDisaggregator.post_process(loc_data)

        super().setUp()
    def setUp(self):
        self.workspace = factories.WorkspaceFactory()
        self.user = factories.NonPartnerUserFactory()
        self.response_plan = factories.ResponsePlanFactory(
            workspace=self.workspace)
        self.cluster = factories.ClusterFactory(
            type='cccm', response_plan=self.response_plan)
        self.prp_role = factories.ClusterPRPRoleFactory(
            user=self.user,
            workspace=self.workspace,
            cluster=self.cluster,
            role=PRP_ROLE_TYPES.cluster_imo)
        self.carto_table = factories.CartoDBTableFactory()
        self.admin_level = 2
        self.loc1 = factories.LocationFactory(admin_level=self.admin_level)
        self.loc2 = factories.LocationFactory(admin_level=self.admin_level)
        self.loc1.workspaces.add(self.workspace)
        self.loc2.workspaces.add(self.workspace)

        for _ in range(2):
            obj = factories.ClusterObjectiveFactory(cluster=self.cluster,
                                                    locations=[
                                                        self.loc1,
                                                        self.loc2,
                                                    ])

            activity = factories.ClusterActivityFactory(
                cluster_objective=obj, locations=[self.loc1, self.loc2])

            blueprint = factories.QuantityTypeIndicatorBlueprintFactory()
            clusteractivity_reportable = factories.QuantityReportableToClusterActivityFactory(
                content_object=activity, blueprint=blueprint)

            clusteractivity_reportable.disaggregations.clear()

            self.sample_disaggregation_value_map = {
                "height": ["tall", "medium", "short", "extrashort"],
                "age": ["1-2m", "3-4m", "5-6m", '7-10m', '11-13m', '14-16m'],
                "gender": ["male", "female", "other"],
            }

            # Create the disaggregations and values in the db for all response plans
            # including one for no response plan as well
            for disagg_name, values in self.sample_disaggregation_value_map.items(
            ):
                for value in values:
                    factories.DisaggregationValueFactory(
                        disaggregation=factories.DisaggregationFactory(
                            name=disagg_name,
                            response_plan=self.response_plan,
                        ),
                        value=value)

            add_disaggregations_to_reportable(
                clusteractivity_reportable,
                disaggregation_targets=["age", "gender", "height"])

            factories.LocationWithReportableLocationGoalFactory(
                location=self.loc1,
                reportable=clusteractivity_reportable,
            )

            factories.LocationWithReportableLocationGoalFactory(
                location=self.loc2,
                reportable=clusteractivity_reportable,
            )

        super().setUp()
Ejemplo n.º 10
0
    def test_cluster_user_list(self):
        """Test the API response for cluster users.
        """
        # Create some test users for partner
        self.imo_user = factories.NonPartnerUserFactory()
        response_plan = factories.ResponsePlanFactory(workspace=self.workspace)
        cluster = factories.ClusterFactory(response_plan=response_plan)
        factories.ClusterPRPRoleFactory(user=self.imo_user,
                                        workspace=self.workspace,
                                        cluster=cluster,
                                        role=PRP_ROLE_TYPES.cluster_imo)

        # Test API as IMO first
        self.client.force_authenticate(self.imo_user)

        # Create 1 cluster viewer and 1 cluster member with Partner
        NUM_TEST_USERS = 2
        for idx in range(NUM_TEST_USERS):
            if idx == 0:
                user = factories.NonPartnerUserFactory()
                factories.ClusterPRPRoleFactory(
                    user=user,
                    workspace=self.workspace,
                    cluster=cluster,
                    role=PRP_ROLE_TYPES.cluster_viewer)
            else:
                user = factories.PartnerUserFactory(partner=self.partner)
                factories.IPPRPRoleFactory(
                    user=user,
                    workspace=self.workspace,
                    role=PRP_ROLE_TYPES.ip_editor,
                )
                factories.ClusterPRPRoleFactory(
                    user=user,
                    workspace=self.workspace,
                    cluster=cluster,
                    role=PRP_ROLE_TYPES.cluster_member)

        # Test users + IMO user
        response = self.client.get(reverse('users') + '?portal=CLUSTER')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(NUM_TEST_USERS + 1, response.data['count'])

        # Test API as Cluster member
        member_user = User.objects.filter(
            prp_roles__role=PRP_ROLE_TYPES.cluster_member).first()
        self.client.force_authenticate(member_user)

        response = self.client.get(reverse('users') + '?portal=CLUSTER')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(
            User.objects.filter(
                prp_roles__role=PRP_ROLE_TYPES.cluster_member).count(),
            response.data['count'])

        # Test API as Cluster viewer
        viewer_user = User.objects.filter(
            prp_roles__role=PRP_ROLE_TYPES.cluster_viewer).first()
        self.client.force_authenticate(viewer_user)

        response = self.client.get(reverse('users') + '?portal=CLUSTER')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)