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