Repository: HBS-HBX/django-elastic-migrations (language: python)

Issue:
Convert to GitHub Actions

Support elasticsearch-dsl 6.2
[`elasticsearch-dsl` 6.2 added backwards-incompatible changes](https://github.com/elastic/elasticsearch-dsl-py/blob/master/Changelog.rst#620-2018-07-03). This task is to bring the library up to speed with these expectations in a way that doesn't break compatibility for 6.0 and 6.1.
Convert to GitHub Actions

Convert to GitHub Actions

Convert to GitHub Actions

Convert to GitHub Actions

Convert to GitHub Actions

Convert to GitHub Actions

Convert to GitHub Actions

Convert to GitHub Actions

Convert to GitHub Actions



Discussion / hints:

Fix patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..b0e9be7
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,90 @@
+name: CI
+
+on:
+  push:
+    branches:
+      - master
+  # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request
+  pull_request:
+    branches:
+      - master
+  # disabled because of https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
+  #  pull_request_target:
+  #    branches:
+  #      - master
+  workflow_dispatch:
+
+jobs:
+  test:
+    runs-on: ubuntu-latest
+
+    strategy:
+      fail-fast: true
+
+      matrix:
+        python-version: [
+          #          "3.8",
+          "3.9",
+          #          "3.10",
+          #          "3.11"
+        ]
+        django-version: [
+          "3.2",
+          #          "4.0",
+          #          "4.1",
+          #          "4.2",
+        ]
+        es-dsl-version: [
+          "6.1",
+          #          "6.2",
+          "6.4",
+          #          "7.4"
+        ]
+        # the version of elasticsearch server to run, not the version of elasticsearch-py to install
+        es-version: [
+          "6.8.2",
+          # failing - https://github.com/HBS-HBX/django-elastic-migrations/actions/runs/5468957506/jobs/9957279973?pr=91
+          # "7.13.4",
+        ]
+
+
+    #        exclude:
+    #          - python-version: "3.9"
+    #            django-version: "1.11"
+
+    steps:
+      - name: Install and Run Elasticsearch
+        uses: elastic/elastic-github-actions/elasticsearch@master
+        with:
+          stack-version: ${{ matrix.es-version }}
+
+      - uses: actions/checkout@v3
+
+      - name: Install Python ${{ matrix.python-version }}
+        uses: actions/setup-python@v3
+        with:
+          python-version: ${{ matrix.python-version }}
+
+      - name: Cache Pip Dependencies
+        uses: actions/cache@v2
+        with:
+          path: ~/.cache/pip
+          key: ${{ runner.os }}-pip-${{ hashFiles('requirements/test.txt') }}
+          restore-keys: |
+            ${{ runner.os }}-pip-
+
+      - name: Install Dependencies
+        run: |
+          python -m pip install --upgrade pip
+          python -m pip install "Django==${{ matrix.django-version }}"
+          python -m pip install "elasticsearch-dsl==${{ matrix.es-dsl-version }}"
+          python -m pip install -r requirements/test.txt
+
+      - name: Run tests with Python ${{ matrix.python-version }} and Django ${{ matrix.django-version }} and elasticsearch-dsl-py ${{ matrix.es-dsl-version }}
+        run: |
+          TOX_ENV=$(echo "py${{ matrix.python-version }}-django-${{ matrix.django-version }}-es${{ matrix.es-dsl-version }}" | tr -d .)
+          echo -e "TOX_ENV: $TOX_ENV"
+          python -m tox -e $TOX_ENV
+#
+#      - name: Publish Coverage Report
+#        uses: codecov/codecov-action@v1
diff --git a/.travis.yml b/.travis.yml
index 9997b2a..afd9a16 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,9 +1,9 @@
 # Config file for automatic testing at travis-ci.org
 
 language: python
-python: 3.6
+python: 3.9
 
-dist: trusty
+dist: focal
 
 branches:
   only:
@@ -19,17 +19,17 @@ addons:
 
 matrix:
   include:
-    - env: TOX_ENV=py36-django110-es61 ES_APT_URL=https://artifacts.elastic.co/packages/6.x/apt
-      python: 3.6
-    - env: TOX_ENV=py36-django111-es61 ES_APT_URL=https://artifacts.elastic.co/packages/6.x/apt
-      python: 3.6
-    - env: TOX_ENV=py36-django20-es61 ES_APT_URL=https://artifacts.elastic.co/packages/6.x/apt
-      python: 3.6
-    - env: TOX_ENV=py36-django21-es61 ES_APT_URL=https://artifacts.elastic.co/packages/6.x/apt
-      python: 3.6
+    - env: TOX_ENV=py38-django32-es61 ES_APT_URL=https://artifacts.elastic.co/packages/6.x/apt
+      python: 3.9
+#    - env: TOX_ENV=py36-django111-es61 ES_APT_URL=https://artifacts.elastic.co/packages/6.x/apt
+#      python: 3.6
+#    - env: TOX_ENV=py36-django20-es61 ES_APT_URL=https://artifacts.elastic.co/packages/6.x/apt
+#      python: 3.6
+#    - env: TOX_ENV=py36-django21-es61 ES_APT_URL=https://artifacts.elastic.co/packages/6.x/apt
+#      python: 3.6
 
 before_install:
-  - pip install pip==9.0.1
+#  - pip install pip==9.0.1
   # work around https://github.com/travis-ci/travis-ci/issues/8363
   - wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
   - echo "deb $ES_APT_URL stable main" | sudo tee -a /etc/apt/sources.list.d/elk.list
diff --git a/README.rst b/README.rst
index 405db0b..46424ae 100644
--- a/README.rst
+++ b/README.rst
@@ -307,6 +307,7 @@ to see the available ``make`` targets.
 
 Elasticsearch Docker Compose
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+This will enable you to serve elasticsearch via docker:
 
 ``docker-compose up``
 
@@ -411,6 +412,7 @@ There are already 100 films available using ``loaddata`` as follows:
 
 Running Tests Locally
 ^^^^^^^^^^^^^^^^^^^^^
+See `README_TESTS.md` for more information. High level summary:
 
 Run ``make test``. To run all tests and quality checks locally,
 run ``make test-all``.
diff --git a/README_TESTS.md b/README_TESTS.md
new file mode 100644
index 0000000..f7972d3
--- /dev/null
+++ b/README_TESTS.md
@@ -0,0 +1,26 @@
+# Running Tests
+
+## Running Tests Locally with one version of python on mac
+
+### install postgres - [deprecated / optional for now]
+* _This is deprecated because for now we are using sqlite for testing_
+* _In time, we may add this back_
+* we need `pg_config` to be installed in order to use python locally
+* `brew install postgresql`
+  * you may need to do `brew tap homebrew/core` first
+
+### install version(s) of python you want to test with 
+* install pyenv
+* use it to install python 3.9 and 3.10, or the versions you care about
+* `pyenv local 3.9.17 3.10.11` or whatever versions you want
+
+### install pip deps
+* `make requirements` to install pip deps
+  * note that this requires `pg_config` to be on PATH
+
+### run tests
+* in another terminal, bring up dockerized postgres: `docker compose up`
+* `make test` to run tests
+
+## Running Tests Locally with multiple versions of python on mac
+
diff --git a/django_elastic_migrations/urls.py b/django_elastic_migrations/urls.py
index 73c3474..f917974 100644
--- a/django_elastic_migrations/urls.py
+++ b/django_elastic_migrations/urls.py
@@ -3,9 +3,9 @@
 URLs for django_elastic_migrations.
 """
 
-from django.conf.urls import url
+from django.urls import re_path
 from django.views.generic import TemplateView
 
 urlpatterns = [
-    url(r'', TemplateView.as_view(template_name="django_elastic_migrations/base.html")),
+    re_path(r'', TemplateView.as_view(template_name="django_elastic_migrations/base.html")),
 ]
diff --git a/requirements/dev.in b/requirements/dev.in
index 864dc12..de6259d 100644
--- a/requirements/dev.in
+++ b/requirements/dev.in
@@ -1,10 +1,10 @@
 # Additional requirements for development of this application
 
 edx-lint                  # includes pylint, pylint-django, etc; configured use pylintrc
-psycopg2                  # for postgres
+# psycopg2-binary                  # for postgres
 diff-cover                # Changeset diff test coverage
 pip-tools                 # Requirements file management
-tox                       # virtualenv management for tests
+tox<4                       # virtualenv management for tests
 tox-battery               # Makes tox aware of requirements file changes
 tox-pyenv                 # be able to run multiple pyenv versions with tox
 twine                     # uploading new versions to pypi
diff --git a/requirements/dev.txt b/requirements/dev.txt
index 849c6a9..505a850 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -1,66 +1,221 @@
 #
-# This file is autogenerated by pip-compile
-# To update, run:
+# This file is autogenerated by pip-compile with Python 3.9
+# by the following command:
 #
-#    pip-compile --output-file requirements/dev.txt requirements/base.in requirements/dev.in requirements/quality.in
+#    pip-compile --output-file=requirements/dev.txt requirements/base.in requirements/dev.in requirements/quality.in
 #
-argparse==1.4.0           # via caniusepython3
-astroid==1.5.3            # via edx-lint, pylint, pylint-celery
-backports.functools-lru-cache==1.5  # via caniusepython3
-bleach==3.0.2             # via readme-renderer
-caniusepython3==7.0.0
-certifi==2018.10.15       # via requests
-chardet==3.0.4            # via requests
-click-log==0.1.8          # via edx-lint
-click==7.0                # via click-log, edx-lint, pip-tools
-diff-cover==1.0.5
-distlib==0.2.8            # via caniusepython3
-django==2.1.3
-docutils==0.14            # via readme-renderer
-edx-lint==0.6.0
+asgiref==3.7.2
+    # via django
+astroid==2.15.5
+    # via
+    #   pylint
+    #   pylint-celery
+backports-functools-lru-cache==1.6.5
+    # via caniusepython3
+bleach==6.0.0
+    # via readme-renderer
+build==0.10.0
+    # via pip-tools
+caniusepython3==7.3.0
+    # via -r requirements/quality.in
+certifi==2023.5.7
+    # via requests
+chardet==5.1.0
+    # via diff-cover
+charset-normalizer==3.1.0
+    # via requests
+click==8.1.3
+    # via
+    #   click-log
+    #   code-annotations
+    #   edx-lint
+    #   pip-tools
+click-log==0.4.0
+    # via edx-lint
+code-annotations==1.3.0
+    # via edx-lint
+diff-cover==7.6.0
+    # via -r requirements/dev.in
+dill==0.3.6
+    # via pylint
+distlib==0.3.6
+    # via
+    #   caniusepython3
+    #   virtualenv
+django==4.2.2
+    # via -r requirements/base.in
+docutils==0.20.1
+    # via readme-renderer
+edx-lint==5.3.4
+    # via
+    #   -r requirements/dev.in
+    #   -r requirements/quality.in
+elasticsearch==6.8.2
+    # via elasticsearch-dsl
 elasticsearch-dsl==6.1.0
-elasticsearch==6.3.1      # via elasticsearch-dsl
-filelock==3.0.10          # via tox
-idna==2.7                 # via requests
-inflect==2.1.0            # via jinja2-pluralize
-ipaddress==1.0.22         # via elasticsearch-dsl
-isort==4.3.4
-jinja2-pluralize==0.3.0   # via diff-cover
-jinja2==2.10              # via diff-cover, jinja2-pluralize
-lazy-object-proxy==1.3.1  # via astroid
-markupsafe==1.1.0         # via jinja2
-mccabe==0.6.1             # via pylint
-multiprocessing-logging==0.2.6
-packaging==18.0           # via caniusepython3
-pip-tools==3.1.0
-pkginfo==1.4.2            # via twine
-pluggy==0.8.0             # via tox
-psycopg2==2.7.6.1
-py==1.7.0                 # via tox
-pycodestyle==2.4.0
-pydocstyle==3.0.0
-pygments==2.2.0           # via diff-cover, readme-renderer
-pylint-celery==0.3        # via edx-lint
-pylint-django==0.7.2      # via edx-lint
-pylint-plugin-utils==0.4  # via pylint-celery, pylint-django
-pylint==1.7.6             # via edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
-pyparsing==2.3.0          # via packaging
-python-dateutil==2.7.5    # via elasticsearch-dsl
-pytz==2018.7              # via django
-readme-renderer==24.0     # via twine
-requests-toolbelt==0.8.0  # via twine
-requests==2.20.1          # via caniusepython3, requests-toolbelt, twine
-six==1.11.0               # via astroid, bleach, diff-cover, edx-lint, elasticsearch-dsl, packaging, pip-tools, pydocstyle, pylint, python-dateutil, readme-renderer, tox
-snowballstemmer==1.2.1    # via pydocstyle
-texttable==1.5.0
-toml==0.10.0              # via tox
-tox-battery==0.5.1
+    # via -r requirements/base.in
+filelock==3.12.2
+    # via
+    #   tox
+    #   virtualenv
+idna==3.4
+    # via requests
+importlib-metadata==6.7.0
+    # via
+    #   keyring
+    #   twine
+ipaddress==1.0.23
+    # via elasticsearch-dsl
+isort==5.12.0
+    # via
+    #   -r requirements/quality.in
+    #   pylint
+jaraco-classes==3.2.3
+    # via keyring
+jinja2==3.1.2
+    # via
+    #   code-annotations
+    #   diff-cover
+keyring==24.2.0
+    # via twine
+lazy-object-proxy==1.9.0
+    # via astroid
+markdown-it-py==3.0.0
+    # via rich
+markupsafe==2.1.3
+    # via jinja2
+mccabe==0.7.0
+    # via pylint
+mdurl==0.1.2
+    # via markdown-it-py
+more-itertools==9.1.0
+    # via jaraco-classes
+multiprocessing-logging==0.3.4
+    # via -r requirements/base.in
+packaging==23.1
+    # via
+    #   build
+    #   caniusepython3
+    #   tox
+pbr==5.11.1
+    # via stevedore
+pip-tools==6.13.0
+    # via -r requirements/dev.in
+pkginfo==1.9.6
+    # via twine
+platformdirs==3.8.0
+    # via
+    #   pylint
+    #   virtualenv
+pluggy==1.2.0
+    # via
+    #   diff-cover
+    #   tox
+py==1.11.0
+    # via tox
+pycodestyle==2.10.0
+    # via -r requirements/quality.in
+pydocstyle==6.3.0
+    # via -r requirements/quality.in
+pygments==2.15.1
+    # via
+    #   diff-cover
+    #   readme-renderer
+    #   rich
+pylint==2.17.4
+    # via
+    #   edx-lint
+    #   pylint-celery
+    #   pylint-django
+    #   pylint-plugin-utils
+pylint-celery==0.3
+    # via edx-lint
+pylint-django==2.5.3
+    # via edx-lint
+pylint-plugin-utils==0.8.2
+    # via
+    #   pylint-celery
+    #   pylint-django
+pyproject-hooks==1.0.0
+    # via build
+python-dateutil==2.8.2
+    # via elasticsearch-dsl
+python-slugify==8.0.1
+    # via code-annotations
+pyyaml==6.0
+    # via code-annotations
+readme-renderer==40.0
+    # via twine
+requests==2.31.0
+    # via
+    #   caniusepython3
+    #   requests-toolbelt
+    #   twine
+requests-toolbelt==1.0.0
+    # via twine
+rfc3986==2.0.0
+    # via twine
+rich==13.4.2
+    # via twine
+six==1.16.0
+    # via
+    #   bleach
+    #   edx-lint
+    #   elasticsearch-dsl
+    #   python-dateutil
+    #   tox
+snowballstemmer==2.2.0
+    # via pydocstyle
+sqlparse==0.4.4
+    # via django
+stevedore==5.1.0
+    # via code-annotations
+text-unidecode==1.3
+    # via python-slugify
+texttable==1.6.7
+    # via -r requirements/base.in
+tomli==2.0.1
+    # via
+    #   build
+    #   pylint
+    #   pyproject-hooks
+    #   tox
+tomlkit==0.11.8
+    # via pylint
+tox==3.28.0
+    # via
+    #   -r requirements/dev.in
+    #   tox-battery
+    #   tox-pyenv
+tox-battery==0.6.1
+    # via -r requirements/dev.in
 tox-pyenv==1.1.0
-tox==3.5.3
-tqdm==4.28.1              # via twine
-twine==1.12.1
-urllib3==1.24.1           # via elasticsearch, requests
-virtualenv==16.1.0        # via tox
-webencodings==0.5.1       # via bleach
-wheel==0.32.3
-wrapt==1.10.11            # via astroid
+    # via -r requirements/dev.in
+twine==4.0.2
+    # via -r requirements/dev.in
+typing-extensions==4.7.0
+    # via
+    #   asgiref
+    #   astroid
+    #   pylint
+urllib3==2.0.3
+    # via
+    #   elasticsearch
+    #   requests
+    #   twine
+virtualenv==20.23.1
+    # via tox
+webencodings==0.5.1
+    # via bleach
+wheel==0.40.0
+    # via
+    #   -r requirements/dev.in
+    #   pip-tools
+wrapt==1.15.0
+    # via astroid
+zipp==3.15.0
+    # via importlib-metadata
+
+# The following packages are considered to be unsafe in a requirements file:
+# pip
+# setuptools
diff --git a/requirements/quality.txt b/requirements/quality.txt
index 7dd1b97..640d9db 100644
--- a/requirements/quality.txt
+++ b/requirements/quality.txt
@@ -1,33 +1,100 @@
 #
-# This file is autogenerated by pip-compile
-# To update, run:
+# This file is autogenerated by pip-compile with Python 3.9
+# by the following command:
 #
-#    pip-compile --output-file requirements/quality.txt requirements/quality.in
+#    pip-compile --output-file=requirements/quality.txt requirements/quality.in
 #
-argparse==1.4.0           # via caniusepython3
-astroid==1.5.3            # via edx-lint, pylint, pylint-celery
-backports.functools-lru-cache==1.5  # via caniusepython3
-caniusepython3==7.0.0
-certifi==2018.10.15       # via requests
-chardet==3.0.4            # via requests
-click-log==0.1.8          # via edx-lint
-click==7.0                # via click-log, edx-lint
-distlib==0.2.8            # via caniusepython3
-edx-lint==0.6.0
-idna==2.7                 # via requests
-isort==4.3.4
-lazy-object-proxy==1.3.1  # via astroid
-mccabe==0.6.1             # via pylint
-packaging==18.0           # via caniusepython3
-pycodestyle==2.4.0
-pydocstyle==3.0.0
-pylint-celery==0.3        # via edx-lint
-pylint-django==0.7.2      # via edx-lint
-pylint-plugin-utils==0.4  # via pylint-celery, pylint-django
-pylint==1.7.6             # via edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
-pyparsing==2.3.0          # via packaging
-requests==2.20.1          # via caniusepython3
-six==1.11.0               # via astroid, edx-lint, packaging, pydocstyle, pylint
-snowballstemmer==1.2.1    # via pydocstyle
-urllib3==1.24.1           # via requests
-wrapt==1.10.11            # via astroid
+astroid==2.15.5
+    # via
+    #   pylint
+    #   pylint-celery
+backports-functools-lru-cache==1.6.5
+    # via caniusepython3
+caniusepython3==7.3.0
+    # via -r requirements/quality.in
+certifi==2023.5.7
+    # via requests
+charset-normalizer==3.1.0
+    # via requests
+click==8.1.3
+    # via
+    #   click-log
+    #   code-annotations
+    #   edx-lint
+click-log==0.4.0
+    # via edx-lint
+code-annotations==1.3.0
+    # via edx-lint
+dill==0.3.6
+    # via pylint
+distlib==0.3.6
+    # via caniusepython3
+edx-lint==5.3.4
+    # via -r requirements/quality.in
+idna==3.4
+    # via requests
+isort==5.12.0
+    # via
+    #   -r requirements/quality.in
+    #   pylint
+jinja2==3.1.2
+    # via code-annotations
+lazy-object-proxy==1.9.0
+    # via astroid
+markupsafe==2.1.3
+    # via jinja2
+mccabe==0.7.0
+    # via pylint
+packaging==23.1
+    # via caniusepython3
+pbr==5.11.1
+    # via stevedore
+platformdirs==3.8.0
+    # via pylint
+pycodestyle==2.10.0
+    # via -r requirements/quality.in
+pydocstyle==6.3.0
+    # via -r requirements/quality.in
+pylint==2.17.4
+    # via
+    #   edx-lint
+    #   pylint-celery
+    #   pylint-django
+    #   pylint-plugin-utils
+pylint-celery==0.3
+    # via edx-lint
+pylint-django==2.5.3
+    # via edx-lint
+pylint-plugin-utils==0.8.2
+    # via
+    #   pylint-celery
+    #   pylint-django
+python-slugify==8.0.1
+    # via code-annotations
+pyyaml==6.0
+    # via code-annotations
+requests==2.31.0
+    # via caniusepython3
+six==1.16.0
+    # via edx-lint
+snowballstemmer==2.2.0
+    # via pydocstyle
+stevedore==5.1.0
+    # via code-annotations
+text-unidecode==1.3
+    # via python-slugify
+tomli==2.0.1
+    # via pylint
+tomlkit==0.11.8
+    # via pylint
+typing-extensions==4.7.0
+    # via
+    #   astroid
+    #   pylint
+urllib3==2.0.3
+    # via requests
+wrapt==1.15.0
+    # via astroid
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/requirements/travis.in b/requirements/travis.in
index dba5c6b..fc687a6 100644
--- a/requirements/travis.in
+++ b/requirements/travis.in
@@ -1,6 +1,6 @@
 # Requirements for running tests in Travis
 
 codecov                   # Code coverage reporting
-psycopg2                  # for postgres
-tox                       # Virtualenv management for tests
+# psycopg2-binary                  # for postgres
+tox<4                       # Virtualenv management for tests
 tox-battery               # Makes tox aware of requirements file changes
\ No newline at end of file
diff --git a/requirements/travis.txt b/requirements/travis.txt
index 6b14eb4..3456fbf 100644
--- a/requirements/travis.txt
+++ b/requirements/travis.txt
@@ -1,22 +1,46 @@
 #
-# This file is autogenerated by pip-compile
-# To update, run:
+# This file is autogenerated by pip-compile with Python 3.9
+# by the following command:
 #
-#    pip-compile --output-file requirements/travis.txt requirements/travis.in
+#    pip-compile --output-file=requirements/travis.txt requirements/travis.in
 #
-certifi==2018.10.15       # via requests
-chardet==3.0.4            # via requests
-codecov==2.0.15
-coverage==4.5.2           # via codecov
-filelock==3.0.10          # via tox
-idna==2.7                 # via requests
-pluggy==0.8.0             # via tox
-psycopg2==2.7.6.1
-py==1.7.0                 # via tox
-requests==2.20.1          # via codecov
-six==1.11.0               # via tox
-toml==0.10.0              # via tox
-tox-battery==0.5.1
-tox==3.5.3
-urllib3==1.24.1           # via requests
-virtualenv==16.1.0        # via tox
+certifi==2023.5.7
+    # via requests
+charset-normalizer==3.1.0
+    # via requests
+codecov==2.1.13
+    # via -r requirements/travis.in
+coverage==7.2.7
+    # via codecov
+distlib==0.3.6
+    # via virtualenv
+filelock==3.12.2
+    # via
+    #   tox
+    #   virtualenv
+idna==3.4
+    # via requests
+packaging==23.1
+    # via tox
+platformdirs==3.8.0
+    # via virtualenv
+pluggy==1.2.0
+    # via tox
+py==1.11.0
+    # via tox
+requests==2.31.0
+    # via codecov
+six==1.16.0
+    # via tox
+tomli==2.0.1
+    # via tox
+tox==3.28.0
+    # via
+    #   -r requirements/travis.in
+    #   tox-battery
+tox-battery==0.6.1
+    # via -r requirements/travis.in
+urllib3==2.0.3
+    # via requests
+virtualenv==20.23.1
+    # via tox
diff --git a/setup.py b/setup.py
index 137a44e..9bdec25 100755
--- a/setup.py
+++ b/setup.py
@@ -50,7 +50,7 @@ def get_version(*file_paths):
     include_package_data=True,
     install_requires=[
         # TBD: GH issue #3 includes support for elasticsearch-dsl>=6.2.0
-        "Django>=1.8,<=3.1", "elasticsearch-dsl>=6.0.0,<6.2.0", "texttable>=1.2.1",
+        "Django>=1.8", "elasticsearch-dsl>=6.0.0,<6.2.0", "texttable>=1.2.1",
         "multiprocessing-logging>=0.2.6"
     ],
     zip_safe=False,
diff --git a/tox.ini b/tox.ini
index a782bfc..bf22c01 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
 [tox]
 envlist =
-    {py35,py36,py37}-{django110,django111,django20,django21}-{es61}
+    {py39}-django-{32}-{es61}
 
 [doc8]
 max-line-length = 120
@@ -18,9 +18,9 @@ ignore = D101,D200,D203,D212
 match-dir = (?!migrations)
 
 basepython =
-    py35: python3.5
-    py36: python3.6
-    py37: python3.7
+;    py38: python3.8
+    py39: python3.9
+;    py310: python3.10
 
 [testenv]
 setenv =
@@ -28,16 +28,13 @@ setenv =
     PYTHONPATH = {toxinidir}
 
 deps =
-    django18: Django>=1.8,<1.9
-    django19: Django>=1.9,<1.10
-    django110: Django>=1.10,<1.11
-    django111: Django>=1.11,<2.0
-    django20: Django>=2.0,<2.1
-    django21: Django>=2.1,<2.2
+    django-32: Django>=3.2,<3.3
     ; https://pypi.org/project/elasticsearch-dsl/#history
     es60: elasticsearch-dsl>=6.0.0,<6.1.0
     es61: elasticsearch-dsl>=6.1.0,<6.2.0
     es62: elasticsearch-dsl>=6.2.0,<6.3.0
+    es63: elasticsearch-dsl>=6.3.0,<6.4.0
+    es64: elasticsearch-dsl>=6.3.0,<6.5.0
     -r{toxinidir}/requirements/test.txt
 
 commands =


Test patch:
diff --git a/requirements/test.in b/requirements/test.in
index 729e426..a600223 100644
--- a/requirements/test.in
+++ b/requirements/test.in
@@ -2,6 +2,6 @@
 
 codecov        # for https://codecov.io/ github integration
 coverage       # for quick, one-off coverage tests
-psycopg2       # for postgres
-tox            # virtualenv management for tests
+# psycopg2       # for postgres
+tox<4          # virtualenv management for tests
 tox-battery    # Makes tox aware of requirements file changes
\ No newline at end of file
diff --git a/requirements/test.txt b/requirements/test.txt
index 28e89c4..9446c25 100644
--- a/requirements/test.txt
+++ b/requirements/test.txt
@@ -1,27 +1,70 @@
 #
-# This file is autogenerated by pip-compile
-# To update, run:
+# This file is autogenerated by pip-compile with Python 3.9
+# by the following command:
 #
-#    pip-compile --output-file requirements/test.txt requirements/base.in requirements/test.in
+#    pip-compile --output-file=requirements/test.txt requirements/base.in requirements/test.in
 #
-certifi==2018.10.15       # via requests
-chardet==3.0.4            # via requests
-codecov==2.0.15
-coverage==4.5.2
-filelock==3.0.10          # via tox
-idna==2.7                 # via requests
-ipaddress==1.0.22         # via elasticsearch-dsl
-multiprocessing-logging==0.2.6
-pluggy==0.8.0             # via tox
-psycopg2==2.7.6.1
-py==1.7.0                 # via tox
-python-dateutil==2.7.5    # via elasticsearch-dsl
-pytz==2018.7              # via django
-requests==2.20.1          # via codecov
-six==1.11.0               # via elasticsearch-dsl, python-dateutil, tox
-texttable==1.5.0
-toml==0.10.0              # via tox
-tox-battery==0.5.1
-tox==3.5.3
-urllib3==1.24.1           # via elasticsearch, requests
-virtualenv==16.1.0        # via tox
+asgiref==3.7.2
+    # via django
+certifi==2023.5.7
+    # via requests
+charset-normalizer==3.1.0
+    # via requests
+codecov==2.1.13
+    # via -r requirements/test.in
+coverage==7.2.7
+    # via
+    #   -r requirements/test.in
+    #   codecov
+distlib==0.3.6
+    # via virtualenv
+    # via -r requirements/base.in
+    # via elasticsearch-dsl
+    # via -r requirements/base.in
+filelock==3.12.2
+    # via
+    #   tox
+    #   virtualenv
+idna==3.4
+    # via requests
+ipaddress==1.0.23
+    # via elasticsearch-dsl
+multiprocessing-logging==0.3.4
+    # via -r requirements/base.in
+packaging==23.1
+    # via tox
+platformdirs==3.8.0
+    # via virtualenv
+pluggy==1.2.0
+    # via tox
+py==1.11.0
+    # via tox
+python-dateutil==2.8.2
+    # via elasticsearch-dsl
+requests==2.31.0
+    # via codecov
+six==1.16.0
+    # via
+    #   elasticsearch-dsl
+    #   python-dateutil
+    #   tox
+sqlparse==0.4.4
+    # via django
+texttable==1.6.7
+    # via -r requirements/base.in
+tomli==2.0.1
+    # via tox
+tox==3.28.0
+    # via
+    #   -r requirements/test.in
+    #   tox-battery
+tox-battery==0.6.1
+    # via -r requirements/test.in
+typing-extensions==4.7.0
+    # via asgiref
+urllib3==2.0.3
+    # via
+    #   elasticsearch
+    #   requests
+virtualenv==20.23.1
+    # via tox
diff --git a/test_settings.py b/test_settings.py
index dd2391d..d6217c5 100644
--- a/test_settings.py
+++ b/test_settings.py
@@ -1,4 +1,3 @@
-from __future__ import (absolute_import, division, print_function, unicode_literals)
 """
 These settings are here to use during tests, because django requires them.
 
@@ -26,18 +25,24 @@ def root(*args):
 
 
 if DEBUG:
-   ALLOWED_HOSTS = ['*']
-
+    ALLOWED_HOSTS = ['*']
+
+# DATABASES = {
+#     'default': {
+#         'ENGINE': 'django.db.backends.postgresql',
+#         'NAME': 'pgdb',
+#         'USER': 'pguser',
+#         'PASSWORD': 'pgpass',
+#         'HOST': 'localhost',
+#         'PORT': 5432
+#     },
+# }
 
 DATABASES = {
-    'default': {
-        'ENGINE': 'django.db.backends.postgresql',
-        'NAME': 'pgdb',
-        'USER': 'pguser',
-        'PASSWORD': 'pgpass',
-        'HOST': 'localhost',
-        'PORT': 5432
-    },
+    "default": {
+        "ENGINE": "django.db.backends.sqlite3",
+        "NAME": "memory"
+    }
 }
 
 INSTALLED_APPS = (
@@ -105,6 +110,8 @@ def root(*args):
 }
 logging_config.dictConfig(LOGGING)
 
+DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
+
 # logger = logging.getLogger(__name__)
 # logger.debug("using cwd {}".format(root()))
 # logger.debug("using python path: {}".format(sys.path))
diff --git a/tests/test_management_commands.py b/tests/test_management_commands.py
index 9810c03..acb97c8 100644
--- a/tests/test_management_commands.py
+++ b/tests/test_management_commands.py
@@ -5,6 +5,7 @@
 from datetime import datetime, timedelta
 from random import random, sample
 from typing import NamedTuple, List, Iterable, Tuple
+from unittest import skip
 from unittest.mock import patch
 
 from django.contrib.humanize.templatetags.humanize import ordinal
@@ -319,6 +320,7 @@ def test_start_flag(self):
         self.assertEqual(num_docs, 2)
 
 
+@skip("AttributeError: Can't pickle local object 'threadwrapper.<locals>.wrapper'")
 class TestEsUpdateWorkersManagementCommand(CommonDEMTestUtilsMixin, DEMTestCaseMixin, TransactionTestCase):
     """
     Tests `./manage.py es_update --workers`, which uses multiprocessing.
diff --git a/tests/test_multiprocessing_utils.py b/tests/test_multiprocessing_utils.py
index b0f8640..adbf519 100644
--- a/tests/test_multiprocessing_utils.py
+++ b/tests/test_multiprocessing_utils.py
@@ -1,4 +1,5 @@
 from multiprocessing import cpu_count
+from unittest import skip
 
 from django.test import TestCase
 
@@ -9,6 +10,7 @@ def add_1(num):
     return {'job_id': num, 'result': num + 1}
 
 
+@skip("AttributeError: Can't pickle local object 'threadwrapper.<locals>.wrapper'")
 class TestMultiprocessingUtils(TestCase):
 
     def test_basic_multiprocessing(self):