git: 89acacbfee22 - main - net-mgmt/netbox: Create Django 4.0 consumers

From: Kai Knoblich <kai_at_FreeBSD.org>
Date: Thu, 16 Jun 2022 16:30:28 UTC
The branch main has been updated by kai:

URL: https://cgit.FreeBSD.org/ports/commit/?id=89acacbfee22729e7d1bfcce383d455bb88adfc3

commit 89acacbfee22729e7d1bfcce383d455bb88adfc3
Author:     Kai Knoblich <kai@FreeBSD.org>
AuthorDate: 2022-06-16 15:57:10 +0000
Commit:     Kai Knoblich <kai@FreeBSD.org>
CommitDate: 2022-06-16 16:28:33 +0000

    net-mgmt/netbox: Create Django 4.0 consumers
    
    * Django 3.2 is currently the "default" version in the ports tree due
      its long term support until April 2024.  Thus ports that are assigned
      to that version will exist until then.
    
      The following ports are required to make the upgrade of
      net-mgmt/netbox to the 3.2 release possible because it requires Django
      4.0.
    
      All of the ports listed below were created on the basis of their
      respective original ports:
    
      - devel/py-dj40-django-rq
      - devel/py-dj40-graphene-django
      - www/py-dj40-django-auth-ldap
      - www/py-dj40-django-cors-headers
      - www/py-dj40-django-debug-toolbar
      - www/py-dj40-django-filter
      - www/py-dj40-django-graphiql-debug-toolbar
      - www/py-dj40-django-js-asset
      - www/py-dj40-django-mptt
      - www/py-dj40-django-prometheus
      - www/py-dj40-django-redis
      - www/py-dj40-django-tables2
      - www/py-dj40-django-taggit
      - www/py-dj40-django-timezone-field
      - www/py-dj40-djangorestframework
      - www/py-dj40-drf-yasg
    
    * Simplify the related CONFLICTS_INSTALL entries as well.  This also
      reduces editing of the Makefiles if another ports need to be
      "repo-copied" (e.g. for Django 4.1) based on the original ports in the
      future. [1]
    
    Reviewed by:    se [1], sunpoet
    Differential Revision:  https://reviews.freebsd.org/D35444
---
 devel/Makefile                                     |  2 ++
 devel/py-dj40-django-rq/Makefile                   | 34 +++++++++++++++++++
 devel/py-dj40-django-rq/distinfo                   |  3 ++
 devel/py-dj40-django-rq/pkg-descr                  |  5 +++
 devel/py-dj40-graphene-django/Makefile             | 33 +++++++++++++++++++
 devel/py-dj40-graphene-django/distinfo             |  3 ++
 devel/py-dj40-graphene-django/files/patch-setup.py | 10 ++++++
 devel/py-dj40-graphene-django/pkg-descr            |  3 ++
 devel/py-django-rq/Makefile                        |  3 +-
 devel/py-graphene-django/Makefile                  |  2 ++
 www/Makefile                                       | 14 ++++++++
 www/py-dj40-django-auth-ldap/Makefile              | 38 ++++++++++++++++++++++
 www/py-dj40-django-auth-ldap/distinfo              |  3 ++
 .../files/patch-docs_conf.py                       | 20 ++++++++++++
 www/py-dj40-django-auth-ldap/files/setup.py        |  5 +++
 www/py-dj40-django-auth-ldap/pkg-descr             |  6 ++++
 www/py-dj40-django-cors-headers/Makefile           | 21 ++++++++++++
 www/py-dj40-django-cors-headers/distinfo           |  3 ++
 www/py-dj40-django-cors-headers/pkg-descr          |  4 +++
 www/py-dj40-django-debug-toolbar/Makefile          | 23 +++++++++++++
 www/py-dj40-django-debug-toolbar/distinfo          |  3 ++
 www/py-dj40-django-debug-toolbar/pkg-descr         |  5 +++
 www/py-dj40-django-filter/Makefile                 | 22 +++++++++++++
 www/py-dj40-django-filter/distinfo                 |  3 ++
 www/py-dj40-django-filter/pkg-descr                |  4 +++
 www/py-dj40-django-graphiql-debug-toolbar/Makefile | 24 ++++++++++++++
 www/py-dj40-django-graphiql-debug-toolbar/distinfo |  3 ++
 .../pkg-descr                                      |  4 +++
 www/py-dj40-django-js-asset/Makefile               | 22 +++++++++++++
 www/py-dj40-django-js-asset/distinfo               |  3 ++
 www/py-dj40-django-js-asset/pkg-descr              |  4 +++
 www/py-dj40-django-mptt/Makefile                   | 23 +++++++++++++
 www/py-dj40-django-mptt/distinfo                   |  3 ++
 www/py-dj40-django-mptt/pkg-descr                  |  4 +++
 www/py-dj40-django-prometheus/Makefile             | 34 +++++++++++++++++++
 www/py-dj40-django-prometheus/distinfo             |  3 ++
 www/py-dj40-django-prometheus/pkg-descr            | 16 +++++++++
 www/py-dj40-django-redis/Makefile                  | 29 +++++++++++++++++
 www/py-dj40-django-redis/distinfo                  |  3 ++
 www/py-dj40-django-redis/pkg-descr                 | 17 ++++++++++
 www/py-dj40-django-tables2/Makefile                | 27 +++++++++++++++
 www/py-dj40-django-tables2/distinfo                |  3 ++
 www/py-dj40-django-tables2/pkg-descr               |  5 +++
 www/py-dj40-django-taggit/Makefile                 | 26 +++++++++++++++
 www/py-dj40-django-taggit/distinfo                 |  3 ++
 www/py-dj40-django-taggit/pkg-descr                |  3 ++
 www/py-dj40-django-timezone-field/Makefile         | 29 +++++++++++++++++
 www/py-dj40-django-timezone-field/distinfo         |  3 ++
 www/py-dj40-django-timezone-field/pkg-descr        |  3 ++
 www/py-dj40-djangorestframework/Makefile           | 22 +++++++++++++
 www/py-dj40-djangorestframework/distinfo           |  3 ++
 www/py-dj40-djangorestframework/pkg-descr          |  4 +++
 www/py-dj40-drf-yasg/Makefile                      | 37 +++++++++++++++++++++
 www/py-dj40-drf-yasg/distinfo                      |  3 ++
 www/py-dj40-drf-yasg/pkg-descr                     | 20 ++++++++++++
 www/py-django-auth-ldap/Makefile                   |  3 +-
 www/py-django-cors-headers/Makefile                |  3 +-
 www/py-django-debug-toolbar/Makefile               |  3 +-
 www/py-django-filter/Makefile                      |  3 +-
 www/py-django-graphiql-debug-toolbar/Makefile      |  2 ++
 www/py-django-js-asset/Makefile                    |  3 +-
 www/py-django-mptt/Makefile                        |  4 +--
 www/py-django-prometheus/Makefile                  |  3 +-
 www/py-django-redis/Makefile                       |  3 +-
 www/py-django-tables2/Makefile                     |  3 +-
 www/py-django-taggit/Makefile                      |  3 +-
 www/py-django-timezone-field/Makefile              |  2 +-
 www/py-djangorestframework/Makefile                |  2 +-
 www/py-drf-yasg/Makefile                           |  3 +-
 69 files changed, 668 insertions(+), 27 deletions(-)

