iil-doc-templates
Reusable Django document template system — create, edit, fill templates with PDF extraction and LLM prefill.
Installation
pip install iil-doc-templates
With optional dependencies:
pip install iil-doc-templates[pdf] # pdfplumber for PDF extraction
pip install iil-doc-templates[llm] # iil-aifw for LLM prefill
pip install iil-doc-templates[docx] # python-docx for the .docx template import
pip install iil-doc-templates[all] # everything
Quick Start
# settings.py
INSTALLED_APPS = [
...
"doc_templates",
]
# urls.py
path("doc-templates/", include("doc_templates.urls")),
Then run migrations:
python manage.py migrate doc_templates
Features
- DocumentTemplate — Reusable document templates with JSON structure (sections + fields)
- DocumentInstance — Filled-out documents based on templates
- PDF Upload — Extract structure from PDF using
iil-concept-templates - Interactive Editor — Drag & drop sections, CRUD fields, table columns
- LLM Prefill — AI-powered field completion via
iil-aifw - PDF Export — Generate PDF from filled documents via
concept_templates.document_renderer - Multi-Tenant — All queries filter by
tenant_id
Architecture
iil-concept-templates (Pure Python) iil-doc-templates (Django)
├── Pydantic Schemas ├── Django Models
├── PDF Structure Extraction ──► ├── CRUD Views + URLs
├── Analysis, Prefill, Export ├── HTML Templates (6)
└── No Django dependency ├── Admin Integration
└── Uses concept_templates internally
Field Types
| Type | Description |
|---|---|
textarea |
Multi-line text (default) |
text |
Single-line text |
number |
Numeric input |
date |
Date picker |
boolean |
Yes/No toggle |
table |
Table with configurable columns |
URL Patterns
| URL | View | Description |
|---|---|---|
/ |
template-list |
List all templates + instances |
/create/ |
template-create |
Create empty template |
/upload/ |
template-upload |
Create template from PDF |
/<pk>/edit/ |
template-edit |
Interactive template editor |
/<pk>/delete/ |
template-delete |
Delete template |
/<pk>/instance/create/ |
instance-create |
Create document from template |
/instance/<pk>/edit/ |
instance-edit |
Edit document fields |
/instance/<pk>/delete/ |
instance-delete |
Delete document |
/instance/<pk>/prefill/ |
instance-prefill |
LLM prefill endpoint |
/instance/<pk>/pdf/ |
instance-pdf |
PDF export |
Vorlagen-Repository (ADR-042)
Das Modul doc_templates.vorlagen ist das Vorlagen-Repository von SchreibAssist
nach meiki:ADR-042. Die Vorlagen eines Amtes liegen in der Postgres-Datenbank des
Produkts — kein Dateibaum, kein DMS, kein Git-Pfad. Das Paket bringt das Geruest mit
und ausdruecklich keine Hausinhalte: der Weg hinein ist der Upload.
Additiv zum Bestand: DocumentTemplate und DocumentInstance bleiben unveraendert.
Die fuenf Tabellen
| Modell | Haelt | Mandant |
|---|---|---|
Fachbereich |
Einheit eines Hauses als Referenz (schluessel), nicht als Amtstext |
tenant_id |
Vorlage |
die Identitaet einer Vorlage — unique je tenant_id + Fachbereich + schluessel |
tenant_id |
VorlagenVersion |
den Inhalt: text mit {{platzhalter}}, felder, bloecke, qr, Herkunft (quelle_sha256) |
ueber Vorlage |
Feldtabelle |
Seriendruckfeld → Vorlagenfeld, je Haus (Guenzburg PE_ANREDE1, Traunstein ANREDE) |
tenant_id |
VorlagenAudit |
wer wann was — ein Eintrag je Workflow-Uebergang | ueber Vorlage |
Alle mandantentragenden Modelle sind fail-closed (platform:ADR-269):
from doc_templates.vorlagen import tenant_context
from doc_templates.vorlagen.models import Vorlage
Vorlage.objects.all() # [] — ohne Mandant gibt es nichts
Vorlage.objects.for_tenant(4711) # der benannte Weg
with tenant_context(4711):
Vorlage.objects.all() # gefiltert auf 4711
Vorlage.objects.alle_mandanten(grund="Betriebsstatistik") # Begruendung Pflicht
Der Pin
vorlage.freigegebene_version(date(2026, 3, 1))
Genau eine Fassung: die spaeteste mit gueltig_ab <= stichtag, deren Gueltigkeit noch
laeuft. Ein Entwurf zaehlt nie — auch nicht als einzige Fassung. Eine abgeloeste
Fassung zaehlt fuer Stichtage aus ihrer Zeit, damit ein Bescheid von damals erklaerbar
bleibt.
Freigabe-Workflow
Entwurf --einreichen--> Review --freigeben--> Freigegeben --(neue Freigabe)--> Abgeloest
^ |
+----zurueckgeben-------+
from doc_templates.vorlagen.freigabe import einreichen, freigeben, zurueckgeben
einreichen(version, akteur="sb1", begruendung="Upload geprueft")
freigeben(version, akteur="leitung", gueltig_ab=date(2026, 4, 1))
freigeben setzt die bisher freigegebene Fassung auf Abgeloest und traegt ihr
gueltig_bis = gueltig_ab ein — sie wird ersetzt, nicht ueberschrieben. Ein ungueltiger
Uebergang ist ein ValueError, kein stilles No-op; Begruendung ist Pflicht bei
einreichen und zurueckgeben.
Word-Import
from doc_templates.vorlagen.importer import importiere_docx
version = importiere_docx(datei, vorlage, feldtabelle, akteur="sb1") # Status: Entwurf
version.unbekannte_felder # Seriendruckfelder ohne Zuordnung — gemeldet, nie verworfen
version.ist_dublette # True: dieselbe Datei mit derselben Feldliste lag schon vor, keine neue Version
Vier Eigenschaften, die ADR-042 Festlegung 2 tragen ("der Import prueft und lehnt ab"):
- Beide Word-Bauformen eines Seriendruckfeldes werden gelesen —
w:fldSimplemitw:instrund diew:instrText-Folge zwischenw:fldChar-Markierungen. Wer nur eine liest, findet in der Haelfte der Dateien nichts und haelt sie fuer leer. - Unbekanntes wird gemeldet. Ein Feld ohne Eintrag in der Feldtabelle steht in
unbekannte_felderund bleibt im Text als«NAME»sichtbar unaufgeloest. Die Freigabe lehnt eine solche Fassung ab; der Auswegunvollstaendig_zulassen=Truebraucht eine Begruendung und steht im Audit. - Die Vorbelegung wird nicht uebernommen. Word haelt in einem Feld die Anweisung und das zuletzt angezeigte Ergebnis; das Ergebnis stammt aus dem letzten Seriendruck und kann personenbezogen sein.
- Derselbe Upload zweimal erzeugt keine zweite Version — die Identitaet der Datei ist ihr SHA-256, nicht ihr Dateiname.
Eingabefelder (FILLIN, ASK mit REF) sind Felder wie Seriendruckfelder, in
beiden Bauformen. Der Name kommt aus der Aufforderung: ein einzelnes Wort oder der Text
in Anfuehrungszeichen, Leerzeichen zusammengefasst, Schalter wie \d "…", \o und
\* MERGEFORMAT gehoeren nicht dazu. Ohne Aufforderung heisst das Feld
Eingabe#<n> (<vorlage>), gezaehlt in Lesereihenfolge. Bei ASK traegt das REF auf
dessen Textmarke den Wert, das ASK selbst bleibt leer. Andere Felder (PAGE, DATE,
REF auf eine gewoehnliche Textmarke) sind keine Felder der Vorlage.
Tabellen werden zu bloecke ({typ, pos, zeilen}), Bildinhalte ignoriert.
Die Aufloesung ueber die Feldtabelle ist case-insensitiv: dieselbe Vorlage schreibt
denselben Namen mal WG_ADAT, mal wg_adat.
Dependencies
- Required: Django ≥ 5.0, iil-concept-templates ≥ 0.4.0
- Optional: pdfplumber (PDF extraction), iil-aifw (LLM prefill), python-docx (.docx template import)
Metadata
Release files for iil-doc-templates 0.11.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| iil_doc_templates-0.11.3.tar.gz | 94.9 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| iil_doc_templates-0.11.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 174.5 kB
Release files / iil_doc_templates-0.11.3.tar.gz
| Download URL | iil_doc_templates-0.11.3.tar.gz |
|---|---|
| Size | 94.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8e6aebacab1eab2e3cf349d0f4ebaa0243a097a54157e28533af55824a3c6c34
|
|
BLAKE2b-256 checksum How to use checksums |
59236aa9c804d4e328caf1b677d0d91fe4a581284f2add7bfa9c19aadb01a548
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency logRelease files / iil_doc_templates-0.11.3-py3-none-any.whl
| Download URL | iil_doc_templates-0.11.3-py3-none-any.whl |
|---|---|
| Size | 79.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e61b7e28ed6cd0ab9e6dca007772db6b174bef914054e5d074e3aea4c41e5042
|
|
BLAKE2b-256 checksum How to use checksums |
b934f0c5fb6c45d84f548a5e84e4ae8d6a117172a17714958db0517f15b19ee2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency logSecurity for iil-doc-templates 0.11.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for iil_doc_templates-0.11.3.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.