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)
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
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