Metadata-Version: 2.4
Name: integreat-cms
Version: 2026.8.4rc0
Summary: Content Management System for the Integreat App
Author-email: Tür an Tür – Digitalfabrik gGmbH <tech@integreat-app.de>
License-Expression: Apache-2.0
Project-URL: Homepage, https://integreat-app.de/en/
Project-URL: Source Code, https://github.com/digitalfabrik/integreat-cms
Project-URL: Issues, https://github.com/digitalfabrik/integreat-cms/issues
Project-URL: Release Notes, https://digitalfabrik.github.io/integreat-cms/release-notes.html
Project-URL: Documentation, https://digitalfabrik.github.io/integreat-cms/
Project-URL: Funding, https://integreat-app.de/en/donation/
Keywords: integreat,cms,django,e-government,newcomers,refugees,multilingual
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Framework :: Django :: 5.2
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: Natural Language :: English
Classifier: Natural Language :: German
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Content Management System
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
Requires-Python: <3.14,>=3.13
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: NOTICE.md
Requires-Dist: aiohttp
Requires-Dist: argon2-cffi
Requires-Dist: bcrypt
Requires-Dist: cairosvg
Requires-Dist: celery
Requires-Dist: cffi
Requires-Dist: deepl
Requires-Dist: django-cacheops
Requires-Dist: django-celery
Requires-Dist: django-cors-headers
Requires-Dist: django-db-mutex
Requires-Dist: django-debug-toolbar
Requires-Dist: django-import-export
Requires-Dist: django-pgtrigger
Requires-Dist: django-polymorphic
Requires-Dist: django-redis
Requires-Dist: django-treebeard
Requires-Dist: django-webpack-loader
Requires-Dist: django-widget-tweaks
Requires-Dist: Django<6.0,>=5.2
Requires-Dist: feedparser
Requires-Dist: geopy
Requires-Dist: google-auth
Requires-Dist: google-cloud-translate
Requires-Dist: gunicorn
Requires-Dist: icalendar
Requires-Dist: idna
Requires-Dist: integreat-django-linkcheck
Requires-Dist: ipython
Requires-Dist: jsonschema
Requires-Dist: lxml-html-clean
Requires-Dist: lxml
Requires-Dist: natsort
Requires-Dist: Pillow
Requires-Dist: psycopg[binary]
Requires-Dist: pyotp
Requires-Dist: python-dateutil
Requires-Dist: python-magic
Requires-Dist: pyyaml
Requires-Dist: qrcode
Requires-Dist: reportlab
Requires-Dist: requests
Requires-Dist: rules
Requires-Dist: shortcodes
Requires-Dist: six
Requires-Dist: uvicorn
Requires-Dist: webauthn
Requires-Dist: xhtml2pdf
Provides-Extra: dev
Requires-Dist: build; extra == "dev"
Requires-Dist: bumpver; extra == "dev"
Requires-Dist: debugpy; extra == "dev"
Requires-Dist: djlint; extra == "dev"
Requires-Dist: freezegun; extra == "dev"
Requires-Dist: mypy; extra == "dev"
Requires-Dist: myst-parser; extra == "dev"
Requires-Dist: pre-commit; extra == "dev"
Requires-Dist: pyjwt; extra == "dev"
Requires-Dist: pytest-cov; extra == "dev"
Requires-Dist: pytest-django; extra == "dev"
Requires-Dist: pytest-httpserver; extra == "dev"
Requires-Dist: pytest-icdiff; extra == "dev"
Requires-Dist: pytest-order; extra == "dev"
Requires-Dist: pytest-testmon; extra == "dev"
Requires-Dist: pytest-xdist; extra == "dev"
Requires-Dist: requests-mock; extra == "dev"
Requires-Dist: ruff; extra == "dev"
Requires-Dist: shellcheck-py; extra == "dev"
Requires-Dist: sphinx-last-updated-by-git; extra == "dev"
Requires-Dist: sphinx-rtd-theme; extra == "dev"
Requires-Dist: sphinx; extra == "dev"
Requires-Dist: sphinxcontrib-django; extra == "dev"
Requires-Dist: twine; extra == "dev"
Requires-Dist: types-python-dateutil; extra == "dev"
Requires-Dist: types-PyYAML; extra == "dev"
Requires-Dist: types-requests; extra == "dev"
Provides-Extra: pinned
Requires-Dist: aiohappyeyeballs==2.7.1; extra == "pinned"
Requires-Dist: aiohttp==3.14.1; extra == "pinned"
Requires-Dist: aiosignal==1.4.0; extra == "pinned"
Requires-Dist: amqp==5.3.1; extra == "pinned"
Requires-Dist: arabic-reshaper==3.0.1; extra == "pinned"
Requires-Dist: argon2-cffi-bindings==25.1.0; extra == "pinned"
Requires-Dist: argon2-cffi==25.1.0; extra == "pinned"
Requires-Dist: asgiref==3.11.1; extra == "pinned"
Requires-Dist: asn1crypto==1.5.1; extra == "pinned"
Requires-Dist: asttokens==3.0.1; extra == "pinned"
Requires-Dist: attrs==26.1.0; extra == "pinned"
Requires-Dist: bcrypt==5.0.0; extra == "pinned"
Requires-Dist: billiard==4.2.4; extra == "pinned"
Requires-Dist: cairocffi==1.7.1; extra == "pinned"
Requires-Dist: CairoSVG==2.9.0; extra == "pinned"
Requires-Dist: cbor2==6.1.3; extra == "pinned"
Requires-Dist: celery==5.6.3; extra == "pinned"
Requires-Dist: certifi==2026.6.17; extra == "pinned"
Requires-Dist: cffi==2.1.0; extra == "pinned"
Requires-Dist: charset-normalizer==3.4.9; extra == "pinned"
Requires-Dist: click-didyoumean==0.3.1; extra == "pinned"
Requires-Dist: click-plugins==1.1.1.2; extra == "pinned"
Requires-Dist: click-repl==0.3.0; extra == "pinned"
Requires-Dist: click==8.4.2; extra == "pinned"
Requires-Dist: cryptography==49.0.0; extra == "pinned"
Requires-Dist: cssselect2==0.9.0; extra == "pinned"
Requires-Dist: decorator==5.3.1; extra == "pinned"
Requires-Dist: deepl==1.30.0; extra == "pinned"
Requires-Dist: defusedxml==0.7.1; extra == "pinned"
Requires-Dist: diff-match-patch==20241021; extra == "pinned"
Requires-Dist: django-cacheops==7.2; extra == "pinned"
Requires-Dist: django-celery==3.1.17; extra == "pinned"
Requires-Dist: django-cors-headers==4.9.0; extra == "pinned"
Requires-Dist: django-db-mutex==3.1.0; extra == "pinned"
Requires-Dist: django-debug-toolbar==7.0.0; extra == "pinned"
Requires-Dist: django-import-export==4.4.1; extra == "pinned"
Requires-Dist: django-pgtrigger==4.17.0; extra == "pinned"
Requires-Dist: django-polymorphic==4.11.6; extra == "pinned"
Requires-Dist: django-redis==7.0.0; extra == "pinned"
Requires-Dist: django-treebeard==5.3.0; extra == "pinned"
Requires-Dist: django-webpack-loader==3.2.4; extra == "pinned"
Requires-Dist: django-widget-tweaks==1.5.1; extra == "pinned"
Requires-Dist: Django==5.2.16; extra == "pinned"
Requires-Dist: executing==2.2.1; extra == "pinned"
Requires-Dist: feedparser==6.0.12; extra == "pinned"
Requires-Dist: frozenlist==1.8.0; extra == "pinned"
Requires-Dist: funcy==2.0; extra == "pinned"
Requires-Dist: geographiclib==2.1; extra == "pinned"
Requires-Dist: geopy==2.4.1; extra == "pinned"
Requires-Dist: google-api-core==2.31.0; extra == "pinned"
Requires-Dist: google-auth==2.55.2; extra == "pinned"
Requires-Dist: google-cloud-core==2.6.0; extra == "pinned"
Requires-Dist: google-cloud-translate==3.27.0; extra == "pinned"
Requires-Dist: googleapis-common-protos==1.75.0; extra == "pinned"
Requires-Dist: grpc-google-iam-v1==0.14.4; extra == "pinned"
Requires-Dist: grpcio-status==1.82.1; extra == "pinned"
Requires-Dist: grpcio==1.82.1; extra == "pinned"
Requires-Dist: gunicorn==26.0.0; extra == "pinned"
Requires-Dist: h11==0.16.0; extra == "pinned"
Requires-Dist: html5lib==1.1; extra == "pinned"
Requires-Dist: icalendar==7.2.0; extra == "pinned"
Requires-Dist: idna==3.18; extra == "pinned"
Requires-Dist: integreat-django-linkcheck==2.4.5; extra == "pinned"
Requires-Dist: ipython_pygments_lexers==1.1.1; extra == "pinned"
Requires-Dist: ipython==9.15.0; extra == "pinned"
Requires-Dist: jedi==0.20.0; extra == "pinned"
Requires-Dist: jsonschema-specifications==2025.9.1; extra == "pinned"
Requires-Dist: jsonschema==4.26.0; extra == "pinned"
Requires-Dist: kombu==5.6.2; extra == "pinned"
Requires-Dist: lxml_html_clean==0.4.5; extra == "pinned"
Requires-Dist: lxml==6.1.1; extra == "pinned"
Requires-Dist: matplotlib-inline==0.2.2; extra == "pinned"
Requires-Dist: multidict==6.7.1; extra == "pinned"
Requires-Dist: natsort==8.4.0; extra == "pinned"
Requires-Dist: oscrypto==1.3.0; extra == "pinned"
Requires-Dist: packaging==26.2; extra == "pinned"
Requires-Dist: parso==0.8.7; extra == "pinned"
Requires-Dist: pexpect==4.9.0; extra == "pinned"
Requires-Dist: pillow==12.3.0; extra == "pinned"
Requires-Dist: pip==26.1.2; extra == "pinned"
Requires-Dist: prompt_toolkit==3.0.52; extra == "pinned"
Requires-Dist: propcache==0.5.2; extra == "pinned"
Requires-Dist: proto-plus==1.28.1; extra == "pinned"
Requires-Dist: protobuf==7.35.1; extra == "pinned"
Requires-Dist: psutil==7.2.2; extra == "pinned"
Requires-Dist: psycopg-binary==3.3.4; extra == "pinned"
Requires-Dist: psycopg==3.3.4; extra == "pinned"
Requires-Dist: ptyprocess==0.7.0; extra == "pinned"
Requires-Dist: pure_eval==0.2.3; extra == "pinned"
Requires-Dist: pyasn1_modules==0.4.2; extra == "pinned"
Requires-Dist: pyasn1==0.6.4; extra == "pinned"
Requires-Dist: pycparser==3.0; extra == "pinned"
Requires-Dist: Pygments==2.20.0; extra == "pinned"
Requires-Dist: pyhanko-certvalidator==0.31.1; extra == "pinned"
Requires-Dist: pyHanko==0.35.2; extra == "pinned"
Requires-Dist: pyOpenSSL==26.3.0; extra == "pinned"
Requires-Dist: PyOTP==2.10.0; extra == "pinned"
Requires-Dist: pypdf==6.14.2; extra == "pinned"
Requires-Dist: python-bidi==0.6.11; extra == "pinned"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "pinned"
Requires-Dist: python-magic==0.4.27; extra == "pinned"
Requires-Dist: PyYAML==6.0.3; extra == "pinned"
Requires-Dist: qrcode==8.2; extra == "pinned"
Requires-Dist: redis==8.0.1; extra == "pinned"
Requires-Dist: referencing==0.37.0; extra == "pinned"
Requires-Dist: reportlab==4.5.1; extra == "pinned"
Requires-Dist: requests==2.34.2; extra == "pinned"
Requires-Dist: rpds-py==2026.6.3; extra == "pinned"
Requires-Dist: rules==3.5; extra == "pinned"
Requires-Dist: sgmllib3k==1.0.0; extra == "pinned"
Requires-Dist: shortcodes==5.4.0; extra == "pinned"
Requires-Dist: six==1.17.0; extra == "pinned"
Requires-Dist: sqlparse==0.5.5; extra == "pinned"
Requires-Dist: stack-data==0.6.3; extra == "pinned"
Requires-Dist: svglib==2.0.2; extra == "pinned"
Requires-Dist: tablib==3.9.0; extra == "pinned"
Requires-Dist: tinycss2==1.5.1; extra == "pinned"
Requires-Dist: traitlets==5.15.1; extra == "pinned"
Requires-Dist: typing_extensions==4.16.0; extra == "pinned"
Requires-Dist: tzdata==2026.2; extra == "pinned"
Requires-Dist: tzlocal==5.4.4; extra == "pinned"
Requires-Dist: uritools==6.1.2; extra == "pinned"
Requires-Dist: urllib3==2.7.0; extra == "pinned"
Requires-Dist: uvicorn==0.51.0; extra == "pinned"
Requires-Dist: vine==5.1.0; extra == "pinned"
Requires-Dist: wcwidth==0.8.2; extra == "pinned"
Requires-Dist: webauthn==3.0.0; extra == "pinned"
Requires-Dist: webencodings==0.5.1; extra == "pinned"
Requires-Dist: xhtml2pdf==0.2.17; extra == "pinned"
Requires-Dist: yarl==1.24.2; extra == "pinned"
Provides-Extra: dev-pinned
Requires-Dist: alabaster==1.0.0; extra == "dev-pinned"
Requires-Dist: ast_serialize==0.6.0; extra == "dev-pinned"
Requires-Dist: babel==2.18.0; extra == "dev-pinned"
Requires-Dist: build==1.5.1; extra == "dev-pinned"
Requires-Dist: bumpver==2026.1132; extra == "dev-pinned"
Requires-Dist: cfgv==3.5.0; extra == "dev-pinned"
Requires-Dist: colorama==0.4.6; extra == "dev-pinned"
Requires-Dist: coverage==7.15.0; extra == "dev-pinned"
Requires-Dist: cssbeautifier==2.0.3; extra == "dev-pinned"
Requires-Dist: debugpy==1.8.21; extra == "dev-pinned"
Requires-Dist: distlib==0.4.3; extra == "dev-pinned"
Requires-Dist: djlint==1.40.4; extra == "dev-pinned"
Requires-Dist: docutils==0.22.4; extra == "dev-pinned"
Requires-Dist: EditorConfig==0.17.1; extra == "dev-pinned"
Requires-Dist: execnet==2.1.2; extra == "dev-pinned"
Requires-Dist: filelock==3.29.7; extra == "dev-pinned"
Requires-Dist: freezegun==1.5.5; extra == "dev-pinned"
Requires-Dist: icdiff==2.0.10; extra == "dev-pinned"
Requires-Dist: id==1.6.1; extra == "dev-pinned"
Requires-Dist: identify==2.6.19; extra == "dev-pinned"
Requires-Dist: imagesize==2.0.0; extra == "dev-pinned"
Requires-Dist: iniconfig==2.3.0; extra == "dev-pinned"
Requires-Dist: jaraco.classes==3.4.0; extra == "dev-pinned"
Requires-Dist: jaraco.context==6.1.2; extra == "dev-pinned"
Requires-Dist: jaraco.functools==4.5.0; extra == "dev-pinned"
Requires-Dist: jeepney==0.9.0; extra == "dev-pinned"
Requires-Dist: Jinja2==3.1.6; extra == "dev-pinned"
Requires-Dist: jsbeautifier==2.0.3; extra == "dev-pinned"
Requires-Dist: json5==0.15.0; extra == "dev-pinned"
Requires-Dist: keyring==25.7.0; extra == "dev-pinned"
Requires-Dist: lexid==2021.1006; extra == "dev-pinned"
Requires-Dist: librt==0.13.0; extra == "dev-pinned"
Requires-Dist: markdown-it-py==4.2.0; extra == "dev-pinned"
Requires-Dist: MarkupSafe==3.0.3; extra == "dev-pinned"
Requires-Dist: mdit-py-plugins==0.6.1; extra == "dev-pinned"
Requires-Dist: mdurl==0.1.2; extra == "dev-pinned"
Requires-Dist: more-itertools==11.1.0; extra == "dev-pinned"
Requires-Dist: mypy_extensions==1.1.0; extra == "dev-pinned"
Requires-Dist: mypy==2.2.0; extra == "dev-pinned"
Requires-Dist: myst-parser==5.1.0; extra == "dev-pinned"
Requires-Dist: nh3==0.3.6; extra == "dev-pinned"
Requires-Dist: nodeenv==1.10.0; extra == "dev-pinned"
Requires-Dist: pathspec==1.1.1; extra == "dev-pinned"
Requires-Dist: platformdirs==4.10.0; extra == "dev-pinned"
Requires-Dist: pluggy==1.6.0; extra == "dev-pinned"
Requires-Dist: pprintpp==0.4.0; extra == "dev-pinned"
Requires-Dist: pre_commit==4.6.0; extra == "dev-pinned"
Requires-Dist: PyJWT==2.13.0; extra == "dev-pinned"
Requires-Dist: pyproject_hooks==1.2.0; extra == "dev-pinned"
Requires-Dist: pytest_httpserver==1.1.5; extra == "dev-pinned"
Requires-Dist: pytest-cov==7.1.0; extra == "dev-pinned"
Requires-Dist: pytest-django==4.12.0; extra == "dev-pinned"
Requires-Dist: pytest-icdiff==0.9; extra == "dev-pinned"
Requires-Dist: pytest-order==1.5.0; extra == "dev-pinned"
Requires-Dist: pytest-testmon==2.2.0; extra == "dev-pinned"
Requires-Dist: pytest-xdist==3.8.0; extra == "dev-pinned"
Requires-Dist: pytest==9.1.1; extra == "dev-pinned"
Requires-Dist: python-discovery==1.4.4; extra == "dev-pinned"
Requires-Dist: readme_renderer==45.0; extra == "dev-pinned"
Requires-Dist: regex==2026.6.28; extra == "dev-pinned"
Requires-Dist: requests-mock==1.12.1; extra == "dev-pinned"
Requires-Dist: requests-toolbelt==1.0.0; extra == "dev-pinned"
Requires-Dist: rfc3986==2.0.0; extra == "dev-pinned"
Requires-Dist: rich==15.0.0; extra == "dev-pinned"
Requires-Dist: roman-numerals==4.1.0; extra == "dev-pinned"
Requires-Dist: ruff==0.15.21; extra == "dev-pinned"
Requires-Dist: SecretStorage==3.5.0; extra == "dev-pinned"
Requires-Dist: shellcheck_py==0.11.0.1; extra == "dev-pinned"
Requires-Dist: snowballstemmer==3.1.1; extra == "dev-pinned"
Requires-Dist: sphinx_rtd_theme==3.1.0; extra == "dev-pinned"
Requires-Dist: sphinx-last-updated-by-git==0.3.8; extra == "dev-pinned"
Requires-Dist: Sphinx==9.1.0; extra == "dev-pinned"
Requires-Dist: sphinxcontrib-applehelp==2.0.0; extra == "dev-pinned"
Requires-Dist: sphinxcontrib-devhelp==2.0.0; extra == "dev-pinned"
Requires-Dist: sphinxcontrib-django==2.5; extra == "dev-pinned"
Requires-Dist: sphinxcontrib-htmlhelp==2.1.0; extra == "dev-pinned"
Requires-Dist: sphinxcontrib-jquery==4.1; extra == "dev-pinned"
Requires-Dist: sphinxcontrib-jsmath==1.0.1; extra == "dev-pinned"
Requires-Dist: sphinxcontrib-qthelp==2.0.0; extra == "dev-pinned"
Requires-Dist: sphinxcontrib-serializinghtml==2.0.0; extra == "dev-pinned"
Requires-Dist: toml==0.10.2; extra == "dev-pinned"
Requires-Dist: twine==6.2.0; extra == "dev-pinned"
Requires-Dist: types-python-dateutil==2.9.0.20260518; extra == "dev-pinned"
Requires-Dist: types-PyYAML==6.0.12.20260518; extra == "dev-pinned"
Requires-Dist: types-requests==2.33.0.20260518; extra == "dev-pinned"
Requires-Dist: virtualenv==21.6.0; extra == "dev-pinned"
Requires-Dist: Werkzeug==3.1.8; extra == "dev-pinned"
Dynamic: license-file

[![CircleCI](https://circleci.com/gh/digitalfabrik/integreat-cms.svg?style=shield)](https://circleci.com/gh/digitalfabrik/integreat-cms)
[![Ruff](https://img.shields.io/badge/ruff-0.9.2-brightgreen)](https://docs.astral.sh/ruff/)
![Coverage](https://img.shields.io/codeclimate/coverage/digitalfabrik/integreat-cms)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)

# Integreat Django CMS

[![Logo](https://integreat-app.de/wp-content/themes/integreat/images/integreat-app-logo.png)](https://integreat-app.de/en/)

[Integreat - The mobile guide for newcomers.](https://integreat-app.de/en/) Multilingual. Offline. Open Source.

This content management system helps local integration experts to provide multilingual information for newcomers.

![A screenshot of the content form](../screenshots/page-form.png)

## TL;DR

### Prerequisites

Following packages are required before installing the project (install them with your package manager):

* python3.7
* python3-pip
* [PostgreSQL](https://www.postgresql.org/) database server
* [Apache2](https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/modwsgi/) server with `mod_wsgi`

### Installation

```
pip install integreat-cms
```

## Documentation

For detailed instructions, tutorials and the source code reference have a look at our great documentation:

https://digitalfabrik.github.io/integreat-cms/
