Beispiel #1
0
def _render_report_configs(request, configs, domain, owner_id, couch_user, email, notes=None, attach_excel=False):
    from dimagi.utils.web import get_url_base

    report_outputs = []
    excel_attachments = []
    format = Format.from_format(request.GET.get('format') or Format.XLS_2007)
    for config in configs:
        content, excel_file = config.get_report_content(attach_excel=attach_excel)
        if excel_file:
            excel_attachments.append({
                'title': config.full_name + "." + format.extension,
                'file_obj': excel_file,
                'mimetype': format.mimetype
            })
        report_outputs.append({
            'title': config.full_name,
            'url': config.url,
            'content': content,
            'description': config.description,
        })

    date_range = config.get_date_range()
    return render(request, "reports/report_email.html", {
        "reports": report_outputs,
        "domain": domain,
        "couch_user": owner_id,
        "DNS_name": get_url_base(),
        "owner_name": couch_user.full_name or couch_user.get_email(),
        "email": email,
        "notes": notes,
        "startdate": date_range["startdate"] if date_range else "",
        "enddate": date_range["enddate"] if date_range else "",
    }), excel_attachments
Beispiel #2
0
def _render_report_configs(request, configs, domain, owner_id, couch_user, email, notes=None, attach_excel=False):
    from dimagi.utils.web import get_url_base

    report_outputs = []
    excel_attachments = []
    format = Format.from_format(request.GET.get('format') or Format.XLS_2007)
    for config in configs:
        content, excel_file = config.get_report_content(attach_excel=attach_excel)
        if excel_file:
            excel_attachments.append({
                'title': config.full_name + "." + format.extension,
                'file_obj': excel_file,
                'mimetype': format.mimetype
            })
        report_outputs.append({
            'title': config.full_name,
            'url': config.url,
            'content': content,
            'description': config.description,
        })

    date_range = config.get_date_range()
    return render(request, "reports/report_email.html", {
        "reports": report_outputs,
        "domain": domain,
        "couch_user": owner_id,
        "DNS_name": get_url_base(),
        "owner_name": couch_user.full_name or couch_user.get_email(),
        "email": email,
        "notes": notes,
        "startdate": date_range["startdate"] if date_range else "",
        "enddate": date_range["enddate"] if date_range else "",
    }), excel_attachments
Beispiel #3
0
def export_response(file, format, filename, checkpoint=None):
    """
    Get an http response for an export
    file can be either a io.BytesIO or io.StringIO
    or an open file object (which this function is responsible for closing)

    """
    from couchexport.export import Format
    if not filename:
        filename = "NAMELESS EXPORT"

    format = Format.from_format(format)
    if isinstance(file, TempBase):
        file = file.file

    if isinstance(file, (io.BytesIO, io.StringIO)):
        response = HttpResponse(file.getvalue(), content_type=format.mimetype)
        # I don't know why we need to close the file. Keeping around.
        file.close()
    else:
        response = StreamingHttpResponse(FileWrapper(file), content_type=format.mimetype)

    if format.download:
        from corehq.util.files import safe_filename_header
        response['Content-Disposition'] = safe_filename_header(filename, format.extension)

    if checkpoint:
        response['X-CommCareHQ-Export-Token'] = checkpoint.get_id

    return response
Beispiel #4
0
def export_response(file, format, filename, checkpoint=None):
    """
    Get an http response for an export
    file can be either a StringIO
    or an open file object (which this function is responsible for closing)

    """
    from couchexport.export import Format
    if not filename:
        filename = "NAMELESS EXPORT"

    format = Format.from_format(format)
    if isinstance(file, TempBase):
        file = file.file

    if isinstance(file, StringIO):
        response = HttpResponse(file.getvalue(), content_type=format.mimetype)
        # I don't know why we need to close the file. Keeping around.
        file.close()
    else:
        response = StreamingHttpResponse(FileWrapper(file),
                                         content_type=format.mimetype)

    if format.download:
        from corehq.util.files import safe_filename_header
        response['Content-Disposition'] = safe_filename_header(
            filename, format.extension)

    if checkpoint:
        response['X-CommCareHQ-Export-Token'] = checkpoint.get_id

    return response
