Skip to content

Commit 2d29f41

Browse files
committed
mass mailing users from admin
1 parent 3601cd1 commit 2d29f41

5 files changed

Lines changed: 61 additions & 30 deletions

File tree

mailing/constants.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ def get_default_mailing_schema() -> dict[str, dict[str, str]]:
77
"text": {"title": "Основной текст письма"},
88
"button_text": {"title": "Текст кнопки", "default": "Кнопка"},
99
}
10+
11+
12+
QUANTITY_MAILING_USERS_IN_GROUP = 100

mailing/utils.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from typing import Dict, List, Union
2+
from .constants import QUANTITY_MAILING_USERS_IN_GROUP
23

34
import django.db.models
45
from django.contrib.auth import get_user_model
@@ -9,28 +10,40 @@
910
User = get_user_model()
1011

1112

13+
def new_connection(old_connection):
14+
old_connection.close()
15+
connection = mail.get_connection()
16+
return connection
17+
18+
19+
def get_users_groups(users_list):
20+
users_groups_list = [users_list[user:user + QUANTITY_MAILING_USERS_IN_GROUP] for user in
21+
range(0, len(users_list), QUANTITY_MAILING_USERS_IN_GROUP)]
22+
return users_groups_list
23+
24+
1225
def send_mail(
13-
user: User,
14-
subject: str,
15-
template_string: str,
16-
template_context: Union[
17-
Dict,
18-
List,
19-
] = None,
20-
connection=None,
26+
user: User,
27+
subject: str,
28+
template_string: str,
29+
template_context: Union[
30+
Dict,
31+
List,
32+
] = None,
33+
connection=None,
2134
):
2235
return send_mass_mail([user], subject, template_string, template_context, connection)
2336

2437

2538
def send_mass_mail(
26-
users: django.db.models.QuerySet | List[User],
27-
subject: str,
28-
template_string: str,
29-
template_context: Union[
30-
Dict,
31-
List,
32-
] = None,
33-
connection=None,
39+
users: django.db.models.QuerySet | List[User],
40+
subject: str,
41+
template_string: str,
42+
template_context: Union[
43+
Dict,
44+
List,
45+
] = None,
46+
connection=None,
3447
) -> None:
3548
"""
3649
Begin mailing to specified users, sending rendered template with template_text arg.

mailing/views.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
from django.http import JsonResponse
33
from django.shortcuts import render
44
from rest_framework.views import APIView
5+
from django.core import mail
56

67
from users.models import CustomUser
78
from .utils import send_mass_mail
89
from .models import MailingSchema
10+
from .utils import get_users_groups, new_connection
911

1012

1113
class SendMailView(APIView):
@@ -20,7 +22,11 @@ def post(self, request):
2022
if key_in_post in request.POST:
2123
context[variable_name] = request.POST[key_in_post]
2224
users_to_send = CustomUser.objects.filter(pk__in=users)
23-
send_mass_mail(users_to_send, subject, mail_schema.template, context)
25+
users_groups = get_users_groups(users_to_send)
26+
connection = mail.get_connection()
27+
for group in users_groups:
28+
send_mass_mail(users_to_send, subject, mail_schema.template, context, connection)
29+
connection = new_connection(connection)
2430
return JsonResponse({"detail": "ok"})
2531

2632

@@ -41,11 +47,11 @@ class MailingTemplateRender:
4147

4248
@classmethod
4349
def render_template(
44-
cls,
45-
request,
46-
schema_id: int | None = None,
47-
picked_users: list[CustomUser] | django.db.models.QuerySet = None,
48-
unpicked_users: list[CustomUser] | django.db.models.QuerySet = None,
50+
cls,
51+
request,
52+
schema_id: int | None = None,
53+
picked_users: list[CustomUser] | django.db.models.QuerySet = None,
54+
unpicked_users: list[CustomUser] | django.db.models.QuerySet = None,
4955
):
5056
return render(
5157
request,
@@ -59,10 +65,10 @@ def render_template(
5965

6066
@classmethod
6167
def _get_context(
62-
cls,
63-
schema_id: int | None = None,
64-
picked_users: list[CustomUser] | django.db.models.QuerySet = None,
65-
unpicked_users: list[CustomUser] | django.db.models.QuerySet = None,
68+
cls,
69+
schema_id: int | None = None,
70+
picked_users: list[CustomUser] | django.db.models.QuerySet = None,
71+
unpicked_users: list[CustomUser] | django.db.models.QuerySet = None,
6672
):
6773
context = cls._get_schema_context(schema_id)
6874
context += cls._get_users_context(picked_users, unpicked_users)
@@ -83,9 +89,9 @@ def _get_schema_context(cls, schema_id: int | None = None):
8389

8490
@classmethod
8591
def _get_users_context(
86-
cls,
87-
picked_users: list[CustomUser] | django.db.models.QuerySet = None,
88-
unpicked_users: list[CustomUser] | django.db.models.QuerySet = None,
92+
cls,
93+
picked_users: list[CustomUser] | django.db.models.QuerySet = None,
94+
unpicked_users: list[CustomUser] | django.db.models.QuerySet = None,
8995
):
9096
if picked_users is None:
9197
picked_users = []

templates/admin/change_list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
<br>
7878
<script>
7979
function mailing() {
80-
window.open("{% url 'admin:all_users_mailing' %}", '_blank').focus()
80+
window.open("{% url 'admin:user_mass_mail' %}", '_blank').focus()
8181
}
8282
window.onload = function() {
8383
var currentURL = window.location.href;

users/admin.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,18 @@ def get_urls(self):
163163
self.admin_site.admin_view(self.force_verify),
164164
name="force_verify",
165165
),
166+
path(
167+
"mailing/",
168+
self.admin_site.admin_view(self.mass_mail),
169+
name="user_mass_mail",
170+
),
166171
]
167172
return custom_urls + default_urls
168173

174+
def mass_mail(self, request):
175+
users = CustomUser.objects.all()
176+
return MailingTemplateRender().render_template(request, None, users, None)
177+
169178
def mailing(self, request, user_object):
170179
user = CustomUser.objects.get(pk=user_object)
171180
users = [user]

0 commit comments

Comments
 (0)