1
0

Accepting request 1094581 from devel:languages:python:mailman:backports

Update to 1.3.7 and use python 3.11

OBS-URL: https://build.opensuse.org/request/show/1094581
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:mailman/python-HyperKitty?expand=0&rev=63
This commit is contained in:
2023-06-22 12:36:53 +00:00
committed by Git OBS Bridge
parent 6f955fc888
commit 9fe5400894
11 changed files with 68 additions and 809 deletions

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8269222bca481dfb9b6dbc4d766fc3e8bda8ef6d85a6dc5880835874850e9f86
size 2488492

3
HyperKitty-1.3.7.tar.gz Normal file
View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4d74aca3ec30546741ca62339ece72392e298f511d0a89e69bcedbfcdc8102cb
size 2691781

View File

@@ -1,67 +0,0 @@
From 94194e0f5eeacf1be2a88a28bfed62dbc6c5d5a2 Mon Sep 17 00:00:00 2001
From: Daniel Garcia Moreno <daniel.garcia@suse.com>
Date: Thu, 6 Oct 2022 12:53:56 +0200
Subject: [PATCH] Fix django4.1 compatibility issues with related fields
In Django4.1 a ValueError exception is raised when trying to access to
foreign keys for unsaved model instances:
https://docs.djangoproject.com/en/4.1/releases/4.1/#reverse-foreign-key-changes-for-unsaved-model-instances
This patch ensures that everything is saved before trying to use related
models and handles the exception correctly in the Thread model pre_save.
---
hyperkitty/models/thread.py | 8 ++++++++
hyperkitty/tests/models/test_email.py | 6 ++++++
2 files changed, 14 insertions(+)
diff --git a/hyperkitty/models/thread.py b/hyperkitty/models/thread.py
index b550cdb8..e49954a7 100644
--- a/hyperkitty/models/thread.py
+++ b/hyperkitty/models/thread.py
@@ -148,10 +148,18 @@ class Thread(models.Model):
from .email import Email # circular import
if self.starting_email is not None:
return
+
try:
self.starting_email = self.emails.get(parent_id__isnull=True)
except Email.DoesNotExist:
self.starting_email = self.emails.order_by("date").first()
+ except ValueError:
+ # If the Thread is not created yet, the self.emails will raise a
+ # ValueError exception. This happens at creation time because this
+ # method is called by on_pre_save
+ #
+ # https://docs.djangoproject.com/en/4.1/releases/4.1/#reverse-foreign-key-changes-for-unsaved-model-instances
+ return
def on_pre_save(self):
self.find_starting_email()
diff --git a/hyperkitty/tests/models/test_email.py b/hyperkitty/tests/models/test_email.py
index 7bcac390..f194e2b1 100644
--- a/hyperkitty/tests/models/test_email.py
+++ b/hyperkitty/tests/models/test_email.py
@@ -195,6 +195,9 @@ class EmailTestCase(TestCase):
subject="This is a folded\n subject",
in_reply_to="<msg1.example.com>\n <msg2.example.com>",
content="Dummy message")
+ sender.save()
+ mlist.save()
+ email.save()
msg = email.as_message()
self.assertEqual(msg["Subject"], "This is a folded subject")
@@ -210,6 +213,9 @@ class EmailTestCase(TestCase):
mailinglist=mlist,
subject="Message subject",
content="Dummy message")
+ sender.save()
+ mlist.save()
+ email.save()
msg = email.as_message()
self.assertEqual(msg['from'], '"Team: J.Q. Doe" <dummy@example.com>')
--
2.37.3

View File

@@ -1,331 +0,0 @@
commit e8228c7eddae75d168b28bc3a7abe351bab04b65
Author: John Vandenberg <jayvdb@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 <abompard@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",

View File

