def download_latest_forecasts(request, pk): """ :return: `latest_forecast_cols_for_project()` output as CSV. for now just does returns a list of the 2-tuples: (Forecast.id, Forecast.source), but later may generalize to allow passing specific columns in `request` """ project = get_object_or_404(Project, pk=pk) if (not request.user.is_authenticated) or not is_user_ok_view_project(request.user, project): return HttpResponseForbidden() response = HttpResponse(content_type='text/csv') csv_filename = get_valid_filename(f"project-{project.name}-latest-forecasts.csv") response['Content-Disposition'] = 'attachment; filename="{}"'.format(str(csv_filename)) # for now just does returns a list of the 2-tuples: (Forecast.id, Forecast.source) rows = latest_forecast_cols_for_project(project, is_incl_fm_id=False, is_incl_tz_id=False, is_incl_issued_at=False, is_incl_created_at=False, is_incl_source=True, is_incl_notes=False) writer = csv.writer(response) writer.writerow(['forecast_id', 'source']) # header # process rows, cleaning up for csv: # - [maybe later] render date and datetime objects as strings: 'issued_at', 'created_at' # - remove \n from free form text: 'source', [maybe later] 'notes' for f_id, source in rows: writer.writerow([f_id, source.replace('\n', '_')]) return response
def forecast_data(request, pk): """ :return: a Forecast's data as JSON - see load_predictions_from_json_io_dict() for the format """ forecast = get_object_or_404(Forecast, pk=pk) if (not request.user.is_authenticated) or \ not is_user_ok_view_project(request.user, forecast.forecast_model.project): return HttpResponseForbidden() return json_response_for_forecast(forecast, request)
def download_truth_data(request, pk): """ :return: the Project's truth data as CSV. note that the actual data is wrapped by metadata """ project = get_object_or_404(Project, pk=pk) if (not request.user.is_authenticated) or not is_user_ok_view_project( request.user, project): return HttpResponseForbidden() return csv_response_for_project_truth_data(project)
def _query_endpoint(request, project_pk, query_validation_fcn, query_job_type, query_worker_fcn): """ `query_forecasts_endpoint()` and `query_scores_endpoint()` helper :param request: a request :param project_pk: a Project's pk :param query_validation_fcn: a function of 2 args (Project and query) that validates the query and returns a 2-tuple: (error_messages, (model_ids, unit_ids, target_ids, timezero_ids, types)) . notice the second element is itself a 5-tuple of validated object IDs. the function is either `validate_forecasts_query` or `validate_scores_query`. there are two cases, which determine the return values: 1) valid query: error_messages is [], and ID lists are valid integers. 2) invalid query: error_messages is a list of strings, and the ID lists are all []. :param query_job_type: is either JOB_TYPE_QUERY_FORECAST or JOB_TYPE_QUERY_SCORES. used for the new Job's `type` :param query_worker_fcn: an enqueue() helper function of one arg (job_pk). the function is either `_forecasts_query_worker` or `_scores_query_worker` :return: the serialized Job """ if request.method != 'POST': return Response(f"Only POST is allowed at this endpoint", status=status.HTTP_405_METHOD_NOT_ALLOWED) # check authorization project = get_object_or_404(Project, pk=project_pk) if (not request.user.is_authenticated) or not is_user_ok_view_project( request.user, project): return HttpResponseForbidden() # validate 'query' if 'query' not in request.data: return JsonResponse({'error': "No 'query' form field."}, status=status.HTTP_400_BAD_REQUEST) query = request.data['query'] logger.debug(f"query_forecasts_endpoint(): query={query}") error_messages, _ = query_validation_fcn(project, query) if error_messages: return JsonResponse( { 'error': f"Invalid query. error_messages='{error_messages}', query={query}" }, status=status.HTTP_400_BAD_REQUEST) job = _create_query_job(project_pk, query, query_job_type, query_worker_fcn, request) job_serializer = JobSerializer(job, context={'request': request}) logger.debug(f"query_forecasts_endpoint(): query enqueued. job={job}") return JsonResponse(job_serializer.data)
def get_queryset(self): return [project for project in Project.objects.all() if is_user_ok_view_project(self.request.user, project)]
def test_func(self): project = self.get_object() return self.request.user.is_authenticated and is_user_ok_view_project(self.request.user, project)
def test_func(self): forecast = self.get_object() return self.request.user.is_authenticated and \ is_user_ok_view_project(self.request.user, forecast.forecast_model.project)
def test_func(self): forecast_model = ForecastModel.objects.get(pk=self.kwargs['pk']) return self.request.user.is_authenticated and is_user_ok_view_project(self.request.user, forecast_model.project)
def test_func(self): project = Project.objects.get(pk=self.kwargs['pk']) return self.request.user.is_authenticated and is_user_ok_view_project(self.request.user, project)