#!/usr/bin/env python

from wagtail import __version__
from wagtail.utils.setup import assets, check_bdist_egg, sdist

try:
    from setuptools import find_packages, setup
except ImportError:
    from distutils.core import setup


# Hack to prevent "TypeError: 'NoneType' object is not callable" error
# in multiprocessing/util.py _exit_function when setup.py exits
# (see http://www.eby-sarna.com/pipermail/peak/2010-May/003357.html)
try:
    import multiprocessing  # noqa: F401
except ImportError:
    pass


install_requires = [
    "Django>=3.2,<4.3",
    "django-modelcluster>=6.0,<7.0",
    "django-permissionedforms>=0.1,<1.0",
    "django-taggit>=2.0,<5.0",
    "django-treebeard>=4.5.1,<5.0",
    "djangorestframework>=3.11.1,<4.0",
    "django-filter>=2.2,<24",
    "draftjs_exporter>=2.1.5,<3.0",
    "Pillow>=4.0.0,<10.0.0",
    "beautifulsoup4>=4.8,<4.12",
    "html5lib>=0.999,<2",
    "Willow>=1.5,<1.6",
    "requests>=2.11.1,<3.0",
    "l18n>=2018.5",
    "openpyxl>=3.0.10,<4.0",
    "anyascii>=0.1.5",
    "telepath>=0.1.1,<1",
]

# Testing dependencies
testing_extras = [
    # Required for running the tests
    "python-dateutil>=2.7",
    "pytz>=2014.7",
    "elasticsearch>=5.0,<6.0",
    "Jinja2>=3.0,<3.2",
    "boto3>=1.16,<1.17",
    "freezegun>=0.3.8",
    "azure-mgmt-cdn>=12.0,<13.0",
    "azure-mgmt-frontdoor>=1.0,<1.1",
    "django-pattern-library>=0.7,<0.8",
    # For coverage and PEP8 linting
    "coverage>=3.7.0",
    "black==22.3.0",
    "doc8==0.8.1",
    "ruff==0.0.272",
    # For enforcing string formatting mechanism in source files
    "semgrep==1.3.0",
    # For templates linting
    "curlylint==0.13.1",
    # For template indenting
    "djhtml==1.5.2",
    # for validating string formats in .po translation files
    "polib>=1.1,<2.0",
    # For wagtail.test.utils.wagtail_factories (used for streamfield migration toolkit)
    "factory-boy>=3.2",
]

# Documentation dependencies
documentation_extras = [
    "pyenchant>=3.1.1,<4",
    "sphinxcontrib-spelling>=5.4.0,<6",
    "Sphinx>=1.5.2",
    "sphinx-autobuild>=0.6.0",
    "sphinx-wagtail-theme==6.0.0",
    "myst_parser==0.18.1",
    "sphinx_copybutton>=0.5,<1.0",
]

setup(
    name="wagtail",
    version=__version__,
    description="A Django content management system.",
    author="Wagtail core team + contributors",
    author_email="hello@wagtail.org",  # For support queries, please see https://docs.wagtail.org/en/stable/support.html
    url="https://wagtail.org/",
    project_urls={
        "Documentation": "https://docs.wagtail.org",
        "Source": "https://github.com/wagtail/wagtail",
    },
    packages=find_packages(),
    include_package_data=True,
    license="BSD",
    long_description="Wagtail is an open source content management \
system built on Django, with a strong community and commercial support. \
It’s focused on user experience, and offers precise control for \
designers and developers.\n\n\
For more details, see https://wagtail.org, https://docs.wagtail.org and \
https://github.com/wagtail/wagtail/.",
    classifiers=[
        "Development Status :: 5 - Production/Stable",
        "Environment :: Web Environment",
        "Intended Audience :: Developers",
        "License :: OSI Approved :: BSD License",
        "Operating System :: OS Independent",
        "Programming Language :: Python",
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.7",
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
        "Programming Language :: Python :: 3.10",
        "Programming Language :: Python :: 3.11",
        "Framework :: Django",
        "Framework :: Django :: 3.2",
        "Framework :: Django :: 4.1",
        "Framework :: Django :: 4.2",
        "Framework :: Wagtail",
        "Topic :: Internet :: WWW/HTTP :: Site Management",
    ],
    python_requires=">=3.7",
    install_requires=install_requires,
    extras_require={"testing": testing_extras, "docs": documentation_extras},
    entry_points="""
            [console_scripts]
            wagtail=wagtail.bin.wagtail:main
    """,
    zip_safe=False,
    cmdclass={
        "sdist": sdist,
        "bdist_egg": check_bdist_egg,
        "assets": assets,
    },
)

