about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gn/packages/bnw.scm2
-rw-r--r--gn/packages/crates-io.scm2
-rw-r--r--gn/packages/cwl.scm150
-rw-r--r--gn/packages/edash.scm23
-rw-r--r--gn/packages/genenetwork.scm29
-rw-r--r--gn/packages/graphviz.scm42
-rw-r--r--gn/packages/jupyterhub.scm150
-rw-r--r--gn/packages/mailman.scm1735
-rw-r--r--gn/packages/python.scm11
-rw-r--r--gn/packages/python24.scm112
-rw-r--r--gn/packages/twint.scm65
-rw-r--r--gn/packages/web.scm277
-rw-r--r--gn/services/genenetwork.scm68
13 files changed, 216 insertions, 2450 deletions
diff --git a/gn/packages/bnw.scm b/gn/packages/bnw.scm
index 043077d..bdcaeb0 100644
--- a/gn/packages/bnw.scm
+++ b/gn/packages/bnw.scm
@@ -6,7 +6,7 @@
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages python)
   #:use-module (gnu packages statistics)
-  #:use-module (gn packages graphviz)
+  #:use-module (past packages graphviz)
   #:use-module (gn packages javascript)
   #:use-module (gn packages maths)
   #:use-module (gn packages python)
diff --git a/gn/packages/crates-io.scm b/gn/packages/crates-io.scm
index f8c2cba..775a5e9 100644
--- a/gn/packages/crates-io.scm
+++ b/gn/packages/crates-io.scm
@@ -31,7 +31,7 @@
         ;("rust-blas-src" ,rust-blas-src-0.2)
         ("rust-cblas-sys" ,rust-cblas-sys-0.1)
         ("rust-rustc-serialize" ,rust-rustc-serialize-0.3)
-        ("rust-serde" ,rust-serde-1.0))
+        ("rust-serde" ,rust-serde-1))
        #:cargo-development-inputs
        (("rust-defmac" ,rust-defmac-0.1)
         ("rust-quickcheck" ,rust-quickcheck-0.7)
diff --git a/gn/packages/cwl.scm b/gn/packages/cwl.scm
index be531f6..3e0576c 100644
--- a/gn/packages/cwl.scm
+++ b/gn/packages/cwl.scm
@@ -1,91 +1,109 @@
-;; Experimental packaging for the Common Workflow Language (started by Bruno)
-
 (define-module (gn packages cwl)
   #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gn packages python)
+  #:use-module (guix download)
+  #:use-module (guix packages)
+  #:use-module (guix build-system python)
   #:use-module (gnu packages)
   #:use-module (gnu packages check)
-  #:use-module (gnu packages databases)
-  #:use-module (gnu packages python)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages node)
   #:use-module (gnu packages rdf)
   #:use-module (gnu packages serialization)
   #:use-module (gnu packages time)
-  #:use-module (gnu packages version-control)
-  #:use-module (gnu packages xml)
-  #:use-module (gn packages python)
-  #:use-module (guix download)
-  #:use-module (guix packages)
-  #:use-module (guix git-download)
-  #:use-module (guix utils)
-  ; #:use-module (guix build-system gnu)
-  #:use-module (guix build-system python)
-  ; #:use-module (guix build-system trivial)
-  #:use-module (srfi srfi-1))
+  #:use-module (gnu packages xml))
 
-(define-public cwltool ; guix: needs work
-  (let ((commit "15539fba76993f951af9eba913bea6d677c74005"))
+(define-public cwltool
   (package
     (name "cwltool")
-    (version "1.0.20181012180214")
+    (version "3.0.20200710214758")
     (source
       (origin
-        ; (method url-fetch)
-        ; (uri (string-append
-        ;        "https://pypi.python.org/packages/source/c/cwltool/cwltool-"
-        ;        version
-        ;       ".tar.gz"))
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/genenetwork/cwltool.git") ;; my repo for Python 3.7
-               (commit commit)))
-         (file-name (git-file-name name (string-append version "-" (string-take commit 7))))
+        (method url-fetch)
+        (uri (pypi-uri "cwltool" version))
         (sha256
-          (base32
-            "1qwfa82car7477sy0cb5bj4964w7zq7dcw2bdcls6c2i9qdp0586"))))
+         (base32
+          "1qbqkhinkhzg98jf24d5gnafsw23kng76rbi2hfvzl18bdsp1zz5"))))
     (build-system python-build-system)
-    (propagated-inputs ; a lot of these are used for testing
-     `(("git" ,git)
-       ("node" ,node)
-       ("python-bagit" ,python-bagit)
-       ("python-arcp" ,python-arcp)
-       ("python-setuptools" ,python-setuptools)
-       ("python-dateutil" ,python-dateutil)
-       ("python-pytest-cov" ,python-pytest-cov)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'loosen-version-restrictions
+           (lambda _
+             (substitute* "setup.py"
+               (("== 1.5.1") ">=1.5.1"))
+             #t))
+         (add-after 'unpack 'modify-tests
+           (lambda _
+             ;; Tries to connect to the internet.
+             (delete-file "tests/test_udocker.py")
+             (substitute* "tests/test_http_input.py"
+               (("https://raw.githubusercontent.com/common-workflow-language/cwltool/main")
+                "."))
+             (substitute* "tests/test_load_tool.py"
+               (("def test_load_graph_fragment_from_packed")
+                "@pytest.mark.skip(reason=\"Disabled by Guix\")\ndef test_load_graph_fragment_from_packed"))
+             (substitute* "tests/test_examples.py"
+               (("def test_env_filtering")
+                "@pytest.mark.skip(reason=\"Disabled by Guix\")\ndef test_env_filtering"))
+             ;; Tries to use cwl-runners.
+             (substitute* "tests/test_examples.py"
+               (("def test_v1_0_arg_empty_prefix_separate_false")
+                "@pytest.mark.skip(reason=\"Disabled by Guix\")\ndef test_v1_0_arg_empty_prefix_separate_false"))
+             #t)))))
+    (propagated-inputs
+     `(("python-bagit" ,python-bagit)
+       ("python-coloredlogs" ,python-coloredlogs)
+       ("python-mypy-extensions" ,python-mypy-extensions)
        ("python-prov" ,python-prov)
-       ("python-pytest-runner" ,python-pytest-runner)
+       ("python-psutil" ,python-psutil)
        ("python-rdflib" ,python-rdflib)
-       ("python-pyparsing" ,python-pyparsing)
-       ("python-pytest-mock" ,python-pytest-mock)
-       ("python-mock" ,python-mock)
-       ("python-subprocess32" ,python-subprocess32)
+       ("python-requests" ,python-requests)
        ("python-ruamel.yaml" ,python-ruamel.yaml)
+       ("python-schema-salad" ,python-schema-salad)
+       ("python-setuptools" ,python-setuptools)
+       ("python-shellescape" ,python-shellescape)
+       ("python-typing-extensions" ,python-typing-extensions)
+       ;; Not listed as needed but seems to be necessary:
+       ("node" ,node)
        ("python-cachecontrol" ,python-cachecontrol-0.11)
+       ("python-dateutil" ,python-dateutil)
        ("python-lxml" ,python-lxml)
-       ("python-mypy-extensions" ,python-mypy-extensions)
-       ("python-mistune" ,python-mistune)
-       ("python-networkx" ,python-networkx)
-       ("python-schema-salad" ,python-schema-salad)
-       ("python-html5lib" ,python-html5lib)
-       ("python-rdflib-jsonld" ,python-rdflib-jsonld)
-       ("python-scandir" ,python-scandir)
-       ("python-psutil" ,python-psutil)
-       ))
-    ; (arguments `(#:tests? #f)) ;; CWL includes no tests.
-    (arguments
-     `(;#:phases
-       ; (modify-phases %standard-phases
-       ;   (replace 'check
-       ;     (lambda* (#:key inputs outputs #:allow-other-keys)
-       ;       (invoke "python" "-m" "pytest")
-       ;       )))
-       #:tests? #f))   ; Disable for now
+       ("python-networkx" ,python-networkx)))
+    (native-inputs
+     `(("python-arcp" ,python-arcp)
+       ("python-humanfriendly" ,python-humanfriendly)
+       ("python-mock" ,python-mock)
+       ("python-pytest" ,python-pytest)
+       ("python-pytest-cov" ,python-pytest-cov)
+       ("python-pytest-mock" ,python-pytest-mock)
+       ("python-pytest-runner" ,python-pytest-runner)
+       ("python-rdflib-jsonld" ,python-rdflib-jsonld)))
+    (home-page
+     "https://github.com/common-workflow-language/common-workflow-language")
+    (synopsis "Common workflow language reference implementation")
+    (description
+     "Common workflow language reference implementation.")
+    (license license:asl2.0)))
 
+(define-public cwl-runner
+  (package
+    (name "cwl-runner")
+    (version "1.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "cwl_runner" version))
+        (sha256
+         (base32
+          "0011am2xqwchysdznayrmwhg4bfjl4wlq6m4k20z1m7gccyzjgw0"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("cwltool" ,cwltool)))
     (home-page
-      "https://github.com/common-workflow-language/common-workflow-language")
-    (synopsis
-      "Common workflow language reference implementation")
+     "https://github.com/common-workflow-language/common-workflow-language")
+    (synopsis "Common workflow language reference implementation")
     (description
-      "Common workflow language reference implementation")
-    (license license:asl2.0))))
+     "Common workflow language reference implementation.")
+    (license license:asl2.0)))
diff --git a/gn/packages/edash.scm b/gn/packages/edash.scm
index 53071b1..7f52393 100644
--- a/gn/packages/edash.scm
+++ b/gn/packages/edash.scm
@@ -7,6 +7,7 @@
   #:use-module (gnu packages web)
   #:use-module (gnu packages base)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-check)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages python-crypto)
@@ -226,28 +227,6 @@ necessary.")
      "A collection of helpers and mock objects for unit tests and doc tests.")
     (license license:expat)))
 
-(define-public python-pytest-aiohttp
-  (package
-    (name "python-pytest-aiohttp")
-    (version "0.3.0")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (pypi-uri "pytest-aiohttp" version))
-       (sha256
-        (base32
-         "0kx4mbs9bflycd8x9af0idcjhdgnzri3nw1qb0vpfyb3751qaaf9"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-pytest" ,python-pytest)
-       ("python-aiohttp" ,python-aiohttp)
-       ("python-pytest-timeout" ,python-pytest-timeout)))
-    (home-page
-     "https://github.com/aio-libs/pytest-aiohttp/")
-    (synopsis "pytest plugin for aiohttp support")
-    (description "pytest plugin for aiohttp support")
-    (license license:asl2.0)))
-
 (define-public python-aiohttp-jinja2
   (package
     (name "python-aiohttp-jinja2")
diff --git a/gn/packages/genenetwork.scm b/gn/packages/genenetwork.scm
index 671d5e9..8a76327 100644
--- a/gn/packages/genenetwork.scm
+++ b/gn/packages/genenetwork.scm
@@ -31,13 +31,13 @@
   #:use-module (gnu packages web)
   #:use-module (gnu packages wget)
   #:use-module (gnu packages xml)
+  #:use-module (past packages graphviz)
   #:use-module (past packages python)
   #:use-module (gn packages bioinformatics)
   #:use-module (gn packages twint)
   #:use-module (gn packages crates-io)
   #:use-module (gn packages elixir)
   #:use-module (gn packages gemma)
-  #:use-module (gn packages graphviz)
   #:use-module (gn packages javascript)
   #:use-module (gn packages phewas)
   #:use-module (gn packages python)
@@ -259,8 +259,8 @@ implemented, light on server resource usage, and fairly speedy.")
          (("rust-rand" ,rust-rand-0.6)
           ("rust-structopt" ,rust-structopt-0.2)
           ("rust-rayon" ,rust-rayon-1)
-          ("rust-serde" ,rust-serde-1.0)
-          ("rust-serde-json" ,rust-serde-json-1.0)
+          ("rust-serde" ,rust-serde-1)
+          ("rust-serde-json" ,rust-serde-json-1)
           ("rust-ndarray" ,rust-ndarray-0.12))
          #:phases
          (modify-phases %standard-phases
@@ -318,6 +318,7 @@ implemented, light on server resource usage, and fairly speedy.")
        ("rust-qtlreaper" ,rust-qtlreaper)
        ("nginx" ,nginx)
        ("python-twint" ,python-twint)
+       ("python2-coverage" ,python2-coverage)
        ("python2-flask" ,python2-flask)
        ("python2-gunicorn-gn" ,python2-gunicorn-gn)
        ; ("python2-pillow" ,python2-pillow) - for later!
@@ -334,7 +335,9 @@ implemented, light on server resource usage, and fairly speedy.")
        ("python2-scipy" ,python2-scipy)
        ("python2-lxml" ,python2-lxml)
        ("python2-mechanize" ,python2-mechanize)
+       ("python2-mock" ,python2-mock)
        ("python2-mysqlclient" ,python2-mysqlclient)
+       ("python2-nose" ,python-nose2)
        ("python2-numarray" ,python2-numarray)
        ("python2-numpy" ,python2-numpy)
        ("python2-pandas" ,python2-pandas)
@@ -823,8 +826,8 @@ written in C")
      (license license:agpl3+))))
 
 (define-public genenetwork1
-  (let ((commit "19791ce6b3c38be8cbf9bc9cd3e95dbee14116c2") ; Aug 23, 2018
-        (revision "1"))
+  (let ((commit "acf65ac9ae4be395c07c1629758f7408bf4eab5f") ; June 3, 2020
+        (revision "2"))
     (package
       (name "genenetwork1")
       (version (git-version "0.0.0" revision commit))
@@ -836,12 +839,11 @@ written in C")
         (file-name (git-file-name name version))
         (sha256
          (base32
-          "1s735dj8kf98gf5w58p10zzyc5766gn27j4j5yh07ksadg7h1kdi"))))
+          "0xmmmjyvh80yd8b0cjrwpdmxl8k9zj5ly65r2g9aygx74njsp4fi"))))
       (build-system gnu-build-system)
-      (propagated-inputs
+      (native-inputs
        `(("ghostscript" ,ghostscript)
          ("graphviz" ,graphviz-2.26)
-         ("httpd" ,httpd22-mod-python-24)
          ("python24" ,python-2.4)
          ("python-piddle" ,python24-piddle)
          ("wget" ,wget)))
@@ -879,6 +881,17 @@ written in C")
                    (("PIDDLE_FONT_PATH.*/lib")
                     (string-append "PIDDLE_FONT_PATH = '" piddle "/lib"))))
                #t))