diff --git a/devel/Makefile b/devel/Makefile
index 37c71bfedc1a..64422a8a4ffc 100644
--- a/devel/Makefile
+++ b/devel/Makefile
@@ -4501,6 +4501,8 @@
     SUBDIR += py-distributed
     SUBDIR += py-dj32-django-rq
     SUBDIR += py-dj32-graphene-django
+    SUBDIR += py-dj40-django-rq
+    SUBDIR += py-dj40-graphene-django
     SUBDIR += py-django-rq
     SUBDIR += py-docker-py
     SUBDIR += py-dockerpty
diff --git a/devel/py-dj40-django-rq/Makefile b/devel/py-dj40-django-rq/Makefile
new file mode 100644
index 000000000000..2e454156e3d0
--- /dev/null
+++ b/devel/py-dj40-django-rq/Makefile
@@ -0,0 +1,34 @@
+PORTNAME=	django-rq
+PORTVERSION=	2.5.1
+CATEGORIES=	devel python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	sunpoet@FreeBSD.org
+COMMENT=	Provides Django integration for RQ (Redis Queue)
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE.txt
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=2.0:www/py-django40@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}redis>=3:databases/py-redis@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}rq>=1.2:devel/py-rq@${PY_FLAVOR}
+TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}coverage>=0:devel/py-coverage@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}docutils>=0,1:textproc/py-docutils@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}mock>=0:devel/py-mock@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}yaml>=0:devel/py-yaml@${PY_FLAVOR} \
+		redis-server:databases/redis
+
+USES=		python:3.6+
+USE_PYTHON=	autoplist concurrent distutils
+
+NO_ARCH=	yes
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+# https://github.com/rq/django-rq/blob/master/Makefile
+do-test:
+	cd ${WRKSRC} && coverage-${PYTHON_VER} run ${LOCALBASE}/bin/django-admin.py test django_rq --settings=django_rq.tests.settings --pythonpath=.
+	cd ${WRKSRC} && ${PYTHON_CMD} setup.py check --metadata --restructuredtext --strict
+
+.include <bsd.port.mk>
diff --git a/devel/py-dj40-django-rq/distinfo b/devel/py-dj40-django-rq/distinfo
new file mode 100644
index 000000000000..29ea384b232e
--- /dev/null
+++ b/devel/py-dj40-django-rq/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1638556556
+SHA256 (django-rq-2.5.1.tar.gz) = f08486602664d73a6e335872c868d79663e380247e6307496d01b8fa770fefd8
+SIZE (django-rq-2.5.1.tar.gz) = 43704
diff --git a/devel/py-dj40-django-rq/pkg-descr b/devel/py-dj40-django-rq/pkg-descr
new file mode 100644
index 000000000000..5273572bf046
--- /dev/null
+++ b/devel/py-dj40-django-rq/pkg-descr
@@ -0,0 +1,5 @@
+Django integration with RQ, a Redis based Python queuing library. Django-RQ is a
+simple app that allows you to configure your queues in django's settings.py and
+easily use them in your project.
+
+WWW: https://github.com/rq/django-rq
diff --git a/devel/py-dj40-graphene-django/Makefile b/devel/py-dj40-graphene-django/Makefile
new file mode 100644
index 000000000000..31be782e19b3
--- /dev/null
+++ b/devel/py-dj40-graphene-django/Makefile
@@ -0,0 +1,33 @@
+PORTNAME=	graphene-django
+PORTVERSION=	2.15.0
+CATEGORIES=	devel python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	sunpoet@FreeBSD.org
+COMMENT=	Graphene Django integration
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=1.11:www/py-django40@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}graphene2>=2.1.7<3:devel/py-graphene2@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}graphql-core2>=2.1.0<3:devel/py-graphql-core2@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}promise>=2.1:devel/py-promise@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}six>=1.10.0:devel/py-six@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}text-unidecode>=0:converters/py-text-unidecode@${PY_FLAVOR}
+
+USES=		python:3.6+
+USE_PYTHON=	autoplist concurrent distutils
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+NO_ARCH=	yes
+
+OPTIONS_DEFINE=	REST_FRAMEWORK
+OPTIONS_DEFAULT=REST_FRAMEWORK
+REST_FRAMEWORK_DESC=	REST framework support
+
+REST_FRAMEWORK_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}dj40-djangorestframework>=3.6.3:www/py-dj40-djangorestframework@${PY_FLAVOR}
+
+.include <bsd.port.mk>
diff --git a/devel/py-dj40-graphene-django/distinfo b/devel/py-dj40-graphene-django/distinfo
new file mode 100644
index 000000000000..e5dadad3d0d0
--- /dev/null
+++ b/devel/py-dj40-graphene-django/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1649270586
+SHA256 (graphene-django-2.15.0.tar.gz) = b78c9b05bc899016b9cc5bf13faa1f37fe1faa8c5407552c6ddd1a28f46fc31a
+SIZE (graphene-django-2.15.0.tar.gz) = 67097
diff --git a/devel/py-dj40-graphene-django/files/patch-setup.py b/devel/py-dj40-graphene-django/files/patch-setup.py
new file mode 100644
index 000000000000..167679f63d97
--- /dev/null
+++ b/devel/py-dj40-graphene-django/files/patch-setup.py
@@ -0,0 +1,10 @@
+--- setup.py.orig	2020-12-31 06:55:53 UTC
++++ setup.py
+@@ -68,7 +68,6 @@ setup(
+         "promise>=2.1",
+         "text-unidecode",
+     ],
+-    setup_requires=["pytest-runner"],
+     tests_require=tests_require,
+     rest_framework_require=rest_framework_require,
+     extras_require={
diff --git a/devel/py-dj40-graphene-django/pkg-descr b/devel/py-dj40-graphene-django/pkg-descr
new file mode 100644
index 000000000000..548cb6d971a9
--- /dev/null
+++ b/devel/py-dj40-graphene-django/pkg-descr
@@ -0,0 +1,3 @@
+A Django integration for Graphene.
+
+WWW: https://github.com/graphql-python/graphene-django
diff --git a/devel/py-django-rq/Makefile b/devel/py-django-rq/Makefile
index f71b43128b01..8ebf52fccd7f 100644
--- a/devel/py-django-rq/Makefile
+++ b/devel/py-django-rq/Makefile
@@ -27,8 +27,7 @@ USE_PYTHON=	autoplist concurrent distutils
 
 NO_ARCH=	yes
 
-CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}dj31-django-rq \
-			${PYTHON_PKGNAMEPREFIX}dj32-django-rq
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
 
 # https://github.com/rq/django-rq/blob/master/Makefile
 do-test:
