Skip to main content

A Django app to create reports.

Project description

PyPI version Python versions Django versions

Django-библиотека для создания и экспорта отчётов в Excel, Word и PDF форматах с поддержкой шаблонов и гибкой настройкой хранилища (локальное или S3).

Основные возможности

  • 📊 Генерация отчётов - создание Excel, Word и PDF документов

  • 📝 Работа с шаблонами - подстановка данных в готовые шаблоны

  • 🎨 Гибкое форматирование - цвета, стили, объединение ячеек

  • 💾 Два режима хранения - локальное хранилище или Amazon S3

  • Асинхронная генерация - интеграция с Celery

  • 🔄 Обратная совместимость - полная поддержка существующего кода

Установка

Базовая установка

pip install keydev-reports

Установка с поддержкой S3

pip install keydev-reports[s3]

Быстрый старт

  1. Добавьте keydev_reports в INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    'keydev_reports',
]
  1. Примените миграции:

python manage.py migrate
  1. Создайте шаблон отчёта в админке Django (/admin/keydev_reports/reporttemplate/)

Настройка хранилища

Локальное хранилище (по умолчанию)

Без дополнительных настроек файлы сохраняются в MEDIA_ROOT/keydev_reports/requested_reports/:

# settings.py
MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = '/media/'

Хранилище Amazon S3

Шаг 1: Установка зависимостей

pip install keydev-reports[s3]

Шаг 2: Настройка Django

# settings.py

KEYDEV_REPORTS_STORAGE = {
    # Обязательные параметры
    'STORAGE_BACKEND': 's3',
    'S3_BUCKET': 'my-reports-bucket',

    # Опциональные параметры (значения по умолчанию)
    'S3_REGION': 'us-east-1',
    'S3_PREFIX': 'keydev_reports/requested_reports/',
    'S3_TEMPLATE_PREFIX': 'keydev_reports/report_templates',
    'S3_PRESIGNED_URL_EXPIRATION': 3600,  # 1 час

    # AWS credentials (не нужны при использовании IAM ролей)
    'AWS_ACCESS_KEY_ID': 'AKIA...',
    'AWS_SECRET_ACCESS_KEY': 'secret...',
}

Шаг 3: Настройка IAM политики

Минимальные права доступа для S3:

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject",
            "s3:ListBucket"
        ],
        "Resource": [
            "arn:aws:s3:::my-reports-bucket/*",
            "arn:aws:s3:::my-reports-bucket"
        ]
    }]
}

Шаг 4: Автоудаление старых файлов (рекомендуется)

Настройте S3 Lifecycle Policy для автоматической очистки:

{
    "Rules": [{
        "Id": "DeleteOldReports",
        "Status": "Enabled",
        "Prefix": "keydev_reports/requested_reports/",
        "Expiration": {"Days": 7}
    }]
}

Примеры использования

Создание Excel отчёта

from keydev_reports.report_tools import ExcelCreator

# Создание отчёта
report = ExcelCreator()
sheet = report.book.add_worksheet('Sales Report')

# Добавление данных
data = [
    ['Product', 'Sales', 'Revenue'],
    ['Product A', 100, 15000],
    ['Product B', 150, 22500],
]
report.populate_with_add_table(sheet, data, start_row=0)

# Сохранение
report.save_excel()
content = report.get_bytes_io()

Работа с шаблонами Word

from keydev_reports.report_tools import WordEditor

# Загрузка шаблона
editor = WordEditor('template.docx')

# Замена переменных
editor.docx_replace(
    company_name='ACME Corp',
    report_date='2026-01-15',
    total_sales='$45,000'
)

# Добавление таблицы
table_data = [
    ['Item', 'Quantity', 'Price'],
    ['Product A', '10', '$150'],
    ['Product B', '5', '$200'],
]
editor.add_table(table_data)

# Сохранение
editor.save('report.docx')

Использование провайдеров

from keydev_reports.exporter import ReportExporter

# Создание экспортёра
exporter = ReportExporter(
    report_data={'table_data': data, 'title': 'Monthly Report'},
    user_name='john_doe',
    report_name='sales_report',
    extension='xlsx',
    provider_name='AddTableProvider'
)

# Генерация отчёта (путь к файлу или S3 URL)
report_url = exporter.get_report()

Настройка Celery для асинхронной генерации

# tasks.py
from keydev_reports.tasks import get_no_template_report