+           (add-after 'patch-generated-file-shebangs 'changes-for-deployed-service
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let ((out    (assoc-ref outputs "out")))
+                 (substitute* "web/webqtl/base/webqtlConfigLocal.py"
+                   ;; Where GN1 is located:
+                   (("/gnshare/gn") out)
+                   ;; Where the database is located:
+                   (("tux01") "localhost"))
+                 ;; This directory is expected to be writable
+                 (symlink "/tmp" "web/tmp")
+                 #t)))
            (add-before 'install 'replace-htaccess-file
              (lambda _
                (delete-file "web/webqtl/.htaccess")
diff --git a/gn/packages/graphviz.scm b/gn/packages/graphviz.scm
deleted file mode 100644
index 22a8959..0000000
--- a/gn/packages/graphviz.scm
+++ /dev/null
@@ -1,42 +0,0 @@
-(define-module (gn packages graphviz)
-  #:use-module ((guix licenses) #:prefix license:)
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix utils)
-  #:use-module (gnu packages gl)
-  #:use-module (gnu packages graphviz)
-  #:use-module (gnu packages gtk)
-  #:use-module (srfi srfi-1))
-
-(define-public graphviz-2.26
-  (package
-    (inherit graphviz)
-    (name "graphviz")
-    (version "2.26.3")
-    (outputs '("out"))
-    (source
-      (origin
-        (method url-fetch)
-        (uri (string-append
-               ;; TODO: Replace with official release
-               "mirror://debian/pool/main/g/graphviz/"
-               "graphviz_" version ".orig.tar.gz"))
-        (file-name (string-append name "-" version ".tar.gz"))
-        (sha256
-         (base32
-          "18bzyg17ni0lpcd2g5dhan8fjv3vzkjym38jq8vm42did5p9j47l"))))
-    ;; TODO: unbundle libraries?
-    (arguments
-     `(#:configure-flags '("--enable-swig=no")
-       ,@(substitute-keyword-arguments (package-arguments graphviz)
-           ((#:phases phases)
-            `(modify-phases ,phases
-               (delete 'move-docs) ; one output
-               (delete 'move-guile-bindings))))))
-    (inputs
-      ;; TODO(?): Add perl, guile@1.8, gtk@2, lua5.1, tcl8.[3-6], rsvg, python-2.4
-     `(("gdk-pixbuf" ,gdk-pixbuf)
-       ("freeglut" ,freeglut)
-       ,@(fold alist-delete (package-inputs graphviz)
-               '("libjpeg-turbo" "guile" "swig"))))
-    (license license:cpl1.0)))
diff --git a/gn/packages/jupyterhub.scm b/gn/packages/jupyterhub.scm
index 43da8ec..f3afa65 100644
--- a/gn/packages/jupyterhub.scm
+++ b/gn/packages/jupyterhub.scm
@@ -266,36 +266,6 @@ balancing and can configure itself automatically and dynamically.")
      "Simple, generic API for escaping strings.")
     (license license:expat)))
 
-(define-public python-tenacity
-  (package
-    (name "python-tenacity")
-    (version "6.0.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "tenacity" version))
-        (sha256
-         (base32
-          "0w9miqmmi63yqp9lw7p6nf6gh5pa57vg60v6f94f11qqpg19gwvj"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "pytest"))))))
-    (propagated-inputs
-     `(("python-six" ,python-six)))
-    (native-inputs
-     `(("python-pytest" ,python-pytest)
-       ("python-setuptools-scm" ,python-setuptools-scm)
-       ("python-tornado" ,python-tornado)))
-    (home-page "https://github.com/jd/tenacity")
-    (synopsis "Retry code until it succeeeds")
-    (description "Tenacity is a general-purpose retrying library to simplify the
-task of adding retry behavior to just about anything.")
-    (license license:asl2.0)))
-
 (define-public python-certipy
   (package
     (name "python-certipy")
@@ -362,126 +332,6 @@ task of adding retry behavior to just about anything.")
     (description "PAM interface using ctypes")
     (license license:expat)))
 
-(define-public python-pifpaf
-  (package
-    (name "python-pifpaf")
-    (version "2.2.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "pifpaf" version))
-        (sha256
-         (base32
-          "09xixb4ddjp15spbm2788yq6rjr5fzy1p8dzcqyzp6pbkv7vwxvg"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "python" "setup.py" "testr" "--slowest"
-                     "--testr-args=until-failure"))))))
-    (propagated-inputs
-     `(("python-click" ,python-click)
-       ("python-daiquiri" ,python-daiquiri)
-       ("python-fixtures" ,python-fixtures)
-       ("python-jinja2" ,python-jinja2)
-       ("python-pbr" ,python-pbr)
-       ("python-psutil" ,python-psutil)
-       ("python-six" ,python-six)
-       ("python-xattr" ,python-xattr)))
-    (native-inputs
-     `(("python-mock" ,python-mock)
-       ("python-os-testr" ,python-os-testr)
-       ("python-requests" ,python-requests)
-       ("python-testrepository" ,python-testrepository)
-       ("python-testtools" ,python-testtools)))
-    (home-page "https://github.com/jd/pifpaf")
-    (synopsis
-      "Suite of tools and fixtures to manage daemons for testing")
-    (description
-      "Suite of tools and fixtures to manage daemons for testing")
-    (license license:asl2.0)))
-
-(define-public python-daiquiri
-  (package
-    (name "python-daiquiri")
-    (version "1.6.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "daiquiri" version))
-        (sha256
-         (base32
-          "1hclvhfm3ix40g3m7g14w0nz2qawb7gp3fjba7d6xzxhh9mj6fn1"))))
-    (build-system python-build-system)
-    (native-inputs
-     `(("python-json-logger" ,python-json-logger)
-       ("python-pbr" ,python-pbr)
-       ("python-pytest" ,python-pytest)
-       ("python-six" ,python-six)))
-    (home-page "https://github.com/jd/daiquiri")
-    (synopsis "Library to configure Python logging easily")
-    (description
-      "Library to configure Python logging easily")
-    (license license:asl2.0)))
-
-(define-public python-xattr
-  (package
-    (name "python-xattr")
-    (version "0.9.6")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "xattr" version))
-        (sha256
-         (base32
-          "0n3llkk488bjywzifgyhyxcfdz22851k3s2h8g69kzmlxa7b5cbw"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-cffi" ,python-cffi)))
-    (home-page "https://github.com/xattr/xattr")
-    (synopsis "Python wrapper for extended filesystem attributes")
-    (description
-     "Python wrapper for extended filesystem attributes")
-    (license license:expat)))
-
-(define-public python-json-logger
-  (package
-    (name "python-json-logger")
-    (version "0.1.11")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "python-json-logger" version))
-        (sha256
-         (base32
-          "10g2ya6nsvn5vxzvq2wb8q4d43i3d7756i5rxyjna6d0y9i138xp"))))
-    (build-system python-build-system)
-    (home-page "https://github.com/madzak/python-json-logger")
-    (synopsis "Python library adding a json log formatter")
-    (description
-     "A python library adding a json log formatter")
-    (license license:bsd-3)))
-
-(define-public python-websockets
-  (package
-    (name "python-websockets")
-    (version "8.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "websockets" version))
-        (sha256
-         (base32
-          "03s3ml6sbki24aajllf8aily0xzrn929zxi84p50zkkbikdd4raw"))))
-    (build-system python-build-system)
-    (home-page "https://github.com/aaugustin/websockets")
-    (synopsis "Implementation of the WebSocket Protocol")
-    (description
-     "An implementation of the WebSocket Protocol (RFC 6455 & 7692).")
-    (license license:bsd-3)))
-
 (define-public python-pytoml
   (package
     (name "python-pytoml")
diff --git a/gn/packages/mailman.scm b/gn/packages/mailman.scm
deleted file mode 100644
index db2b92d..0000000
--- a/gn/packages/mailman.scm
+++ /dev/null
@@ -1,1735 +0,0 @@
-(define-module (gn packages mailman)
-  #:use-module ((guix licenses) #:prefix license:)
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix build-system python)
-  #:use-module (gnu packages check)
-  #:use-module (gnu packages compression)
-  #:use-module (gnu packages databases)
-  #:use-module (gnu packages django)
-  #:use-module (gnu packages geo)
-  #:use-module (gnu packages libffi)
-  #:use-module (gnu packages mail)
-  #:use-module (gnu packages ncurses)
-  #:use-module (gnu packages python-check)
-  #:use-module (gnu packages python-crypto)
-  #:use-module (gnu packages python-xyz)
-  #:use-module (gnu packages python-web)
-  #:use-module (gnu packages time)
-  #:use-module (gnu packages tls))
-
-(define-public mailman
-  (package
-    (name "mailman")
-    (version "3.3.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "mailman" version))
-        (sha256
-         (base32
-          "1qph9i93ndahfxi3bb2sd0kjm2c0pkh844ai6zacfmvihl1k3pvy"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("gunicorn" ,gunicorn)
-       ("python-aiosmtpd" ,python-aiosmtpd)
-       ("python-alembic" ,python-alembic)
-       ("python-atpublic" ,python-atpublic)
-       ("python-authheaders" ,python-authheaders)
-       ("python-authres" ,python-authres)
-       ("python-click" ,python-click)
-       ("python-dateutil" ,python-dateutil)
-       ("python-dnspython" ,python-dnspython)
-       ("python-falcon" ,python-falcon)
-       ("python-flufl-bounce" ,python-flufl-bounce)
-       ("python-flufl-i18n" ,python-flufl-i18n)
-       ("python-flufl-lock" ,python-flufl-lock)
-       ("python-importlib-resources" ,python-importlib-resources) ; built into python-3.7
-       ("python-lazr-config" ,python-lazr-config)
-       ("python-passlib" ,python-passlib)
-       ("python-requests" ,python-requests)
-       ("python-sqlalchemy" ,python-sqlalchemy)
-       ("python-zope-component" ,python-zope-component)
-       ("python-zope-configuration" ,python-zope-configuration)
-       ("python-zope-event" ,python-zope-event)
-       ("python-zope-interface" ,python-zope-interface)))
-    (home-page "https://www.list.org")
-    (synopsis "Mailing list manager")
-    (description
-     "GNU Mailman is software for managing email discussion and mailing
-lists.  Both users and administrators generally perform their actions in a
-web interface, although email and command-line interfaces are also provided.
-The system features built-in archiving, automatic bounce processing, content
-filtering, digest delivery, and more.")
-    (license license:gpl3+)))
-
-(define-public python-aiosmtpd
-  (package
-    (name "python-aiosmtpd")
-    (version "1.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "aiosmtpd" version))
-        (sha256
-         (base32
-          "1xdfk741pjmz1cm8dsi4n5vq4517i175rm94696m3f7kcgk7xsmp"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'delete-failing-test
-           (lambda _
-             (delete-file "aiosmtpd/tests/test_smtps.py")
-             #t))
-         (replace 'check
-           (lambda _
-             (invoke "python" "-m" "nose2" "-v"))))))
-    (native-inputs
-     `(("python-flufl-testing" ,python-flufl-testing)
-       ("python-nose2" ,python-nose2)))
-    (propagated-inputs
-     `(("python-atpublic" ,python-atpublic)))
-    (home-page "https://aiosmtpd.readthedocs.io/")
-    (synopsis "Asyncio based SMTP server")
-    (description
-     "This project is a reimplementation of the Python stdlib @code{smtpd.py}
-based on asyncio.")
-    (license (list license:asl2.0
-                   license:lgpl3)))) ; only for setup_helpers.py
-
-(define-public python-flufl-testing
-  (package
-    (name "python-flufl-testing")
-    (version "0.8")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "flufl.testing" version))
-        (sha256
-         (base32
-          "1nkm95mhcfhl4x5jgs6y97ikszaxsfh07nyawsih6cxxm6l62641"))))
-    (build-system python-build-system)
-    (native-inputs
-     `(("python-nose2" ,python-nose2)))
-    (home-page "https://gitlab.com/warsaw/flufl.testing")
-    (synopsis "Collection of test tool plugins")
-    (description
-     "A small collection of test tool plugins for nose2 and flake8.")
-    (license license:asl2.0)))
-
-(define-public python-atpublic
-  (package
-    (name "python-atpublic")
-    (version "1.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "atpublic" version))
-        (sha256
-         (base32
-          "0i3sbxkdlbb4560rrlmwwd5y4ps7k73lp4d8wnmd7ag9k426gjkx"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (add-before 'build 'enable-c-implementation
-           (lambda _
-             (setenv "ATPUBLIC_BUILD_EXTENSION" "yes")
-             #t))
-         (replace 'check
-           (lambda _
-             (invoke "python" "-m" "nose2" "-v"))))))
-    (native-inputs
-     `(("python-nose2" ,python-nose2)))
-    (home-page "https://public.readthedocs.io/")
-    (synopsis "@code{@@public} decorator for populating @code{__all__}")
-    (description
-     "This Python module adds a @code{@@public} decorator and function which
-populates a module's @code{__all__} and optionally the module globals.  With
-it, the declaration of a name's public export semantics are not separated from
-the implementation of that name.")
-    (license (list license:asl2.0
-                   license:lgpl3)))) ; only for setup_helpers.py
-
-(define-public python-authheaders
-  (package
-    (name "python-authheaders")
-    (version "0.12.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "authheaders" version))
-        (sha256
-         (base32
-          "1ljcp8vk2n4xwk8p758b6q5sgdicyj4gxxpkmh33mx21jscn6q4i"))
-        (modules '((guix build utils)))
-        (snippet
-         '(begin
-            ;; Remove bundled public suffix list and its license.
-            (delete-file "authheaders/public_suffix_list.txt")
-            (delete-file "MPL-2.0")
-            #t))))
-    (build-system python-build-system)
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-before 'build 'configure-public-suffix-list
-           ;; Use public suffix list from Guix package.
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let ((publicsuffix (assoc-ref inputs "python-publicsuffix")))
-               (invoke "python" "setup.py" "psllocal"
-                 (string-append "--path=" publicsuffix "/lib/python"
-                                (python-version (assoc-ref inputs "python"))
-                                "/site-packages/publicsuffix"
-                                "/public_suffix_list.dat"))
-               #t)))
-         (replace 'check
-           (lambda _
-             ;; Make it find the only test file.
-             (invoke "python" "-m" "unittest" "-v" "test"
-                     "authheaders/test/test_authentication.py")
-             #t)))))
-    (propagated-inputs
-     `(("python-authres" ,python-authres)
-       ("python-dkimpy" ,python-dkimpy)
-       ("python-dnspython" ,python-dnspython)
-       ("python-publicsuffix" ,python-publicsuffix)))
-    (home-page "https://github.com/ValiMail/authentication-headers")
-    (synopsis "Library wrapping email authentication header verification and generation")
-    (description
-     "This is a Python library for the generation of email authentication
-headers.  The library can perform DKIM, SPF, and DMARC validation, and the
-results are packaged into the Authentication-Results header.  The library can
-DKIM and ARC sign messages and output the corresponding signature headers.")
-    ;; The package's metadata claims it were MIT licensed, but the source file
-    ;; headers disagree.¬
-    (license (list license:zpl2.1 license:zlib))))
-
-(define-public python-authres
-  (package
-    (name "python-authres")
-    (version "1.2.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "authres" version))
-        (sha256
-         (base32
-          "1dr5zpqnb54h4f5ax8334l1dcp8j9083d7v4vdi1xqkwmnavklck"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           ;; Run doctests as described in the README.
-           (lambda _
-             (invoke "python" "-m" "authres" "-v"))))))
-    (home-page "https://launchpad.net/authentication-results-python")
-    (synopsis "Email Authentication Results Header Module")
-    (description
-     "This module can be used to generate and parse RFC 5451/7001/7601
-Authentication-Results headers.  It also supports Authentication Results
-extensions:
-@itemize
-@item RFC 5617 DKIM/ADSP
-@item RFC 6008 DKIM signature identification (header.b)
-@item RFC 6212 Vouch By Reference (VBR)
-@item RFC 6577 Sender Policy Framework (SPF)
-@item RFC 7281 Authentication-Results Registration for S/MIME
-@item RFC 7293 The Require-Recipient-Valid-Since Header Field
-@item RFC 7489 Domain-based Message Authentication, Reporting, and Conformance (DMARC)
-@item Authenticated Recieved Chain (ARC) (draft-ietf-dmarc-arc-protocol-08)
-@end itemize
-Note: RFC 7601 obsoletes RFC 5451, 6577, 7001, and 7410.  Authres supports the
-current standard.  No backward compatibility issues have been noted.")
-    (license license:asl2.0)))
-
-(define-public python-flufl-bounce
-  (package
-    (name "python-flufl-bounce")
-    (version "3.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "flufl.bounce" version))
-        (sha256
-         (base32
-          "0k5kjqa3x6gvwwxyzb2vwi1g1i6asm1zw5fivylxz3d583y4kid2"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-atpublic" ,python-atpublic)
-       ("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-nose2" ,python-nose2)))
-    (home-page "https://fluflbounce.readthedocs.io/en/latest/")
-    (synopsis "Email bounce detectors")
-    (description "The @code{flufl.bounce} library provides a set of heuristics
-and an API for detecting the original bouncing email addresses from a bounce
-message.  Many formats found in the wild are supported, as are VERP and
-RFC 3464.")
-    (license (list license:asl2.0
-                   license:lgpl3)))) ; only for setup_headers.py
-
-(define-public python-flufl-i18n
-  (package
-    (name "python-flufl-i18n")
-    (version "2.0.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "flufl.i18n" version))
-        (sha256
-         (base32
-          "1csgds59nx0ann9v2alqr69lakp1cnc1ikmbgn96l6n23js7c2ah"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-atpublic" ,python-atpublic)))
-    (home-page "https://flufli18n.readthedocs.io")
-    (synopsis "API for Python internationalization")
-    (description
-     "This package provides a high level, convenient API for managing
-internationalization translation contexts in Python application.  There is a
-simple API for single-context applications, such as command line scripts which
-only need to translate into one language during the entire course of thei
-execution.  There is a more flexible, but still convenient API for multi-context
-applications, such as servers, which may need to switch language contexts for
-different tasks.")
-    (license license:asl2.0)))
-
-(define-public python-flufl-lock
-  (package
-    (name "python-flufl-lock")
-    (version "3.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "flufl.lock" version))
-        (sha256
-         (base32
-          "0nzzd6l30ff6cwsrlrb94xzfja4wkyrqv3ydc6cz0hdbr766mmm8"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-atpublic" ,python-atpublic)))
-    (home-page "https://flufllock.readthedocs.io")
-    (synopsis "NFS-safe file locking with timeouts for POSIX systems")
-    (description
-     "The @dfn{flufl.lock} package provides NFS-safe file locking with
-timeouts for POSIX systems.  It is similar to the @code{O_EXCL} option of the
-@code{open} system call but uses a lockfile.  Lock objects support lock-breaking
-and have a maximum lifetime built-in.")
-    (license (list license:asl2.0
-                   license:lgpl3)))) ; only for setup_helpers.py
-
-(define-public python-importlib-resources
-  (package
-    (name "python-importlib-resources")
-    (version "1.0.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "importlib_resources" version))
-        (sha256
-         (base32
-          "0y3hg12iby1qyaspnbisz4s4vxax7syikk3skznwqizqyv89y9yk"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "python" "-m" "unittest" "discover"))))))
-    (propagated-inputs
-     `(("python-pathlib2" ,python-pathlib2)))
-    (native-inputs
-     `(("python-wheel" ,python-wheel)))
-    (home-page "https://importlib-resources.readthedocs.io/")
-    (synopsis "Read resources from Python packages")
-    (description
-     "@code{importlib_resources} is a backport of Python 3.7's standard library
-@code{importlib.resources} module for Python 2.7, and 3.4 through 3.6.")
-    (license license:asl2.0)))
-
-(define-public python-lazr-config
-  (package
-    (name "python-lazr-config")
-    (version "2.2.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "lazr.config" version))
-        (sha256
-         (base32
-          "1s7pyvlq06qjrkaw9r6nc290lb095n25ybzgavvy51ygpxkgqxwn"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "python" "-s" "-m" "nose" "-P" "lazr"))))))
-    (propagated-inputs
-     `(("python-lazr-delegates" ,python-lazr-delegates)
-       ("python-zope-interface" ,python-zope-interface)))
-    (home-page "https://launchpad.net/lazr.config")
-    (synopsis "Create configuration schemas and process and validate configurations")
-    (description
-     "The LAZR config system is typically used to manage process configuration.
-Process configuration is for saying how things change when we run systems on
-different machines, or under different circumstances.  This system uses ini-like
-file format of section, keys, and values.  The config file supports inheritance
-to minimize duplication of information across files.  The format supports schema
-validation.")
-    (license license:lgpl3)))
-
-(define-public python-zope-component
-  (package
-    (name "python-zope-component")
-    (version "4.5")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.component" version))
-        (sha256
-         (base32
-          "0mafp41aqcffbfl9dsac34clc7zlpxwwzkx8jllbg4xmqckddpvf"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (add-installed-pythonpath inputs outputs)
-             (invoke "python" "setup.py" "test"))))))
-    (propagated-inputs
-     `(("python-zope-deferredimport" ,python-zope-deferredimport)
-       ("python-zope-deprecation" ,python-zope-deprecation)
-       ("python-zope-event" ,python-zope-event)
-       ("python-zope-hookable" ,python-zope-hookable)
-       ("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-persistent" ,python-persistent)
-       ("python-zope-configuration" ,python-zope-configuration-bootstrap)
-       ("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
-       ("python-zope-location" ,python-zope-location-bootstrap)
-       ("python-zope-proxy" ,python-zope-proxy-bootstrap)
-       ("python-zope-security" ,python-zope-security-bootstrap)
-       ("python-zope-testing" ,python-zope-testing)
-       ("python-zope-testrunner" ,python-zope-testrunner)))
-    (home-page "https://github.com/zopefoundation/zope.component")
-    (synopsis "Zope Component Architecture")
-    (description "Zope Component Architecture")
-    (license license:zpl2.1)))
-
-(define-public python-zope-component-bootstrap
-  (package
-    (inherit python-zope-component)
-    (arguments `(#:tests? #f))
-    (native-inputs `())
-    (properties `((hidden? . #t)))))
-
-(define-public python-zope-configuration
-  (package
-    (name "python-zope-configuration")
-    (version "4.3.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.configuration" version))
-        (sha256
-         (base32
-          "1qb88764fd7nkkmqv7fl9bxd1jirynkg5vbqkpqdiffnkxzp85kf"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
-       ("python-zope-interface" ,python-zope-interface)
-       ("python-zope-schema" ,python-zope-schema)))
-    (native-inputs
-     `(("python-manuel" ,python-manuel)
-       ("python-zope-schema" ,python-zope-schema)
-       ("python-zope-testing" ,python-zope-testing)
-       ("python-zope-testrunner" ,python-zope-testrunner)))
-    (home-page "https://github.com/zopefoundation/zope.configuration")
-    (synopsis "Zope Configuration Markup Language (ZCML)")
-    (description
-      "Zope Configuration Markup Language (ZCML)")
-    (license license:zpl2.1)))
-
-(define-public python-zope-configuration-bootstrap
-  (package
-    (inherit python-zope-configuration)
-    (arguments `(#:tests? #f))
-    (native-inputs `())
-    (properties `((hidden? . #t)))))
-
-(define-public python-zope-interface
-  (package
-    (name "python-zope-interface")
-    (version "4.6.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.interface" version))
-        (sha256
-         (base32
-          "1rgh2x3rcl9r0v0499kf78xy86rnmanajf4ywmqb943wpk50sg8v"))))
-    (build-system python-build-system)
-    (native-inputs
-     `(("python-coverage" ,python-coverage)
-       ("python-nose" ,python-nose)
-       ("python-zope-event" ,python-zope-event)))
-    (home-page "https://github.com/zopefoundation/zope.interface")
-    (synopsis "Interfaces for Python")
-    (description "Interfaces for Python")
-    (license license:zpl2.1)))
-
-(define-public python-dkimpy
-  (package
-    (name "python-dkimpy")
-    (version "0.9.5")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "dkimpy" version))
-        (sha256
-         (base32
-          "1wlzahsy4dz3w7dzbr6ayd2vqps1zcbj6101lbbgarn43fkpmx3b"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (add-after 'patch-source-shebangs 'patch-more-source
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let ((openssl (assoc-ref inputs "openssl")))
-               (substitute* "dkim/dknewkey.py"
-                 (("/usr/bin/openssl") (string-append openssl "/bin/openssl"))))
-             #t))
-         (replace 'check
-           (lambda _
-             (invoke "python" "test.py"))))))
-    (propagated-inputs
-     `(("python-dnspython" ,python-dnspython)))
-    (native-inputs
-     `(("python-authres" ,python-authres)
-       ("python-pynacl" ,python-pynacl)))
-    (inputs
-     `(("openssl" ,openssl)))
-    (home-page "https://launchpad.net/dkimpy")
-    (synopsis "DKIM (DomainKeys Identified Mail)")
-    (description "Python module that implements @dfn{DKIM} (DomainKeys
-Identified Mail) email signing and verification (RFC6376).  It also provides
-helper scripts for command line signing and verification.  It supports DKIM
-signing/verifying of ed25519-sha256 signatures (RFC 8463).  It also supports
-the RFC 8617 Authenticated Received Chain (ARC) protocol.")
-    (license license:bsd-3)))
-
-(define-public python-lazr-delegates
-  (package
-    (name "python-lazr-delegates")
-    (version "2.0.4")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "lazr.delegates" version))
-        (sha256
-         (base32
-          "1rdnl85j9ayp8n85l0ciip621j9dcziz5qnmv2m7krgwgcn31vfx"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "python" "setup.py" "nosetests"))))))
-    (propagated-inputs
-     `(("python-nose" ,python-nose)
-       ("python-zope-interface" ,python-zope-interface)))
-    (home-page "https://launchpad.net/lazr.delegates")
-    (synopsis "Easily write objects that delegate behavior")
-    (description
-     "The @code{lazr.delegates} package makes it easy to write objects that
-delegate behavior to another object.  The new object adds some property or
-behavior on to the other object, while still providing the underlying interface,
-and delegating behavior.")
-    (license license:lgpl3)))
-
-(define-public python-zope-deferredimport
-  (package
-    (name "python-zope-deferredimport")
-    (version "4.3.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.deferredimport" version))
-        (sha256
-         (base32
-          "1q89v54dwniiqypjbwywwdfjdr4kdkqlyqsgrpplgvsygdg39cjp"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-zope-proxy" ,python-zope-proxy)))
-    (native-inputs
-     `(("python-zope-testrunner" ,python-zope-testrunner)))
-    (home-page "https://github.com/zopefoundation/zope.deferredimport")
-    (synopsis "Defer imports until used by code")
-    (description
-     "Often, especially for package modules, you want to import names for
-convenience, but not actually perform the imports until necessary.  The
-@code{zope.deferredimport} package provided facilities for defining names in
-modules that will be imported from somewhere else when used.  You can also cause
-deprecation warnings to be issued when a variable is used.")
-    (license license:zpl2.1)))
-
-(define-public python-zope-hookable
-  (package
-    (name "python-zope-hookable")
-    (version "4.2.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.hookable" version))
-        (sha256
-         (base32
-          "05fy9lynyglzyiy1nbzdyv3rgvznwv0s0q0dr2hcavv6lclkkpy1"))))
-    (build-system python-build-system)
-    (native-inputs
-     `(("python-coverage" ,python-coverage)
-       ("python-zope-testing" ,python-zope-testing)))
-    (home-page "https://github.com/zopefoundation/zope.hookable")
-    (synopsis "Zope hookable")
-    (description "This package supports the efficient creation of hookable
-objects, which are callable objects that are meant to be optionally replaced.
-The idea is that you create a function that does some default thing and make i
-hookable.  Later, someone can modify what it does by calling its sethook method
-and changing its implementation.  All users of the function, including those
-that imported it, will see the change.")
-    (license license:zpl2.1)))
-
-(define-public python-zope-i18nmessageid
-  (package
-    (name "python-zope-i18nmessageid")
-    (version "4.3.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.i18nmessageid" version))
-        (sha256
-         (base32
-          "1qw1f2p4ycqrm5ja4blwv2lllnn8d3jf2ml29pwadlvmivzys4g5"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-six" ,python-six)))
-    (native-inputs
-     `(("python-coverage" ,python-coverage)
-       ("python-nose" ,python-nose)))
-    (home-page "https://github.com/zopefoundation/zope.i18nmessageid")
-    (synopsis "Message Identifiers for internationalization")
-    (description
-     "This package provides facilities for declaring messages within program
-source text; translation of the messages is the responsiblitiy of the
-@code{zope.i18n} package.")
-    (license license:zpl2.1)))
-
-(define-public python-zope-schema
-  (package
-    (name "python-zope-schema")
-    (version "4.9.3")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.schema" version))
-        (sha256
-         (base32
-          "178631dks473rfsfd46pmqipz7fdkn9bjd35j6qlgavwf2l1v5rd"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-zope-event" ,python-zope-event)
-       ("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
-       ("python-zope-testing" ,python-zope-testing)
-       ("python-zope-testrunner" ,python-zope-testrunner)))
-    (home-page "https://github.com/zopefoundation/zope.schema")
-    (synopsis "Zope.interface extension for defining data schemas")
-    (description
-     "Schemas extend the notion of interfaces to detailed descriptions of
-Attributes (but not methods).  Every schema is an interface and specifies the
-public fields of an object.  A field roughly corresponds to an attribute of a
-Python object.  But a Field provides space for at least a title and a
-description.  It can also constrain its value and provide a validation method.
-Besides you can optionally specify characteristics such as its value being
-read-only or not required.")
-    (license license:zpl2.1)))
-
-(define-public python-py3dns
-  (package
-    (name "python-py3dns")
-    (version "3.2.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "py3dns" version))
-        (sha256
-         (base32
-          "1r25f0ys5p37bhld7m7n4gb0lrysaym3w318w2f8bncq7r3d81qz"))))
-    (build-system python-build-system)
-    ;; This package wants to read /etc/resolv.conf. We can't patch it without
-    ;; removing functionality so we copy from Nix and "just don't build it".
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* "setup.py"
-               (("import DNS") "")
-               (("DNS.__version__") (string-append "\"" ,version "\"")))
-             #t)))
-       #:tests? #f)) ; Also skip the tests.
-    (home-page "https://launchpad.net/py3dns")
-    (synopsis "Python 3 DNS library")
-    (description "This Python 3 module provides a DNS API for looking up DNS
-entries from within Python 3 modules and applications.  This module is a
-simple, lightweight implementation.")
-    (license license:psfl)))
-
-(define-public python-zope-proxy
-  (package
-    (name "python-zope-proxy")
-    (version "4.3.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.proxy" version))
-        (sha256
-         (base32
-          "05svkbri0jsavjy5jk36n1iba7z2ilb07zr8r3516765v5snjvdb"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-zope-security" ,python-zope-security-bootstrap)
-       ("python-zope-testrunner" ,python-zope-testrunner)))
-    (home-page "https://github.com/zopefoundation/zope.proxy")
-    (synopsis "Generic Transparent Proxies")
-    (description "@code{zope.proxy} is implemented via a C extension module,
-which lets it do things like lie about its own __class__ that are difficult in
-pure Python (and were completely impossible before metaclasses).")
-    (license license:zpl2.1)))
-
-(define-public python-zope-proxy-bootstrap
-  (package
-    (inherit python-zope-proxy)
-    (arguments `(#:tests? #f))
-    (native-inputs `())
-    (properties `((hidden? . #t)))))
-
-(define-public python-zope-testrunner
-  (package
-    (name "python-zope-testrunner")
-    (version "5.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.testrunner" version))
-        (sha256
-         (base32
-          "0w3q66cy4crpj7c0hw0vvvvwf3g931rnvw7wwa20av7yqvv6ajim"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:tests? #f)) ; Tests can't find zope.exceptions.
-    (propagated-inputs
-     `(("python-six" ,python-six)
-       ("python-zope-exceptions" ,python-zope-exceptions)
-       ("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-zope-testing" ,python-zope-testing)))
-    (home-page "https://github.com/zopefoundation/zope.testrunner")
-    (synopsis "Zope testrunner script")
-    (description "This package provides a flexible test runner with layer
-support for the Zope framework.")
-    (license license:zpl2.1)))
-
-(define-public python-zope-testrunner-bootstrap
-  (package
-    (inherit python-zope-testrunner)
-    (arguments `(#:tests? #f))
-    (propagated-inputs
-     `(("python-six" ,python-six)
-       ("python-zope-exceptions" ,python-zope-exceptions-bootstrap)))
-    (properties `((hidden? . #t)))))
-
-(define-public python-zope-exceptions
-  (package
-    (name "python-zope-exceptions")
-    (version "4.3")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.exceptions" version))
-        (sha256
-         (base32
-          "04bjskwas17yscl8bs3l44maxspw1gdji0zcmr499fs420y9r9az"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "zope-testrunner" "--test-path=src" "\\[]"))))))
-    (propagated-inputs
-     `(("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-zope-testrunner" ,python-zope-testrunner-bootstrap)))
-    (home-page "https://github.com/zopefoundation/zope.exceptions")
-    (synopsis "Zope Exceptions")
-    (description "This package contains exception exceptions and
- implementations which are so general purpose that they don't belong in Zope
- application-specific packages.")
-    (license license:zpl2.1)))
-
-(define-public python-zope-exceptions-bootstrap
-  (package
-    (inherit python-zope-exceptions)
-    (arguments `(#:tests? #f))
-    (propagated-inputs `())
-    (native-inputs `())
-    (properties `((hidden? . #t)))))
-
-(define-public python-zope-testing
-  (package
-    (name "python-zope-testing")
-    (version "4.7")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.testing" version))
-        (sha256
-         (base32
-          "1sh3c3i0m8n8fnhqiry0bk3rr356i56ry7calmn57s1pvv8yhsyn"))))
-    (build-system python-build-system)
-    (home-page "https://github.com/zopefoundation/zope.testing")
-    (synopsis "Zope testing helpers")
-    (description "This package provides a number of Zope testing helpers")
-    (license license:zpl2.1)))
-
-(define-public python-persistent
-  (package
-    (name "python-persistent")
-    (version "4.5.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "persistent" version))
-        (sha256
-         (base32
-          "0slbvq1m3rilgyhj6i522rsyv592xv9pmvm61mrmgkgf40kfnz69"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-cffi" ,python-cffi)
-       ("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-manuel" ,python-manuel)
-       ("python-zope-testrunner" ,python-zope-testrunner)))
-    (home-page "https://github.com/zopefoundation/persistent/")
-    (synopsis "Translucent persistent objects")
-    (description "This package contains a generic persistence implementation for
-Python.  It forms the core protocol for making objects interact
-\"transparently\" with a database such as the ZODB.")
-    (license license:zpl2.1)))
-
-(define-public python-zope-location
-  (package
-    (name "python-zope-location")
-    (version "4.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.location" version))
-        (sha256
-         (base32
-          "1b40pzl8v00d583d3gsxv1qjdw2dhghlgkbgxl3m07d5r3izj857"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "zope-testrunner" "--test-path=src" "\\[]"))))))
-    (propagated-inputs
-     `(("python-zope-interface" ,python-zope-interface)
-       ("python-zope-proxy" ,python-zope-proxy)
-       ("python-zope-schema" ,python-zope-schema)))
-    (native-inputs
-     `(("python-zope-component" ,python-zope-component-bootstrap)
-       ("python-zope-configuration" ,python-zope-configuration-bootstrap)
-       ("python-zope-copy" ,python-zope-copy-bootstrap)
-       ("python-zope-testrunner" ,python-zope-testrunner)))
-    (home-page "https://github.com/zopefoundation/zope.location/")
-    (synopsis "Zope Location")
-    (description "In Zope3, \"locations\" are special objects that have a
-structural location.")
-    (license license:zpl2.1)))
-
-(define-public python-zope-location-bootstrap
-  (package
-    (inherit python-zope-location)
-    (arguments `(#:tests? #f))
-    (native-inputs `())
-    (properties `((hidden? . #t)))))
-
-(define-public python-zope-security
-  (package
-    (name "python-zope-security")
-    (version "4.3.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.security" version))
-        (sha256
-         (base32
-          "1zzaggsq4d9pslzh1h1i9qizsrykrm91iyqzi1dz0vw5rixyaj4l"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-zope-component" ,python-zope-component)
-       ("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
-       ("python-zope-interface" ,python-zope-interface)
-       ("python-zope-location" ,python-zope-location)
-       ("python-zope-proxy" ,python-zope-proxy)
-       ("python-zope-schema" ,python-zope-schema)))
-    (native-inputs
-     `(("python-btrees" ,python-btrees)
-       ("python-zope-component" ,python-zope-component-bootstrap)
-       ("python-zope-configuration" ,python-zope-configuration-bootstrap)
-       ("python-zope-location" ,python-zope-location-bootstrap)
-       ("python-zope-testing" ,python-zope-testing)
-       ("python-zope-testrunner" ,python-zope-testrunner)))
-    (home-page "https://github.com/zopefoundation/zope.security")
-    (synopsis "Zope Security Framework")
-    (description "The security framework provides a generic mechanism to
-implement security policies on Python objects.")
-    (license license:zpl2.1)))
-
-(define-public python-zope-security-bootstrap
-  (package
-    (inherit python-zope-security)
-    (arguments `(#:tests? #f))
-    (propagated-inputs
-     `(;("python-zope-component" ,python-zope-component-bootstrap)
-       ("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
-       ("python-zope-interface" ,python-zope-interface)
-       ;("python-zope-location" ,python-zope-location)
-       ("python-zope-proxy" ,python-zope-proxy-bootstrap)
-       ("python-zope-schema" ,python-zope-schema)))
-    (native-inputs `())
-    (properties `((hidden? . #t)))))
-
-(define-public python-manuel
-  (package
-    (name "python-manuel")
-    (version "1.10.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "manuel" version))
-        (sha256
-         (base32
-          "1bdzay7j70fly5fy6wbdi8fbrxjrrlxnxnw226rwry1c8a351rpy"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-six" ,python-six)))
-    (native-inputs
-     `(("python-zope-testing" ,python-zope-testing)))
-    (home-page "https://pypi.org/project/manuel/")
-    (synopsis "Build tested documentation")
-    (description
-     "Manuel lets you mix and match traditional doctests with custom test syntax.")
-    (license license:asl2.0)))
-
-(define-public python-zope-copy
-  (package
-    (name "python-zope-copy")
-    (version "4.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "zope.copy" version))
-        (sha256
-         (base32
-          "06m75434krl57n6p73c2qj55k5i3fixg887j8ss01ih6zw4rvfs7"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "zope-testrunner" "--test-path=src" "\\[]"))))))
-    (propagated-inputs
-     `(("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-zope-component" ,python-zope-component-bootstrap)
-       ("python-zope-location" ,python-zope-location-bootstrap)
-       ("python-zope-testing" ,python-zope-testing)
-       ("python-zope-testrunner" ,python-zope-testrunner)))
-    (home-page "https://github.com/zopefoundation/zope.copy")
-    (synopsis "Pluggable object copying mechanism")
-    (description
-     "This package provides a pluggable mechanism for copying persistent objects.")
-    (license license:zpl2.1)))
-
-(define-public python-zope-copy-bootstrap
-  (package
-    (inherit python-zope-copy)
-    (arguments `(#:tests? #f))
-    (native-inputs `())
-    (properties `((hidden? . #t)))))
-
-(define-public python-btrees
-  (package
-    (name "python-btrees")
-    (version "4.6.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "BTrees" version))
-        (sha256
-         (base32
-          "0bmkpg6z5z47p21340nyrfbdv2jkfp80yv085ndgbwaas1zi7ac9"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-persistent" ,python-persistent)
-       ("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-persistent" ,python-persistent)
-       ("python-transaction" ,python-transaction)
-       ("python-zope-testrunner" ,python-zope-testrunner)))
-    (home-page "https://github.com/zopefoundation/BTrees")
-    (synopsis "Scalable persistent object containers")
-    (description
-     "This package contains a set of persistent object containers built around a
-modified BTree data structure.  The trees are optimized for use inside ZODB's
-\"optimistic concurrency\" paradigm, and include explicit resolution of
-conflicts detected by that mechanism.")
-    (license license:zpl2.1)))
-
-(define-public python-transaction
-  (package
-    (name "python-transaction")
-    (version "2.4.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "transaction" version))
-        (sha256
-         (base32
-          "17wz1y524ca07vr03yddy8dv0gbscs06dbdywmllxv5rc725jq3j"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-coverage" ,python-coverage)
-       ("python-mock" ,python-mock)
-       ("python-nose" ,python-nose)))
-    (home-page "https://github.com/zopefoundation/transaction")
-    (synopsis "Transaction management for Python")
-    (description "This package contains a generic transaction implementation
-for Python.  It is mainly used by the ZODB.")
-    (license license:zpl2.1)))
-
-(define-public python-mailmanclient-3.3
-  (package
-    (inherit python-mailmanclient)
-    (name "python-mailmanclient")
-    (version "3.3.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "mailmanclient" version))
-        (sha256
-         (base32
-          "1s8sbhg1vyc9v9zjwxrh6m8h3qx1nspvrkvcnicbvq9a2nz6qwy8"))))
-    (propagated-inputs
-     `(("python-requests" ,python-requests)))
-    (native-inputs
-     `(("python-falcon" ,python-falcon)
-       ("python-mailman" ,mailman)
-       ("python-pytest" ,python-pytest)
-       ("python-pytest-services" ,python-pytest-services)
-       ("python-pytest-vcr" ,python-pytest-vcr)))))
-
-(define-public python-pytest-services
-  (package
-    (name "python-pytest-services")
-    (version "1.3.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "pytest-services" version))
-        (sha256
-         (base32
-          "0b2zfv04w6m3gp2v44ifdhx22vcji069qnn95ry3zcyxib7cjnq3"))))
-    (build-system python-build-system)
-    (arguments '(#:tests? #f)) ; Tests not included in release tarball.
-    (propagated-inputs
-     `(("python-psutil" ,python-psutil)
-       ("python-pytest" ,python-pytest)
-       ("python-requests" ,python-requests)
-       ("python-setuptools" ,python-setuptools))) ; enumerated in setup.py
-    (home-page "https://github.com/pytest-dev/pytest-services")
-    (synopsis "Services plugin for pytest testing framework")
-    (description
-     "This plugin provides a set of fixtures and utility functions to start
-service processes for your tests with pytest.")
-    (license license:expat)))
-
-(define-public python-pytest-vcr
-  (package
-    (name "python-pytest-vcr")
-    (version "1.0.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "pytest-vcr" version))
-        (sha256
-         (base32
-          "15hq5vwiixhb5n2mdvbmxfn977zkwjm769r74vcl7k5vbavm3vi3"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-pytest" ,python-pytest)
-       ("python-vcrpy" ,python-vcrpy)))
-    (home-page "https://github.com/ktosiek/pytest-vcr")
-    (synopsis "Plugin for managing VCR.py cassettes")
-    (description
-      "Plugin for managing VCR.py cassettes")
-    (license license:expat)))
-
-(define-public python-mailman-hyperkitty
-  (package
-    (name "python-mailman-hyperkitty")
-    (version "1.1.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "mailman-hyperkitty" version))
-        (sha256
-         (base32
-          "1lfqa9admhvdv71f528jmz2wl0i5cv77v6l64px2pm4zqr9ckkjx"))
-        (patches (list (origin
-                         ;; see: https://gitlab.com/mailman/mailman-hyperkitty/issues/17
-                         (method url-fetch)
-                         (uri "https://salsa.debian.org/mailman-team/mailman-hyperkitty/raw/debian/1.1.0-9/debian/patches/0002-Skip-the-test_archive_message_unserializable.patch")
-                         (sha256
-                          (base32
-                           "0p1fwm46c4bl81lvsg3kjhn2r1lwgkpgxamb3xyqn7h9qdrw10hw")))))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-mailman" ,mailman)
-       ("python-requests" ,python-requests)
-       ("python-setuptools" ,python-setuptools) ; enumerated in setup.py
-       ("python-zope-interface" ,python-zope-interface)))
-    (native-inputs
-     `(("python-mock" ,python-mock)
-       ("python-nose2" ,python-nose2)))
-    (home-page "https://gitlab.com/mailman/mailman-hyperkitty/")
-    (synopsis "Mailman archiver plugin for HyperKitty")
-    (description
-      "Mailman archiver plugin for HyperKitty")
-    (license license:gpl3+)))
-
-(define-public python-hyperkitty
-  (package
-    (name "python-hyperkitty")
-    (version "1.3.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "HyperKitty" version))
-        (sha256
-         (base32
-          "092fkv0xyf5vgj33xwq0mh9h5c5d56ifwimaqbfpx5cwc6yivb88"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (setenv "PYTHONPATH" (string-append ".:" (getenv "PYTHONPATH")))
-             (invoke "example_project/manage.py" "test"
-                     "--settings=hyperkitty.tests.settings_test"))))))
-    (propagated-inputs
-     `(("python-dateutil" ,python-dateutil)
-       ("python-django" ,python-django)
-       ("python-django-compressor" ,python-django-compressor)
-       ("python-django-extensions" ,python-django-extensions)
-       ("python-django-gravatar2" ,python-django-gravatar2)
-       ("python-django-haystack" ,python-django-haystack)
-       ("python-django-mailman3" ,python-django-mailman3)
-       ("python-django-q" ,python-django-q)
-       ("python-djangorestframework" ,python-djangorestframework)
-       ("python-flufl-lock" ,python-flufl-lock)
-       ("python-mailmanclient" ,python-mailmanclient-3.3)
-       ("python-networkx" ,python-networkx)
-       ("python-pytz" ,python-pytz)
-       ("python-robot-detection" ,python-robot-detection)))
-    (native-inputs
-     `(("python-beautifulsoup4" ,python-beautifulsoup4)
-       ("python-elasticsearch" ,python-elasticsearch)
-       ("python-isort" ,python-isort)
-       ("python-mock" ,python-mock)
-       ("python-whoosh" ,python-whoosh)))
-    (home-page "https://gitlab.com/mailman/hyperkitty")
-    (synopsis "Web interface to access GNU Mailman v3 archives")
-    (description
-      "A web interface to access GNU Mailman v3 archives")
-    (license license:gpl3))) ; Some files are gpl2+
-
-(define-public python-django-compressor
-  (package
-    (name "python-django-compressor")
-    (version "2.3")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "django_compressor" version))
-        (sha256
-         (base32
-          "1pbygd00l0k5p1r959131khij1km1a1grfxg0r59ar2wyx3n7j27"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (setenv "DJANGO_SETTINGS_MODULE" "compressor.test_settings")
-             (invoke "django-admin" "test"
-                     "--pythonpath=."))))))
-    (propagated-inputs
-     `(("python-django-appconf" ,python-django-appconf)
-       ("python-rcssmin" ,python-rcssmin)
-       ("python-rjsmin" ,python-rjsmin)))
-    (native-inputs
-     `(("python-beautifulsoup4" ,python-beautifulsoup4)
-       ("python-brotli" ,python-brotli)
-       ("python-csscompressor" ,python-csscompressor)
-       ("python-django-sekizai" ,python-django-sekizai)
-       ("python-mock" ,python-mock)))
-    (home-page "https://django-compressor.readthedocs.io/en/latest/")
-    (synopsis
-     "Compresses linked and inline JavaScript or CSS into single cached files")
-    (description
-     "Compresses linked and inline JavaScript or CSS into single cached files.")
-    (license license:expat)))
-
-(define-public python-csscompressor
-  (package
-    (name "python-csscompressor")
-    (version "0.9.5")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "csscompressor" version))
-        (sha256
-         (base32
-          "018ssffvlpnc1salmnpyl52c11glzzwj4k9f757hl4pkpjnjp8mg"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "py.test"))))))
-    (native-inputs
-     `(("python-pytest" ,python-pytest)))
-    (home-page "https://github.com/sprymix/csscompressor")
-    (synopsis "Python port of YUI CSS Compressor")
-    (description
-     "This package provides a python port of YUI CSS Compressor.")
-    (license license:bsd-3)))
-
-(define-public python-brotli
-  (package
-    (name "python-brotli")
-    (version "1.0.7")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "Brotli" version ".zip"))
-        (sha256
-         (base32
-          "19x5dqxckb62n37mpnczp21rfxqvgpm0ki5ds8ac65zx8hbxqf05"))))
-    (build-system python-build-system)
-    (native-inputs
-     `(("unzip" ,unzip)))
-    (home-page "https://github.com/google/brotli")
-    (synopsis "Python bindings for the Brotli compression library")
-    (description
-     "This package provides python bindings for the Brotli compression library.")
-    (license license:asl2.0)))
-
-(define-public python-django-sekizai
-  (package
-    (name "python-django-sekizai")
-    (version "1.0.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "django-sekizai" version))
-        (sha256
-         (base32
-          "052y7cgrmbbdlbl17cgvnarzqb6x9sv21wwprif9pzljzrb36ak4"))))
-    (build-system python-build-system)
-    (arguments '(#:tests? #f)) ; Test script not included with release.
-    (propagated-inputs
-     `(("python-django" ,python-django)
-       ("python-django-classy-tags" ,python-django-classy-tags)))
-    (home-page "https://github.com/divio/django-sekizai")
-    (synopsis "Template blocks for Django projects")
-    (description "Sekizai means blocks in Japanese, and thats what this app
-provides.  A fresh look at blocks.  With @code{django-sekizai} you can define
-placeholders where your blocks get rendered and at different places in your
-templates append to those blocks.  This is especially useful for css and
-javascript.  Your subtemplates can now define css and javscript files to be
-included, and the css will be nicely put at the top and the javascript to the
-bottom, just like you should.  Also sekizai will ignore any duplicate content in
-a single block.")
-    (license license:bsd-3)))
-
-(define-public python-django-classy-tags
-  (package
-    (name "python-django-classy-tags")
-    (version "0.9.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "django-classy-tags" version))
-        (sha256
-         (base32
-          "0axzsigvmb17ha5mnr3xf6c851kwinjpkxksxwprwjakh1m59d1q"))))
-    (build-system python-build-system)
-    (arguments '(#:tests? #f)) ; Test script not distributed with release.
-    (propagated-inputs
-     `(("python-django" ,python-django)))
-    (home-page "https://github.com/divio/django-classy-tags")
-    (synopsis "Class based template tags for Django")
-    (description
-      "Class based template tags for Django")
-    (license license:bsd-3)))
-
-(define-public python-django-haystack
-  (package
-    (name "python-django-haystack")
-    (version "2.8.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "django-haystack" version))
-        (sha256
-         (base32
-          "1302fqsrx8w474xk5cmnmg3hjqfprlxnjg9qlg86arsr4v4vqm4b"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'loosen-verion-restrictions
-           (lambda _
-             (substitute* "setup.py"
-               (("geopy.*") "geopy',\n"))
-             #t))
-         (add-before 'check 'set-gdal-lib-path
-           (lambda* (#:key inputs #:allow-other-keys)
-             (setenv "GDAL_LIBRARY_PATH"
-                     (string-append (assoc-ref inputs "gdal")
-                                    "/lib"))
-             #t)))
-       #:tests? #f)) ; OSError: libgdal.so.20: cannot open shared object file
-    (propagated-inputs
-     `(("python-django" ,python-django)))
-    (native-inputs
-     `(("gdal" ,gdal)
-       ("python-coverage" ,python-coverage)
-       ("python-dateutil" ,python-dateutil)
-       ("python-geopy" ,python-geopy)
-       ("python-mock" ,python-mock)
-       ("python-nose" ,python-nose)
-       ("python-requests" ,python-requests)
-       ("python-setuptools-scm" ,python-setuptools-scm)
-       ("python-pysolr" ,python-pysolr)
-       ("python-whoosh" ,python-whoosh)))
-    (home-page "http://haystacksearch.org/")
-    (synopsis "Pluggable search for Django")
-    (description "Haystack provides modular search for Django.  It features a
-unified, familiar API that allows you to plug in different search backends
-(such as Solr, Elasticsearch, Whoosh, Xapian, etc.) without having to modify
-your code.")
-    (license license:bsd-3)))
-
-(define-public python-pysolr
-  (package
-    (name "python-pysolr")
-    (version "3.8.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "pysolr" version))
-        (sha256
-         (base32
-          "06x8q23llzcmkbcadcp4ifv3qdm0pxq3ajmrmvwvrdkxc9vb3v48"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:tests? #f)) ; Tests require network access.
-    (propagated-inputs
-     `(("python-requests" ,python-requests)))
-    (native-inputs
-     `(("python-setuptools-scm" ,python-setuptools-scm)))
-    (home-page "https://github.com/django-haystack/pysolr/")
-    (synopsis "Lightweight python wrapper for Apache Solr")
-    (description
-      "Lightweight python wrapper for Apache Solr.")
-    (license license:bsd-3)))
-
-(define-public python-geopy
-  (package
-    (name "python-geopy")
-    (version "1.20.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "geopy" version))
-        (sha256
-         (base32
-          "1qih13l4csa3l6kafbcl6q3vvvvc2b7z3b779865jcb2xs8bq6cl"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-geographiclib" ,python-geographiclib)))
-    (native-inputs
-     `(("python-contextlib2" ,python-contextlib2)
-       ("python-coverage" ,python-coverage)
-       ("python-flake8" ,python-flake8)
-       ("python-isort" ,python-isort)
-       ("python-mock" ,python-mock)
-       ("python-pytest" ,python-pytest)
-       ("python-readme-renderer" ,python-readme-renderer)
-       ("python-six" ,python-six)))
-    (home-page "https://github.com/geopy/geopy")
-    (synopsis "Python Geocoding Toolbox")
-    (description "Python Geocoding Toolbox")
-    (license license:expat)))
-
-(define-public python-geographiclib
-  (package
-    (name "python-geographiclib")
-    (version "1.50")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "geographiclib" version))
-        (sha256
-         (base32
-          "0cn6ap5fkh3mkfa57l5b44z3gvz7j6lpmc9rl4g2jny2gvp4dg8j"))))
-    (build-system python-build-system)
-    (home-page "https://geographiclib.sourceforge.io/1.50/python/")
-    (synopsis "Python geodesic routines from GeographicLib")
-    (description
-     "This is a python implementation of the geodesic routines in GeographicLib.")
-    (license license:expat)))
-
-(define-public python-readme-renderer
-  (package
-    (name "python-readme-renderer")
-    (version "24.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "readme_renderer" version))
-        (sha256
-         (base32
-          "0br0562lnvj339f1nwz4nfl4ay49rw05xkqacigzf9wz4mdza5mv"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-bleach" ,python-bleach)
-       ("python-docutils" ,python-docutils)
-       ("python-pygments" ,python-pygments)
-       ("python-six" ,python-six)))
-    (native-inputs
-     `(("python-mock" ,python-mock)
-       ("python-pytest" ,python-pytest)))
-    (home-page "https://github.com/pypa/readme_renderer")
-    (synopsis "Render README files in Warehouse")
-    (description
-     "Readme Renderer is a library that will safely render arbitrary README
-files into HTML.  It is designed to be used in Warehouse to render the
-@code{long_description} for packages.  It can handle Markdown, reStructuredText,
-and plain text.")
-    (license license:asl2.0)))
-
-(define-public python-django-mailman3
-  (package
-    (name "python-django-mailman3")
-    (version "1.3.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "django-mailman3" version))
-        (sha256
-         (base32
-          "0wppv1q3jkkg2d66qsygc4dfpvhfcj5i2as2xpqnzf3l3w7dgja1"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (setenv "DJANGO_SETTINGS_MODULE" "django_mailman3.tests.settings_test")
-             (invoke "django-admin" "test"
-                     "--pythonpath=."))))))
-    (propagated-inputs
-     `(("python-django" ,python-django)
-       ("python-django-allauth" ,python-django-allauth-gn)
-       ("python-django-gravatar2" ,python-django-gravatar2)
-       ("python-mailmanclient" ,python-mailmanclient-3.3)
-       ("python-pytz" ,python-pytz)))
-    (native-inputs
-     `(("python-mock" ,python-mock)))
-    (home-page "https://gitlab.com/mailman/django-mailman3")
-    (synopsis "Django library to help interaction with Mailman")
-    (description
-     "This package contains libraries and templates for Django-based interfaces
-interacting with Mailman.")
-    (license license:gpl3+)))
-
-(define-public python-django-allauth-gn
-  (package
-    (inherit python-django-allauth)
-    (name "python-django-allauth")
-    (version "0.40.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "django-allauth" version))
-        (sha256
-         (base32
-          "12f5gjidcpb7a0d1f601k0c5dcdmb6fg9sfn7xn5j8zfsg29y63a"))))
-    (arguments
-     '(#:tests? #f)) ; skip tests for now
-    (propagated-inputs
-     `(("python-django" ,python-django)
-       ("python-openid" ,python-openid)
-       ("python-requests" ,python-requests)
-       ("python-requests-oauthlib" ,python-requests-oauthlib)))))
-
-(define-public python-django-q
-  (package
-    (name "python-django-q")
-    (version "1.0.2")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "django-q" version))
-        (sha256
-         (base32
-          "17q7q7xgrdpix4qkv3gkdp1qf5k4zclg1jsacvc4i1ypqrc1y23h"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (setenv "DJANGO_SETTINGS_MODULE" "django_q.tests.settings")
-             (invoke "django-admin" "test" "django_q.tests"
-                     "--pythonpath=."))))))
-    (propagated-inputs
-     `(("python-arrow" ,python-arrow)
-       ("python-blessed" ,python-blessed)
-       ("python-django" ,python-django)
-       ("python-django-picklefield" ,python-django-picklefield)))
-    (native-inputs
-     `(("python-django-redis" ,python-django-redis)
-       ("python-pytest-django" ,python-pytest-django)))
-    (home-page "https://django-q.readthedocs.io/")
-    (synopsis "Multiprocessing distributed task queue for Django")
-    (description
-     "Django Q is a native Django task queue, scheduler and worker application
-using Python multiprocessing.")
-    (license license:expat)))
-
-(define-public python-robot-detection
-  (package
-    (name "python-robot-detection")
-    (version "0.4")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "robot-detection" version))
-        (sha256
-         (base32
-          "1xd2jm3yn31bnk1kqzggils2rxj26ylxsfz3ap7bhr3ilhnbg3rx"))))
-    (build-system python-build-system)
-    (arguments '(#:tests? #f)) ; Tests not shipped in pypi release.
-    (propagated-inputs `(("python-six" ,python-six)))
-    (home-page "https://github.com/rory/robot-detection")
-    (synopsis "Detect web crawlers")
-    (description
-     "@code{robot_detection} is a python module to detect if a given HTTP User
-Agent is a web crawler.  It uses the list of registered robots from
-@url{http://www.robotstxt.org}.")
-    (license license:gpl3+)))
-
-(define-public python-rcssmin
-  (package
-    (name "python-rcssmin")
-    (version "1.0.6")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "rcssmin" version))
-        (sha256
-         (base32
-          "0w42l4dhxghcz7pj3q7hkxp015mvb8z2cq9sfxbl31npsfavd1ya"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "python" "run_tests.py" "tests"))))))
-    (home-page "http://opensource.perlig.de/rcssmin/")
-    (synopsis "CSS Minifier")
-    (description "CSS Minifier")
-    (license license:asl2.0)))
-
-(define-public python-rjsmin
-  (package
-    (name "python-rjsmin")
-    (version "1.1.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "rjsmin" version))
-        (sha256
-         (base32
-          "0cmc72rlkvzz8fl89bc83czkx0pcvhzj7yn7m29r8pgnf5fcfpdi"))))
-    (build-system python-build-system)
-    (native-inputs
-     `(("python-pytest" ,python-pytest)))
-    (home-page "http://opensource.perlig.de/rjsmin/")
-    (synopsis "Javascript Minifier")
-    (description "Javascript Minifier")
-    (license license:asl2.0)))
-
-(define-public python-blessed
-  (package
-    (name "python-blessed")
-    (version "1.16.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "blessed" version))
-        (sha256
-         (base32
-          "1yhxgibvjyzccyy2rzmygkq515p7kpyls7x0ymvcyrpj14xph8m2"))
-        (modules '((guix build utils)))
-        (snippet
-         '(begin
-            ;; Don't get hung up on Windows test failures.
-            (delete-file "blessed/win_terminal.py") #t))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-six" ,python-six)
-       ("python-wcwidth" ,python-wcwidth)))
-    (native-inputs
-     `(("python-mock" ,python-mock)
-       ("python-pytest" ,python-pytest)))
-    (home-page "https://github.com/jquast/blessed")
-    (synopsis "Wrapper around terminal capabilities")
-    (description
-     "Blessed is a thin, practical wrapper around terminal styling, screen
-positioning, and keyboard input.")
-    (license license:expat)))
-
-(define-public python-django-picklefield
-  (package
-    (name "python-django-picklefield")
-    (version "2.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "django-picklefield" version))
-        (sha256
-         (base32
-          "097aljd37ab36jci3phmh8ckrakmk1gpi3kkgl6nq15nn66klwzi"))))
-    (build-system python-build-system)
-    (propagated-inputs `(("python-django" ,python-django)))
-    (native-inputs `(("python-tox" ,python-tox)))
-    (home-page "https://github.com/gintas/django-picklefield")
-    (synopsis "Pickled object field for Django")
-    (description "Pickled object field for Django")
-    (license license:expat)))
-
-(define-public python-jinxed
-  (package
-    (name "python-jinxed")
-    (version "1.0.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "jinxed" version))
-        (sha256
-         (base32
-          "1n7vl03rhjd0xhjgbjlh8x9f8yfbhamcwkgvs4jg7g5qj8f0wk89"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (add-before 'check 'set-environment-variables
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let ((ncurses (assoc-ref inputs "ncurses")))
-               (setenv "TERM" "LINUX")
-               (setenv "TERMINFO" (string-append ncurses "/share/terminfo"))
-               #t))))
-       #:tests? #f)) ; _curses.error: setupterm: could not find terminal
-    (native-inputs
-     `(("ncurses" ,ncurses)))
-    (home-page
-      "https://github.com/Rockhopper-Technologies/jinxed")
-    (synopsis "Jinxed Terminal Library")
-    (description
-     "Jinxed is an implementation of a subset of the Python curses library.")
-    (license license:mpl2.0)))
-
-(define-public postorius-1.3
-  (package
-    (name "postorius")
-    (version "1.3.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "postorius" version))
-        (sha256
-         (base32
-          "12aghg862js5sxm61xy7ijjb5ixdlv86vhp3nr8l94yiiq92k8sl"))))
-    (build-system python-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda* (#:key inputs outputs tests? #:allow-other-keys)
-             (add-installed-pythonpath inputs outputs)
-             (if tests?
-                 (invoke "python" "example_project/manage.py" "test"
-                         "--settings=test_settings" "postorius")
-                 #t))))
-       #:tests? #f)) ; Tests try to run a mailman instance to test against.
-    (propagated-inputs
-     `(("python-django" ,python-django)
-       ("python-django-mailman3" ,python-django-mailman3)
-       ("python-mailmanclient" ,python-mailmanclient-3.3)
-       ("python-readme-renderer" ,python-readme-renderer)))
-    (native-inputs
-     `(("python-beautifulsoup4" ,python-beautifulsoup4)
-       ("python-isort" ,python-isort)
-       ("python-mock" ,python-mock)
-       ("python-vcrpy" ,python-vcrpy)))
-    (home-page "https://gitlab.com/mailman/postorius")
-    (synopsis "Web user interface for GNU Mailman")
-    (description
-     "Postorius is a Django app which provides a web user interface
-to access GNU Mailman.")
-    (license (list license:gpl3+ license:lgpl3+))))
diff --git a/gn/packages/python.scm b/gn/packages/python.scm
index 7be6b4f..2940e40 100644
--- a/gn/packages/python.scm
+++ b/gn/packages/python.scm
@@ -1139,14 +1139,14 @@ server.")
 (define-public python-schema-salad
   (package
     (name "python-schema-salad")
-    (version "5.0.20200416112825")
+    (version "7.0.20200612160654")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "schema-salad" version))
         (sha256
          (base32
-          "1pm6q266qrw4r0w0vnzhsvqgk5j8b3q61hxg99awhgpjsmcvkmsz"))))
+          "15ma3lb6fkfc6sj75hnmmg0jj8q3pc5yrlyx15lpdd4dcp2jc39s"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-cachecontrol" ,python-cachecontrol-0.11)
@@ -1155,15 +1155,12 @@ server.")
        ("python-rdflib" ,python-rdflib)
        ("python-rdflib-jsonld" ,python-rdflib-jsonld)
        ("python-requests" ,python-requests)
-       ("python-ruaml.yaml" ,python38-ruaml.yaml-0.15.76)
+       ("python-ruamel.yaml" ,python-ruamel.yaml)
        ("python-setuptools" ,python-setuptools)
        ("python-typing-extensions" ,python-typing-extensions)))
     (native-inputs
-     `(("python-pytest" ,python-pytest)
+     `(("python-pytest" ,python-pytest-4)
        ("python-pytest-runner" ,python-pytest-runner)))
-    (arguments
-     `(
-       #:tests? #f)) ; no tests
     (home-page "https://github.com/common-workflow-language/schema_salad")
     (synopsis "Schema Annotations for Linked Avro Data (SALAD)")
     (description
diff --git a/gn/packages/python24.scm b/gn/packages/python24.scm
index bae5304..8dc237f 100644
--- a/gn/packages/python24.scm
+++ b/gn/packages/python24.scm
@@ -3,10 +3,12 @@
   #:use-module (guix utils)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix build-system python)
   #:use-module (gn packages python)
   #:use-module (past packages python)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages databases)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages python-xyz)
   #:use-module (srfi srfi-1))
@@ -126,55 +128,6 @@ pre-defined variants."
     (description "Stand-alone Assertions for Python")
     (license license:expat)))
 
-(define-public python24-pyx
-  (package
-    (name "python24-pyx")
-    (version "0.12.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "pyx" version))
-        (sha256
-         (base32
-          "13kyhqx19rw7dlv2xapdb68j8l9laq6nrpgkyd6549qwidmb4dz8"))))
-    (build-system python-build-system)
-    (arguments
-     `(#:python ,python-2.4
-       #:use-setuptools? #f
-       #:tests? #f))    ; tests not included
-    (properties '((release-date "2012-10-26")))
-    (home-page "https://pyx-project.org/")
-    (synopsis "Python package for the generation of PostScript, PDF, and SVG files")
-    (description "Python package for the generation of PostScript, PDF, and SVG files.")
-    (license license:gpl2+)))
-
-(define-public python24-pyxlwriter
-  (package
-    (name "python24-pyxlwriter")
-    (version "0.4a3")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (string-append "mirror://sourceforge/pyxlwriter/pyxlwriter/"
-                            version "/pyXLWriter-" version ".zip"))
-        (sha256
-         (base32
-          "1kfsi6la9y53rwayszgayfmkjfknpp650v69a0hwd1fcfk1df735"))))
-    (build-system python-build-system)
-    (arguments
-     `(#:python ,python-2.4
-       #:use-setuptools? #f
-       #:tests? #f)) ; no tests
-    (native-inputs
-     `(("unzip" ,unzip)))
-    (home-page "https://sourceforge.net/projects/pyxlwriter/")
-    (synopsis "Python library for generating Excel compatible spreadsheets")
-    (description "PyXLWriter is a Python library for generating Excel compatible
-spreadsheets.  It's a port of John McNamara's Perl @code{Spreadsheet::WriteExcel}
-module version 1.01 to Python.  It allows writing of Excel compatible
-spreadsheets without the need for COM objects.")
-    (license license:lgpl2.1+)))
-
 (define-public python24-pil
   (package
     (inherit python2-pil1)
@@ -219,7 +172,7 @@ spreadsheets without the need for COM objects.")
       (origin
         (method url-fetch)
         (uri (string-append
-             "http://www.parallelpython.com/downloads/pp/pp-" version ".zip"))
+               "https://www.parallelpython.com/downloads/pp/pp-" version ".zip"))
         (sha256
          (base32
           "0qkxcyclz3vgwpl6xvsrg76q59dj0wwy8qx15567bafv659ypyb1"))))
@@ -230,7 +183,7 @@ spreadsheets without the need for COM objects.")
        #:tests? #f)) ; no tests
     (native-inputs
      `(("unzip" ,unzip)))
-    (home-page "http://www.parallelpython.com")
+    (home-page "https://www.parallelpython.com/")
     (synopsis "Parallel and distributed programming for Python")
     (description "PP is a python module which provides mechanism for parallel
 execution of python code on SMP (systems with multiple processors or cores) and
@@ -435,3 +388,60 @@ clusters (computers connected via network).")
     (synopsis "")
     (description "")
     (license license:bsd-3)))
+
+(define-public python24-mysqlclient
+  (package
+    (name "python24-mysqlclient")
+    (version "1.2.5")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/PyMySQL/mysqlclient-python")
+               (commit "MySQLdb-1.2.5")))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32
+          "193h09afkmz9nw2jlwfdikx1xj9sybswd2705k8jy48h1ks6fnbj"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:python ,python-2.4
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'dont-create-release-file
+           (lambda _
+             (substitute* "setup_common.py"
+               (("MySQLdb/release.py")
+                (string-append (getcwd) "/release.py")))
+             #t))
+         (add-before 'check 'pre-check
+           (lambda _
+             (call-with-output-file "/tmp/my.cnf"
+               (lambda (p)
+                 (format p
+                         "[mysqld]~@
+                         datadir=/tmp~@
+                         socket=/tmp/mysql.sock~%")))
+             (system* "mysqld" "--defaults-file=/tmp/my.cnf" "--bootstrap")
+             ;(invoke "mysql" "-S" "/tmp/mysql.sock"
+             ;        "-e" "'create database mysqldb_test charset utf8;'")
+             #t)))
+       #:tests? #f))    ; TODO: Run the test suite
+    (native-inputs
+     `(("mariadb" ,mariadb "dev")
+       ("mariadb:bin" ,mariadb)
+       ("python-nose" ,python24-nose)
+       ("python-setuptools" ,python24-setuptools)))
+    (inputs
+     `(("zlib" ,zlib)))
+    (home-page "http://mysql-python.sourceforge.net/")
+    (synopsis "Python interface to MySQL")
+    (description "MySQLdb is an interface to the popular MySQL database server
+for Python.  The design goals are:
+@itemize
+@item with Python database API version 2.0
+@item Thread-safety
+@item Thread-friendliness (threads will not block each other)
+@item Compatibility with MySQL-3.23 and later
+@end itemize")
+    (license license:gpl2+)))
diff --git a/gn/packages/twint.scm b/gn/packages/twint.scm
index 14f04c4..cc538dd 100644
--- a/gn/packages/twint.scm
+++ b/gn/packages/twint.scm
@@ -4,14 +4,14 @@
   #:use-module (guix build-system python)
   #:use-module (guix packages)
   #:use-module (guix download)
-  #:use-module (gn packages mailman)
   #:use-module (gnu packages check)
-  #:use-module (gnu packages sphinx)
-  #:use-module (gnu packages time)
+  #:use-module (gnu packages geo)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-science)
-  #:use-module (gnu packages python-xyz))
+  #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages sphinx)
+  #:use-module (gnu packages time))
 
 (define-public python-googletransx
   (package
@@ -60,41 +60,6 @@
      "A Python 2.* port of 3.4 Statistics Module")
     (license #f)))
 
-(define-public python-geopy
-  (package
-  (name "python-geopy")
-  (version "1.22.0")
-  (source
-    (origin
-      (method url-fetch)
-      (uri (pypi-uri "geopy" version))
-      (sha256
-        (base32
-          "0jypkaqlbyr8icqypwm23lzsvq7flakp3a3nqr8ib5fmd0fzsq7q"))))
-  (build-system python-build-system)
-  (arguments
-   `(#:tests? #f))
-  (propagated-inputs
-    `(("python-geographiclib" ,python-geographiclib)))
-  (native-inputs
-    `(("python-contextlib2" ,python-contextlib2)
-      ("python-coverage" ,python-coverage)
-      ("python-flake8" ,python-flake8)
-      ("python-isort" ,python-isort)
-      ("python-mock" ,python-mock)
-      ("python-pytest" ,python-pytest)
-      ("python-readme-renderer"
-       ,python-readme-renderer)
-      ("python-six" ,python-six)
-      ("python-sphinx" ,python-sphinx)
-      ("python-sphinx-rtd-theme"
-       ,python-sphinx-rtd-theme)
-      ("python-statistics" ,python-statistics)))
-  (home-page "https://github.com/geopy/geopy")
-  (synopsis "Python Geocoding Toolbox")
-  (description "Python Geocoding Toolbox")
-  (license license:expat)))
-
 (define-public python-fake-useragent
   (package
     (name "python-fake-useragent")
@@ -138,28 +103,6 @@
       "cChardet is high speed universal character encoding detector.")
     (license #f)))
 
-(define-public python-geographiclib
-  (package
-  (name "python-geographiclib")
-  (version "1.50")
-  (source
-   (origin
-     (method url-fetch)
-     (uri (pypi-uri "geographiclib" version))
-     (sha256
-      (base32
-       "0cn6ap5fkh3mkfa57l5b44z3gvz7j6lpmc9rl4g2jny2gvp4dg8j"))))
-  (build-system python-build-system)
-  (arguments
-   `(#:tests? #f))
-  (home-page
-   "https://geographiclib.sourceforge.io/1.50/python")
-  (synopsis
-   "The geodesic routines from GeographicLib")
-  (description
-   "The geodesic routines from GeographicLib")
-  (license license:expat)))
-
 (define-public python-twint
   (package
     (name "python-twint")
diff --git a/gn/packages/web.scm b/gn/packages/web.scm
index 9589586..9290a64 100644
--- a/gn/packages/web.scm
+++ b/gn/packages/web.scm
@@ -1,22 +1,10 @@
 (define-module (gn packages web)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages)
-  #:use-module (gnu packages autotools)
-  #:use-module (gnu packages compression)
   #:use-module (gnu packages fonts)
-  #:use-module (past packages python)
-  #:use-module (gnu packages python)
-  #:use-module (gnu packages readline)
-  #:use-module (gnu packages tcl)
-  #:use-module (gnu packages tls)
-  #:use-module (gnu packages web)
   #:use-module (guix packages)
-  #:use-module (guix download)
   #:use-module (guix git-download)
-  #:use-module (guix utils)
-  #:use-module (guix build-system gnu)
-  #:use-module (guix build-system trivial)
-  #:use-module (srfi srfi-1))
+  #:use-module (guix build-system trivial))
 
 ; <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
 
@@ -165,269 +153,6 @@ extensive prebuilt components, and powerful plugins built on jQuery.")
       (description "Bootstrap native does not use jquery.")
       (license license:expat))))
 
-(define-public httpd-2.2
-  (package
-    (inherit httpd)
-    (version "2.2.34")
-    (source (origin
-             (method url-fetch)
-             (uri (string-append "mirror://apache/httpd/httpd-"
-                                 version ".tar.bz2"))
-             (sha256
-              (base32
-               "0q4196krxbyaswl5yzmm0r5ry2dijfhvxjdld3bl0mxcvzaq6cg5"))))
-    (inputs
-     `(("openssl" ,openssl-1.0)
-       ,@(alist-delete "openssl" (package-inputs httpd))))
-    (arguments
-     (substitute-keyword-arguments (package-arguments httpd)
-       ((#:configure-flags flags)
-        `(cons "--enable-mods-shared=most" ,flags))))))
-
-(define-public mod-python
-  (let ((commit "902bb8700e2c45ffd96b78e2f1146a3c101be7f5")
-        (revision "1"))
-    (package
-      (name "mod-python")
-      (version (git-version "3.5.0" revision commit))
-      (source
-        (origin
-          (method git-fetch)
-          (uri (git-reference
-                 (url "https://github.com/grisha/mod_python.git")
-                 (commit commit)))
-          (file-name (git-file-name name version))
-          (sha256
-           (base32
-            "0lqlpldw11dml24n05305xzpbjlkay497djjczvgsj5v8djkxcq0"))))
-      (build-system gnu-build-system)
-      (arguments
-       '(#:tests? #f ; tests require a running apache server
-         #:phases
-         (modify-phases %standard-phases
-           (add-after 'unpack 'patch-source
-             (lambda* (#:key outputs #:allow-other-keys)
-               (let ((out    (assoc-ref outputs "out")))
-                 (substitute* "Makefile.in"
-                   ;; Don't use httpd's prefix
-                   (("LIBEXECDIR=.*") (string-append "LIBEXECDIR=" out "/modules\n")))
-                 (substitute* "scripts/Makefile.in"
-                   (("BINDIR=.*") (string-append "BINDIR=" out "/bin")))
-                 (substitute* "dist/setup.py.in"
-                   ;; we want out modules dir, not httpd's
-                   ;; If we want SYSCONFDIR to be the same as httpd's :
-                   ;; (("@SYSCONFDIR@") (string-append (assoc-ref %build-inputs "httpd") "/etc/httpd"))
-                   (("@LIBEXECDIR@") (string-append out "/modules")))
-                 (substitute* "dist/Makefile.in"
-                   (("\\$\\(DESTDIR\\)") "/")
-                   (("--root") (string-append "--prefix=" out " --root"))))
-               #t)))))
-      (inputs
-       `(("httpd" ,httpd)
-         ("readline" ,readline)
-         ("python" ,python-2))) ; does not seem to build with python3.7+
-      (native-inputs `(("flex" ,(@ (gnu packages flex) flex))))
-      (home-page "http://modpython.org/")
-      (synopsis "Apache/Python Integration")
-      (description "Mod_python is an Apache module that embeds the Python
-interpreter within the server.  With mod_python you can write web-based
-applications in Python that will run many times faster than traditional CGI and
-will have access to advanced features such as ability to retain database
-connections and other data between hits and access to Apache internals.")
-      (license license:asl2.0))))
-
-(define-public mod-python-24-httpd22
-  (package
-    (inherit mod-python)
-    (name "mod-python-24-httpd22")
-    (version "3.3.1")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (string-append "https://archive.apache.org/dist/httpd/"
-                            "modpython/mod_python-" version ".tgz"))
-        (sha256
-         (base32
-          "0sss2xi6l1a2z8y6ji0cp8vgyvnhq8zrg0ilkvpj1mygbzyk28xd"))
-        (patches
-          (list
-            (origin
-              (method url-fetch)
-              (uri "https://sources.debian.org/data/main/liba/libapache2-mod-python/3.3.1-11/debian/patches/04_autoconf_python_multiarch.patch")
-              (file-name "mod-python-24-python-discovery.patch")
-              (sha256
-               (base32
-                "0n3zp8j6q0mp0scry7d2hi0baqkim42bqq2c81p4l6mizsy8ry4h")))
-            (origin
-              (method url-fetch)
-              (uri "https://sources.debian.org/data/main/liba/libapache2-mod-python/3.3.1-11/debian/patches/10_bts521965.patch")
-              (file-name "mod-python-24-apr13-compat.patch")
-              (sha256
-               (base32
-                "1k2cd2r13938fbm473sn0ivicaylkcqigyqn2wjir9ppch98kybg")))))))
-    (arguments
-     `(#:imported-modules ((guix build python-build-system)
-                           ,@%gnu-build-system-modules)
-       #:modules ((guix build gnu-build-system)
-                  (guix build utils)
-                  ((guix build python-build-system) #:prefix python:))
-       #:phases
-       (modify-phases %standard-phases
-         (replace 'bootstrap
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let* ((python (assoc-ref inputs "python"))
-                    (tcl (assoc-ref inputs "tcl"))
-                    (py-version (python:python-version python))
-                    (tcl-version ,(version-major+minor (package-version tcl))))
-               (substitute* "configure.in"
-                 (("PY_LIBS=.*")
-                  (string-append "PY_LIBS=-L" python "/lib/python" py-version "\n"))
-                 (("PY_LDFLAGS=.*")
-                  (string-append "PY_LDFLAGS=\"-lpython" py-version
-                                 " -lreadline -lssl -lcrypto"
-                                 " -ltk" tcl-version " -ltcl" tcl-version
-                                 " -lgdbm -ltirpc -lnsl -lz\"\n"))
-                 (("PY_INCLUDES=.*")
-                  (string-append "PY_INCLUDES=-I" python "/include/python" py-version "\n")))
-               (invoke "autoreconf" "-vfi"))))
-         (add-after 'unpack 'patch-sources
-           (lambda _
-             (substitute* "test/test.py"
-               (("2\\.2") "2.4"))
-             #t))
-         (replace 'install
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out")))
-               (install-file "src/mod_python.so" (string-append out "/modules"))
-               (with-directory-excursion "dist"
-                 (invoke "python" "setup.py" "install" "--root=/"
-                         (string-append "--prefix=" out)))
-               #t))))))
-    (native-inputs
-     `(("autoconf" ,autoconf)
-       ("automake" ,automake)
-       ("flex" ,(@ (gnu packages flex) flex))))
-    (inputs
-     `(("httpd" ,httpd-2.2)
-       ("python" ,python-2.4)
-       ,@(package-inputs python-2.4)))))
-
-(define-public mod-python-24
-  (package
-    (inherit mod-python-24-httpd22)
-    (name "mod-python-24")
-    (source
-      (origin
-        (inherit (package-source mod-python-24-httpd22))
-        (patches
-          (append
-            (origin-patches (package-source mod-python-24-httpd22))
-            (list
-              (origin
-                (method url-fetch)
-                (uri "https://sources.debian.org/data/main/liba/libapache2-mod-python/3.3.1-11/debian/patches/20_apache24.patch")
-                (file-name "mod-python-24-apache24-compat.patch")
-                (sha256
-                 (base32
-                  "1bmcx7ki7y486x6490yppssr7dh3a0qyki6gjf2lj83gyh68c0r0"))))))))
-    (inputs
-     `(("httpd" ,httpd)
-       ("python" ,python-2.4)
-       ,@(package-inputs python-2.4)))))
-
-(define-public httpd-mod-python-24
-  (package
-    (inherit httpd)
-    (name "httpd-mod-python-24")
-    (arguments
-     `(#:imported-modules ((guix build python-build-system)
-                           ,@%gnu-build-system-modules)
-       #:modules (((guix build gnu-build-system) #:prefix gnu:)
-                  (guix build utils)
-                  ,@%gnu-build-system-modules
-                  ((guix build python-build-system) #:prefix python:))
-       ,@(substitute-keyword-arguments (package-arguments httpd)
-          ((#:phases phases '%standard-phases)
-           `(modify-phases ,phases
-              (add-after 'install 'unpack-mod-python
-                (lambda* args
-                  ((assoc-ref gnu:%standard-phases 'unpack)
-                   #:source (assoc-ref %build-inputs "mod-python"))))
-              (add-after 'unpack-mod-python 'change-directory
-                (lambda _
-                  ;; Make sure we're in the correct folder
-                  (chdir "../mod_python-3.3.1") #t))
-              (add-after 'change-directory 'bootstrap-mod-python
-                (lambda* (#:key inputs #:allow-other-keys)
-                  (let* ((python (assoc-ref inputs "python"))
-                         (tcl (assoc-ref inputs "tcl"))
-                         (py-version (python:python-version python))
-                         (tcl-version ,(version-major+minor (package-version tcl))))
-                    (substitute* "configure.in"
-                      (("PY_LIBS=.*")
-                       (string-append "PY_LIBS=-L" python "/lib/python" py-version "\n"))
-                      (("PY_LDFLAGS=.*")
-                       (string-append "PY_LDFLAGS=\"-lpython" py-version
-                                      " -lreadline -lssl -lcrypto"
-                                      " -ltk" tcl-version " -ltcl" tcl-version
-                                      " -lgdbm -ltirpc -lnsl -lz\"\n"))
-                      (("PY_INCLUDES=.*")
-                       (string-append "PY_INCLUDES=-I" python "/include/python" py-version "\n")))
-                    (invoke "autoreconf" "-vfi"))))
-              (add-after 'bootstrap-mod-python 'patch-bin-file-mod-python
-                (assoc-ref gnu:%standard-phases 'patch-usr-bin-file))
-              (add-after 'patch-bin-file-mod-python 'patch-source-shebangs-mod-python
-                (assoc-ref gnu:%standard-phases 'patch-source-shebangs))
-              (add-after 'patch-source-shebangs-mod-python 'configure-mod-python
-                (lambda* args
-                  ((assoc-ref gnu:%standard-phases 'configure)
-                   #:outputs %outputs
-                   #:inputs %build-inputs
-                   #:configure-flags (list (string-append "--with-apxs="
-                                                          (assoc-ref %outputs "out")
-                                                          "/bin/apxs")))))
-              (add-after 'configure-mod-python 'patch-more-shebangs-mod-python
-                (assoc-ref gnu:%standard-phases 'patch-generated-file-shebangs))
-              (add-after 'patch-more-shebangs-mod-python 'make-mod-python
-                (assoc-ref gnu:%standard-phases 'build))
-              (add-after 'make-mod-python 'install-mod-python
-                (lambda* (#:key outputs #:allow-other-keys)
-                  (let ((out (assoc-ref outputs "out")))
-                    (install-file "src/mod_python.so" (string-append out "/modules"))
-                    (with-directory-excursion "dist"
-                      (invoke "python" "setup.py" "install" "--root=/"
-                              (string-append "--prefix=" out)))
-                    #t))))))))
-    (native-inputs
-     `(,@(package-native-inputs httpd)
-       ,@(package-native-inputs mod-python-24)
-       ("mod-python" ,(package-source mod-python-24))))
-    (inputs
-     `(,@(alist-delete "openssl" (package-inputs httpd))
-       ,@(package-inputs python-2.4)
-       ("python" ,python-2.4)))))
-
-(define-public httpd22-mod-python-24
-  (package
-    (inherit httpd-mod-python-24)
-    (name "httpd22-mod-python-24")
-    (version (package-version httpd-2.2))
-    (source
-      (origin
-        (inherit (package-source httpd-2.2))))
-    (arguments
-     (substitute-keyword-arguments (package-arguments httpd-mod-python-24)
-       ((#:configure-flags flags)
-        `(cons "--enable-mods-shared=most" ,flags))))
-    (native-inputs
-     `(,@(package-native-inputs httpd-2.2)
-        ,@(package-native-inputs mod-python-24-httpd22)
-       ("mod-python" ,(package-source mod-python-24-httpd22))))
-    (inputs
-     `(,@(package-inputs httpd-2.2)
-       ,@(package-inputs python-2.4)
-       ("python" ,python-2.4)))))
-
 (define-public web-font-awesome
   (package
     (inherit font-awesome)
diff --git a/gn/services/genenetwork.scm b/gn/services/genenetwork.scm
index 0137e94..7de1821 100644
--- a/gn/services/genenetwork.scm
+++ b/gn/services/genenetwork.scm
@@ -3,17 +3,10 @@
 (use-modules (gnu)
              (ice-9 match)
              (past packages python)
+             (past packages web)
              (gn packages genenetwork)
-             (gn packages python24)
-             (gn packages web))
+             (gn packages python24))
 (use-service-modules web)
-(use-package-modules python)
-
-(define %python-path
-  "/lib/python2.4/site-packages")
-
-(define %mod-python-path
-  (file-append httpd22-mod-python-24 %python-path))
 
 (define %default-httpd22-modules
   (map (match-lambda
@@ -82,28 +75,32 @@
   (firmware '())
 
   (packages (cons* python-2.4
-                   ;httpd-mod-python-24
-                   ;python24-qtlreaper
-                   ;python24-htmlgen-GN1
-                   ;python24-json-GN1
-                   ;python24-piddle
-                   ;python24-pyx-GN1
-                   ;python24-pyxlwriter
-                   ;python24-svg-GN1
+                   python24-htmlgen-GN1
+                   python24-json-GN1
+                   python24-mysqlclient ; MySQLdb
+                   python24-numarray
+                   python24-piddle
+                   python24-pp
+                   python24-pyx
+                   python24-pyxlwriter
+                   python24-qtlreaper
+                   python24-svg-GN1
                    %base-packages))
 
   (services (list (service httpd-service-type
                            (httpd-configuration
-                             (package httpd22-mod-python-24)    ; Must be httpd-2.2?
+                             ;; Must be a httpd-2.2 variant.
+                             (package httpd22-with-mod-python)
                              (config
                                (httpd-config-file
                                  (server-name "www.genenetwork.org")
-                                 (server-root httpd22-mod-python-24)    ; Defaults to httpd, must be combo package.
+                                 ;; Defaults to httpd, should be same as 'package' above.
+                                 (server-root httpd22-with-mod-python)
                                  (user "nobody")
                                  (group "root")
+                                 ;; Only while debugging
                                  (pid-file "/tmp/httpd-genenetwork1")
                                  (error-log "/tmp/httpd-genenetwork1-error-log")
-                                 (document-root (file-append genenetwork1 "/web"))
                                  (listen '("8042"))
                                  (modules (cons*
                                             (httpd-module
@@ -111,21 +108,32 @@
                                               (file "modules/mod_python.so"))
                                             %default-httpd22-modules))
                                  (extra-config (list "\
-TypesConfig etc/httpd/mime.types
-#for apache-2.2, ignored by apache-2.4
+TypesConfig " httpd22-with-mod-python "/etc/httpd/mime.types
 DefaultType application/octet-stream
-# Should PythonPath just be genenetwork1/web/webqtl?
-PythonPath \"sys.path+['" (file-append python-2.4 "/lib/python2.4") "', '" %mod-python-path "', '" (file-append genenetwork1 "/web/webqtl") "']\"
-<Directory " (file-append genenetwork1 "/web/webqtl") ">
-  AddHandler mod_python .py
-  PythonHandler mod_python.publisher
-  PythonAutoReload Off
+# DocumentRoot MUST NOT be in the PythonPath. Because genenetwork1 must be in PythonPath we leave the document-root keyword above unset.
+PythonPath \"['/run/current-system/profile/lib/python2.4', '/run/current-system/profile/lib/python2.4/site-packages', '" httpd22-with-mod-python "/lib/python2.4/site-packages', '" genenetwork1 "/web/webqtl']\"
+# same as 'listen' above
+NameVirtualHost *:8042
+<VirtualHost *:8042>
+  DocumentRoot "genenetwork1 "/web
+</VirtualHost>
+<Directory " genenetwork1 "/web/webqtl>
+  PythonOption session FileSession
+  #what is the difference between these two?
+  #AddHandler mod_python .py
+  SetHandler python-program
+  #publisher has more debug information
+  PythonHandler " genenetwork1 "/web/webqtl/main.py
+  #PythonHandler mod_python.publisher
+  #PythonHandler mod_python.cgihandler
+  # only while debugging:
   PythonDebug On
 </Directory>
+# only while debugging:
 <Location /mpinfo>
   SetHandler python-program
   PythonHandler mod_python.testhandler
 </Location>")))))))))
 
-;PythonPath \"sys.path+['" (file-append python-2.4 "/lib/python2.4") "', '" %mod-python-path "', '" (file-append python24-qtlreaper %python-path) "', '" (file-append python24-json-GN1 %python-path) "', '" (file-append python24-piddle %python-path) "', '" (file-append python24-pyx-GN1 %python-path) "', '" (file-append python24-pyxlwriter-GN1 %python-path) "', '" (file-append python24-svg-GN1 %python-path) "', '" (file-append python24-htmlgen-GN1) "', '" (file-append genenetwork1 "/web/webqtl") "']\"
-;PythonPath \"sys.path+['" (file-append python-2.4 "/lib/python2.4") "', '" %mod-python-path "', '" (file-append genenetwork1 "/web/webqtl") "']\"
+;; guix system container -L /path/to/guix-past/modules/ -L /path/to/guix-bioinformatics/ /path/to/guix-bioinformatics/gn/services/genenetwork.scm --network
+;; xdg-open http://localhost:8042