Skip to content

Hope Core Dependencies

Full updated list of dependencies can be checked in the project's pyproject.toml ⧉

Here a brief list of the relevant technologies

  • Django
  • Elasticsearch
  • Graphene
  • Celery
  • Django REST Framework
  • PIL
  • React
  • Tesseract

pyproject.toml

[build-system]
build-backend = "setuptools.build_meta"
requires = [ "setuptools", "wheel" ]

[project]
name = "hope"
version = "3.4.0"
description = "HCT MIS is UNICEF's humanitarian cash transfer platform."
readme = "README.md"
license = { text = "None" }

authors = [
  { name = "HOPE UNICEF", email = "hope@mail.unicef.org" },
  { name = "Kellton" },
]
requires-python = "==3.13.*"
classifiers = [
  "Programming Language :: Python :: 3 :: Only",
  "Programming Language :: Python :: 3.13",
]
dependencies = [
  "black>=23,<24",
  "celery[redis]>=5.2.7,<6",
  "coreapi>=2.3.3,<3",
  "defusedxml==0.7.0rc1",
  "django~=3.2.15",
  "django-admin-cursor-paginator>=0.1.3,<1",
  "django-admin-extra-buttons>=1.5.4,<2",
  "django-admin-sync>=0.7,<1",
  "django-adminactions>=2.1,<3",
  "django-adminfilters==2.4.2",
  "django-advanced-filters>=2,<3",
  "django-auditlog>=2.1.1,<3",
  "django-celery-beat>=2.3,<3",
  "django-celery-results>=2.3.1,<3",
  "django-compressor>=4,<5",
  "django-concurrency>=2.4,<3",
  "django-constance[redis]>=2.9,<3",
  "django-cors-headers>=3.13,<4",
  "django-countries>=7.3.2,<8",
  "django-csp>=3.7,<4",
  "django-debug-toolbar>=4.3,<5",
  "django-elasticsearch-dsl>=8,<9",
  "django-environ>=0.10,<1",
  "django-extensions>=3.1.5,<4",
  "django-fernet-fields>=0.6",
  "django-filter>=22,<23",
  "django-flags>=5.0.12,<6",
  "django-front-door>=0.10,<1",
  "django-fsm>=2.8,<3",
  "django-graphiql-debug-toolbar>=0.2,<1",
  "django-hijack>=3.2.1,<4",
  "django-import-export>=2.8,<3",
  "django-import-export-celery>=1.2,<2",
  "django-jsoneditor>=0.2.2,<1",
  "django-markdownify>=0.9.2,<1",
  "django-model-utils>=4.2,<5",
  "django-mptt>=0.14,<1",
  "django-multiselectfield==0.1.12",
  "django-phonenumber-field>=7,<8",
  "django-querysetsequence>=0.16,<1",
  "django-redis>=5.2,<6",
  "django-rest-extensions>=0.2",
  "django-reversion>=5.0.2,<6",
  "django-silk>=5.0.1,<6",
  "django-smart-admin>=2,<3",
  "django-smart-env",
  "django-sql-explorer[xls]>=3,<4",
  "django-storages[azure]>=1.12.3,<2",
  "django-strategy-field>=3,<4",
  "django-sysinfo>=2.6,<3",
  "djangorestframework>=3.13.1,<4",
  "drf-extensions==0.7.1",
  "drf-jwt>=1.19.2,<2",
  "drf-nested-routers~=0.94.0",
  "drf-spectacular[sidecar]>=0.27,<1",
  "elastic-transport==8.13",
  "elasticsearch~=8.14.0",
  "elasticsearch-dsl~=8.14.0",
  "factory-boy>=3,<4",
  "flower>=2.0.1",
  "gevent",
  "graphene-django~=2.14.0",
  "graphene-file-upload>=1.3,<2",
  "gunicorn>=20.1,<21",
  "ipython>=8.4,<9",
  "jedi>=0.18.1,<1",
  "jinja2>=3.1.3,<4",
  "jmespath>=1.0.1,<2",
  "markupsafe>=2.1.1,<3",
  "msoffcrypto-tool>=5.4.2",
  "natural-keys>=2,<3",
  "nested-multipart-parser",
  "openpyxl==3.1.5",
  "openpyxl-image-loader>=1.0.5,<2",
  "phonenumbers>=8.12.49,<9",
  "pillow>=10.2,<11",
  "prompt-toolkit>=3.0.29,<4",
  "psycopg2-binary>=2.9.3",
  "ptyprocess>=0.7,<1",
  "pycountry>=22.3,<23",
  "pydyf==0.10",
  "pygments>=2.12,<3",
  "pyjwt>=2.4,<3",
  "pytesseract>=0.3.9,<1",
  "pytz>=2022.1,<2023",
  "pyyaml>=6,<7",
  "pyzipper>=0.3.6",
  "sentry-sdk==2.8",
  "setuptools==71.1",
  "single-source>=0.3,<1",
  "social-auth-app-django>=5,<6",
  "social-auth-core>=4.2,<5",
  "sorl-thumbnail==12.9",
  "swapper>=1.3,<2",
  "tblib>=1.7,<2",
  "tomli>=2.0.1,<3",
  "update>=0.0.1,<1",
  "urllib3>=1.26.9,<2",
  "weasyprint>=59,<60",
  "xlrd>=1.2,<2",
]

