From d5fa3a7d7137ff12e99f075d28f53037a93c77d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Tue, 3 Jan 2023 18:40:03 +0100
Subject: [PATCH] Upgrade django and other python dependencies

Upgrade django to 4.1
Upgrade django-timezone-field, django-simple-history, django-debug-toolbar and django-bootstrap-datepicker-plus
Upgrade mysqlclient
Remove obsolete pytz
Adapt timezone handling code to new interface of TimezoneInfo (part of python since 3.9 and backport included in 3.8)
Drop support for python 3.7 (since Django 4 requires >= 3.8)
---
 AKModel/availability/forms.py       |  2 +-
 AKModel/forms.py                    |  2 +-
 AKModel/migrations/0057_upgrades.py | 19 +++++++++++++++++++
 AKModel/models.py                   |  2 +-
 AKModel/views.py                    |  4 ++--
 INSTALL.md                          |  2 +-
 requirements.txt                    | 13 ++++++-------
 7 files changed, 31 insertions(+), 13 deletions(-)
 create mode 100644 AKModel/migrations/0057_upgrades.py

diff --git a/AKModel/availability/forms.py b/AKModel/availability/forms.py
index 17594263..27d3887a 100644
--- a/AKModel/availability/forms.py
+++ b/AKModel/availability/forms.py
@@ -80,7 +80,7 @@ class AvailabilitiesFormMixin(forms.Form):
         if not obj:
             raise TypeError
         if obj.tzinfo is None:
-            obj = tz.localize(obj)
+            obj = obj.astimezone(tz)
 
         return obj
 
diff --git a/AKModel/forms.py b/AKModel/forms.py
index aaa62164..bfa327e8 100644
--- a/AKModel/forms.py
+++ b/AKModel/forms.py
@@ -1,7 +1,7 @@
 import csv
 import io
 
-from bootstrap_datepicker_plus import DateTimePickerInput
+from bootstrap_datepicker_plus.widgets import DateTimePickerInput
 from django import forms
 from django.forms.utils import ErrorList
 from django.utils.translation import gettext_lazy as _
diff --git a/AKModel/migrations/0057_upgrades.py b/AKModel/migrations/0057_upgrades.py
new file mode 100644
index 00000000..8dc09d54
--- /dev/null
+++ b/AKModel/migrations/0057_upgrades.py
@@ -0,0 +1,19 @@
+# Generated by Django 4.1.5 on 2023-01-03 17:04
+
+from django.db import migrations
+import timezone_field.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('AKModel', '0056_remove_tags'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='event',
+            name='timezone',
+            field=timezone_field.fields.TimeZoneField(choices_display='WITH_GMT_OFFSET', default='Europe/Berlin', help_text='Time Zone where this event takes place in', verbose_name='Time Zone'),
+        ),
+    ]
diff --git a/AKModel/models.py b/AKModel/models.py
index 710b0251..5cf5fac7 100644
--- a/AKModel/models.py
+++ b/AKModel/models.py
@@ -22,7 +22,7 @@ class Event(models.Model):
 
     place = models.CharField(max_length=128, blank=True, verbose_name=_('Place'),
                              help_text=_('City etc. the event takes place in'))
-    timezone = TimeZoneField(default='Europe/Berlin', display_GMT_offset=True, blank=False,
+    timezone = TimeZoneField(default='Europe/Berlin', blank=False, choices_display="WITH_GMT_OFFSET",
                              verbose_name=_('Time Zone'), help_text=_('Time Zone where this event takes place in'))
     start = models.DateTimeField(verbose_name=_('Start'), help_text=_('Time the event begins'))
     end = models.DateTimeField(verbose_name=_('End'), help_text=_('Time the event ends'))
diff --git a/AKModel/views.py b/AKModel/views.py
index db61f2fc..68da9f43 100644
--- a/AKModel/views.py
+++ b/AKModel/views.py
@@ -541,8 +541,8 @@ class DefaultSlotEditorView(EventSlugMixin, IntermediateAdminView):
         previous_slot_ids = set(s.id for s in self.event.defaultslot_set.all())
 
         for slot in default_slots_raw:
-            start = tz.localize(parse_datetime(slot["start"]))
-            end = tz.localize(parse_datetime(slot["end"]))
+            start = parse_datetime(slot["start"]).astimezone(tz)
+            end = parse_datetime(slot["end"]).astimezone(tz)
 
             if slot["id"] != '':
                 id = int(slot["id"])
diff --git a/INSTALL.md b/INSTALL.md
index f242088a..c887af92 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -10,7 +10,7 @@ setup.
 
 ### System Requirements
 
-* Python 3.7 incl. development tools
+* Python 3.8+ incl. development tools
 * Virtualenv
 * pdflatex & beamer
   class (`texlive-latex-base texlive-latex-recommended texlive-latex-extra texlive-fonts-extra texlive-luatex`)
diff --git a/requirements.txt b/requirements.txt
index 66d2db7a..15e5c412 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,15 +1,14 @@
-Django==3.2.16
+Django==4.1.5
 django-bootstrap5==22.2
 fontawesomefree==6.2.1 # Makes static files (css, fonts) available locally
 django-fontawesome-6==1.0.0.0 # Provides an icon field for models and forms as well as handy shortcuts to render icons
 django-split-settings==1.2.0
-django-timezone-field==4.1.2
+django-timezone-field==5.0
 djangorestframework==3.14.0
-django-simple-history==3.1.1
+django-simple-history==3.2.0
 django-registration-redux==2.11
-django-debug-toolbar==3.7.0
-django-bootstrap-datepicker-plus==3.0.5
+django-debug-toolbar==3.8.1
+django-bootstrap-datepicker-plus==5.0.2
 django-tex==1.1.10
 django-csp==3.7
-mysqlclient==2.0.3  # for production deployment
-pytz==2022.4
+mysqlclient==2.1.1  # for production deployment
-- 
GitLab