From 8cce90f83bf190ff8768f230c2c39139b18ddfe9 Mon Sep 17 00:00:00 2001 From: Yingtong Li Date: Sun, 30 Apr 2023 20:35:53 +1000 Subject: [PATCH] Update dependencies etc. --- requirements.txt | 4 +- selfserv/jinja2.py | 5 +- ssmain/email.py | 4 +- .../management/commands/sendonboardemail.py | 112 ------------------ 4 files changed, 7 insertions(+), 118 deletions(-) delete mode 100644 ssmembership/management/commands/sendonboardemail.py diff --git a/requirements.txt b/requirements.txt index 93656bf..a0518ea 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,10 @@ Django==2.1.5 -Jinja2==2.10 +Jinja2==3.1.2 social-auth-app-django==2.1.0 jsonfield==2.0.2 Pillow==5.4.1 Markdown==3.0.1 google-api-python-client==1.7.7 django-ratelimit==2.0.0 -boto3==1.9.86 +boto3==1.26.79 premailer==3.2.0 diff --git a/selfserv/jinja2.py b/selfserv/jinja2.py index 3403b19..b0799e2 100644 --- a/selfserv/jinja2.py +++ b/selfserv/jinja2.py @@ -1,5 +1,5 @@ # Society Self-Service -# Copyright © 2018-2020 Yingtong Li (RunasSudo) +# Copyright © 2018-2023 Yingtong Li (RunasSudo) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -22,7 +22,8 @@ from django.conf import settings from django.urls import reverse from django.utils import timezone -from jinja2 import Environment, Markup, select_autoescape +from jinja2 import Environment, select_autoescape +from markupsafe import Markup import importlib diff --git a/ssmain/email.py b/ssmain/email.py index 33363d9..71b75fe 100644 --- a/ssmain/email.py +++ b/ssmain/email.py @@ -1,5 +1,5 @@ # Society Self-Service -# Copyright © 2018-2020 Yingtong Li (RunasSudo) +# Copyright © 2018-2023 Yingtong Li (RunasSudo) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -20,7 +20,7 @@ import premailer from django.conf import settings from django.template import loader -from jinja2 import Markup +from markupsafe import Markup from selfserv.mdx_urlize import UrlizeExtension diff --git a/ssmembership/management/commands/sendonboardemail.py b/ssmembership/management/commands/sendonboardemail.py deleted file mode 100644 index ab0d17f..0000000 --- a/ssmembership/management/commands/sendonboardemail.py +++ /dev/null @@ -1,112 +0,0 @@ -# Society Self-Service -# Copyright © 2018-2019 Yingtong Li (RunasSudo) -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - -import boto3 -from botocore.exceptions import ClientError -import premailer - -from django.core.management.base import BaseCommand, CommandError - -from django.conf import settings -from django.template import loader -from django.urls import reverse - -from ssmembership.monboard import get_members, set_emailed_by_email - -import hmac -import logging -import time -import urllib.parse - -class Command(BaseCommand): - help = 'Send emails for membership onboarding' - - def add_arguments(self, parser): - parser.add_argument('ids', nargs='*', type=int, help='Members with ID numbers equal to these values will be emailed (default all)') - parser.add_argument('--render', action='store_true', help='Render to stdout instead of sending emails') - - def handle(self, *args, **options): - template_html = loader.get_template('ssmembership/email/onboard.html') - template_txt = loader.get_template('ssmembership/email/onboard.txt') - - members = get_members() - - if len(options['ids']) > 0: - members = [member for member in members if member[0] in options['ids']] - else: - raise Exception('Must provide IDs') - - client = boto3.client('ses', aws_access_key_id=settings.AWS_KEY_ID, aws_secret_access_key=settings.AWS_SECRET, region_name=settings.AWS_REGION) - - def send_mail(**kwargs): - for i in range(0, 10): - try: - client.send_email(**kwargs) - return - except ClientError as e: - if e['Error']['Code'] == 'Throttling' and e['Error']['Message'] == 'Maximum sending rate exceeded.': - wait_time = max(10*(2**i), 5000) - self.stdout.write(self.style.NOTICE('Reached maximum sending rate, waiting {} ms'.format(wait_time))) - time.sleep(wait_time/1000) - else: - raise e - raise Exception('Reached maximum number of retries') - - for member in members: - #_id, student_id, email, first_name, last_name, year, is_msa, phone, date, purchased, imported, emailed - if member[10] or member[11]: - continue - - sig = hmac.new(settings.SECRET_KEY_MEMBERSIG.encode('utf-8'), member[2].encode('utf-8'), 'sha256').hexdigest() - renew_url = reverse('monboard_signed') + '?' + urllib.parse.urlencode({'email': member[2], 'sig': sig}) - - template_args = { - 'name': member[3].strip() + ' ' + member[4].strip(), - 'renew_url': renew_url, - 'baseurl': 'https://' + settings.ALLOWED_HOSTS[0], - 'purchased': member[10] - } - - content_html = premailer.Premailer(template_html.render(template_args), cssutils_logging_level=logging.ERROR).transform() - content_txt = template_txt.render(template_args) - - if options['render']: - self.stdout.write('Content-Type: multipart/alternative; boundary=boundary\n\n--boundary\nContent-Type: text/html; charset=utf-8\n\n' + content_html + '\n--boundary\nContent-Type: text/plain; charset=utf-8\n\n' + content_txt + '\n--boundary') - else: - self.stdout.write('Emailing {} at {}'.format(member[0], member[2])) - send_mail( - Destination={ - 'ToAddresses': [member[2]], - }, - Message={ - 'Body': { - 'Html': { - 'Charset': 'utf-8', - 'Data': content_html, - }, - 'Text': { - 'Charset': 'utf-8', - 'Data': content_txt, - }, - }, - 'Subject': { - 'Charset': 'utf-8', - 'Data': 'Activate your ' + settings.ORG_NAME + ' membership', - }, - }, - Source='{} <{}>'.format(settings.ORG_NAME, settings.AWS_SENDER_EMAIL), - ) - set_emailed_by_email(member[2])