Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-HyperKitty for 
openSUSE:Factory checked in at 2022-01-03 10:49:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-HyperKitty (Old)
 and      /work/SRC/openSUSE:Factory/.python-HyperKitty.new.1896 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-HyperKitty"

Mon Jan  3 10:49:22 2022 rev:14 rq:943313 version:1.3.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-HyperKitty/python-HyperKitty.changes      
2021-12-29 21:10:50.322279706 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-HyperKitty.new.1896/python-HyperKitty.changes
    2022-01-03 10:49:48.075589220 +0100
@@ -1,0 +2,5 @@
+Tue Dec 28 07:02:11 UTC 2021 - John Vandenberg <jay...@gmail.com>
+
+- Add hyperkitty-django4.patch to support Django 4
+
+-------------------------------------------------------------------

New:
----
  hyperkitty-django4.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-HyperKitty.spec ++++++
--- /var/tmp/diff_new_pack.t6ySES/_old  2022-01-03 10:49:48.719589466 +0100
+++ /var/tmp/diff_new_pack.t6ySES/_new  2022-01-03 10:49:48.723589468 +0100
@@ -59,6 +59,8 @@
 # PATCH-FIX-UPSTREAM hyperkitty-fix-mistune-2.0-imports.patch 
gl#mailman/hyperkitty#379 mc...@suse.com
 # Two elements moved in mistune 2.0
 Patch1:         hyperkitty-fix-mistune-2.0-imports.patch
+# PATCH-FIX-UPSTREAM hyperkitty-django4.patch gl#mailman/hyperkitty#384 
jay...@gmail.com
+Patch2:         hyperkitty-django4.patch
 #
 BuildRequires:  %{python_module django-debug-toolbar >= 2.2}
 BuildRequires:  %{python_module isort}
@@ -151,10 +153,13 @@
 cp %{SOURCE30} .
 touch settings_local.py
 
-# Copy exmaple_project to just build the static files
+%patch2 -p1
+
+# Copy example_project to just build the static files
 rsync -a example_project/* build_static_files
 
-%autopatch -p1
+%patch0 -p1
+%patch1 -p1
 
 %build
 sed -i 's|^#!/usr/bin/env.*|#!%{_bindir}/python3|' \

++++++ hyperkitty-django4.patch ++++++
commit e8228c7eddae75d168b28bc3a7abe351bab04b65
Author: John Vandenberg <jay...@gmail.com>
Date:   Mon Dec 27 10:48:27 2021 +0800

    Support Django 4.0

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 <abomp...@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",

Reply via email to