setup.py
#!/usr/bin/env python

from wagtail import __version__
from wagtail.utils.setup import assets, check_bdist_egg, sdist

try:
    from setuptools import find_packages, setup
except ImportError:
    from distutils.core import setup


# Hack to prevent "TypeError: 'NoneType' object is not callable" error
# in multiprocessing/util.py _exit_function when setup.py exits
# (see http://www.eby-sarna.com/pipermail/peak/2010-May/003357.html)
try:
    import multiprocessing  # noqa: F401
except ImportError:
    pass


install_requires = [
    "Django>=3.2,<4.3",
    "django-modelcluster>=6.0,<7.0",
    "django-permissionedforms>=0.1,<1.0",
    "django-taggit>=2.0,<5.0",
    "django-treebeard>=4.5.1,<5.0",
    "djangorestframework>=3.11.1,<4.0",
    "django-filter>=2.2,<24",
    "draftjs_exporter>=2.1.5,<3.0",
    "Pillow>=9.1.0,<11.0.0",
    "beautifulsoup4>=4.8,<4.12",
    "html5lib>=0.999,<2",
    "Willow>=1.5,<1.6",
    "requests>=2.11.1,<3.0",
    "l18n>=2018.5",
    "openpyxl>=3.0.10,<4.0",
    "anyascii>=0.1.5",
    "telepath>=0.1.1,<1",
]

# Testing dependencies
testing_extras = [
    # Required for running the tests
    "python-dateutil>=2.7",
    "pytz>=2014.7",
    "elasticsearch>=5.0,<6.0",
    "Jinja2>=3.0,<3.2",
    "boto3>=1.16,<1.17",
    "freezegun>=0.3.8",
    "azure-mgmt-cdn>=12.0,<13.0",
    "azure-mgmt-frontdoor>=1.0,<1.1",
    "django-pattern-library>=0.7,<0.8",
    # For coverage and PEP8 linting
    "coverage>=3.7.0",
    "black==22.3.0",
    "doc8==0.8.1",
    "ruff==0.0.272",
    # For enforcing string formatting mechanism in source files
    "semgrep==1.3.0",
    # For templates linting
    "curlylint==0.13.1",
    # For template indenting
    "djhtml==1.5.2",
    # for validating string formats in .po translation files
    "polib>=1.1,<2.0",
    # For wagtail.test.utils.wagtail_factories (used for streamfield migration toolkit)
    "factory-boy>=3.2",
]

# Documentation dependencies
documentation_extras = [
    "pyenchant>=3.1.1,<4",
    "sphinxcontrib-spelling>=5.4.0,<6",
    "Sphinx>=1.5.2",
    "sphinx-autobuild>=0.6.0",
    "sphinx-wagtail-theme==6.0.0",
    "myst_parser==0.18.1",
    "sphinx_copybutton>=0.5,<1.0",
]