@@ -1,55 +0,0 @@
From 2c3c189c9aacef3f54de2ae0f653aa13c6167093 Mon Sep 17 00:00:00 2001
From: David Runge <dave@sleepmap.de>
Date: Sun, 5 Dec 2021 12:39:01 +0100
Subject: [PATCH 1/3] Fix mistune imports for mistune >= 2.0.0
hyperkitty/lib/renderer.py:
With mistune 2.0.0 the `escape_url()` and `escape_html()` are moved to
mistune.util.
---
hyperkitty/lib/renderer.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hyperkitty/lib/renderer.py b/hyperkitty/lib/renderer.py
index cf54e7c0..96f026db 100644
--- a/hyperkitty/lib/renderer.py
+++ b/hyperkitty/lib/renderer.py
@@ -4,7 +4,7 @@ from django.conf import settings
import mistune
from mistune.plugins.extra import plugin_url
-from mistune.scanner import escape_html, escape_url
+from mistune.util import escape_html, escape_url
class MyRenderer(mistune.HTMLRenderer):
--
GitLab
From 0807a57860c57ebfe0542cc9d58fedf1ed5582d5 Mon Sep 17 00:00:00 2001
From: David Runge <dave@sleepmap.de>
Date: Sun, 5 Dec 2021 12:40:10 +0100
Subject: [PATCH 2/3] Require mistune >= 2.0.0
setup.py:
Require mistune >= 2.0.0 to rely on a stable mistune release.
---
setup.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/setup.py b/setup.py
index 6cc7636e..c16294b0 100755
--- a/setup.py
+++ b/setup.py
@@ -45,7 +45,7 @@ REQUIRES = [
"pytz>=2012",
"django-compressor>=1.3",
"mailmanclient>=3.3.3",
- "mistune>=2.0.0rc1",
+ "mistune>=2.0.0",
"python-dateutil >= 2.0",
"networkx>=2.0",
"django-haystack>=2.8.0",
--
GitLab

View File

@@ -1,102 +0,0 @@
From 2cda594bc0e7af5c0c24dcc3467ecea04be89f9e Mon Sep 17 00:00:00 2001
From: David Runge <dave@sleepmap.de>
Date: Tue, 7 Dec 2021 22:46:17 +0100
Subject: [PATCH 1/4] Ensure that date headers are valid
hyperkitty/management/commands/hyperkitty_import.py:
Change `DbImporter._get_date()` to return None if a `Date:` header is
retrieved, that is not valid (its `datetime` attribute is set to
`None`).
The email module has been reworked with python 3.10 to set the `Date:`
header string representation even if it is not valid, but ensures, that
its `datetime` attribute is set to None in that case:
https://github.com/python/cpython/commit/303aac8c56609290e122eecc14c038e9b1e4174a
hyperkitty/tests/commands/test_import.py:
Change `test_ungettable_date()` to rely on differing error messages in
the output, depending on python version. With python 3.10 the logged
error message has changed.
---
hyperkitty/management/commands/hyperkitty_import.py | 9 ++++++++-
hyperkitty/tests/commands/test_import.py | 7 ++++++-
2 files changed, 14 insertions(+), 2 deletions(-)
Index: HyperKitty-1.3.5/hyperkitty/management/commands/hyperkitty_import.py
===================================================================
--- HyperKitty-1.3.5.orig/hyperkitty/management/commands/hyperkitty_import.py
+++ HyperKitty-1.3.5/hyperkitty/management/commands/hyperkitty_import.py
@@ -131,7 +131,14 @@ class DbImporter(object):
def _get_date(self, message, header, report_name):
try:
date = message.get(header)
- except (TypeError, ValueError) as e:
+ if date and not date.datetime:
+ if self.verbose:
+ self.stderr.write(
+ "Bad datetime in {} header in message {}{}.".format(
+ header, unquote(message.get("message-id", 'n/a')),
+ report_name))
+ return None
+ except (AttributeError, TypeError, ValueError) as e:
if self.verbose:
self.stderr.write(
"Can't get {} header in message {}{}: {}.".format(
Index: HyperKitty-1.3.5/hyperkitty/tests/commands/test_import.py
===================================================================
--- HyperKitty-1.3.5.orig/hyperkitty/tests/commands/test_import.py
+++ HyperKitty-1.3.5/hyperkitty/tests/commands/test_import.py
@@ -225,7 +225,12 @@ msg1
# The message should be archived.
self.assertEqual(Email.objects.count(), 1)
# But there should be an error message.
- self.assertIn("Can't get date header in message", output.getvalue())
+ if sys.hexversion < 0x30a0000:
+ self.assertIn("Can't get date header in message",
+ output.getvalue())
+ else:
+ self.assertIn("Bad datetime in date header in message",
+ output.getvalue())
def test_no_date_but_resent_date(self):
# If there's no Dete: header, fall back to Resent-Date:.
Index: HyperKitty-1.3.5/tox.ini
===================================================================
--- HyperKitty-1.3.5.orig/tox.ini
+++ HyperKitty-1.3.5/tox.ini
@@ -1,5 +1,5 @@
[tox]
-envlist = py{36,37,38,39}-django{22,30,31,32},docs,qa
+envlist = py{36,37,38,39,310}-django{22,30,31,32},docs,qa
[testenv]
From 3efe7507944dbdbfcfa4c182d332528712476b28 Mon Sep 17 00:00:00 2001
From: Mark Sapiro <mark@msapiro.net>
Date: Thu, 16 Jun 2022 13:40:28 -0700
Subject: [PATCH] Skip test_import.test_unconvertable_message where bpo-43323
is fixed.
---
hyperkitty/tests/commands/test_import.py | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/hyperkitty/tests/commands/test_import.py b/hyperkitty/tests/commands/test_import.py
index 5284e0a8..c9c288bd 100644
--- a/hyperkitty/tests/commands/test_import.py
+++ b/hyperkitty/tests/commands/test_import.py
@@ -364,6 +364,11 @@ msg1
def test_unconvertable_message(self):
# This message can't be converted to an email.message.EmailMessage.
+ # This fails with Python 3.9 >=3.9.13 and versions >= 3.10.5 because
+ # https://bugs.python.org/issue43323 is fixed.
+ if ((sys.hexversion >= 0x3090df0 and sys.hexversion < 0x30a0000) or
+ sys.hexversion >= 0x30a05f0):
+ raise SkipTest
mbox = mailbox.mbox(os.path.join(self.tmpdir, "test.mbox"))
# We have to do it this way to see the exception.
with open(get_test_file("unconvertable_message.txt"), "rb") as em_file:
--
GitLab

View File

@@ -1,24 +0,0 @@
From 3edc0c58b8dea3b0bdccd77c0794ada28d1c6f61 Mon Sep 17 00:00:00 2001
From: Mark Sapiro <mark@msapiro.net>
Date: Sun, 5 Dec 2021 00:32:33 +0000
Subject: [PATCH] Set Q_CLUSTER retry > timeout.
---
example_project/settings.py | 1 +
1 files changed, 1 insertions(+)
diff --git a/example_project/settings.py b/example_project/settings.py
index a6e90441..5aca0186 100644
--- a/example_project/settings.py
+++ b/example_project/settings.py
@@ -368,6 +368,7 @@ REST_FRAMEWORK = {
#
Q_CLUSTER = {
'timeout': 300,
+ 'retry': 360,
'save_limit': 100,
'orm': 'default',
}
--
GitLab

View File

@@ -1,8 +1,8 @@
Index: HyperKitty-1.3.5/example_project/settings.py
Index: HyperKitty-1.3.6/example_project/settings.py
===================================================================
--- HyperKitty-1.3.5.orig/example_project/settings.py 2021-10-12 23:40:25.000000000 +0200
+++ HyperKitty-1.3.5/example_project/settings.py 2021-11-17 09:36:12.809720361 +0100
@@ -135,7 +135,7 @@ DATABASES = {
--- HyperKitty-1.3.6.orig/example_project/settings.py 2022-05-19 03:16:49.000000000 +0200
+++ HyperKitty-1.3.6/example_project/settings.py 2022-11-21 10:36:26.670671874 +0100
@@ -134,7 +134,7 @@ DATABASES = {
# Use 'sqlite3', 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'ENGINE': 'django.db.backends.sqlite3',
# DB name or path to database file if using sqlite3.
@@ -11,7 +11,7 @@ Index: HyperKitty-1.3.5/example_project/settings.py
# The following settings are not used with sqlite3:
'USER': 'hyperkitty',
'PASSWORD': 'hkpass',
@@ -203,7 +203,7 @@ USE_TZ = True
@@ -205,7 +205,7 @@ USE_TZ = True
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/var/www/example.com/static/"
@@ -20,7 +20,7 @@ Index: HyperKitty-1.3.5/example_project/settings.py
# URL prefix for static files.
# Example: "http://example.com/static/", "http://static.example.com/"
@@ -396,7 +396,7 @@ LOGGING = {
@@ -386,7 +386,7 @@ LOGGING = {
'level': 'INFO',
#'class': 'logging.handlers.RotatingFileHandler',
'class': 'logging.handlers.WatchedFileHandler',

View File

@@ -1,192 +0,0 @@
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/commands/test_import.py HyperKitty-1.3.5/hyperkitty/tests/commands/test_import.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/commands/test_import.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/commands/test_import.py 2022-05-26 11:03:59.326617643 +0200
@@ -15,7 +15,7 @@ from django.core.management import call_
from django.db import DEFAULT_DB_ALIAS
from django.utils.timezone import utc
-from mock import Mock, patch
+from unittest.mock import Mock, patch
from hyperkitty.lib.incoming import add_to_list
from hyperkitty.management.commands.hyperkitty_import import Command
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/commands/test_mailman_sync.py HyperKitty-1.3.5/hyperkitty/tests/commands/test_mailman_sync.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/commands/test_mailman_sync.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/commands/test_mailman_sync.py 2022-05-26 11:03:59.326617643 +0200
@@ -22,7 +22,7 @@
from django.core.management import call_command
-from mock import patch
+from unittest.mock import patch
from hyperkitty.tests.utils import TestCase
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/lib/test_incoming.py HyperKitty-1.3.5/hyperkitty/tests/lib/test_incoming.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/lib/test_incoming.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/lib/test_incoming.py 2022-05-26 11:03:59.326617643 +0200
@@ -30,7 +30,7 @@ from django.core.cache import cache
from django.db import DataError, IntegrityError
from django.utils import timezone
-import mock
+from unittest import mock
from hyperkitty.lib.incoming import DuplicateMessage, add_to_list
from hyperkitty.lib.utils import get_message_id_hash
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/lib/test_mailman.py HyperKitty-1.3.5/hyperkitty/tests/lib/test_mailman.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/lib/test_mailman.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/lib/test_mailman.py 2022-05-26 11:03:59.326617643 +0200
@@ -26,7 +26,7 @@ from django.contrib.auth.models import U
from django.core.cache import cache
from django_mailman3.tests.utils import FakeMMList, FakeMMPage
-from mock import Mock, patch
+from unittest.mock import Mock, patch
from hyperkitty.lib import mailman
from hyperkitty.models import MailingList, Sender
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/lib/test_posting.py HyperKitty-1.3.5/hyperkitty/tests/lib/test_posting.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/lib/test_posting.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/lib/test_posting.py 2022-05-26 11:03:59.326617643 +0200
@@ -28,7 +28,7 @@ from django.core import mail
from django.test.client import RequestFactory
from django_mailman3.tests.utils import FakeMMList, FakeMMMember
-from mock import Mock, patch
+from unittest.mock import Mock, patch
from hyperkitty.lib import posting
from hyperkitty.models import MailingList
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/_test_caching.py HyperKitty-1.3.5/hyperkitty/tests/_test_caching.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/_test_caching.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/_test_caching.py 2022-05-26 11:03:59.326617643 +0200
@@ -8,7 +8,7 @@ from urllib.error import HTTPError
from mailman.email.message import Message
from mailman.interfaces.archiver import ArchivePolicy
-from mock import Mock
+from unittest.mock import Mock
#import kittystore.utils
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/test_signals.py HyperKitty-1.3.5/hyperkitty/tests/test_signals.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/test_signals.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/test_signals.py 2022-05-26 11:03:59.326617643 +0200
@@ -21,7 +21,7 @@
#
from django_mailman3.signals import mailinglist_created, mailinglist_modified
-from mock import patch
+from unittest.mock import patch
from hyperkitty.tests.utils import TestCase
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/test_tasks.py HyperKitty-1.3.5/hyperkitty/tests/test_tasks.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/test_tasks.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/test_tasks.py 2022-05-26 11:03:59.330617665 +0200
@@ -22,7 +22,7 @@
from email.message import EmailMessage
-from mock import patch
+from unittest.mock import patch
from hyperkitty import tasks
from hyperkitty.lib.incoming import add_to_list
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/utils.py HyperKitty-1.3.5/hyperkitty/tests/utils.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/utils.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/utils.py 2022-05-26 11:03:59.330617665 +0200
@@ -37,7 +37,7 @@ from django.test import TestCase as Djan
from django.test import TransactionTestCase
import mailmanclient
-from mock import Mock, patch
+from unittest.mock import Mock, patch
def setup_logging(tmpdir):
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_accounts.py HyperKitty-1.3.5/hyperkitty/tests/views/test_accounts.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_accounts.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/views/test_accounts.py 2022-05-26 11:03:59.330617665 +0200
@@ -31,7 +31,7 @@ from django.contrib.auth.models import U
from allauth.account.models import EmailAddress
from django_mailman3.tests.utils import FakeMMList, FakeMMMember
-from mock import Mock
+from unittest.mock import Mock
from hyperkitty.lib.incoming import add_to_list
from hyperkitty.lib.utils import get_message_id_hash
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_archives.py HyperKitty-1.3.5/hyperkitty/tests/views/test_archives.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_archives.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/views/test_archives.py 2022-05-26 11:03:59.330617665 +0200
@@ -34,7 +34,7 @@ from django.core.cache import cache
from bs4 import BeautifulSoup
from django_mailman3.tests.utils import FakeMMList, FakeMMMember
-from mock import Mock
+from unittest.mock import Mock
from hyperkitty.lib.incoming import add_to_list
from hyperkitty.models import (
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_index.py HyperKitty-1.3.5/hyperkitty/tests/views/test_index.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_index.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/views/test_index.py 2022-05-26 11:03:59.330617665 +0200
@@ -31,7 +31,7 @@ from django.test import override_setting
from django_mailman3.models import MailDomain
from django_mailman3.tests.utils import FakeMMList, FakeMMMember
-from mock import Mock
+from unittest.mock import Mock
from hyperkitty.lib.incoming import add_to_list
from hyperkitty.models import ArchivePolicy, MailingList
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_mailman.py HyperKitty-1.3.5/hyperkitty/tests/views/test_mailman.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_mailman.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/views/test_mailman.py 2022-05-26 11:03:59.330617665 +0200
@@ -27,7 +27,7 @@ from io import BytesIO
from django.conf import settings
from django.contrib.sites.models import Site
-import mock
+from unittest import mock
from django_mailman3.models import MailDomain
from hyperkitty.models.email import Email
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_message.py HyperKitty-1.3.5/hyperkitty/tests/views/test_message.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_message.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/views/test_message.py 2022-05-26 11:03:59.330617665 +0200
@@ -36,7 +36,7 @@ from django.utils import timezone
from allauth.account.models import EmailAddress
from django_gravatar.helpers import get_gravatar_url
from django_mailman3.tests.utils import get_flash_messages
-from mock import Mock, patch
+from unittest.mock import Mock, patch
from hyperkitty.lib.incoming import add_to_list
from hyperkitty.lib.utils import get_message_id_hash
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_search.py HyperKitty-1.3.5/hyperkitty/tests/views/test_search.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_search.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/views/test_search.py 2022-05-26 11:03:59.330617665 +0200
@@ -26,7 +26,7 @@ from django.contrib.auth.models import U
from django_mailman3.tests.utils import FakeMMList, FakeMMMember
from haystack import DEFAULT_ALIAS
-from mock import Mock, patch
+from unittest.mock import Mock, patch
from hyperkitty.lib.incoming import add_to_list
from hyperkitty.models import ArchivePolicy, MailingList
diff -upr HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_thread.py HyperKitty-1.3.5/hyperkitty/tests/views/test_thread.py
--- HyperKitty-1.3.5.orig/hyperkitty/tests/views/test_thread.py 2022-05-26 11:03:59.294617461 +0200
+++ HyperKitty-1.3.5/hyperkitty/tests/views/test_thread.py 2022-05-26 11:03:59.330617665 +0200
@@ -31,7 +31,7 @@ from django.test import override_setting
from bs4 import BeautifulSoup
from django_mailman3.tests.utils import get_flash_messages
-from mock import patch
+from unittest.mock import patch
from hyperkitty.lib.incoming import add_to_list
from hyperkitty.models import Email, MailingList, Tag, Tagging, Thread

View File

@@ -1,8 +1,59 @@
-------------------------------------------------------------------
Sun Jun 18 16:12:47 UTC 2023 - Andreas Schneider <asn@cryptomilk.org>
- Update to version 1.3.7
* ``hyperkitty_import`` will now import messages to a list with archiving
disabled. (Closes #451)
* Add support for Python 3.11.
- Use sle15_python_module_pythons
-------------------------------------------------------------------
Wed Apr 5 09:44:44 UTC 2023 - Andreas Schneider <asn@cryptomilk.org>
- Add missing requires for sassc used by manage.py
-------------------------------------------------------------------
Mon Nov 21 09:34:53 UTC 2022 - Andreas Schneider <asn@cryptomilk.org>
- Update to version 1.3.6
* Fixed an issue in hyperkitty_import with an empty Message-ID. (Closes #396)
* Set Q_CLUSTER retry > timeout in example_project. (Closes #402)
* Set DEFAULT_AUTO_FIELD to silence errors with Django >= 3.2.
* Require mistune >= 2.0.0 and fix a problem with importing from it. (Closes
#395)
* Adapt parsing of emails to be compatible with python 3.10. (Closes #401)
* Add gitlab-ci integration for python 3.10.
* Skip lists with private archives in the find list search. (Closes #237)
* Add a new setting HYPERKITTY_MBOX_EXPORT which, when set to false, removes
the :guilabel:`Download` button and disables the export view. ( Fixes #386)
* Return 400 instead of 500 when the sort mode is invalid. (Fixes #270)
* Allow HyperKitty to find attachments in either the database or the
HYPERKITTY_ATTACHMENT_FOLDER. (Closes #213)
* Implemented a new attachments_to_file management command to move attachment
content to the file system after setting HYPERKITTY_ATTACHMENT_FOLDER.
(Closes #413)
* Handle exception when a banned address tries to post. (Fixes #325)
* Add an index on the 'name' column (fqdn)for the MailingList table since it
is most frequently used to query the MailingList object.
* Add the ability to view a thread without Javascript enabled. This uses the
same mechanism we use with bot-detection and rendering of the entire page
at once, which will be slow to load but allow reading. (See #422)
* Improve the performance of the thread view for logged-in users by
optimizing the total database calls made. (See !409)
* Add support for Django <= 4.1
* Remove support for Django < 3.2
* Remove support for Python 3.6
* Fix tests to be compatible with Python 3.10
* Replace use of mock with unittest.mock in all tests. (Closes #429)
* The check for writability of HYPERKITTY_ATTACHMENT_FOLDER when set has been
improved to avoid a potential race condition. (Closes #389)
- Run complete testsuite with pytest
- Removed hyperkitty-django4.patch
- Removed hyperkitty-fix-mistune-2.0-imports.patch
- Removed python-HyperKitty-no-mock.patch
- Removed hyperkitty-fix-qcluster-timeout.patch
- Removed hyperkitty-fix-py310-tests.patch
-------------------------------------------------------------------
Thu Oct 6 12:07:43 UTC 2022 - Daniel Garcia <daniel.garcia@suse.com>

View File

@@ -38,15 +38,15 @@
%define __mypython %{__python39}
%define mypython_sitelib %{python39_sitelib}
%else
%{?!python_module:%define python_module() python3-%{**}}
%define pythons python3
%{?sle15_python_module_pythons}
%define pythons python311
%define mypython python3
%define __mypython %{__python3}
%define mypython_sitelib %{python3_sitelib}
%endif
Name: python-HyperKitty
Version: 1.3.5
Version: 1.3.7
Release: 0
Summary: A web interface to access GNU Mailman v3 archives
License: GPL-3.0-only
@@ -67,21 +67,8 @@ Source30: README.SUSE.md
# PATCH-FIX-OPENSUSE hyperkitty-settings.patch mcepl@suse.com
# hard-code locations of configuration files
Patch0: hyperkitty-settings.patch
# PATCH-FIX-UPSTREAM hyperkitty-fix-mistune-2.0-imports.patch gl#mailman/hyperkitty#379 mcepl@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 jayvdb@gmail.com
Patch2: hyperkitty-django4.patch
# https://gitlab.com/mailman/hyperkitty/-/issues/429
Patch3: python-HyperKitty-no-mock.patch
# https://gitlab.com/mailman/hyperkitty/-/commit/3edc0c58b8dea3b0bdccd77c0794ada28d1c6f61
Patch4: hyperkitty-fix-qcluster-timeout.patch
# https://gitlab.com/mailman/hyperkitty/-/merge_requests/381 + https://gitlab.com/mailman/hyperkitty/-/merge_requests/449
Patch5: hyperkitty-fix-py310-tests.patch
# PATCH-FIX-UPSTREAM fix-django41.patch gl#mailman/hyperkitty#467
Patch6: fix-django41.patch
# PATCH-FIX-UPSTREAM fix-elasticsearch8.patch gl#mailman/hyperkitty#468
Patch7: fix-elasticsearch8.patch
Patch1: fix-elasticsearch8.patch
#
BuildRequires: %{python_module django-debug-toolbar >= 2.2}
BuildRequires: %{python_module isort}
@@ -108,7 +95,7 @@ BuildRequires: %{python_module django-compressor >= 1.3}
BuildRequires: %{python_module django-extensions >= 1.3.7}
BuildRequires: %{python_module django-gravatar2 >= 1.0.6}
BuildRequires: %{python_module django-haystack >= 2.8.0}
BuildRequires: %{python_module django-mailman3 >= 1.3.7}
BuildRequires: %{python_module django-mailman3 >= 1.3.8}
BuildRequires: %{python_module django-q >= 1.3.9}
BuildRequires: %{python_module djangorestframework >= 3.0.0}
BuildRequires: %{python_module elasticsearch}
@@ -191,18 +178,11 @@ This package holds the uwsgi configuration.
cp %{SOURCE30} .
touch settings_local.py
%patch2 -p1
# Copy example_project to just build the static files
rsync -a example_project/* build_static_files
%patch0 -p1
%patch1 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%build
sed -i 's|^#!/usr/bin/env.*|#!%{__mypython}|' \
@@ -307,9 +287,9 @@ for job in \
done
%check
export DJANGO_SETTINGS_MODULE="hyperkitty.tests.settings_test"
export PYTHONPATH=$(pwd)
%python_exec example_project/manage.py test
export PYTHONPATH="$(pwd)"
export LANG=C.UTF-8
%pytest
%pre -n %{hyperkitty_pkgname}-web
/usr/sbin/groupadd -r hyperkitty &>/dev/null || :
@@ -364,7 +344,6 @@ fi
%{hyperkitty_basedir}/static/debug_toolbar
%{hyperkitty_basedir}/static/django-mailman3
%{hyperkitty_basedir}/static/django_extensions
%{hyperkitty_basedir}/static/facebook
%{hyperkitty_basedir}/static/hyperkitty
%{hyperkitty_basedir}/static/rest_framework