Metadata-Version: 2.4
Name: xladmin-import-export
Version: 0.1.1
Summary: Optional import/export extension for xladmin backend.
Author: Artasov
License-Expression: MIT
Project-URL: Homepage, https://github.com/Artasov/xladmin/tree/main/xladmin-backend/xladmin-import-export
Project-URL: Repository, https://github.com/Artasov/xladmin
Project-URL: Issues, https://github.com/Artasov/xladmin/issues
Requires-Python: >=3.12
Description-Content-Type: text/markdown
Requires-Dist: fastapi<1.0.0,>=0.115.0
Requires-Dist: openpyxl<4.0.0,>=3.1.0
Requires-Dist: python-multipart<1.0.0,>=0.0.20
Requires-Dist: xladmin<1.0.0,>=0.2.8
Provides-Extra: test
Requires-Dist: aiosqlite>=0.20.0; extra == "test"
Requires-Dist: asyncpg>=0.30.0; extra == "test"
Requires-Dist: httpx>=0.28.0; extra == "test"
Requires-Dist: pytest>=8.0.0; extra == "test"
Requires-Dist: pytest-asyncio>=1.0.0; extra == "test"
Provides-Extra: dev
Requires-Dist: aiosqlite>=0.20.0; extra == "dev"
Requires-Dist: asyncpg>=0.30.0; extra == "dev"
Requires-Dist: build>=1.2.2; extra == "dev"
Requires-Dist: httpx>=0.28.0; extra == "dev"
Requires-Dist: mypy>=1.11.0; extra == "dev"
Requires-Dist: pytest>=8.0.0; extra == "dev"
Requires-Dist: pytest-asyncio>=1.0.0; extra == "dev"
Requires-Dist: ruff>=0.11.0; extra == "dev"
Requires-Dist: twine>=6.1.0; extra == "dev"

<div align="center">
  <a href="./README.md">
    <img src="https://img.shields.io/badge/English-blue?style=for-the-badge" alt="English">
  </a>
  <a href="./docs/README.ru.md">
    <img src="https://img.shields.io/badge/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9-red?style=for-the-badge" alt="Русский">
  </a>
</div>

# xladmin-import-export backend

Optional backend extension for `xladmin` that adds import/export endpoints.

## Features

- export `json`, `csv`, `xlsx`
- import `json`, `csv`, `xlsx`
- export custom readable fields, including your custom `list_display` fields
- import validation before commit
- PK conflict modes: `auto_generate_pk`, `update_existing`, `skip_existing`
- UUID primary key auto-generation on import

## Install

```bash
pip install xladmin xladmin-import-export
```

## Minimal Example

```python
from fastapi import APIRouter
from xladmin import AdminHTTPConfig, create_admin_router
from xladmin_import_export import ImportExportConfig, create_import_export_router

router = APIRouter()
router.include_router(create_admin_router(http_config))
router.include_router(create_import_export_router(http_config))

user_model = ModelConfig(
    model=UserORM, slug="users",
    import_export=ImportExportConfig(),
)

# OR

user_model = ModelConfig(
    model=UserORM, slug="users",
    import_export=ImportExportConfig(
        export_fields=("id", "email", "roles"),
        import_fields=("id", "email", "roles"),
    ),
)
```

## Endpoints

- `GET /xladmin/models/{slug}/import-export/meta/`
- `POST /xladmin/models/{slug}/export/`
- `POST /xladmin/models/{slug}/import/validate/`
- `POST /xladmin/models/{slug}/import/commit/`

## Development

```bash
cd xladmin-backend/xladmin-import-export
uv sync --extra dev
uv run pytest -q
uv run ruff check .
uv run mypy
uv run python -m build
```