Beispiel #5
0
 def get_export_as_http_response(self, request):
     file_ref = self._get_file_ref()
     if file_ref:
         _file = file_ref.get_file_from_blobdb()
         content_format = Format('', 'json', '', True)
         return get_download_response(_file, file_ref.get_file_size(), content_format, self._blob_id(), request)
     else:
         return JsonResponse({"message": "Data is not updated for this month"})
Beispiel #6
0
def download_saved_export(request, export_id):
    export = SavedBasicExport.get(export_id)
    content_type = Format.from_format(export.configuration.format).mimetype
    payload = export.get_payload(stream=True)
    response = StreamingHttpResponse(FileWrapper(payload), content_type=content_type)
    if export.configuration.format != 'html':
        # ht: http://stackoverflow.com/questions/1207457/convert-unicode-to-string-in-python-containing-extra-symbols
        normalized_filename = unicodedata.normalize(
            'NFKD', unicode(export.configuration.filename),
        ).encode('ascii', 'ignore')
        response['Content-Disposition'] = 'attachment; filename="%s"' % normalized_filename
    return response
Beispiel #7
0
 def get_export_as_http_response(self, request):
     file_ref = self._get_file_ref()
     if file_ref:
         _file = file_ref.get_file_from_blobdb()
         content_format = Format('', 'json', '', True)
         return get_download_response(_file, file_ref.get_file_size(), content_format, self._blob_id(), request)
     else:
         from custom.icds_reports.tasks import build_missing_disha_dump
         args = [self.month, self.state_name]
         now = datetime.utcnow()
         if now.hour >= 14:
             # 14 hours should be when much after ICDS agg task would have finished by
             build_missing_disha_dump.delay(*args)
         else:
             build_missing_disha_dump.apply_async(
                 args=args,
                 eta=now.replace(hour=14)
             )
         return JsonResponse({"message": "Data is not updated for this month, please check after 14:00 UTC"})
Beispiel #8
0
def download_cases(request, domain):
    include_closed = json.loads(request.GET.get('include_closed', 'false'))
    try:
        format = Format.from_format(
            request.GET.get('format') or Format.XLS_2007)
    except URLError as e:
        return HttpResponseBadRequest(e.reason)
    group = request.GET.get('group', None)
    user_filter, _ = UserTypeFilter.get_user_filter(request)

    async = request.GET.get('async') == 'true'

    kwargs = {
        'domain': domain,
        'include_closed': include_closed,
        'format': format,
        'group': group,
        'user_filter': user_filter,
    }
    payload_func = SerializableFunction(generate_case_export_payload, **kwargs)
    content_disposition = 'attachment; filename="{domain}_data.{ext}"'.format(
        domain=domain, ext=format.extension)
    mimetype = "%s" % format.mimetype

    def generate_payload(payload_func):
        if async:
            download = DownloadBase()
            a_task = prepare_download.delay(download.download_id, payload_func,
                                            content_disposition, mimetype)
            download.set_task(a_task)
            return download.get_start_response()
        else:
            payload = payload_func()
            response = HttpResponse(payload)
            response['Content-Type'] = mimetype
            response['Content-Disposition'] = content_disposition
            return response

    return generate_payload(payload_func)
Beispiel #9
0
def export_response(file, format, filename, checkpoint=None):
    """
    Get an http response for an export
    file can be either a StringIO
    or an open file object (which this function is responsible for closing)

    """
    from couchexport.export import Format
    if not filename:
        filename = "NAMELESS EXPORT"

    format = Format.from_format(format)
    if isinstance(file, TempBase):
        file = file.file

    if isinstance(file, StringIO):
        response = HttpResponse(file.getvalue(), content_type=format.mimetype)
        # I don't know why we need to close the file. Keeping around.
        file.close()
    else:
        response = StreamingHttpResponse(FileWrapper(file),
                                         content_type=format.mimetype)

    if format.download:
        try:
            filename = unidecode(filename)
        except Exception:
            logging.exception("Error with filename: %r" % filename)
            filename = "data"
        finally:
            response[
                'Content-Disposition'] = 'attachment; filename="{filename}.{format.extension}"'.format(
                    filename=filename, format=format)

    if checkpoint:
        response['X-CommCareHQ-Export-Token'] = checkpoint.get_id

    return response
