示例#1
0
    def test_get_valid_regional_justification(self):
        with self.settings(REGIONAL_JUSTIFICATION_TIMEOUT_DAYS=None):
            self.job.user.last_login = timezone.now()
            self.downloadable = FileProducingTaskResult.objects.create(
                download_url="http://testserver/media/{0}/file.txt".format(self.run.uid)
            )
            self.task.result = self.downloadable
            self.task.save()

            self.run_zip_file = RunZipFile.objects.create(run=self.run, downloadable_file=self.downloadable)
            self.data_provider_task_records = [self.data_provider_task_record]
            self.run_zip_file.data_provider_task_records.set(self.data_provider_task_records)

            self.region = Region.objects.get(name="Africa")
            policies_example = json.loads(get_example_from_file("examples/policies_example.json"))
            justification_options_example = json.loads(
                get_example_from_file("examples/justification_options_example.json")
            )

            self.regional_policy = RegionalPolicy.objects.create(
                name="Test Policy",
                region=self.region,
                policies=policies_example,
                justification_options=justification_options_example,
                policy_title_text="Policy Title",
                policy_cancel_button_text="Cancel Button",
            )

            self.regional_policy.providers.set([self.provider])

            active_regional_justification = get_valid_regional_justification(self.regional_policy, self.job.user)
            self.assertEqual(active_regional_justification, None)

            regional_justification = RegionalJustification.objects.create(
                justification_id=1,
                justification_name="Test Option",
                regional_policy=self.regional_policy,
                user=self.job.user,
            )

            active_regional_justification = get_valid_regional_justification(self.regional_policy, self.job.user)
            self.assertEqual(active_regional_justification, regional_justification)

            # Update the users last login, the previous regional justification should no longer be active.
            self.job.user.last_login = timezone.now()
            active_regional_justification = get_valid_regional_justification(self.regional_policy, self.job.user)
            self.assertEqual(active_regional_justification, None)

        with self.settings(REGIONAL_JUSTIFICATION_TIMEOUT_DAYS=1):
            # Justification was created within the last day.
            active_regional_justification = get_valid_regional_justification(self.regional_policy, self.job.user)
            self.assertEqual(active_regional_justification, regional_justification)

            # Subtract a day from the created_at date.
            regional_justification.created_at = regional_justification.created_at - datetime.timedelta(days=1)
            regional_justification.save()
            active_regional_justification = get_valid_regional_justification(self.regional_policy, self.job.user)
            self.assertEqual(active_regional_justification, None)
示例#2
0
    def user_can_download(self, user: User):
        """
        Checks to see if the user has all of the required permissions to download the file.  To not make these
        requests slower ideally the downloadable will have already
        select_related("export_task__export_provider_task__provider", "export_task__export_provider_task__run")
        :param user: The user requesting the file.
        :param downloadable: The downloadable file.
        :return:
        """

        jobs = JobPermission.userjobs(user, JobPermissionLevel.READ.value)
        job = jobs.filter(
            runs__data_provider_task_records__tasks__result=self).first()
        providers = []

        if not job:
            return False

        # Check the associated RunZipFile for attribute classes.
        attribute_classes = []
        for run_zip_file in self.runzipfile_set.all():
            for data_provider_task_record in run_zip_file.data_provider_task_records.all(
            ):
                providers.append(data_provider_task_record.provider)
                if data_provider_task_record.provider.attribute_class:
                    attribute_classes.append(
                        data_provider_task_record.provider.attribute_class)

        for attribute_class in attribute_classes:
            if attribute_class and not attribute_class.users.filter(
                    id=user.id):
                return False

        # Get the providers associated with this download if it's not a zipfile.
        if self.export_task.export_provider_task.provider:
            providers.append(self.export_task.export_provider_task.provider)

        # Check to make sure the user has agreed to the regional policy if one exists.
        for policy in RegionalPolicy.objects.filter(
                region__the_geom__intersects=job.the_geom,
                providers__in=providers).prefetch_related("justifications"):
            if not get_valid_regional_justification(policy, user):
                return False

        return True
示例#3
0
def add_restricted_regions_to_config(
    base_config: dict, config: dict, slug: str, user: User = None
) -> Tuple[dict, dict]:
    from eventkit_cloud.jobs.models import DataProvider, RegionalPolicy

    config["sources"]["default"]["coverage"] = {
        "clip": True,
        "difference": [{"bbox": [-180, -90, 180, 90], "srs": "EPSG:4326"}],
    }
    providers = [get_cached_model(model=DataProvider, prop="slug", value=slug)]
    for policy in RegionalPolicy.objects.filter(providers__in=providers).prefetch_related("justifications"):
        # If no user no need to set up regional policy.
        if user and not get_valid_regional_justification(policy, user):
            config["sources"]["default"]["coverage"]["difference"].append(
                {"bbox": GEOSGeometry(policy.region.the_geom).extent, "srs": "EPSG:4326"}
            )
            for current_cache in base_config.get("caches", {}):
                base_config["caches"][current_cache]["disable_storage"] = True

    return base_config, config