|
|
|
@ -6,6 +6,7 @@ from typing import Optional, Dict, Tuple, List
|
|
|
|
|
from time import time
|
|
|
|
|
from django.db import IntegrityError
|
|
|
|
|
from django.conf import settings
|
|
|
|
|
from django.core.mail import EmailMultiAlternatives
|
|
|
|
|
from django.template.loader import render_to_string
|
|
|
|
|
from django.utils.translation import activate, gettext
|
|
|
|
|
from rest_framework import status
|
|
|
|
@ -33,13 +34,12 @@ SEND_MAIL_ERROR = "E10: Error sending email"
|
|
|
|
|
# A Grade is always given a int
|
|
|
|
|
Grade = int
|
|
|
|
|
|
|
|
|
|
def send_mails_invitation(liste_email_token: list,election: str):
|
|
|
|
|
def send_mails_invitation_API(list_email_token: list, election: str):
|
|
|
|
|
"""
|
|
|
|
|
Def to send the election invitation
|
|
|
|
|
Def to send the election invitation by API
|
|
|
|
|
"""
|
|
|
|
|
print(type(liste_email_token))
|
|
|
|
|
|
|
|
|
|
for couple in liste_email_token:
|
|
|
|
|
for couple in list_email_token:
|
|
|
|
|
token_get: str = f"?token={couple[1]}"
|
|
|
|
|
merge_data: Dict[str, str] = {
|
|
|
|
|
"invitation_url": f"{settings.SITE_URL}/vote/{election.id}{token_get}",
|
|
|
|
@ -71,11 +71,63 @@ def send_mails_invitation(liste_email_token: list,election: str):
|
|
|
|
|
encoded_token = base64.b64encode(("api:" + settings.EMAIL_API_KEY).encode("ascii")).decode("ascii")
|
|
|
|
|
request.add_header("Authorization","Basic {}".format(encoded_token))
|
|
|
|
|
try:
|
|
|
|
|
response = urllib.request.urlopen(request)
|
|
|
|
|
print(response.getcode())
|
|
|
|
|
urllib.request.urlopen(request)
|
|
|
|
|
except Exception as err:
|
|
|
|
|
return(err)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def send_mail(email: str, text_body, html_body, title):
|
|
|
|
|
"""
|
|
|
|
|
Def to send mails by API
|
|
|
|
|
"""
|
|
|
|
|
data= urllib.parse.urlencode({
|
|
|
|
|
"from": "Mieux Voter <" + settings.DEFAULT_FROM_EMAIL + ">",
|
|
|
|
|
"to": email,
|
|
|
|
|
"subject": f"[{gettext('Mieux Voter')}] {title}",
|
|
|
|
|
"text": text_body,
|
|
|
|
|
"html": html_body,
|
|
|
|
|
"o:tracking": False,
|
|
|
|
|
"o:tag":"Invitation",
|
|
|
|
|
"o:require-tls": settings.EMAIL_USE_TLS,
|
|
|
|
|
"o:skip-verification": settings.EMAIL_SKIP_VERIFICATION
|
|
|
|
|
}, doseq=True).encode()
|
|
|
|
|
|
|
|
|
|
#request = urllib.request.Request(settings.EMAIL_API_DOMAIN, data=data)
|
|
|
|
|
request = urllib.request.Request("https://api.eu.mailgun.net/v3/mg.app.mieuxvoter.fr/messages", data=data)
|
|
|
|
|
encoded_token = base64.b64encode(("api:" + settings.EMAIL_API_KEY).encode("ascii")).decode("ascii")
|
|
|
|
|
request.add_header("Authorization","Basic {}".format(encoded_token))
|
|
|
|
|
try:
|
|
|
|
|
urllib.request.urlopen(request)
|
|
|
|
|
except Exception as err:
|
|
|
|
|
return(err)
|
|
|
|
|
|
|
|
|
|
def send_mails_invitation_SMTP(list_email_token: list, election: str):
|
|
|
|
|
"""
|
|
|
|
|
Def to send the election invitation by SMTP
|
|
|
|
|
"""
|
|
|
|
|
for couple in list_email_token:
|
|
|
|
|
token_get: str = f"?token={couple[1]}"
|
|
|
|
|
merge_data: Dict[str, str] = {
|
|
|
|
|
"invitation_url": f"{settings.SITE_URL}/vote/{election.id}{token_get}",
|
|
|
|
|
"result_url": f"{settings.SITE_URL}/result/{election.id}",
|
|
|
|
|
"title": election.title,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if election.select_language not in settings.LANGUAGE_AVAILABLE:
|
|
|
|
|
activate(settings.DEFAULT_LANGUAGE)
|
|
|
|
|
else:
|
|
|
|
|
activate(election.select_language)
|
|
|
|
|
|
|
|
|
|
text_body = render_to_string("election/mail_invitation.txt", merge_data)
|
|
|
|
|
html_body = render_to_string("election/mail_invitation.html", merge_data)
|
|
|
|
|
|
|
|
|
|
msg = EmailMultiAlternatives(
|
|
|
|
|
f"[{gettext('Mieux Voter')}] {election.title}",
|
|
|
|
|
text_body,
|
|
|
|
|
settings.EMAIL_HOST_USER,
|
|
|
|
|
[couple[0]])
|
|
|
|
|
msg.attach_alternative(html_body, "text/html")
|
|
|
|
|
msg.send()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ElectionCreateAPIView(CreateAPIView):
|
|
|
|
|
serializer_class = serializers.ElectionCreateSerializer
|
|
|
|
@ -94,12 +146,13 @@ class ElectionCreateAPIView(CreateAPIView):
|
|
|
|
|
)
|
|
|
|
|
tokens.append(token.id)
|
|
|
|
|
|
|
|
|
|
liste_email_token = list(zip(electors_emails,tokens))
|
|
|
|
|
list_email_token = list(zip(electors_emails,tokens))
|
|
|
|
|
|
|
|
|
|
send_mails_invitation(liste_email_token, election)
|
|
|
|
|
if settings.EMAIL_TYPE == "API":
|
|
|
|
|
send_mails_invitation_API(list_email_token, election)
|
|
|
|
|
else:
|
|
|
|
|
send_mails_invitation_SMTP(list_email_token, election)
|
|
|
|
|
|
|
|
|
|
del tokens, electors_emails, liste_email_token
|
|
|
|
|
|
|
|
|
|
headers = self.get_success_headers(serializer.data)
|
|
|
|
|
return Response(
|
|
|
|
|
serializer.data,
|
|
|
|
|