From 28d5ffcc23407797b5f1eb2468e382cb1984f233 Mon Sep 17 00:00:00 2001 From: Tobias Juelg <tobias@juelg.net> Date: Thu, 12 Nov 2020 22:42:10 +0100 Subject: [PATCH] fixes timezone issues in templated invite and remind emails --- management/views.py | 16 ++++++++-------- vote/models.py | 25 ++++++++++++++++--------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/management/views.py b/management/views.py index 4f92701..d6d852b 100644 --- a/management/views.py +++ b/management/views.py @@ -3,7 +3,6 @@ import json import logging import os from argparse import Namespace -from datetime import datetime from functools import partial from pathlib import Path from typing import Dict @@ -16,6 +15,7 @@ from django.http import Http404, HttpResponse from django.shortcuts import render, redirect from django.template.loader import get_template from django.urls import reverse +from django.utils import timezone from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_protect from latex.build import PdfLatexBuilder @@ -57,16 +57,16 @@ def index(request): messages.add_message(request, messages.INFO, 'Test email sent.') test_session = Namespace(**{ - "title": form.data['title'], - "invite_text": form.data['invite_text'], - "start_date": datetime.fromisoformat(form.data['start_date']) if form.data[ - 'start_date'] else datetime.now(), - 'meeting_link': form.data['meeting_link'], + "title": form.cleaned_data['title'], + "invite_text": form.cleaned_data['invite_text'], + "start_date": form.cleaned_data['start_date'] if form.data[ + 'start_date'] else timezone.now(), + 'meeting_link': form.cleaned_data['meeting_link'], }) test_voter = Namespace(**{ "name": "Testname", - "email": form.data['email'], + "email": form.cleaned_data['email'], "session": test_session, }) test_voter.email_user = partial(Voter.email_user, test_voter) @@ -389,7 +389,7 @@ def export_csv(request, pk): writer.writerow(header) for i in range(len(e.election_summary)): a = e.election_summary[i] - row = [i+1, a.get_display_name(), a.email, a.votes_accept, a.votes_reject, a.votes_abstention] + row = [i + 1, a.get_display_name(), a.email, a.votes_accept, a.votes_reject, a.votes_abstention] if e.max_votes_yes is not None: row.append(True if i < e.max_votes_yes else False) writer.writerow(row) diff --git a/vote/models.py b/vote/models.py index 5b3621d..3b08105 100644 --- a/vote/models.py +++ b/vote/models.py @@ -275,16 +275,20 @@ class Voter(models.Model): return subject = f'Invitation for {self.session.title}' if self.session.invite_text: + if self.session.start_date: + # cast to correct time zone + current_tz = timezone.get_current_timezone() + st = current_tz.normalize(self.session.start_date) context = { 'name': self.name, 'title': self.session.title, 'access_code': access_code, 'login_url': 'https://vote.stustanet.de' + reverse('vote:link_login', kwargs={'access_code': access_code}), - 'start_date': self.session.start_date.strftime("%d.%m.%Y") if self.session.start_date else "", - 'start_time': self.session.start_date.strftime("%H:%M") if self.session.start_date else "", - 'start_date_en': self.session.start_date.strftime("%Y/%m/%d") if self.session.start_date else "", - 'start_time_en': self.session.start_date.strftime("%I:%M %p") if self.session.start_date else "", + 'start_date': st.strftime("%d.%m.%Y") if self.session.start_date else "", + 'start_time': st.strftime("%H:%M") if self.session.start_date else "", + 'start_date_en': st.strftime("%Y/%m/%d") if self.session.start_date else "", + 'start_time_en': st.strftime("%I:%M %p") if self.session.start_date else "", 'base_url': 'https://vote.stustanet.de', 'meeting_link': self.session.meeting_link } @@ -313,14 +317,18 @@ class Voter(models.Model): return subject = f'{election.title} is now open' if election.remind_text: + if self.session.start_date: + # cast to correct time zone + current_tz = timezone.get_current_timezone() + et = current_tz.normalize(election.end_date) context = { 'name': self.name, 'title': election.title, 'url': 'https://vote.stustanet.de' + reverse('vote:vote', kwargs={'election_id': election.pk}), - 'end_date': election.end_date.strftime("%d.%m.%y") if election.end_date else "", - 'end_time': election.end_date.strftime("%H:%M") if election.end_date else "", - 'end_date_en': election.end_date.strftime("%Y/%m/%d") if election.end_date else "", - 'end_time_en': election.end_date.strftime("%I:%M %p") if election.end_date else "", + 'end_date': et.strftime("%d.%m.%y") if election.end_date else "", + 'end_time': et.strftime("%H:%M") if election.end_date else "", + 'end_date_en': et.strftime("%Y/%m/%d") if election.end_date else "", + 'end_time_en': et.strftime("%I:%M %p") if election.end_date else "", } body_html = election.remind_text.format(**context) else: @@ -385,7 +393,6 @@ class Voter(models.Model): return self.get_access_code(self, password) - def avatar_file_name(instance, filename): ext = filename.split('.')[-1] return os.path.join('avatars', str(uuid.uuid4()) + '.' + ext) -- GitLab