diff --git a/devel/py-graphene-django/Makefile b/devel/py-graphene-django/Makefile
index 580d3ede1e2f..4e3f12f2fac9 100644
--- a/devel/py-graphene-django/Makefile
+++ b/devel/py-graphene-django/Makefile
@@ -23,6 +23,8 @@ RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django32>=1.11:www/py-django32@${PY_FLAVOR}
 USES=		python:3.5+
 USE_PYTHON=	autoplist concurrent distutils
 
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
 NO_ARCH=	yes
 
 OPTIONS_DEFINE=	REST_FRAMEWORK
diff --git a/www/Makefile b/www/Makefile
index 813dd6bf6950..e65eb243e126 100644
--- a/www/Makefile
+++ b/www/Makefile
@@ -1478,6 +1478,20 @@
     SUBDIR += py-dj32-django-treebeard
     SUBDIR += py-dj32-djangorestframework
     SUBDIR += py-dj32-drf-yasg
+    SUBDIR += py-dj40-django-auth-ldap
+    SUBDIR += py-dj40-django-cors-headers
+    SUBDIR += py-dj40-django-debug-toolbar
+    SUBDIR += py-dj40-django-filter
+    SUBDIR += py-dj40-django-graphiql-debug-toolbar
+    SUBDIR += py-dj40-django-js-asset
+    SUBDIR += py-dj40-django-mptt
+    SUBDIR += py-dj40-django-prometheus
+    SUBDIR += py-dj40-django-redis
+    SUBDIR += py-dj40-django-tables2
+    SUBDIR += py-dj40-django-taggit
+    SUBDIR += py-dj40-django-timezone-field
+    SUBDIR += py-dj40-djangorestframework
+    SUBDIR += py-dj40-drf-yasg
     SUBDIR += py-django
     SUBDIR += py-django-admin-rangefilter
     SUBDIR += py-django-advanced-filters