Beispiel #10
0
def export_response(file, format, filename, checkpoint=None):
    """
    Get an http response for an export
    file can be either a StringIO
    or an open file object (which this function is responsible for closing)

    """
    from couchexport.export import Format
    if not filename:
        filename = "NAMELESS EXPORT"

    format = Format.from_format(format)
    if isinstance(file, TempBase):
        file = file.file

    if isinstance(file, StringIO):
        response = HttpResponse(file.getvalue(), content_type=format.mimetype)
        # I don't know why we need to close the file. Keeping around.
        file.close()
    else:
        response = StreamingHttpResponse(FileWrapper(file), content_type=format.mimetype)

    if format.download:
        try:
            filename = unidecode(filename)
        except Exception:
            logging.exception("Error with filename: %r" % filename)
            filename = "data"
        finally:
            response['Content-Disposition'] = 'attachment; filename="{filename}.{format.extension}"'.format(
                filename=filename,
                format=format
            )

    if checkpoint:
        response['X-CommCareHQ-Export-Token'] = checkpoint.get_id

    return response
Beispiel #11
0
def download_cases(request, domain):
    include_closed = json.loads(request.GET.get('include_closed', 'false'))
    try:
        format = Format.from_format(request.GET.get('format') or Format.XLS_2007)
    except URLError as e:
        return HttpResponseBadRequest(e.reason)
    group = request.GET.get('group', None)
    user_filter, _ = UserTypeFilter.get_user_filter(request)

    async = request.GET.get('async') == 'true'

    kwargs = {
        'domain': domain,
        'include_closed': include_closed,
        'format': format,
        'group': group,
        'user_filter': user_filter,
    }
    payload_func = SerializableFunction(generate_case_export_payload, **kwargs)
    content_disposition = 'attachment; filename="{domain}_data.{ext}"'.format(domain=domain, ext=format.extension)
    mimetype = "%s" % format.mimetype

    def generate_payload(payload_func):
        if async:
            download = DownloadBase()
            a_task = prepare_download.delay(download.download_id, payload_func,
                                            content_disposition, mimetype)
            download.set_task(a_task)
            return download.get_start_response()
        else:
            payload = payload_func()
            response = HttpResponse(payload)
            response['Content-Type'] = mimetype
            response['Content-Disposition'] = content_disposition
            return response

    return generate_payload(payload_func)
Beispiel #12
0
def export_response(file, format, filename, checkpoint=None):
    """
    Get an http response for an export
    """
    from couchexport.export import Format
    if not filename:
        filename = "NAMELESS EXPORT"
        
    format = Format.from_format(format)

    if not format.download:
        # For direct-display formats like HTML and JSON, don't attach the file, just send it directly.
        response = HttpResponse(file.getvalue(), mimetype=format.mimetype)
        if checkpoint:
            response['X-CommCareHQ-Export-Token'] = checkpoint.get_id
        return response


    response = HttpResponse(mimetype=format.mimetype)

    try:
        filename = unidecode(filename)
    except Exception:
        logging.exception("Error with filename: %r" % filename)
        filename = "data"
    finally:
        response['Content-Disposition'] = 'attachment; filename="{filename}.{format.extension}"'.format(
            filename=filename,
            format=format
        )

    if checkpoint:
        response['X-CommCareHQ-Export-Token'] = checkpoint.get_id
    response.write(file.getvalue())
    file.close()
    return response
Beispiel #13
0
def download_cases(request, domain):
    include_closed = json.loads(request.GET.get("include_closed", "false"))
    try:
        format = Format.from_format(request.GET.get("format") or Format.XLS_2007)
    except URLError as e:
        return HttpResponseBadRequest(e.reason)
    group = request.GET.get("group", None)
    user_filter, _ = UserTypeFilter.get_user_filter(request)

    async = request.GET.get("async") == "true"

    kwargs = {
        "domain": domain,
        "include_closed": include_closed,
        "format": format,
        "group": group,
        "user_filter": user_filter,
    }
    payload_func = SerializableFunction(generate_case_export_payload, **kwargs)
    content_disposition = 'attachment; filename="{domain}_data.{ext}"'.format(domain=domain, ext=format.extension)
    mimetype = "%s" % format.mimetype

    def generate_payload(payload_func):
        if async:
            download = DownloadBase()
            a_task = prepare_download.delay(download.download_id, payload_func, content_disposition, mimetype)
            download.set_task(a_task)
            return download.get_start_response()
        else:
            payload = payload_func()
            response = HttpResponse(payload)
            response["Content-Type"] = mimetype
            response["Content-Disposition"] = content_disposition
            return response

    return generate_payload(payload_func)