# Запуск асинхронной задачи
task = get_no_template_report.delay(
    report_data=data,
    user_name='john_doe',
    report_name='sales_report',
    extension='xlsx',
    provider_name='AddTableProvider'
)

# Получение результата
result = task.get()  # Путь к файлу или S3 URL

Параметры конфигурации

KEYDEV_REPORTS_STORAGE

Все параметры конфигурации хранилища:

Параметр

Тип

Описание

STORAGE_BACKEND

str

'local' или 's3' (по умолчанию: 'local')

S3_BUCKET

str

Имя S3 бакета (обязательно для S3)

S3_REGION

str

AWS регион (по умолчанию: 'us-east-1')

S3_PREFIX

str

Префикс пути для отчётов (по умолчанию: 'keydev_reports/requested_reports/')

S3_TEMPLATE_PREFIX

str

Префикс пути для шаблонов (по умолчанию: 'keydev_reports/report_templates')

S3_PRESIGNED_URL_EXPIRATION

int

Время жизни presigned URL в секундах (по умолчанию: 3600)

AWS_ACCESS_KEY_ID

str

AWS Access Key (опционально при использовании IAM ролей)

AWS_SECRET_ACCESS_KEY

str

AWS Secret Key (опционально при использовании IAM ролей)

Миграция между хранилищами

При переключении с локального хранилища на S3 (или наоборот):

  • ✅ Существующие файлы остаются в старом хранилище

  • ✅ Новые файлы создаются в новом хранилище

  • ⚠️ Для миграции существующих файлов необходим собственный скрипт

Использование IAM ролей (EC2/ECS)

При развёртывании на AWS EC2 или ECS можно использовать IAM роли вместо ключей доступа:

# settings.py
KEYDEV_REPORTS_STORAGE = {
    'STORAGE_BACKEND': 's3',
    'S3_BUCKET': 'my-reports-bucket',
    # AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY не нужны
}

Прикрепите IAM роль с необходимыми правами к вашему EC2 инстансу или ECS задаче.

Troubleshooting

Ошибка: “boto3 is required for S3 storage”

Установите зависимости S3: pip install keydev-reports[s3]

Ошибка: “S3 bucket not found”

Проверьте имя бакета в настройках KEYDEV_REPORTS_STORAGE['S3_BUCKET']

Ошибка: “Access denied to S3 bucket”

Проверьте IAM права доступа. Необходимы: s3:PutObject, s3:GetObject, s3:DeleteObject

Presigned URL истекает слишком быстро

Увеличьте S3_PRESIGNED_URL_EXPIRATION в настройках (значение в секундах)

Файлы не удаляются автоматически

Настройте S3 Lifecycle Policy для автоматического удаления старых файлов

Требования

  • Python >= 3.8

  • Django >= 4.1.3

  • openpyxl >= 3.0.10

  • xlsxwriter >= 3.1.9

  • python-docx >= 0.8.11

  • celery

  • boto3 >= 1.26.0 (только для S3)

  • django-storages[s3] >= 1.13.0 (только для S3)

Лицензия

BSD-3-Clause

Поддержка

Если у вас возникли проблемы или есть предложения, создайте issue на GitHub.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

keydev_reports-1.0.2.tar.gz (53.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

keydev_reports-1.0.2-py3-none-any.whl (50.3 kB view details)

Uploaded Python 3

File details

Details for the file keydev_reports-1.0.2.tar.gz.

File metadata

  • Download URL: keydev_reports-1.0.2.tar.gz
  • Upload date:
  • Size: 53.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for keydev_reports-1.0.2.tar.gz
Algorithm Hash digest
SHA256 26fb4127690a823aeaade11e34614540513feb8c9ee03ad5b1c8f0a0a0a1a6e3
MD5 5b40f1ea3fb562a31327bcea6b1891ba
BLAKE2b-256 65461eede4b8b88a432bcfdc327f38d629015d53bca9701a2faef5912408c46c

See more details on using hashes here.

File details

Details for the file keydev_reports-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: keydev_reports-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 50.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for keydev_reports-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c09ecbeb523d0a40c0810b4288d031740f5b343f5da2716657493a852ba6089b
MD5 f6846b637524b6cc20cc5d7b075e3999
BLAKE2b-256 35424e795d974695af6542948e67fa586a56f98fed3567f7492603657c5c81a9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page