diff --git a/www/py-dj40-django-auth-ldap/Makefile b/www/py-dj40-django-auth-ldap/Makefile
new file mode 100644
index 000000000000..d9e1cf8e1604
--- /dev/null
+++ b/www/py-dj40-django-auth-ldap/Makefile
@@ -0,0 +1,38 @@
+PORTNAME=	django-auth-ldap
+PORTVERSION=	4.1.0
+CATEGORIES=	www security python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	kai@FreeBSD.org
+COMMENT=	LDAP integration for django.contrib.auth
+
+LICENSE=	BSD2CLAUSE
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}setuptools_scm>=3.4:devel/py-setuptools_scm@${PY_FLAVOR}
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=2.2:www/py-django40@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}ldap>=3.1:net/py-ldap@${PY_FLAVOR}
+
+USES=		python:3.6+
+USE_PYTHON=	autoplist concurrent distutils
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+NO_ARCH=	yes
+PORTDOCS=	*
+OPTIONS_DEFINE=	DOCS
+DOCS_BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}sphinx>=0,1:textproc/py-sphinx@${PY_FLAVOR}
+DOCS_VARS=		PYDISTUTILS_BUILD_TARGET+="build_sphinx -a -E"
+
+# Workaround to make the port still buildable with "distutils"
+post-extract:
+	@${CP} ${FILESDIR}/setup.py ${WRKSRC}/
+
+post-install-DOCS-on:
+	@${MKDIR} ${STAGEDIR}${DOCSDIR}
+	(cd ${WRKSRC}/build/sphinx/html && \
+		${COPYTREE_SHARE} . ${STAGEDIR}${DOCSDIR} \
+			"! -name .buildinfo -and ! -name objects.inv")
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-auth-ldap/distinfo b/www/py-dj40-django-auth-ldap/distinfo
new file mode 100644
index 000000000000..43490a063c0e
--- /dev/null
+++ b/www/py-dj40-django-auth-ldap/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1654945388
+SHA256 (django-auth-ldap-4.1.0.tar.gz) = 77f749d3b17807ce8eb56a9c9c8e5746ff316567f81d5ba613495d9c7495a949
+SIZE (django-auth-ldap-4.1.0.tar.gz) = 53254
diff --git a/www/py-dj40-django-auth-ldap/files/patch-docs_conf.py b/www/py-dj40-django-auth-ldap/files/patch-docs_conf.py
new file mode 100644
index 000000000000..d41916245ebc
--- /dev/null
+++ b/www/py-dj40-django-auth-ldap/files/patch-docs_conf.py
@@ -0,0 +1,20 @@
+Avoid the download of various intersphinx inventories during build.  Only two
+intersphinx mappings are used and the documentation can be built/used without
+them.
+
+--- docs/conf.py.orig	2022-06-12 10:26:47 UTC
++++ docs/conf.py
+@@ -188,13 +188,3 @@ texinfo_documents = [
+ # -- Extension configuration -------------------------------------------------
+ 
+ # -- Options for intersphinx extension ---------------------------------------
+-
+-intersphinx_mapping = {
+-    "python": ("https://docs.python.org/3/", None),
+-    "django": (
+-        "https://docs.djangoproject.com/en/stable/",
+-        "https://docs.djangoproject.com/en/stable/_objects/",
+-    ),
+-    "pythonldap": ("https://www.python-ldap.org/en/latest/", None),
+-    "tox": ("https://tox.wiki/en/latest/", None),
+-}
diff --git a/www/py-dj40-django-auth-ldap/files/setup.py b/www/py-dj40-django-auth-ldap/files/setup.py
new file mode 100644
index 000000000000..927cf403e2f6
--- /dev/null
+++ b/www/py-dj40-django-auth-ldap/files/setup.py
@@ -0,0 +1,5 @@
+# Taken from the previous release (= 3.0.0)
+
+from setuptools import setup
+
+setup()
diff --git a/www/py-dj40-django-auth-ldap/pkg-descr b/www/py-dj40-django-auth-ldap/pkg-descr
new file mode 100644
index 000000000000..74682fda4265
--- /dev/null
+++ b/www/py-dj40-django-auth-ldap/pkg-descr
@@ -0,0 +1,6 @@
+This is a Django authentication backend that authenticates against an LDAP
+service. Configuration can be as simple as a single distinguished name template,
+but there are many rich configuration options for working with users, groups,
+and permissions.
+
+WWW: https://github.com/django-auth-ldap/django-auth-ldap
diff --git a/www/py-dj40-django-cors-headers/Makefile b/www/py-dj40-django-cors-headers/Makefile
new file mode 100644
index 000000000000..fc9647dc12ab
--- /dev/null
+++ b/www/py-dj40-django-cors-headers/Makefile
@@ -0,0 +1,21 @@
+PORTNAME=	django-cors-headers
+PORTVERSION=	3.12.0
+CATEGORIES=	www python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	kai@FreeBSD.org
+COMMENT=	Handles server headers required for Cross-Origin Resource Sharing
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=3.2:www/py-django40@${PY_FLAVOR}
+
+USES=		python:3.7+
+USE_PYTHON=	autoplist distutils
+
+NO_ARCH=		yes
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-cors-headers/distinfo b/www/py-dj40-django-cors-headers/distinfo
new file mode 100644
index 000000000000..26998037b0e1
--- /dev/null
+++ b/www/py-dj40-django-cors-headers/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1652519963
+SHA256 (django-cors-headers-3.12.0.tar.gz) = 5f07e2ff8a95c887698e748588a4a0b2ad0ad1b5a292e2d33132f1253e2a97cb
+SIZE (django-cors-headers-3.12.0.tar.gz) = 21054
diff --git a/www/py-dj40-django-cors-headers/pkg-descr b/www/py-dj40-django-cors-headers/pkg-descr
new file mode 100644
index 000000000000..7248fec2ba2d
--- /dev/null
+++ b/www/py-dj40-django-cors-headers/pkg-descr
@@ -0,0 +1,4 @@
+A Django App that adds CORS (Cross-Origin Resource Sharing) headers to
+responses.
+
+WWW: https://github.com/adamchainz/django-cors-headers
diff --git a/www/py-dj40-django-debug-toolbar/Makefile b/www/py-dj40-django-debug-toolbar/Makefile
new file mode 100644
index 000000000000..b85ebb36fdb7
--- /dev/null
+++ b/www/py-dj40-django-debug-toolbar/Makefile
@@ -0,0 +1,23 @@
+PORTNAME=	django-debug-toolbar
+PORTVERSION=	3.2.4
+CATEGORIES=	www python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	sunpoet@FreeBSD.org
+COMMENT=	Configurable set of panels to display debug information
+
+LICENSE=	BSD3CLAUSE
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=2.2:www/py-django40@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}sqlparse>=0.2.0:databases/py-sqlparse@${PY_FLAVOR}
+
+USES=		python:3.6+
+USE_PYTHON=	autoplist concurrent distutils
+
+NO_ARCH=	yes
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-debug-toolbar/distinfo b/www/py-dj40-django-debug-toolbar/distinfo
new file mode 100644
index 000000000000..e5834ab3ad6d
--- /dev/null
+++ b/www/py-dj40-django-debug-toolbar/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1641046016
+SHA256 (django-debug-toolbar-3.2.4.tar.gz) = 644bbd5c428d3283aa9115722471769cac1bec189edf3a0c855fd8ff870375a9
+SIZE (django-debug-toolbar-3.2.4.tar.gz) = 128774
diff --git a/www/py-dj40-django-debug-toolbar/pkg-descr b/www/py-dj40-django-debug-toolbar/pkg-descr
new file mode 100644
index 000000000000..9a28df80297f
--- /dev/null
+++ b/www/py-dj40-django-debug-toolbar/pkg-descr
@@ -0,0 +1,5 @@
+The Django Debug Toolbar is a configurable set of panels that display various
+debug information about the current request/response and when clicked, display
+more details about the panel's content.
+
+WWW: https://github.com/jazzband/django-debug-toolbar
diff --git a/www/py-dj40-django-filter/Makefile b/www/py-dj40-django-filter/Makefile
new file mode 100644
index 000000000000..ad55d3551bd6
--- /dev/null
+++ b/www/py-dj40-django-filter/Makefile
@@ -0,0 +1,22 @@
+PORTNAME=	django-filter
+DISTVERSION=	21.1
+CATEGORIES=	www python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	kai@FreeBSD.org
+COMMENT=	Dynamic filtering for querysets with Django
+
+LICENSE=	BSD3CLAUSE
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=2.2:www/py-django40@${PY_FLAVOR}
+
+USES=		python:3.6+
+USE_PYTHON=	distutils autoplist
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+NO_ARCH=		yes
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-filter/distinfo b/www/py-dj40-django-filter/distinfo
new file mode 100644
index 000000000000..1a819fdaccb6
--- /dev/null
+++ b/www/py-dj40-django-filter/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1632927725
+SHA256 (django-filter-21.1.tar.gz) = 632a251fa8f1aadb4b8cceff932bb52fe2f826dd7dfe7f3eac40e5c463d6836e
+SIZE (django-filter-21.1.tar.gz) = 154188
diff --git a/www/py-dj40-django-filter/pkg-descr b/www/py-dj40-django-filter/pkg-descr
new file mode 100644
index 000000000000..8b454bf6899f
--- /dev/null
+++ b/www/py-dj40-django-filter/pkg-descr
@@ -0,0 +1,4 @@
+Django-filter is a reusable Django application allowing users to declaratively
+add dynamic QuerySet filtering from URL parameters.
+
+WWW: https://github.com/carltongibson/django-filter
diff --git a/www/py-dj40-django-graphiql-debug-toolbar/Makefile b/www/py-dj40-django-graphiql-debug-toolbar/Makefile
new file mode 100644
index 000000000000..83b0e0b8de06
--- /dev/null
+++ b/www/py-dj40-django-graphiql-debug-toolbar/Makefile
@@ -0,0 +1,24 @@
+PORTNAME=	django-graphiql-debug-toolbar
+DISTVERSION=	0.2.0
+CATEGORIES=	www python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	kai@FreeBSD.org
+COMMENT=	Django Debug Toolbar for GraphiQL IDE
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=2.2:www/py-django40@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj40-graphene-django>=2.0.0:devel/py-dj40-graphene-django@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj40-django-debug-toolbar>=3.1:www/py-dj40-django-debug-toolbar@${PY_FLAVOR}
+
+USES=		python
+USE_PYTHON=	autoplist distutils
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+NO_ARCH=	yes
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-graphiql-debug-toolbar/distinfo b/www/py-dj40-django-graphiql-debug-toolbar/distinfo
new file mode 100644
index 000000000000..559e6602138b
--- /dev/null
+++ b/www/py-dj40-django-graphiql-debug-toolbar/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1630337959
+SHA256 (django-graphiql-debug-toolbar-0.2.0.tar.gz) = aec7a9e096594123d9fc359a583da794a0020b5391d941dda584ce1e667e0afd
+SIZE (django-graphiql-debug-toolbar-0.2.0.tar.gz) = 5000
diff --git a/www/py-dj40-django-graphiql-debug-toolbar/pkg-descr b/www/py-dj40-django-graphiql-debug-toolbar/pkg-descr
new file mode 100644
index 000000000000..328c55ac2ba0
--- /dev/null
+++ b/www/py-dj40-django-graphiql-debug-toolbar/pkg-descr
@@ -0,0 +1,4 @@
+This package is an extension for Django Debug Toolbar which enables support
+for debugging GraphiQL queries in Django Projects.
+
+WWW: https://github.com/flavors/django-graphiql-debug-toolbar
diff --git a/www/py-dj40-django-js-asset/Makefile b/www/py-dj40-django-js-asset/Makefile
new file mode 100644
index 000000000000..ef7598e56faf
--- /dev/null
+++ b/www/py-dj40-django-js-asset/Makefile
@@ -0,0 +1,22 @@
+PORTNAME=	django-js-asset
+DISTVERSION=	1.2.2
+CATEGORIES=	www python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	kai@FreeBSD.org
+COMMENT=	Insert script tags with additional attributes for django.forms.Media
+
+LICENSE=	BSD3CLAUSE
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>0:www/py-django40@${PY_FLAVOR}
+
+USES=		python:3.6+
+USE_PYTHON=	distutils autoplist
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+NO_ARCH=		yes
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-js-asset/distinfo b/www/py-dj40-django-js-asset/distinfo
new file mode 100644
index 000000000000..95516ac977d9
--- /dev/null
+++ b/www/py-dj40-django-js-asset/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1586294408
+SHA256 (django-js-asset-1.2.2.tar.gz) = c163ae80d2e0b22d8fb598047cd0dcef31f81830e127cfecae278ad574167260
+SIZE (django-js-asset-1.2.2.tar.gz) = 4436
diff --git a/www/py-dj40-django-js-asset/pkg-descr b/www/py-dj40-django-js-asset/pkg-descr
new file mode 100644
index 000000000000..1b3c52191784
--- /dev/null
+++ b/www/py-dj40-django-js-asset/pkg-descr
@@ -0,0 +1,4 @@
+Insert script tags with additional attributes (such as "id" and "data" for
+CSP-compatible data injection) for the django.forms.Media package.
+
+WWW: https://github.com/matthiask/django-js-asset
diff --git a/www/py-dj40-django-mptt/Makefile b/www/py-dj40-django-mptt/Makefile
new file mode 100644
index 000000000000..54b0eb3bc879
--- /dev/null
+++ b/www/py-dj40-django-mptt/Makefile
@@ -0,0 +1,23 @@
+PORTNAME=	django-mptt
+PORTVERSION=	0.13.4
+CATEGORIES=	www python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	kai@FreeBSD.org
+COMMENT=	Utilities for implementing Modified Preorder Tree Traversal in Django
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=2.2:www/py-django40@${PY_FLAVOR}\
+		${PYTHON_PKGNAMEPREFIX}dj40-django-js-asset>0:www/py-dj40-django-js-asset@${PY_FLAVOR}
+
+USES=		python:3.6+
+USE_PYTHON=	autoplist distutils
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+NO_ARCH=		yes
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-mptt/distinfo b/www/py-dj40-django-mptt/distinfo
new file mode 100644
index 000000000000..d16c6d82366f
--- /dev/null
+++ b/www/py-dj40-django-mptt/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1632928296
+SHA256 (django-mptt-0.13.4.tar.gz) = 80c9fb34df7796a4e5af0cb6b8ade3697555b1aa438bd07a01f32b3ab5202b63
+SIZE (django-mptt-0.13.4.tar.gz) = 102901
diff --git a/www/py-dj40-django-mptt/pkg-descr b/www/py-dj40-django-mptt/pkg-descr
new file mode 100644
index 000000000000..965e7289f5b7
--- /dev/null
+++ b/www/py-dj40-django-mptt/pkg-descr
@@ -0,0 +1,4 @@
+Utilities for implementing Modified Preorder Tree Traversal with your Django
+Models and working with trees of Model instances.
+
+WWW: https://github.com/django-mptt/django-mptt
diff --git a/www/py-dj40-django-prometheus/Makefile b/www/py-dj40-django-prometheus/Makefile
new file mode 100644
index 000000000000..7aab23735366
--- /dev/null
+++ b/www/py-dj40-django-prometheus/Makefile
@@ -0,0 +1,34 @@
+PORTNAME=	django-prometheus
+PORTVERSION=	2.2.0
+CATEGORIES=	www python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	kai@FreeBSD.org
+COMMENT=	Export Django monitoring metrics for Prometheus.io
+
+LICENSE=	APACHE20
+
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}pytest-runner>0:devel/py-pytest-runner@${PY_FLAVOR}
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=2.2:www/py-django40@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}prometheus-client>=0.7:net-mgmt/py-prometheus-client@${PY_FLAVOR}
+
+USES=		python:3.6+
+USE_PYTHON=	autoplist distutils
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+NO_ARCH=		yes
+
+OPTIONS_GROUP=		DATABASE CACHE
+OPTIONS_GROUP_CACHE=	MEMCACHED REDIS
+OPTIONS_GROUP_DATABASE=	MYSQL PGSQL
+
+MEMCACHED_DESC=		Memcached distributed memory caching support
+
+MEMCACHED_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}python-memcached>=0:databases/py-python-memcached@${PY_FLAVOR}
+MYSQL_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}mysqlclient>=0:databases/py-mysqlclient@${PY_FLAVOR}
+PGSQL_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}psycopg2>=0:databases/py-psycopg2@${PY_FLAVOR}
+REDIS_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}dj40-django-redis>=4.8:www/py-dj40-django-redis@${PY_FLAVOR}
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-prometheus/distinfo b/www/py-dj40-django-prometheus/distinfo
new file mode 100644
index 000000000000..65dd0e40195c
--- /dev/null
+++ b/www/py-dj40-django-prometheus/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1641495767
+SHA256 (django-prometheus-2.2.0.tar.gz) = 240378a1307c408bd5fc85614a3a57f1ce633d4a222c9e291e2bbf325173b801
+SIZE (django-prometheus-2.2.0.tar.gz) = 24995
diff --git a/www/py-dj40-django-prometheus/pkg-descr b/www/py-dj40-django-prometheus/pkg-descr
new file mode 100644
index 000000000000..5bb2be69d186
--- /dev/null
+++ b/www/py-dj40-django-prometheus/pkg-descr
@@ -0,0 +1,16 @@
+This library exports Django monitoring metrics for Prometheus.io.
+
+It provides support to monitor the following databases types:
+
+* SQLite (via Django)
+* PostgreSQL
+* MySQL
+
+In addition, caches can also be monitored:
+
+* memcached
+* Redis
+
+It's even possible to export metrics of Django models and migrations.
+
+WWW: https://github.com/korfuri/django-prometheus
diff --git a/www/py-dj40-django-redis/Makefile b/www/py-dj40-django-redis/Makefile
new file mode 100644
index 000000000000..aaaaee92c0ea
--- /dev/null
+++ b/www/py-dj40-django-redis/Makefile
@@ -0,0 +1,29 @@
+PORTNAME=	django-redis
+PORTVERSION=	5.2.0
+CATEGORIES=	www databases python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	sunpoet@FreeBSD.org
+COMMENT=	Full featured Redis cache/session backend for Django
+
+LICENSE=	BSD3CLAUSE
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=2.2:www/py-django40@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}redis>=3<4:databases/py-redis@${PY_FLAVOR}
+TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}hiredis>=0:databases/py-hiredis@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}mock>=0:devel/py-mock@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}msgpack>=0:devel/py-msgpack@${PY_FLAVOR}
+
+USES=		python:3.6+
+USE_PYTHON=	autoplist concurrent distutils
+
+NO_ARCH=	yes
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+do-test:
+	@cd ${WRKSRC}/tests && ${PYTHON_CMD} runtests.py
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-redis/distinfo b/www/py-dj40-django-redis/distinfo
new file mode 100644
index 000000000000..e8022e0e5f97
--- /dev/null
+++ b/www/py-dj40-django-redis/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1641046018
+SHA256 (django-redis-5.2.0.tar.gz) = 8a99e5582c79f894168f5865c52bd921213253b7fd64d16733ae4591564465de
+SIZE (django-redis-5.2.0.tar.gz) = 44132
diff --git a/www/py-dj40-django-redis/pkg-descr b/www/py-dj40-django-redis/pkg-descr
new file mode 100644
index 000000000000..765564e7a725
--- /dev/null
+++ b/www/py-dj40-django-redis/pkg-descr
@@ -0,0 +1,17 @@
+Django-redis is a BSD Licensed, full featured Redis cache/session
+backend for Django.
+
+Why use django-redis?
+
+ * Modular client system (pluggable clients).
+ * Master-Slave support in the default client.
+ * Used in production in several projects as cache and session storage.
+ * Supports infinite timeouts.
+ * Python 3 support in same code base.
+ * Facilities for raw access to Redis client/connection pool.
+ * Highly configurable (can emulate memcached exception behavior, for
+   example).
+ * Unix sockets supported by default.
+ * Pluggable parsers.
+
+WWW: https://github.com/jazzband/django-redis
diff --git a/www/py-dj40-django-tables2/Makefile b/www/py-dj40-django-tables2/Makefile
new file mode 100644
index 000000000000..99dff8cee92f
--- /dev/null
+++ b/www/py-dj40-django-tables2/Makefile
@@ -0,0 +1,27 @@
+PORTNAME=	django-tables2
+DISTVERSION=	2.4.1
+CATEGORIES=	www python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	kai@FreeBSD.org
+COMMENT=	Table/data-grid framework for Django
+
+LICENSE=	BSD2CLAUSE
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=1.11:www/py-django40@${PY_FLAVOR}
+
+USES=		python:3.7+
+USE_PYTHON=	distutils autoplist
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+NO_ARCH=		yes
+
+OPTIONS_DEFINE=		TABLIB
+
+TABLIB_DESC=		Enable support for exporting table datasets
+TABLIB_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}tablib>=0:textproc/py-tablib@${PY_FLAVOR}
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-tables2/distinfo b/www/py-dj40-django-tables2/distinfo
new file mode 100644
index 000000000000..151f1103a4fd
--- /dev/null
+++ b/www/py-dj40-django-tables2/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1633552255
+SHA256 (django-tables2-2.4.1.tar.gz) = 6c72dd208358539e789e4c0efd7d151e43283a4aa4093a35f44c43489e7ddeaa
+SIZE (django-tables2-2.4.1.tar.gz) = 78516
diff --git a/www/py-dj40-django-tables2/pkg-descr b/www/py-dj40-django-tables2/pkg-descr
new file mode 100644
index 000000000000..e4a9e8e434f9
--- /dev/null
+++ b/www/py-dj40-django-tables2/pkg-descr
@@ -0,0 +1,5 @@
+django-tables2 simplifies the task of turning sets of data into HTML tables.
+It has native support for pagination and sorting, does for HTML tables what
+django.forms does for HTML forms.
+
+WWW: https://github.com/jieter/django-tables2
diff --git a/www/py-dj40-django-taggit/Makefile b/www/py-dj40-django-taggit/Makefile
new file mode 100644
index 000000000000..3307ba7ca174
--- /dev/null
+++ b/www/py-dj40-django-taggit/Makefile
@@ -0,0 +1,26 @@
+PORTNAME=	django-taggit
+PORTVERSION=	2.1.0
+CATEGORIES=	www python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	kai@FreeBSD.org
+COMMENT=	Reusable Django application for simple tagging
+
+LICENSE=	BSD3CLAUSE
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=2.2:www/py-django40@${PY_FLAVOR}
+TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}dj40-djangorestframework>0:www/py-dj40-djangorestframework@${PY_FLAVOR}
+
+USES=		python:3.6+
+USE_PYTHON=	autoplist distutils
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+NO_ARCH=		yes
+
+do-test:
+	@cd ${WRKSRC} && ${SETENV} ${TEST_ENV} ${PYTHON_CMD} -m django test --settings=tests.settings -v3
+
+.include <bsd.port.mk>
diff --git a/www/py-dj40-django-taggit/distinfo b/www/py-dj40-django-taggit/distinfo
new file mode 100644
index 000000000000..6fb77687abb6
--- /dev/null
+++ b/www/py-dj40-django-taggit/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1644942645
+SHA256 (django-taggit-2.1.0.tar.gz) = a9f41e4ad58efe4b28d86f274728ee87eb98eeae90c9eb4b4efad39e5068184e
+SIZE (django-taggit-2.1.0.tar.gz) = 55659
diff --git a/www/py-dj40-django-taggit/pkg-descr b/www/py-dj40-django-taggit/pkg-descr
new file mode 100644
index 000000000000..1c0759657dfc
--- /dev/null
+++ b/www/py-dj40-django-taggit/pkg-descr
@@ -0,0 +1,3 @@
+django-taggit a simpler approach to tagging with Django.
+
+WWW: https://github.com/jazzband/django-taggit
diff --git a/www/py-dj40-django-timezone-field/Makefile b/www/py-dj40-django-timezone-field/Makefile
new file mode 100644
index 000000000000..e95f9ad5da48
--- /dev/null
+++ b/www/py-dj40-django-timezone-field/Makefile
@@ -0,0 +1,29 @@
+PORTNAME=	django-timezone-field
+DISTVERSION=	5.0
+CATEGORIES=	www python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}dj40-
+
+MAINTAINER=	kai@FreeBSD.org
+COMMENT=	Provides database and form fields for pytz timezone objects for Django
+
+LICENSE=	BSD2CLAUSE
+LICENSE_FILE=	${WRKSRC}/LICENSE.txt
+
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=2.2:www/py-django40@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pytz>0:devel/py-pytz@${PY_FLAVOR}
+
+USES=		python:3.6+
+USE_PYTHON=	distutils autoplist
+
+CONFLICTS_INSTALL=	${PYTHON_PKGNAMEPREFIX}*${PORTNAME}
+
+NO_ARCH=		yes
+
+.include <bsd.port.pre.mk>
+
+.if ${PYTHON_REL} < 30900
+RUN_DEPENDS+=	${PYTHON_PKGNAMEPREFIX}backports.zoneinfo>=0.2.1<0.3.0:devel/py-backports.zoneinfo@${PY_FLAVOR}
+.endif
+
+.include <bsd.port.post.mk>
diff --git a/www/py-dj40-django-timezone-field/distinfo b/www/py-dj40-django-timezone-field/distinfo
new file mode 100644
index 000000000000..8933b4e95c22
--- /dev/null
+++ b/www/py-dj40-django-timezone-field/distinfo
@@ -0,0 +1,3 @@
*** 326 LINES SKIPPED ***