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

[tool.black]
line-length = 120
include = '\.pyi?$'
exclude = '''
/(
    \.git
  | \.hg
  | \.mypy_cache
  | \.tox
  | \.venv
  | venv
  | _build
  | buck-out
  | build
  | dist
  | migrations
  | snapshots
  | __pypackages__
  | frontend
  | uv-cache
)/
'''
# TODO: remove migrations exclude rule once it won't create much conflicts between feature branches and develop
[tool.isort]
py_version = 312
profile = "black"
default_section = "THIRDPARTY"
known_first_party = [
    "account",
    "core",
    "grievance",
    "household",
    "id_management",
    "intervention",
    "payment",
    "program",
    "targeting.apps.TargetingConfig",
    "utils",
    "registration_datahub",
    "mptt",
    "django_extensions",
    "registration_data",
    "sanction_list",
    "accountability",
]
known_django = "django"
sections = ["FUTURE", "STDLIB", "DJANGO", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"]
include_trailing_comma = true
skip = ["migrations", "snapshots", "venv", ".venv", "__pypackages__", "frontend", ".tox", "uv-cache"]

[tool.mypy]
python_version = 3.13
show_error_codes = true
exclude = [
    "migrations",
    "venv",
    "snapshots",
    "__pypackages__",
    "build",
    "uv-cache",
    "manage.py"
]

strict = true

ignore_missing_imports = true # TODO
follow_imports = "skip"

# TODO: remove one, fix errors, repeat
disable_error_code = [
    "var-annotated", # this enforces Django Model fields to have type annotations
    "attr-defined",
    "misc", # cannot subclass DjangoObjectType
    "union-attr",
    "type-arg", # this misses type parameters for graphene.ObjectType
    "no-any-return", # this enforces adding return None for function that returns None
]

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

[tool.uv]
package = true

[dependency-groups]
dev = [
    "mypy==0.982",
    "django-stubs~=1.12.0",
    "django-stubs-ext<1.0.0,>=0.7.0",
    "djangorestframework-stubs~=1.7.0",
    "argh<1.0,>=0.28",
    "django-webtest<2.0.0,>=1.9.10",
    "faker<18,>=17",
    "flake8<7,>=6",
    "flake8-absolute-import<2.0.0.0,>=1.0.0.1",
    "flake8-bugbear<23.0.0,>=22.9.23",
    "flake8-formatter-junit-xml<1.0.0,>=0.0.6",
    "freezegun",
    "graphene-stubs<1.0,>=0.15",
    "ipdb<1.0.0,>=0.13.9",
    "isort<6.0.0,>=5.10.1",
    "openpyxl-stubs<1.0.0,>=0.1.24",
    "parameterized<1.0.0,>=0.8.1",
    "parso<1.0.0,>=0.8.3",
    "pytest<8.0.0,>=7.4.4",
    "pytest-django<5.0.0,>=4.5.2",
    "pytest-echo<2.0.0,>=1.7.1",
    "selenium==4.29.0",
    "webdriver-manager==4.0.2",
    "requests-mock<2.0.0,>=1.9.3",
    "responses<1.0,>=0.22",
    "snapshottest<2.0.0,>=1.0.0a0",
    "types-freezegun",
    "types-requests==2.31.0.6",
    "types-python-dateutil<3.0.0.0,>=2.8.19.2",
    "types-pytz<2023.0.0.0,>=2022.4.0.0",
    "types-redis<5.0.0.0,>=4.3.21.2",
    "unittest-xml-reporting<4.0.0,>=3.2.0",
    "watchdog<3.0.0,>=2.1.8",
    "wasmer<2.0.0,>=1.1.0",
    "pre-commit<4.0.0,>=3.1.1",
    "pytest-rerunfailures<14.0,>=13.0",
    "pytest-randomly<4.0.0,>=3.15.0",
    "pytest-cov<5.0.0,>=4.1.0",
    "pytest-xdist<4.0.0,>=3.5.0",
    "pytest-repeat<1.0.0,>=0.9.3",
    "pytest-html>=4.1.1",
    "pytest-vcr>=1.0.2",
    "pytest-html-reporter>=0.2.9",
    "flaky<4.0.0,>=3.8.1",
    "coverage<8.0.0,>=7.3.2",
    "tox>=4.25.0",
    "tox-uv>=1.25.0",
]
docs = [
    "cairosvg>=2.7.1",
    "markupsafe>=2.1.5",
    "mdx-gh-links>=0.4",
    "mkdocs-autolinks-plugin>=0.7.1",
    "mkdocs-awesome-pages-plugin>=2.9.3",
    "mkdocs-click>=0.8.1",
    "mkdocs-ezglossary-plugin>=1.6.10",
    "mkdocs-ezlinks-plugin>=0.1.14",
    "mkdocs-gen-files>=0.5.0",
    "mkdocs-get-deps>=0.2.0",
    "mkdocs-link-marker>=0.1.3",
    "mkdocs-material>=9.5.15",
    "mkdocs-simple-hooks>=0.1.5",
    "mkdocs>=1.5.3",
    "mkdocstrings[python]>=0.24.1",
    "pymdown-extensions>=10.7.1",
    "mkdocs-embed-external-markdown>=3.0.2",
    "mkdocs-include-markdown-plugin>=6.2.2",
    "mkdocs-alias-plugin>=0.8.1",
    "pillow>=10.4.0",
    "requests>=2.32.3",
    "django-environ>=0.11.2",
    "mkdocs-pdf-export-plugin>=0.5.10",
    "mike>=2.1.3",
    "mkdocs-gitsnippet-plugin>=1.2.0",
    "mkdocs-macros-plugin>=1.2.0",
    "mkdocs-panzoom-plugin>=0.1.1",
]

[project]
name = "hope"
version = "3.2.5"
description = "HCT MIS is UNICEF's humanitarian cash transfer platform."
authors = [
    { name = "Tivix" },
]
dependencies = [
    "setuptools==71.1.0",
    "defusedxml==0.7.0rc1",
    "Django~=3.2.15",
    "elasticsearch~=8.14.0",
    "graphene-django~=2.14.0",
    "openpyxl==3.1.5",
    "Jinja2<4.0.0,>=3.1.3",
    "MarkupSafe<3.0.0,>=2.1.1",
    "PyJWT<3.0.0,>=2.4.0",
    "PyYAML<7.0,>=6.0",
    "black<24,>=23",
    "celery[redis]<6.0.0,>=5.2.7",
    "coreapi<3.0.0,>=2.3.3",
    "django-admin-cursor-paginator<1.0.0,>=0.1.3",
    "django-admin-extra-buttons<2.0.0,>=1.5.4",
    "django-admin-sync<1.0,>=0.7",
    "django-adminactions<3.0,>=2.1",
    "django-adminfilters==2.4.2",
    "django-advanced-filters<3.0.0,>=2.0.0",
    "django-auditlog<3.0.0,>=2.1.1",
    "django-celery-beat<3.0.0,>=2.3.0",
    "django-celery-results<3.0.0,>=2.3.1",
    "django-concurrency<3.0,>=2.4",
    "django-constance[redis]<3.0,>=2.9",
    "django-cors-headers<4.0.0,>=3.13.0",
    "django-countries<8.0.0,>=7.3.2",
    "django-csp<4.0,>=3.7",
    "django-elasticsearch-dsl<9.0,>=8.0",
    "django-environ<1.0.0,>=0.10.0",
    "django-extensions<4.0.0,>=3.1.5",
    "django-filter<23,>=22",
    "django-flags<6.0.0,>=5.0.12",
    "django-front-door<1.0,>=0.10",
    "django-fsm<3.0.0,>=2.8.0",
    "django-hijack<4.0.0,>=3.2.1",
    "django-import-export<3.0.0,>=2.8.0",
    "django-import-export-celery<2.0,>=1.2",
    "django-jsoneditor<1.0.0,>=0.2.2",
    "django-markdownify<1.0.0,>=0.9.2",
    "django-model-utils<5.0.0,>=4.2.0",
    "django-mptt<1.0,>=0.14",
    "django-multiselectfield==0.1.12",
    "django-phonenumber-field<8,>=7",
    "django-redis<6.0.0,>=5.2.0",
    "django-reversion<6.0.0,>=5.0.2",
    "django-silk<6.0.0,>=5.0.1",
    "django-smart-admin<3,>=2",
    "django-smart-env",
    "django-sql-explorer[xls]<4,>=3",
    "django-storages[azure]<2.0.0,>=1.12.3",
    "django-strategy-field<4.0,>=3.0",
    "django-sysinfo<3.0.0,>=2.6.0",
    "django-compressor<5.0,>=4.0",
    "django-querysetsequence<1.0,>=0.16",
    "djangorestframework<4.0.0,>=3.13.1",
    "drf-jwt<2.0.0,>=1.19.2",
    "drf-spectacular[sidecar]<1.0,>=0.27",
    "drf-extensions==0.7.1",
    "elasticsearch-dsl~=8.14.0",
    "gevent",
    "graphene-file-upload<2.0.0,>=1.3.0",
    "gunicorn<21.0.0,>=20.1.0",
    "ipython<9.0.0,>=8.4.0",
    "jedi<1.0.0,>=0.18.1",
    "jmespath<2.0.0,>=1.0.1",
    "natural-keys<3.0.0,>=2.0.0",
    "openpyxl-image-loader<2.0.0,>=1.0.5",
    "phonenumbers<9.0.0,>=8.12.49",
    "pillow<11.0.0,>=10.2.0",
    "prompt-toolkit<4.0.0,>=3.0.29",
    "psycopg2-binary>=2.9.3",
    "ptyprocess<1.0.0,>=0.7.0",
    "pycountry<23.0,>=22.3",
    "pygments<3.0.0,>=2.12.0",
    "pytesseract<1.0.0,>=0.3.9",
    "pytz<2023.0,>=2022.1",
    "single-source<1.0.0,>=0.3.0",
    "social-auth-app-django<6.0.0,>=5.0.0",
    "social-auth-core<5.0.0,>=4.2.0",
    "sorl-thumbnail==12.9",
    "swapper<2.0.0,>=1.3.0",
    "tblib<2.0.0,>=1.7.0",
    "update<1.0.0,>=0.0.1",
    "urllib3<2.0.0,>=1.26.9",
    "xlrd<2.0,>=1.2",
    "weasyprint<60.0,>=59.0",
    "tomli<3.0.0,>=2.0.1",
    "sentry-sdk==2.8.0",
    "django-debug-toolbar<5.0.0,>=4.3.0",
    "django-graphiql-debug-toolbar<1.0.0,>=0.2.0",
    "django-rest-extensions>=0.2.0",
    "pydyf==0.10.0",
    "elastic-transport==8.13.0",
    "flower>=2.0.1",
    "factory-boy<4,>=3",
    "django-fernet-fields>=0.6",
    "msoffcrypto-tool>=5.4.2",
    "pyzipper>=0.3.6",
]
requires-python = "==3.13.*"
readme = "README.md"
license = { text = "None" }

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

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

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