feat(shared): Add a view for exporting members to a mailing-list
This commit is contained in:
parent
4f8813bc81
commit
57eaa85e0f
6 changed files with 73 additions and 2 deletions
|
@ -1,6 +1,7 @@
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
|
||||||
from bds import views
|
from bds import views
|
||||||
|
from shared.views import SympaListView
|
||||||
|
|
||||||
app_name = "bds"
|
app_name = "bds"
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
@ -21,4 +22,10 @@ urlpatterns = [
|
||||||
name="members.expired",
|
name="members.expired",
|
||||||
),
|
),
|
||||||
path("members/reset", views.ResetMembershipView.as_view(), name="members.reset"),
|
path("members/reset", views.ResetMembershipView.as_view(), name="members.reset"),
|
||||||
|
# Sympa export view
|
||||||
|
path(
|
||||||
|
"sympa/members/",
|
||||||
|
SympaListView.as_view(filters={"bds__is_member": True}),
|
||||||
|
name="export.sympa",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -27,6 +27,9 @@ ALLOWED_HOSTS = []
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
|
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
|
||||||
|
|
||||||
|
SYMPA_PASSWORD = b"sympa"
|
||||||
|
SYMPA_USERNAME = b"sympa"
|
||||||
|
|
||||||
if TESTING:
|
if TESTING:
|
||||||
PASSWORD_HASHERS = ["django.contrib.auth.hashers.MD5PasswordHasher"]
|
PASSWORD_HASHERS = ["django.contrib.auth.hashers.MD5PasswordHasher"]
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,9 @@ EMAIL_HOST = credentials.get("EMAIL_HOST")
|
||||||
|
|
||||||
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
|
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
|
||||||
|
|
||||||
|
SYMPA_PASSWORD = credentials["SYMPA_PASSWORD"].encode()
|
||||||
|
SYMPA_USERNAME = credentials["SYMPA_USERNAME"].encode()
|
||||||
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# Installed Apps configuration
|
# Installed Apps configuration
|
||||||
|
|
|
@ -30,6 +30,9 @@ LDAP_SERVER_URL = credentials.get("LDAP_SERVER_URL")
|
||||||
|
|
||||||
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
|
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
|
||||||
|
|
||||||
|
SYMPA_PASSWORD = credentials["SYMPA_PASSWORD"].encode()
|
||||||
|
SYMPA_USERNAME = credentials["SYMPA_USERNAME"].encode()
|
||||||
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# Installed Apps configuration
|
# Installed Apps configuration
|
||||||
|
|
|
@ -4,6 +4,16 @@ from django.views.generic.base import TemplateView
|
||||||
from django_cas_ng import views as django_cas_views
|
from django_cas_ng import views as django_cas_views
|
||||||
|
|
||||||
from gestioncof import csv_views, views
|
from gestioncof import csv_views, views
|
||||||
|
from shared.views import SympaListView
|
||||||
|
|
||||||
|
sympa_patterns = [
|
||||||
|
path(
|
||||||
|
f"{mailing}/",
|
||||||
|
SympaListView.as_view(filters={f"profile__mailing_{mailing}": True}),
|
||||||
|
name=f"sympa.{mailing}",
|
||||||
|
)
|
||||||
|
for mailing in ["bda", "bda_revente", "cof", "unernestaparis"]
|
||||||
|
]
|
||||||
|
|
||||||
export_patterns = [
|
export_patterns = [
|
||||||
path("members", views.export_members, name="export.members"),
|
path("members", views.export_members, name="export.members"),
|
||||||
|
@ -162,4 +172,8 @@ urlpatterns = [
|
||||||
# Clubs
|
# Clubs
|
||||||
# -----
|
# -----
|
||||||
path("clubs/", include(clubs_patterns)),
|
path("clubs/", include(clubs_patterns)),
|
||||||
|
# -----
|
||||||
|
# Sympa export
|
||||||
|
# -----
|
||||||
|
path("sympa/", include(sympa_patterns)),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,12 +1,53 @@
|
||||||
|
import base64
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
from dal import autocomplete
|
from dal import autocomplete
|
||||||
|
from django.conf import settings
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.http import Http404
|
from django.http import Http404, HttpResponse
|
||||||
from django.views.generic import TemplateView
|
from django.views.generic import TemplateView, View
|
||||||
|
|
||||||
from shared.autocomplete import ModelSearch
|
from shared.autocomplete import ModelSearch
|
||||||
|
|
||||||
|
User = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
|
class SympaListView(View):
|
||||||
|
realm = "sympa"
|
||||||
|
|
||||||
|
username = settings.SYMPA_USERNAME
|
||||||
|
password = settings.SYMPA_PASSWORD
|
||||||
|
|
||||||
|
filters: dict[str, Any] = {}
|
||||||
|
|
||||||
|
def dispatch(self, request, *args, **kwargs):
|
||||||
|
if "HTTP_AUTHORIZATION" in request.META:
|
||||||
|
auth = request.META["HTTP_AUTHORIZATION"].split()
|
||||||
|
|
||||||
|
if len(auth) == 2 and auth[0].lower() == "basic":
|
||||||
|
name, passwd = base64.b64decode(auth[1]).split(b":")
|
||||||
|
|
||||||
|
if name == self.username and passwd == self.password:
|
||||||
|
return self.render_to_response(request, *args, **kwargs)
|
||||||
|
|
||||||
|
return HttpResponse(
|
||||||
|
status=401, headers={"WWW-Authenticate": f'Basic realm="{self.realm}"'}
|
||||||
|
)
|
||||||
|
|
||||||
|
def render_to_response(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Renders a list of emails in a text response.
|
||||||
|
"""
|
||||||
|
|
||||||
|
users = User.objects.filter(**self.filters)
|
||||||
|
|
||||||
|
return HttpResponse(
|
||||||
|
b"\n".join(u.email.encode("utf-8") for u in users if u.email),
|
||||||
|
content_type="text/plain",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Select2QuerySetView(ModelSearch, autocomplete.Select2QuerySetView):
|
class Select2QuerySetView(ModelSearch, autocomplete.Select2QuerySetView):
|
||||||
"""Compatibility layer between ModelSearch and Select2QuerySetView."""
|
"""Compatibility layer between ModelSearch and Select2QuerySetView."""
|
||||||
|
|
Loading…
Add table
Reference in a new issue