Exemplo n.º 1
0
def export_sales_summary(sales_summary_report):
    directory = TEMPDIR / utils.make_token_with_timestamp("sales_summary")
    directory.mkdir(parents=True, exist_ok=True)
    logger.info("Will use directory %s", directory)
    sales_summary_file = directory / "sales-summary.csv"
    sales_summary_file.touch(exist_ok=True)
    sales_summary_data = sales_summary_file.open("r+")

    directory = TEMPDIR / utils.make_token_with_timestamp("sales_yearly")
    directory.mkdir(parents=True, exist_ok=True)
    logger.info("Will use directory %s", directory)
    sales_yearly_file = directory / "sales-yearly.csv"
    sales_yearly_file.touch(exist_ok=True)
    sales_yearly_data = sales_yearly_file.open("r+")

    export_sales(sales_summary_data, sales_yearly_data, sales_summary_report)
    exported_files = [sales_summary_file, sales_yearly_file]
    byte_data = BytesIO()
    with zipfile.ZipFile(byte_data, "w") as zip_file:
        for file in exported_files:
            zip_file.write(file, arcname=file.name)

    response = HttpResponse(byte_data.getvalue(),
                            content_type="application/zip")
    response["Content-Disposition"] = "attachment; filename=sales_summary.zip"
    return response
Exemplo n.º 2
0
def export_skus(skus, include_formulas=False, include_product_lines=False):
    """
    Exports a list of SKUs, and optionally ZIP up the formulas if the user requested
    that, too.
    :param request: a HttpRequest instance to obtain the session key (as namespace
        for the exported files)
    :param skus: data to be exported
    :param include_formulas: whether to include the formulas for the SKUs. Note that
        this makes the export a ZIP file rather than a CSV file.
    :return: response containing the exported data, either as a CSV or a ZIP file.
    """
    directory = TEMPDIR / utils.make_token_with_timestamp("skus")
    directory.mkdir(parents=True, exist_ok=True)
    logger.info("Will use directory %s", directory)
    sku_file = directory / FILE_TYPE_TO_FILENAME["skus"]
    sku_file.touch(exist_ok=True)
    sku_data = sku_file.open("r+")
    _export_objs(sku_data, "skus", skus)
    logger.info("Exported %d SKU records", len(skus))
    exported_files = [sku_file]
    if include_formulas:
        formulas = [sku.formula for sku in skus]
        formulas = FormulaIngredient.objects.filter(
            formula__in=formulas).order_by("formula__number")
        formula_file = directory / FILE_TYPE_TO_FILENAME["formulas"]
        formula_file.touch(exist_ok=True)
        formula_data = formula_file.open("r+")
        _export_objs(formula_data, "formulas", formulas)
        exported_files.append(formula_file)
        logger.info("Exported %d Formula records", len(formulas))

    if include_product_lines:
        product_lines = ProductLine.objects.filter(sku__in=skus).distinct()
        product_line_file = directory / FILE_TYPE_TO_FILENAME["product_lines"]
        product_line_file.touch(exist_ok=True)
        product_line_data = product_line_file.open("r+")
        _export_objs(product_line_data, "product_lines", product_lines)
        exported_files.append(product_line_file)
        logger.info("Exported %d Product Line records", len(product_lines))

    logger.info("exported_files is %s", exported_files)
    if len(exported_files) > 1:
        byte_data = BytesIO()
        with zipfile.ZipFile(byte_data, "w") as zip_file:
            for file in exported_files:
                zip_file.write(file, arcname=file.name)

        response = HttpResponse(byte_data.getvalue(),
                                content_type="application/zip")
        response["Content-Disposition"] = "attachment; filename=archive.zip"
    else:
        response = HttpResponse(exported_files[0].open("r").read(),
                                content_type="text/csv")
        response["Content-Disposition"] = "attachment; filename=skus.csv"

    return response
Exemplo n.º 3
0
def export_drilldown(sales):
    """
    Exports a list of sales as a temporary CSV file
    :param sales: the list of sales to be exported
    :return: an HttpResponse containing the exported CSV file
    """
    directory = TEMPDIR / utils.make_token_with_timestamp("sales")
    directory.mkdir(parents=True, exist_ok=True)
    logger.info("Will use directory %s", directory)
    file = directory / FILE_TYPE_TO_FILENAME["sales"]
    file.touch(exist_ok=True)
    logger.info("Will export sales to %s", file)
    data = _export_objs(file.open("r+"), "sales", sales)
    response = HttpResponse(data.read(), content_type="text/csv")
    response["Content-Disposition"] = "attachment; filename=sales.csv"
    return response
Exemplo n.º 4
0
def export_formulas(formulas):
    """
    Exports a list of ingredients as a temporary CSV file
    :param formulas: the list of ingredients to be exported
    :return: an HttpResponse containing the exported CSV file
    """
    directory = TEMPDIR / utils.make_token_with_timestamp("formulas")
    directory.mkdir(parents=True, exist_ok=True)
    logger.info("Will use directory %s", directory)
    formulas = FormulaIngredient.objects.filter(
        formula__in=formulas).order_by("formula__number")
    formula_file = directory / FILE_TYPE_TO_FILENAME["formulas"]
    formula_file.touch(exist_ok=True)
    formula_data = formula_file.open("r+")
    data = _export_objs(formula_data, "formulas", formulas)
    response = HttpResponse(data.read(), content_type="text/csv")
    response["Content-Disposition"] = "attachment; filename=formulas.csv"
    return response
Exemplo n.º 5
0
def generate_ingredient_dependency_report(ingredients):
    directory = TEMPDIR / utils.make_token_with_timestamp("report")
    directory.mkdir(parents=True, exist_ok=True)
    logger.info("Will use directory %s", directory)
    file = directory / "report.csv"
    file.touch(exist_ok=True)
    logger.info("Will write to file %s", file)
    stream = file.open("r+", newline="")
    writer = csv.writer(stream)
    writer.writerow(["Ingr#", "Ingredient Name", "SKU#", "SKU Name"])
    for ingredient in ingredients:
        formulas = FormulaIngredient.objects.filter(ingredient_id=ingredient)
        for formula in formulas:
            skus = Sku.objects.filter(formula=formula.formula)
            for sku in skus:
                writer.writerow(
                    [ingredient.number, ingredient.name, sku.number, sku.name])

    stream.seek(0)
    response = HttpResponse(stream.read())
    response["content_type"] = "text/csv"
    response["Content-Disposition"] = "attachment;filename=report.csv"
    return response