[dependency-groups]
dev = [
  "argh>=0.28,<1",
  "coverage>=7.3.2,<8",
  "django-stubs~=1.12.0",
  "django-stubs-ext>=0.7,<1",
  "django-webtest>=1.9.10,<2",
  "djangorestframework-stubs~=1.7.0",
  "faker>=17,<18",
  "flake8>=6,<7",
  "flake8-absolute-import>=1.0.0.1,<2",
  "flake8-bugbear>=22.9.23,<23",
  "flake8-formatter-junit-xml>=0.0.6,<1",
  "flaky>=3.8.1,<4",
  "freezegun",
  "graphene-stubs>=0.15,<1",
  "ipdb>=0.13.9,<1",
  "openpyxl-stubs>=0.1.24,<1",
  "parameterized>=0.8.1,<1",
  "parso>=0.8.3,<1",
  "pre-commit>=3.1.1,<4",
  "pytest>=7.4.4,<8",
  "pytest-cov>=4.1,<5",
  "pytest-django>=4.5.2,<5",
  "pytest-echo>=1.7.1,<2",
  "pytest-html>=4.1.1",
  "pytest-html-reporter>=0.2.9",
  "pytest-mock",
  "pytest-randomly>=3.15,<4",
  "pytest-repeat>=0.9.3,<1",
  "pytest-rerunfailures>=13,<14",
  "pytest-vcr>=1.0.2",
  "pytest-xdist>=3.5,<4",
  "requests-mock>=1.9.3,<2",
  "responses>=0.22,<1",
  "ruff>=0.11.8",
  "selenium==4.29",
  "snapshottest>=1.0.0a0,<2",
  "tox>=4.25",
  "types-freezegun>=1.1.10,<2",
  "types-python-dateutil>=2.8.19.2,<3",
  "types-pytz>=2022.4,<2023",
  "types-redis>=4.3.21.2,<5",
  "types-requests>=2.28.11.2,<3",
  "unittest-xml-reporting>=3.2,<4",
  "wasmer>=1.1,<2",
  "watchdog>=2.1.8,<3",
  "webdriver-manager==4.0.2",
]

docs = [
  "cairosvg>=2.7.1",
  "django-environ>=0.11.2",
  "markupsafe>=2.1.5",
  "mdx-gh-links>=0.4",
  "mike>=2.1.3",
  "mkdocs>=1.5.3",
  "mkdocs-alias-plugin>=0.8.1",
  "mkdocs-autolinks-plugin>=0.7.1",
  "mkdocs-awesome-pages-plugin>=2.9.3",
  "mkdocs-click>=0.8.1",
  "mkdocs-embed-external-markdown>=3.0.2",
  "mkdocs-ezglossary-plugin>=1.6.10",
  "mkdocs-ezlinks-plugin>=0.1.14",
  "mkdocs-gen-files>=0.5",
  "mkdocs-get-deps>=0.2",
  "mkdocs-gitsnippet-plugin>=1.2",
  "mkdocs-include-markdown-plugin>=6.2.2",
  "mkdocs-link-marker>=0.1.3",
  "mkdocs-macros-plugin>=1.2",
  "mkdocs-material>=9.5.15",
  "mkdocs-panzoom-plugin>=0.1.1",
  "mkdocs-pdf-export-plugin>=0.5.10",
  "mkdocs-simple-hooks>=0.1.5",
  "mkdocstrings[python]>=0.24.1",
  "pillow>=10.4",
  "pymdown-extensions>=10.7.1",
  "requests>=2.32.3",
]

[tool.setuptools]
package-dir = { "" = "src" }

[tool.setuptools.packages.find]
where = [ "src" ]

[tool.django-stubs]
django_settings_module = "hct_mis_api.settings"

[tool.uv]
package = true