setup(
    name="wagtail",
    version=__version__,
    description="A Django content management system.",
    author="Wagtail core team + contributors",
    author_email="hello@wagtail.org",  # For support queries, please see https://docs.wagtail.org/en/stable/support.html
    url="https://wagtail.org/",
    project_urls={
        "Documentation": "https://docs.wagtail.org",
        "Source": "https://github.com/wagtail/wagtail",
    },
    packages=find_packages(),
    include_package_data=True,
    license="BSD",
    long_description="Wagtail is an open source content management \
system built on Django, with a strong community and commercial support. \
It’s focused on user experience, and offers precise control for \
designers and developers.\n\n\
For more details, see https://wagtail.org, https://docs.wagtail.org and \
https://github.com/wagtail/wagtail/.",
    classifiers=[
        "Development Status :: 5 - Production/Stable",
        "Environment :: Web Environment",
        "Intended Audience :: Developers",
        "License :: OSI Approved :: BSD License",
        "Operating System :: OS Independent",
        "Programming Language :: Python",
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.7",
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
        "Programming Language :: Python :: 3.10",
        "Programming Language :: Python :: 3.11",
        "Framework :: Django",
        "Framework :: Django :: 3.2",
        "Framework :: Django :: 4.1",
        "Framework :: Django :: 4.2",
        "Framework :: Wagtail",
        "Topic :: Internet :: WWW/HTTP :: Site Management",
    ],
    python_requires=">=3.7",
    install_requires=install_requires,
    extras_require={"testing": testing_extras, "docs": documentation_extras},
    entry_points="""
            [console_scripts]
            wagtail=wagtail.bin.wagtail:main
    """,
    zip_safe=False,
    cmdclass={
        "sdist": sdist,
        "bdist_egg": check_bdist_egg,
        "assets": assets,
    },
)

setup.py
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 90bced5b57a1..5c31c88c10f7 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -69,6 +69,7 @@ Changelog
  * Maintenance: Refactor GroupPagePermission to use Django's Permission model (Sage Abdullah)
  * Maintenance: Convert the CONTRIBUTORS file to Markdown (Dan Braghis)
  * Maintenance: Move `django-filter` version upper bound to v24 (Yuekui)
+ * Maintenance: Update Pillow dependency to allow 10.x, only include support for >= 9.1.0 (Yuekui)
 
 
 5.0.2 (21.06.2023)
diff --git a/docs/releases/5.1.md b/docs/releases/5.1.md
index fa4552ca95ff..b661dc4938cf 100644
--- a/docs/releases/5.1.md
+++ b/docs/releases/5.1.md
@@ -103,10 +103,15 @@ Thank you to Damilola for his work, and to Google for sponsoring this project.
  * Refactor GroupPagePermission to use Django's Permission model (Sage Abdullah)
  * Convert the `CONTRIBUTORS` file to Markdown (Dan Braghis)
  * Move `django-filter` version upper bound to v24 (Yuekui)
+ * Update Pillow dependency to allow 10.x, only include support for >= 9.1.0 (Yuekui)
 
 
 ## Upgrade considerations
 
+## Pillow dependency update
+
+Wagtail no longer supports Pillow versions below `9.1.0`.
+
 ### `insert_editor_css` hook is deprecated
 
 The `insert_editor_css` hook has been deprecated. The `insert_global_admin_css` hook has the same functionality, and all uses of `insert_editor_css` should be changed to `insert_global_admin_css`.
diff --git a/setup.py b/setup.py
index fa6c22ebaf46..3370734ae0d7 100755
--- a/setup.py
+++ b/setup.py
@@ -27,7 +27,7 @@
     "djangorestframework>=3.11.1,<4.0",
     "django-filter>=2.2,<24",
     "draftjs_exporter>=2.1.5,<3.0",
-    "Pillow>=4.0.0,<10.0.0",
+    "Pillow>=9.1.0,<11.0.0",
     "beautifulsoup4>=4.8,<4.12",
     "html5lib>=0.999,<2",
     "Willow>=1.5,<1.6",

Add support for Pillow 10.0.0
### Is your proposal related to a problem?

Pillow 10.0.0 [has just been released.](https://github.com/python-pillow/Pillow/releases/tag/10.0.0) Wagtail 5.0.2 [restricts Pillow support to <10.0.0.](https://github.com/wagtail/wagtail/blob/a68f69f2d7f46943cc23b7f65349448b23044869/setup.py#L30)

Adding support for the new Pillow release is desired.

### Describe the solution you'd like

Add support for Pillow 10.0.0


### Describe alternatives you've considered

Not applicable.

### Additional context

This is a relevant dependency to the project, and to sites running it.

