Пример #1
0
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
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
 def get_queryset(self):
     return [project for project in Project.objects.all() if is_user_ok_view_project(self.request.user, project)]
Пример #6
0
 def test_func(self):
     project = self.get_object()
     return self.request.user.is_authenticated and is_user_ok_view_project(self.request.user, project)
Пример #7
0
 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)
Пример #8
0
 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)
Пример #9
0
 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)