[arch-commits] Commit in hyperkitty/trunk (PKGBUILD hyperkitty-1.3.5-django4.0.patch)
David Runge
dvzrv at gemini.archlinux.org
Sun Feb 20 16:18:24 UTC 2022
Date: Sunday, February 20, 2022 @ 16:18:24
Author: dvzrv
Revision: 1135302
upgpkg: hyperkitty 1.3.5-4: Rebuild for django 4.0 compatibility.
Add fixes for django 4.0 compatibility:
https://gitlab.com/mailman/hyperkitty/-/merge_requests/384
Remove unneeded quotes and curly braces.
Added:
hyperkitty/trunk/hyperkitty-1.3.5-django4.0.patch
Modified:
hyperkitty/trunk/PKGBUILD
----------------------------------+
PKGBUILD | 100 +++++-----
hyperkitty-1.3.5-django4.0.patch | 341 +++++++++++++++++++++++++++++++++++++
2 files changed, 393 insertions(+), 48 deletions(-)
Modified: PKGBUILD
===================================================================
--- PKGBUILD 2022-02-20 16:04:10 UTC (rev 1135301)
+++ PKGBUILD 2022-02-20 16:18:24 UTC (rev 1135302)
@@ -3,7 +3,7 @@
_name=HyperKitty
pkgname=hyperkitty
pkgver=1.3.5
-pkgrel=3
+pkgrel=4
pkgdesc="A web interface to access GNU Mailman v3 archives"
arch=(any)
url="https://gitlab.com/mailman/hyperkitty"
@@ -20,23 +20,25 @@
'python-xapian-haystack: for using xapian as search backend'
'uwsgi-plugin-python: for running inside uwsgi'
'ruby-sassc: alternative to sassc')
-backup=("etc/uwsgi/${pkgname}.ini"
- "etc/webapps/${pkgname}/settings_local.py"
- "etc/webapps/${pkgname}/urls.py"
+backup=(
+ etc/uwsgi/$pkgname.ini
+ etc/webapps/$pkgname/settings_local.py
+ etc/webapps/$pkgname/urls.py
)
-install="${pkgname}.install"
+install=$pkgname.install
source=(
- "https://files.pythonhosted.org/packages/source/${_name::1}/${_name}/${_name}-${pkgver}.tar.gz"{,.asc}
- "${pkgname}-1.3.2-settings.patch"
- "${pkgname}-1.3.5-qcluster_retry.patch"
- "${pkgname}-1.3.5-mistune2.0.0_imports.patch"
- "${pkgname}-1.3.5-implict_primary_keys.patch"
- "${pkgname}-1.3.5-assert_printable_date.patch"
- "${pkgname}-1.3.5-assert_date_header.patch"
- "${pkgname}-qcluster.service"
- "${pkgname}.sysusers"
- "${pkgname}.tmpfiles"
- "${pkgname}.uwsgi"
+ https://files.pythonhosted.org/packages/source/${_name::1}/$_name/$_name-$pkgver.tar.gz{,.asc}
+ $pkgname-1.3.2-settings.patch
+ $pkgname-1.3.5-qcluster_retry.patch
+ $pkgname-1.3.5-mistune2.0.0_imports.patch
+ $pkgname-1.3.5-implict_primary_keys.patch
+ $pkgname-1.3.5-assert_printable_date.patch
+ $pkgname-1.3.5-assert_date_header.patch
+ $pkgname-qcluster.service
+ $pkgname.sysusers
+ $pkgname.tmpfiles
+ $pkgname.uwsgi
+ $pkgname-1.3.5-django4.0.patch
)
sha512sums=('9e794cd522904369dea5a70489e3ab7fe149680ed13f03e5002f0ad84304cf1de7481c71e302cf46cd9fa244cadca5d0c41767ceb4cee82b7153f052bc1b677d'
'SKIP'
@@ -49,7 +51,8 @@
'a41c938082ceee555143ddb21c3a95835f9832b9aff423142d78d3e52f12500561f80e0ce43c67a4f190065c9d045945741ac71ab3307db1419c4dc0686db09a'
'3267427109b08b8c9336b187381ed14357a07370bdcdfc24da94555020ad0424c5bbebc09e131e981e0540c51db443ffe558209e1bca7c2a1b7b1f602ed0805b'
'c943d82b8640a513728e3f07fa44c0ddb5a3bb8ec84a3a70990e51287ca01977887f895b901688fc4643d8fcb106d524259a86a51bccaafd77c69b241f1b23ba'
- '351f40a6bc1fd1735c883408f9941808e081206927a7c02467e03228243dd156378cac21f851b498702bd4f96fde8e4c80536dbcc6f3c384bf708bed4e988971')
+ '351f40a6bc1fd1735c883408f9941808e081206927a7c02467e03228243dd156378cac21f851b498702bd4f96fde8e4c80536dbcc6f3c384bf708bed4e988971'
+ '27c018daa36d84207fc7911568f85e4f903b8b87026c98e6b05b5dfe78b2437bc6619ea6a30ac4b3666c6e46f0115627bafcd7cba8a6739354bfc80d5666cee7')
b2sums=('2ef6917425bdf00a5a03383a8f7ff0eb1243557c1189d9afba33b3c1f09db63b40827b0e7f9602964f251197045594d786df13c6cd288c97980967bdf85eba4c'
'SKIP'
'1eab6221db4adb1a066bde8d6c84a90d3e414d1d30c5cf55a90a4ac58d131f7c4872c85d65e98d91ee0f4cac6f71c47c829993c736617a86be8fec5d831422c8'
@@ -61,39 +64,40 @@
'e8ae1d123e74b0c6984df3e5fff720e03dcbc3f007123718fe845024b42e5c13b7eac4da6bde04a9e1372d446bfa50ac12479730a9092e8396b73434e59663d3'
'f4e912e75c5127897837d67626ba94a418ec408f0f3a9bcd1767633347e107600cc43825caa5737a84362273a353bf03097879ff5b9065663150f6db4b96238a'
'e4fd83e38703d8ff9a714b238296e4e12791b8ce0c19446709e5c20b4012ed10b97504cafda66cdbe12e56a9f943c094147b6a02db3bd9c854e609adca38ff01'
- '767f334add0dd0e83b27e198415a2ef8ae3c505aa7f37d12138e37a98dc5575e43f83eb665431464ed488a5bf6b8913cd675eb112dc880cf17ff51511a3f07e6')
+ '767f334add0dd0e83b27e198415a2ef8ae3c505aa7f37d12138e37a98dc5575e43f83eb665431464ed488a5bf6b8913cd675eb112dc880cf17ff51511a3f07e6'
+ '8d958d3e9cce9fbee504d30108fb43d4978c2dca300ccdd9f1a136bc4dd3daca6009c5cc95e1143d6df7b704c0cef5c6318e55fef7c31b03c21cb24876b479bf')
validpgpkeys=('541EA0448453394FF77A0ECC9D9B2BA061D0A67C') # Abhilash Raj <raj.abhilash1 at gmail.com>
prepare() {
- mv -v "${_name}-${pkgver}" "$pkgname-$pkgver"
- cd "$pkgname-$pkgver"
# setting FHS compliant default paths, remove debug options
- patch -Np1 -i "../${pkgname}-1.3.2-settings.patch"
-
+ patch -d $_name-$pkgver -p1 -i ../$pkgname-1.3.2-settings.patch
# fix warnings with qcluster retry
# https://gitlab.com/mailman/hyperkitty/-/issues/402
- patch -Np1 -i ../"${pkgname}-1.3.5-qcluster_retry.patch"
+ patch -d $_name-$pkgver -p1 -i ../$pkgname-1.3.5-qcluster_retry.patch
# fix imports with python-mistune >= 2.0.0
# https://gitlab.com/mailman/hyperkitty/-/issues/395
- patch -Np1 -i ../"${pkgname}-1.3.5-mistune2.0.0_imports.patch"
+ patch -d $_name-$pkgver -p1 -i ../$pkgname-1.3.5-mistune2.0.0_imports.patch
# fix excessive warnings with django >= 3.2
# https://gitlab.com/mailman/hyperkitty/-/issues/401
- patch -Np1 -i ../"${pkgname}-1.3.5-implict_primary_keys.patch"
+ patch -d $_name-$pkgver -p1 -i ../$pkgname-1.3.5-implict_primary_keys.patch
# fix issues due to changes in the email module in python 3.10
# https://gitlab.com/mailman/hyperkitty/-/issues/401
- patch -Np1 -i ../"${pkgname}-1.3.5-assert_printable_date.patch"
- patch -Np1 -i ../"${pkgname}-1.3.5-assert_date_header.patch"
- touch settings_local.py
+ patch -d $_name-$pkgver -p1 -i ../$pkgname-1.3.5-assert_printable_date.patch
+ patch -d $_name-$pkgver -p1 -i ../$pkgname-1.3.5-assert_date_header.patch
+ # make compatible with django 4.0: https://gitlab.com/mailman/hyperkitty/-/merge_requests/384
+ patch -d $_name-$pkgver -p1 -i ../$pkgname-1.3.5-django4.0.patch
+
+ touch $_name-$pkgver/settings_local.py
}
build() {
- cd "$pkgname-$pkgver"
+ cd $_name-$pkgver
python setup.py build
}
check() {
- cd "$pkgname-$pkgver"
- export PYTHONPATH="build:${PYTHONPATH}"
+ cd $_name-$pkgver
+ export PYTHONPATH="build:$PYTHONPATH"
python example_project/manage.py test --settings=hyperkitty.tests.settings_test hyperkitty
}
@@ -100,33 +104,33 @@
package() {
local python_stdlib_basepath="$(python -c "from sysconfig import get_path; print(get_path('stdlib'))")"
- cd "$pkgname-$pkgver"
- python setup.py install --optimize=1 --root="${pkgdir}"
+ cd $_name-$pkgver
+ python setup.py install --optimize=1 --root="$pkgdir"
# remove example_project from top level site-packages:
# https://gitlab.com/mailman/hyperkitty/issues/279
- rm -rfv "${pkgdir}/${python_stdlib_basepath}/site-packages/example_project"
+ rm -rfv "$pkgdir/$python_stdlib_basepath/site-packages/example_project"
# doc
- install -vDm 644 README.rst -t "${pkgdir}/usr/share/doc/${pkgname}"
+ install -vDm 644 README.rst -t "$pkgdir/usr/share/doc/$pkgname"
# django project
- install -vDm 644 example_project/{__init__,manage,settings,wsgi}.py -t "${pkgdir}/usr/share/webapps/${pkgname}"
+ install -vDm 644 example_project/{__init__,manage,settings,wsgi}.py -t "$pkgdir/usr/share/webapps/$pkgname"
# symlink locale and static dirs to state dir
- ln -svf "/var/lib/${pkgname}/locale/" "${pkgdir}/usr/share/webapps/${pkgname}"
- ln -svf "/var/lib/${pkgname}/static/" "${pkgdir}/usr/share/webapps/${pkgname}"
+ ln -svf /var/lib/$pkgname/locale/ "$pkgdir/usr/share/webapps/$pkgname"
+ ln -svf /var/lib/$pkgname/static/ "$pkgdir/usr/share/webapps/$pkgname"
# state dir
- install -vdm 750 "${pkgdir}/var/lib/${pkgname}/data"
- install -vdm 755 "${pkgdir}/var/lib/${pkgname}/"{locale,static}
+ install -vdm 750 "$pkgdir/var/lib/$pkgname/data"
+ install -vdm 755 "$pkgdir/var/lib/$pkgname/"{locale,static}
# log dir
- install -vdm 750 "${pkgdir}/var/log/${pkgname}"
+ install -vdm 750 "$pkgdir/var/log/$pkgname"
# config
- install -vDm 640 settings_local.py example_project/urls.py -t "${pkgdir}/etc/webapps/${pkgname}"
- ln -svf "/etc/webapps/${pkgname}/settings_local.py" "${pkgdir}/usr/share/webapps/${pkgname}/settings_local.py"
- ln -svf "/etc/webapps/${pkgname}/urls.py" "${pkgdir}/usr/share/webapps/${pkgname}/urls.py"
+ install -vDm 640 settings_local.py example_project/urls.py -t "$pkgdir/etc/webapps/$pkgname"
+ ln -svf "/etc/webapps/$pkgname/settings_local.py" "$pkgdir/usr/share/webapps/$pkgname/settings_local.py"
+ ln -svf "/etc/webapps/$pkgname/urls.py" "$pkgdir/usr/share/webapps/$pkgname/urls.py"
# systemd service
- install -vDm 644 "../${pkgname}-qcluster.service" -t "${pkgdir}/usr/lib/systemd/system"
+ install -vDm 644 "../$pkgname-qcluster.service" -t "$pkgdir/usr/lib/systemd/system"
# uwsgi
- install -vDm 644 "../${pkgname}.uwsgi" "${pkgdir}/etc/uwsgi/${pkgname}.ini"
+ install -vDm 644 "../$pkgname.uwsgi" "$pkgdir/etc/uwsgi/$pkgname.ini"
# tmpfiles.d
- install -vDm 644 "../${pkgname}.tmpfiles" "${pkgdir}/usr/lib/tmpfiles.d/${pkgname}.conf"
+ install -vDm 644 "../$pkgname.tmpfiles" "$pkgdir/usr/lib/tmpfiles.d/$pkgname.conf"
# sysusers.d
- install -vDm 644 "../${pkgname}.sysusers" "${pkgdir}/usr/lib/sysusers.d/${pkgname}.conf"
+ install -vDm 644 "../$pkgname.sysusers" "$pkgdir/usr/lib/sysusers.d/$pkgname.conf"
}
Added: hyperkitty-1.3.5-django4.0.patch
===================================================================
--- hyperkitty-1.3.5-django4.0.patch (rev 0)
+++ hyperkitty-1.3.5-django4.0.patch 2022-02-20 16:18:24 UTC (rev 1135302)
@@ -0,0 +1,341 @@
+From e8228c7eddae75d168b28bc3a7abe351bab04b65 Mon Sep 17 00:00:00 2001
+From: John Vandenberg <jayvdb at gmail.com>
+Date: Mon, 27 Dec 2021 10:48:27 +0800
+Subject: [PATCH 1/3] Support Django 4.0
+
+---
+ example_project/urls.py | 12 +--
+ hyperkitty/tests/urls_test.py | 9 +-
+ hyperkitty/urls.py | 157 +++++++++++++++-------------------
+ hyperkitty/views/mailman.py | 5 +-
+ setup.py | 2 +-
+ 5 files changed, 85 insertions(+), 100 deletions(-)
+
+diff --git a/example_project/urls.py b/example_project/urls.py
+index 9c854989..53245861 100644
+--- a/example_project/urls.py
++++ b/example_project/urls.py
+@@ -21,21 +21,21 @@ This file is the main URL config for a Django website including HyperKitty.
+ """
+
+ from django.conf import settings
+-from django.conf.urls import include, url
++from django.conf.urls import include
+ from django.contrib import admin
+ from django.urls import path, reverse_lazy
+ from django.views.generic import RedirectView
+
+
+ urlpatterns = [
+- url(r'^$', RedirectView.as_view(
++ path('', RedirectView.as_view(
+ url=reverse_lazy('hk_root'))),
+- url(r'^hyperkitty/', include('hyperkitty.urls')),
++ path('hyperkitty/', include('hyperkitty.urls')),
+ # url(r'^postorius/', include('postorius.urls')),
+- url(r'', include('django_mailman3.urls')),
+- url(r'^accounts/', include('allauth.urls')),
++ path('', include('django_mailman3.urls')),
++ path('accounts/', include('allauth.urls')),
+ # Django admin
+- url(r'^admin/', admin.site.urls),
++ path('admin/', admin.site.urls),
+ ]
+
+
+diff --git a/hyperkitty/tests/urls_test.py b/hyperkitty/tests/urls_test.py
+index 67d5497a..4e1c3af7 100644
+--- a/hyperkitty/tests/urls_test.py
++++ b/hyperkitty/tests/urls_test.py
+@@ -21,11 +21,12 @@
+ This file is the main URL config for a Django website including HyperKitty.
+ """
+
+-from django.conf.urls import include, url
++from django.conf.urls import include
++from django.urls import path
+
+
+ urlpatterns = [
+- url(r'', include('hyperkitty.urls')),
+- url(r'', include('django_mailman3.urls')),
+- url(r'^accounts/', include('allauth.urls')),
++ path('', include('hyperkitty.urls')),
++ path('', include('django_mailman3.urls')),
++ path('accounts/', include('allauth.urls')),
+ ]
+diff --git a/hyperkitty/urls.py b/hyperkitty/urls.py
+index a6782fbd..f5e45e1a 100644
+--- a/hyperkitty/urls.py
++++ b/hyperkitty/urls.py
+@@ -21,8 +21,9 @@
+ # Author: Aurelien Bompard <abompard at fedoraproject.org>
+ #
+
+-from django.conf.urls import include, url
++from django.conf.urls import include
+ from django.contrib.staticfiles.urls import staticfiles_urlpatterns
++from django.urls import path, re_path
+ from django.views.generic.base import TemplateView
+
+ from hyperkitty.api import email as api_email
+@@ -41,146 +42,130 @@ from hyperkitty.views import (
+
+ # List archives and overview
+ list_patterns = [
+- url(r'^(?P<year>\d{4})/(?P<month>\d\d?)/(?P<day>\d\d?)/$',
++ re_path(r'^(?P<year>\d{4})/(?P<month>\d\d?)/(?P<day>\d\d?)/$',
+ mlist.archives, name='hk_archives_with_day'),
+- url(r'^(?P<year>\d{4})/(?P<month>\d\d?)/$',
++ re_path(r'^(?P<year>\d{4})/(?P<month>\d\d?)/$',
+ mlist.archives, name='hk_archives_with_month'),
+- url(r'^latest$', mlist.archives, name='hk_archives_latest'),
+- url(r'^$', mlist.overview, name='hk_list_overview'),
+- url(r'^recent-activity$',
+- mlist.recent_activity, name='hk_list_recent_activity'),
+- url(r'^recent-threads$',
+- mlist.overview_recent_threads, name='hk_list_overview_recent_threads'),
+- url(r'^pop-threads$',
+- mlist.overview_pop_threads, name='hk_list_overview_pop_threads'),
+- url(r'^top-threads$',
+- mlist.overview_top_threads, name='hk_list_overview_top_threads'),
+- url(r'^favorites$',
+- mlist.overview_favorites, name='hk_list_overview_favorites'),
+- url(r'^posted-to$',
+- mlist.overview_posted_to, name='hk_list_overview_posted_to'),
+- url(r'^top-posters$',
+- mlist.overview_top_posters, name='hk_list_overview_top_posters'),
+- url(r'^export/(?P<filename>[^/]+)\.mbox.gz$',
++ path('latest', mlist.archives, name='hk_archives_latest'),
++ path('', mlist.overview, name='hk_list_overview'),
++ path('recent-activity', mlist.recent_activity, name='hk_list_recent_activity'),
++ path('recent-threads', mlist.overview_recent_threads, name='hk_list_overview_recent_threads'),
++ path('pop-threads', mlist.overview_pop_threads, name='hk_list_overview_pop_threads'),
++ path('top-threads', mlist.overview_top_threads, name='hk_list_overview_top_threads'),
++ path('favorites', mlist.overview_favorites, name='hk_list_overview_favorites'),
++ path('posted-to', mlist.overview_posted_to, name='hk_list_overview_posted_to'),
++ path('top-posters', mlist.overview_top_posters, name='hk_list_overview_top_posters'),
++ re_path(r'^export/(?P<filename>[^/]+)\.mbox.gz$',
+ mlist.export_mbox, name='hk_list_export_mbox'),
+- url(r'delete/', mlist.delete, name='hk_list_delete'),
+- url(r'feed/', check_mlist_private(MailingListFeed()), name='hk_list_feed'),
++ path('delete/', mlist.delete, name='hk_list_delete'),
++ path('feed/', check_mlist_private(MailingListFeed()), name='hk_list_feed'),
+ ]
+
+
+ # Messages
+ message_patterns = [
+- url(r'^$', message.index, name='hk_message_index'),
+- url(r'^attachment/(?P<counter>\d+)/(?P<filename>.+)$',
+- message.attachment, name='hk_message_attachment'),
+- url(r'^vote$', message.vote, name='hk_message_vote'),
+- url(r'^reply$', message.reply, name='hk_message_reply'),
+- url(r'^delete$', message.delete, name='hk_message_delete'),
++ path('', message.index, name='hk_message_index'),
++ path('attachment/<int:counter>/<path:filename>', message.attachment, name='hk_message_attachment'),
++ path('vote', message.vote, name='hk_message_vote'),
++ path('reply', message.reply, name='hk_message_reply'),
++ path('delete', message.delete, name='hk_message_delete'),
+ ]
+
+
+ # Threads
+ thread_patterns = [
+- url(r'^$', thread.thread_index, name='hk_thread'),
+- url(r'^replies$', thread.replies, name='hk_thread_replies'),
+- url(r'^tags$', thread.tags, name='hk_tags'),
+- url(r'^suggest-tags$', thread.suggest_tags, name='hk_suggest_tags'),
+- url(r'^favorite$', thread.favorite, name='hk_favorite'),
+- url(r'^category$', thread.set_category, name='hk_thread_set_category'),
+- url(r'^reattach$', thread.reattach, name='hk_thread_reattach'),
+- url(r'^reattach-suggest$',
+- thread.reattach_suggest, name='hk_thread_reattach_suggest'),
+- url(r'^delete$', message.delete, name='hk_thread_delete'),
++ path('', thread.thread_index, name='hk_thread'),
++ path('replies', thread.replies, name='hk_thread_replies'),
++ path('tags', thread.tags, name='hk_tags'),
++ path('suggest-tags', thread.suggest_tags, name='hk_suggest_tags'),
++ path('favorite', thread.favorite, name='hk_favorite'),
++ path('category', thread.set_category, name='hk_thread_set_category'),
++ path('reattach', thread.reattach, name='hk_thread_reattach'),
++ path('reattach-suggest', thread.reattach_suggest, name='hk_thread_reattach_suggest'),
++ path('delete', message.delete, name='hk_thread_delete'),
+ ]
+
+
+ # REST API
+ api_list_patterns = [
+- url(r'^$',
+- api_mailinglist.MailingListDetail.as_view(), name="hk_api_mailinglist_detail"),
+- url(r'^threads/$',
+- api_thread.ThreadList.as_view(), name="hk_api_thread_list"),
+- url(r'^thread/(?P<thread_id>[^/]+)/$',
+- api_thread.ThreadDetail.as_view(), name="hk_api_thread_detail"),
+- url(r'^emails/$',
+- api_email.EmailList.as_view(), name="hk_api_email_list"),
+- url(r'^email/(?P<message_id_hash>.*)/$',
++ path('', api_mailinglist.MailingListDetail.as_view(), name="hk_api_mailinglist_detail"),
++ path('threads/', api_thread.ThreadList.as_view(), name="hk_api_thread_list"),
++ path('thread/<str:thread_id>/', api_thread.ThreadDetail.as_view(), name="hk_api_thread_detail"),
++ path('emails/', api_email.EmailList.as_view(), name="hk_api_email_list"),
++ re_path(r'^email/(?P<message_id_hash>.*)/$',
+ api_email.EmailDetail.as_view(), name="hk_api_email_detail"),
+- url(r'^thread/(?P<thread_id>[^/]+)/emails/$',
+- api_email.EmailList.as_view(), name="hk_api_thread_email_list"),
++ path('thread/<str:thread_id>/emails/', api_email.EmailList.as_view(), name="hk_api_thread_email_list"),
+ ]
+ api_patterns = [
+- url(r'^$', TemplateView.as_view(template_name="hyperkitty/api.html")),
+- url(r'^lists/$',
+- api_mailinglist.MailingListList.as_view(), name="hk_api_mailinglist_list"),
+- url(r'^list/(?P<mlist_fqdn>[^/@]+@[^/@]+)/', include(api_list_patterns)),
+- url(r'^sender/(?P<mailman_id>[^/]+)/emails/$',
+- api_email.EmailListBySender.as_view(), name="hk_api_sender_email_list"),
+- url(r'^tags/$', api_tag.TagList.as_view(), name="hk_api_tag_list"),
++ path('', TemplateView.as_view(template_name="hyperkitty/api.html")),
++ path('lists/', api_mailinglist.MailingListList.as_view(), name="hk_api_mailinglist_list"),
++ re_path(r'^list/(?P<mlist_fqdn>[^/@]+@[^/@]+)/', include(api_list_patterns)),
++ path('sender/<str:mailman_id>/emails/', api_email.EmailListBySender.as_view(), name="hk_api_sender_email_list"),
++ path('tags/', api_tag.TagList.as_view(), name="hk_api_tag_list"),
+ ]
+
+
+ urlpatterns = [
+ # Index
+- url(r'^$', index.index, name='hk_root'),
+- url(r'^find-list$', index.find_list, name='hk_find_list'),
++ path('', index.index, name='hk_root'),
++ path('find-list', index.find_list, name='hk_find_list'),
+
+ # User profile
+- url(r'^profile/', include([
+- url(r'^$', accounts.user_profile, name='hk_user_profile'),
+- url(r'^favorites$', accounts.favorites, name='hk_user_favorites'),
+- url(r'^last_views$', accounts.last_views, name='hk_user_last_views'),
+- url(r'^votes$', accounts.votes, name='hk_user_votes'),
+- url(r'^subscriptions$', accounts.subscriptions,
++ path('profile/', include([
++ path('', accounts.user_profile, name='hk_user_profile'),
++ path('favorites', accounts.favorites, name='hk_user_favorites'),
++ path('last_views', accounts.last_views, name='hk_user_last_views'),
++ path('votes', accounts.votes, name='hk_user_votes'),
++ path('subscriptions', accounts.subscriptions,
+ name='hk_user_subscriptions'),
+ ])),
+
+ # Users
+- url(r'^users/$', users.users, name='hk_users_overview'),
+- url(r'^users/(?P<user_id>[^/]+)/$', accounts.public_profile, name='hk_public_user_profile'),
+- url(r'^users/(?P<user_id>[^/]+)/posts$', accounts.posts, name='hk_user_posts'),
++ path('users/', users.users, name='hk_users_overview'),
++ path('users/<str:user_id>/', accounts.public_profile, name='hk_public_user_profile'),
++ path('users/<str:user_id>/posts', accounts.posts, name='hk_user_posts'),
+
+ # List archives and overview
+- url(r'^list/(?P<mlist_fqdn>[^/@]+@[^/@]+)/', include(list_patterns)),
++ re_path(r'^list/(?P<mlist_fqdn>[^/@]+@[^/@]+)/', include(list_patterns)),
+
+ # Messages
+- url(r'^list/(?P<mlist_fqdn>[^/@]+@[^/@]+)/message/'
++ re_path(r'^list/(?P<mlist_fqdn>[^/@]+@[^/@]+)/message/'
+ r'(?P<message_id_hash>\w+)/', include(message_patterns)),
+- url(r'^list/(?P<mlist_fqdn>[^/@]+@[^/@]+)/message/new$',
++ re_path(r'^list/(?P<mlist_fqdn>[^/@]+@[^/@]+)/message/new$',
+ message.new_message, name='hk_message_new'),
+
+ # Threads
+- url(r'^list/(?P<mlist_fqdn>[^/@]+@[^/@]+)/thread/(?P<threadid>\w+)/',
++ re_path(r'^list/(?P<mlist_fqdn>[^/@]+@[^/@]+)/thread/(?P<threadid>\w+)/',
+ include(thread_patterns)),
+
+ # Search
+- url(r'^search$', search.search, name='hk_search'),
++ path('search', search.search, name='hk_search'),
+
+ # Categories and Tags
+- url(r'^categories/$', categories.categories, name='hk_categories_overview'),
+- url(r'^tags/$', tags.tags, name='hk_tags_overview'),
++ path('categories/', categories.categories, name='hk_categories_overview'),
++ path('tags/', tags.tags, name='hk_tags_overview'),
+
+ # Mailman archiver API
+- url(r'^api/mailman/urls$', mailman.urls, name='hk_mailman_urls'),
+- url(r'^api/mailman/archive$', mailman.archive, name='hk_mailman_archive'),
++ path('api/mailman/urls', mailman.urls, name='hk_mailman_urls'),
++ path('api/mailman/archive', mailman.archive, name='hk_mailman_archive'),
+
+ # REST API
+- url(r'^api/', include(api_patterns)),
++ path('api/', include(api_patterns)),
+
+ # Mailman 2.X compatibility
+- url(r'^listinfo/?$', compat.summary),
+- url(r'^listinfo/(?P<list_name>[^/]+)/?$', compat.summary),
+- url(r'^pipermail/(?P<list_name>[^/]+)/?$', compat.summary),
+- url(r'^pipermail/(?P<list_name>[^/]+)/(?P<year>\d\d\d\d)-(?P<month_name>\w+)/?$', compat.arch_month),
+- url(r'^pipermail/(?P<list_name>[^/]+)/(?P<year>\d\d\d\d)-(?P<month_name>\w+)/(?P<summary_type>[a-z]+)\.html$', compat.arch_month),
+- url(r'^pipermail/(?P<list_name>[^/]+)/(?P<year>\d\d\d\d)-(?P<month_name>\w+)\.txt.gz', compat.arch_month_mbox),
++ re_path(r'^listinfo/?$', compat.summary),
++ re_path(r'^listinfo/(?P<list_name>[^/]+)/?$', compat.summary),
++ re_path(r'^pipermail/(?P<list_name>[^/]+)/?$', compat.summary),
++ re_path(r'^pipermail/(?P<list_name>[^/]+)/(?P<year>\d\d\d\d)-(?P<month_name>\w+)/?$', compat.arch_month),
++ re_path(r'^pipermail/(?P<list_name>[^/]+)/(?P<year>\d\d\d\d)-(?P<month_name>\w+)/(?P<summary_type>[a-z]+)\.html$', compat.arch_month),
++ re_path(r'^pipermail/(?P<list_name>[^/]+)/(?P<year>\d\d\d\d)-(?P<month_name>\w+)\.txt.gz', compat.arch_month_mbox),
+ #url(r'^pipermail/(?P<list_name>[^/]+)/(?P<year>\d\d\d\d)-(?P<month_name>\w+)/(?P<msg_num>\d+)\.html$', compat.message),
+- url(r'^list/(?P<list_name>[^@]+)@[^/]+/(?P<year>\d\d\d\d)-(?P<month_name>\w+)/?$', compat.arch_month),
++ re_path(r'^list/(?P<list_name>[^@]+)@[^/]+/(?P<year>\d\d\d\d)-(?P<month_name>\w+)/?$', compat.arch_month),
+ #url(r'^list/(?P<list_name>[^@]+)@[^/]+/(?P<year>\d\d\d\d)-(?P<month_name>\w+)/(?P<msg_num>\d+)\.html$', compat.message),
+
+ # URL compatibility with previous versions
+- url(r'^list/(?P<list_id>[^@/]+)/', compat.redirect_list_id),
+- url(r'^lists/', compat.redirect_lists),
++ re_path(r'^list/(?P<list_id>[^@/]+)/', compat.redirect_list_id),
++ path('lists/', compat.redirect_lists),
+
+ ]
+ #) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
+diff --git a/hyperkitty/views/mailman.py b/hyperkitty/views/mailman.py
+index 285e4cd2..9b6dfb7e 100644
+--- a/hyperkitty/views/mailman.py
++++ b/hyperkitty/views/mailman.py
+@@ -27,13 +27,12 @@ from email import message_from_binary_file
+ from email.message import EmailMessage
+ from email.policy import default
+ from functools import wraps
+-from urllib.parse import urljoin
++from urllib.parse import unquote, urljoin
+
+ from django.conf import settings
+ from django.core.exceptions import ImproperlyConfigured, SuspiciousOperation
+ from django.http import HttpResponse
+ from django.urls import reverse
+-from django.utils.http import urlunquote
+ from django.views.decorators.csrf import csrf_exempt
+ from django.views.decorators.http import require_POST
+
+@@ -134,7 +133,7 @@ def _get_url(mlist_fqdn, msg_id=None):
+ msg_hash = get_message_id_hash(msg_id.strip().strip("<>"))
+ url = reverse('hk_message_index', kwargs={
+ "mlist_fqdn": mlist_fqdn, "message_id_hash": msg_hash})
+- relative_url = urlunquote(url)
++ relative_url = unquote(url)
+ mail_domain = mlist_fqdn.split("@")[1]
+ try:
+ domain = MailDomain.objects.get(
+diff --git a/setup.py b/setup.py
+index c16294b0..827cef0b 100755
+--- a/setup.py
++++ b/setup.py
+@@ -37,7 +37,7 @@ with open('hyperkitty/__init__.py') as fp:
+
+ # Requirements
+ REQUIRES = [
+- "django>=2.2,<3.3",
++ "django>=2.2,<4.1",
+ "django_mailman3>=1.3.7",
+ "django-gravatar2>=1.0.6",
+ "djangorestframework>=3.0.0",
+--
+GitLab
+
More information about the arch-commits
mailing list