From f2a2b07792805c750a83385c1f829064812bd4e0 Mon Sep 17 00:00:00 2001
From: Stefan Dworschak
Date: Mon, 29 Nov 2021 09:46:23 +0000
Subject: [PATCH 1/6] Adding timezone field
---
accounts/admin.py | 2 +-
accounts/forms.py | 14 ++++++++++++--
accounts/lists.py | 4 ++++
.../migrations/0017_customuser_timezone.py | 18 ++++++++++++++++++
accounts/models.py | 9 ++++++++-
5 files changed, 43 insertions(+), 4 deletions(-)
create mode 100644 accounts/migrations/0017_customuser_timezone.py
diff --git a/accounts/admin.py b/accounts/admin.py
index cf51f3f0..e081ffd5 100644
--- a/accounts/admin.py
+++ b/accounts/admin.py
@@ -13,7 +13,7 @@ class CustomUserAdmin(BaseUserAdmin):
'username', 'first_name', 'last_name',
'full_name', 'slack_display_name',
'current_lms_module', 'organisation',
- 'user_type', 'is_external')}),
+ 'timezone', 'user_type', 'is_external')}),
('Permissions', {'fields': (
'is_active', 'is_staff', 'is_superuser',
'profile_is_public', 'email_is_public',
diff --git a/accounts/forms.py b/accounts/forms.py
index 13663373..c9bf2ba8 100644
--- a/accounts/forms.py
+++ b/accounts/forms.py
@@ -1,7 +1,7 @@
from django import forms
from django.contrib.auth import get_user_model
-from .lists import LMS_MODULES_CHOICES
+from .lists import LMS_MODULES_CHOICES, TIMEZONE_CHOICES
from .models import CustomUser
@@ -23,11 +23,15 @@ class SignupForm(forms.Form):
widget=forms.Select(choices=LMS_MODULES_CHOICES),
label="Where are you currently in the programme?"
)
+ timezone = forms.CharField(
+ widget=forms.Select(choices=TIMEZONE_CHOICES),
+ label="Timezone"
+ )
class Meta:
fields = (
'email', 'password1', 'password2', 'slack_display_name',
- 'current_lms_module',
+ 'current_lms_module', 'timezone',
)
model = get_user_model()
@@ -37,6 +41,7 @@ def signup(self, request, user):
user.username = self.cleaned_data['email']
user.slack_display_name = self.cleaned_data['slack_display_name']
user.current_lms_module = self.cleaned_data['current_lms_module']
+ user.timezone = self.cleaned_data['timezone']
user.save()
@@ -59,6 +64,10 @@ class EditProfileForm(forms.ModelForm):
)
about = forms.CharField(widget=forms.Textarea(), required=False)
website_url = forms.CharField(required=False)
+ timezone = forms.CharField(
+ widget=forms.Select(choices=TIMEZONE_CHOICES),
+ required=True,
+ )
class Meta:
model = CustomUser
@@ -69,6 +78,7 @@ class Meta:
'slack_display_name',
'current_lms_module',
'website_url',
+ 'timezone',
'profile_is_public',
'email_is_public',
)
diff --git a/accounts/lists.py b/accounts/lists.py
index cefb5e9c..94d62699 100644
--- a/accounts/lists.py
+++ b/accounts/lists.py
@@ -2,6 +2,8 @@
List of user types to be passed into dropdown of same name for each
user selection.
"""
+import pytz
+
USER_TYPES_CHOICES = (
('', 'Select Post Category'),
('participant', 'Participant'),
@@ -33,3 +35,5 @@
('alumni', 'Alumni'),
('staff', 'Staff'),
)
+
+TIMEZONE_CHOICES = [(tz, tz) for tz in pytz.all_timezones]
diff --git a/accounts/migrations/0017_customuser_timezone.py b/accounts/migrations/0017_customuser_timezone.py
new file mode 100644
index 00000000..30381fe3
--- /dev/null
+++ b/accounts/migrations/0017_customuser_timezone.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.1.5 on 2021-11-15 18:36
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('accounts', '0016_customuser_is_external'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='customuser',
+ name='timezone',
+ field=models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Asmera', 'Africa/Asmera'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Timbuktu', 'Africa/Timbuktu'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/ComodRivadavia', 'America/Argentina/ComodRivadavia'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Atka', 'America/Atka'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Buenos_Aires', 'America/Buenos_Aires'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Catamarca', 'America/Catamarca'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Coral_Harbour', 'America/Coral_Harbour'), ('America/Cordoba', 'America/Cordoba'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Ensenada', 'America/Ensenada'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fort_Wayne', 'America/Fort_Wayne'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Godthab', 'America/Godthab'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Indianapolis', 'America/Indianapolis'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Jujuy', 'America/Jujuy'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Knox_IN', 'America/Knox_IN'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Louisville', 'America/Louisville'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Mendoza', 'America/Mendoza'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montreal', 'America/Montreal'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Nuuk', 'America/Nuuk'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Acre', 'America/Porto_Acre'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Rosario', 'America/Rosario'), ('America/Santa_Isabel', 'America/Santa_Isabel'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Shiprock', 'America/Shiprock'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Virgin', 'America/Virgin'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/South_Pole', 'Antarctica/South_Pole'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Ashkhabad', 'Asia/Ashkhabad'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Calcutta', 'Asia/Calcutta'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Chongqing', 'Asia/Chongqing'), ('Asia/Chungking', 'Asia/Chungking'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Dacca', 'Asia/Dacca'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Harbin', 'Asia/Harbin'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Istanbul', 'Asia/Istanbul'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kashgar', 'Asia/Kashgar'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Katmandu', 'Asia/Katmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macao', 'Asia/Macao'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Rangoon', 'Asia/Rangoon'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Saigon', 'Asia/Saigon'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Tel_Aviv', 'Asia/Tel_Aviv'), ('Asia/Thimbu', 'Asia/Thimbu'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ujung_Pandang', 'Asia/Ujung_Pandang'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Ulan_Bator', 'Asia/Ulan_Bator'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faeroe', 'Atlantic/Faeroe'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Jan_Mayen', 'Atlantic/Jan_Mayen'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/ACT', 'Australia/ACT'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Canberra', 'Australia/Canberra'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/LHI', 'Australia/LHI'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/NSW', 'Australia/NSW'), ('Australia/North', 'Australia/North'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Queensland', 'Australia/Queensland'), ('Australia/South', 'Australia/South'), ('Australia/Sydney', 'Australia/Sydney'), ('Australia/Tasmania', 'Australia/Tasmania'), ('Australia/Victoria', 'Australia/Victoria'), ('Australia/West', 'Australia/West'), ('Australia/Yancowinna', 'Australia/Yancowinna'), ('Brazil/Acre', 'Brazil/Acre'), ('Brazil/DeNoronha', 'Brazil/DeNoronha'), ('Brazil/East', 'Brazil/East'), ('Brazil/West', 'Brazil/West'), ('CET', 'CET'), ('CST6CDT', 'CST6CDT'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Canada/Saskatchewan', 'Canada/Saskatchewan'), ('Canada/Yukon', 'Canada/Yukon'), ('Chile/Continental', 'Chile/Continental'), ('Chile/EasterIsland', 'Chile/EasterIsland'), ('Cuba', 'Cuba'), ('EET', 'EET'), ('EST', 'EST'), ('EST5EDT', 'EST5EDT'), ('Egypt', 'Egypt'), ('Eire', 'Eire'), ('Etc/GMT', 'Etc/GMT'), ('Etc/GMT+0', 'Etc/GMT+0'), ('Etc/GMT+1', 'Etc/GMT+1'), ('Etc/GMT+10', 'Etc/GMT+10'), ('Etc/GMT+11', 'Etc/GMT+11'), ('Etc/GMT+12', 'Etc/GMT+12'), ('Etc/GMT+2', 'Etc/GMT+2'), ('Etc/GMT+3', 'Etc/GMT+3'), ('Etc/GMT+4', 'Etc/GMT+4'), ('Etc/GMT+5', 'Etc/GMT+5'), ('Etc/GMT+6', 'Etc/GMT+6'), ('Etc/GMT+7', 'Etc/GMT+7'), ('Etc/GMT+8', 'Etc/GMT+8'), ('Etc/GMT+9', 'Etc/GMT+9'), ('Etc/GMT-0', 'Etc/GMT-0'), ('Etc/GMT-1', 'Etc/GMT-1'), ('Etc/GMT-10', 'Etc/GMT-10'), ('Etc/GMT-11', 'Etc/GMT-11'), ('Etc/GMT-12', 'Etc/GMT-12'), ('Etc/GMT-13', 'Etc/GMT-13'), ('Etc/GMT-14', 'Etc/GMT-14'), ('Etc/GMT-2', 'Etc/GMT-2'), ('Etc/GMT-3', 'Etc/GMT-3'), ('Etc/GMT-4', 'Etc/GMT-4'), ('Etc/GMT-5', 'Etc/GMT-5'), ('Etc/GMT-6', 'Etc/GMT-6'), ('Etc/GMT-7', 'Etc/GMT-7'), ('Etc/GMT-8', 'Etc/GMT-8'), ('Etc/GMT-9', 'Etc/GMT-9'), ('Etc/GMT0', 'Etc/GMT0'), ('Etc/Greenwich', 'Etc/Greenwich'), ('Etc/UCT', 'Etc/UCT'), ('Etc/UTC', 'Etc/UTC'), ('Etc/Universal', 'Etc/Universal'), ('Etc/Zulu', 'Etc/Zulu'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belfast', 'Europe/Belfast'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Nicosia', 'Europe/Nicosia'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Tiraspol', 'Europe/Tiraspol'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GB', 'GB'), ('GB-Eire', 'GB-Eire'), ('GMT', 'GMT'), ('GMT+0', 'GMT+0'), ('GMT-0', 'GMT-0'), ('GMT0', 'GMT0'), ('Greenwich', 'Greenwich'), ('HST', 'HST'), ('Hongkong', 'Hongkong'), ('Iceland', 'Iceland'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Iran', 'Iran'), ('Israel', 'Israel'), ('Jamaica', 'Jamaica'), ('Japan', 'Japan'), ('Kwajalein', 'Kwajalein'), ('Libya', 'Libya'), ('MET', 'MET'), ('MST', 'MST'), ('MST7MDT', 'MST7MDT'), ('Mexico/BajaNorte', 'Mexico/BajaNorte'), ('Mexico/BajaSur', 'Mexico/BajaSur'), ('Mexico/General', 'Mexico/General'), ('NZ', 'NZ'), ('NZ-CHAT', 'NZ-CHAT'), ('Navajo', 'Navajo'), ('PRC', 'PRC'), ('PST8PDT', 'PST8PDT'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Johnston', 'Pacific/Johnston'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Ponape', 'Pacific/Ponape'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Samoa', 'Pacific/Samoa'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Truk', 'Pacific/Truk'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('Pacific/Yap', 'Pacific/Yap'), ('Poland', 'Poland'), ('Portugal', 'Portugal'), ('ROC', 'ROC'), ('ROK', 'ROK'), ('Singapore', 'Singapore'), ('Turkey', 'Turkey'), ('UCT', 'UCT'), ('US/Alaska', 'US/Alaska'), ('US/Aleutian', 'US/Aleutian'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/East-Indiana', 'US/East-Indiana'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Indiana-Starke', 'US/Indiana-Starke'), ('US/Michigan', 'US/Michigan'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('US/Samoa', 'US/Samoa'), ('UTC', 'UTC'), ('Universal', 'Universal'), ('W-SU', 'W-SU'), ('WET', 'WET'), ('Zulu', 'Zulu')], default='Europe/London', max_length=255),
+ ),
+ ]
diff --git a/accounts/models.py b/accounts/models.py
index 715fd7b4..4f8a369c 100644
--- a/accounts/models.py
+++ b/accounts/models.py
@@ -3,7 +3,7 @@
from django.db import models
from django.contrib.auth.models import AbstractUser
-from .lists import LMS_MODULES_CHOICES
+from .lists import LMS_MODULES_CHOICES, TIMEZONE_CHOICES
from teams.lists import LMS_LEVELS
@@ -97,6 +97,13 @@ class CustomUser(AbstractUser):
"registration link")
)
+ timezone = models.CharField(
+ max_length=255,
+ blank=False,
+ default='Europe/London',
+ choices=TIMEZONE_CHOICES,
+ )
+
class Meta:
verbose_name = 'User'
verbose_name_plural = 'Users'
From bd378fa1f488bb0c7730dd24def2ce405398904f Mon Sep 17 00:00:00 2001
From: Stefan Dworschak
Date: Mon, 29 Nov 2021 09:46:51 +0000
Subject: [PATCH 2/6] Adding timezone field to profile
---
profiles/templates/profiles/profile.html | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/profiles/templates/profiles/profile.html b/profiles/templates/profiles/profile.html
index 6ca195bc..eb0e6a63 100644
--- a/profiles/templates/profiles/profile.html
+++ b/profiles/templates/profiles/profile.html
@@ -76,6 +76,11 @@
{{ user.human_readable_current_lms_module|title }}
+
+
+ {{ user.timezone|title }}
+
+
{% if user.website_url %}
From 3e429092d05c63ab9471fafbab2e8b140b2518a1 Mon Sep 17 00:00:00 2001
From: Stefan Dworschak
Date: Mon, 29 Nov 2021 09:48:03 +0000
Subject: [PATCH 3/6] Adding timezone calendar view to teams
---
static/css/style.css | 20 ++++++
teams/helpers.py | 11 +++
teams/templates/team_calendar.html | 103 +++++++++++++++++++++++++++++
teams/templatetags/teams_tags.py | 7 ++
teams/urls.py | 24 ++++---
teams/views.py | 52 ++++++++++++++-
6 files changed, 205 insertions(+), 12 deletions(-)
create mode 100644 teams/templates/team_calendar.html
diff --git a/static/css/style.css b/static/css/style.css
index 5a4871d9..7ed07d70 100644
--- a/static/css/style.css
+++ b/static/css/style.css
@@ -583,6 +583,26 @@ form.distribute-teams-form, form.clear-teams-form {
border: none;
}
+/* Team Calendar Page */
+.table.calendar td {
+ text-align: center;
+}
+
+.table.calendar td.working {
+ color: #155724;
+ background-color: #d4edda;
+ border-color: #c3e6cb;
+}
+
+.table.calendar tr:hover {
+ border: 1px solid black;
+ font-weight: 600;
+}
+
+.table.calendar tr:hover * {
+ background: #FAFAFA;
+}
+
/* Ensure teams in paginated view are centered at all times even when odd number of
teams persist in the view. */
.teams-row {
diff --git a/teams/helpers.py b/teams/helpers.py
index 896a4d36..f3d45de2 100644
--- a/teams/helpers.py
+++ b/teams/helpers.py
@@ -1,6 +1,9 @@
from copy import deepcopy
+from datetime import datetime
import math
+import pytz
+
from .lists import LMS_LEVELS
from accounts.models import CustomUser
from hackathon.models import Hackathon, HackTeam
@@ -223,3 +226,11 @@ def update_team_participants(created_by_user, teams, hackathon_id):
hackathon = Hackathon.objects.get(id=hackathon_id)
create_new_team_and_add_participants(created_by_user, team_name,
team_members, hackathon)
+
+
+def calculate_timezone_offset(timezone, timezone_offset):
+ """ Calculates the timezone offset between a timezone and a known
+ timezone offset """
+ tz = pytz.timezone(timezone)
+ offset = (datetime.now(tz).utcoffset().total_seconds()/60/60)
+ return offset - timezone_offset
diff --git a/teams/templates/team_calendar.html b/teams/templates/team_calendar.html
new file mode 100644
index 00000000..9a470f8d
--- /dev/null
+++ b/teams/templates/team_calendar.html
@@ -0,0 +1,103 @@
+{% extends "base.html" %}
+{% load static %}
+{% load teams_tags %}
+{% load account_tags %}
+
+{% block extra_meta %}
+
+{% if showcase %}
+
+ {% if showcase.get_image %}
+
+ {% endif %}
+
+
+
+{% endif %}
+
+{% endblock %}
+
+{% block css %}
+
+{% endblock %}
+
+{% block content %}
+
+{% with authorised_types='SUPERUSER,STAFF,FACILITATOR_ADMIN,FACILITATOR_JUDGE,PARTNER_ADMIN,PARTNER_JUDGE' %}
+
+
+
+
+ {% include 'includes/back_button.html' with redirect_url=redirect_url button_label='Back To The Team' %}
+
+
+
+
+ Marked are the hours of 8am - 8pm in the team member's respective timezone based on your own (or selected) timezone.
+
+
+
+
+
+
+
+
+
+
+
+ {% for header in headers %}
+
+ {{header.display_name}}
+ {{header.timezone}}
+ |
+ {% endfor%}
+
+
+
+ {% for cal in calendar %}
+
+ {% for i in cal %}
+ {% if i|is_working_time and not forloop.first %}
+ |
+ {% else %}
+ |
+ {% endif %}
+ {{i}}
+ |
+ {% endfor %}
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+{% endwith %}
+
+{% include 'upload_image.html' %}
+{% include 'includes/rename_team.html' %}
+
+{% endblock %}
+
+{% block js %}
+
+{% endblock %}
diff --git a/teams/templatetags/teams_tags.py b/teams/templatetags/teams_tags.py
index 8975fa86..a382ac2c 100644
--- a/teams/templatetags/teams_tags.py
+++ b/teams/templatetags/teams_tags.py
@@ -39,3 +39,10 @@ def divided_by(num, val):
@register.filter
def extract_userid(username):
return username.split('_')[0]
+
+
+@register.filter
+def is_working_time(num):
+ _num = int(num.split(':')[0])
+ return 8 <= _num <= 20
+ return num
\ No newline at end of file
diff --git a/teams/urls.py b/teams/urls.py
index 35e4c234..301c653b 100644
--- a/teams/urls.py
+++ b/teams/urls.py
@@ -1,18 +1,20 @@
from django.urls import path
from .views import view_team, create_teams, clear_teams, create_project,\
- rename_team, create_group_im
+ rename_team, create_group_im, view_team_calendar
from showcase.views import create_or_update_showcase
urlpatterns = [
- path("/", view_team,
- name="view_team"),
- path("/project/", create_project, name="create_project"),
- path("/showcase/",
- create_or_update_showcase, name="create_or_update_showcase"),
- path("/create_group_im/", create_group_im,
- name="create_group_im"),
- path("/rename/", rename_team, name="rename_team"),
- path("create/", create_teams, name="create_teams"),
- path("clear/", clear_teams, name="clear_teams"),
+ path("/", view_team,
+ name="view_team"),
+ path("/project/", create_project, name="create_project"),
+ path("/showcase/",
+ create_or_update_showcase, name="create_or_update_showcase"),
+ path("/create_group_im/", create_group_im,
+ name="create_group_im"),
+ path("/rename/", rename_team, name="rename_team"),
+ path("/calendar/", view_team_calendar,
+ name="view_team_calendar"),
+ path("create/", create_teams, name="create_teams"),
+ path("clear/", clear_teams, name="clear_teams"),
]
diff --git a/teams/views.py b/teams/views.py
index 395ce94f..fd72ef96 100644
--- a/teams/views.py
+++ b/teams/views.py
@@ -1,4 +1,6 @@
+from datetime import datetime, timedelta
import json
+import pytz
import re
import requests
@@ -10,11 +12,13 @@
from accounts.decorators import can_access
from accounts.models import UserType
+from accounts.lists import TIMEZONE_CHOICES
from hackathon.models import Hackathon, HackTeam, HackProject
from teams.helpers import choose_team_sizes, group_participants,\
choose_team_levels, find_all_combinations,\
distribute_participants_to_teams,\
- create_teams_in_view, update_team_participants
+ create_teams_in_view, update_team_participants, \
+ calculate_timezone_offset
from teams.forms import HackProjectForm, EditTeamName
SLACK_GROUP_IM_ENDPOINT = 'https://slack.com/api/conversations.open/'
@@ -265,3 +269,49 @@ def create_group_im(request, team_id):
messages.success(request, 'Group IM successfully created')
return redirect(reverse('view_team', kwargs={'team_id': team_id}))
+
+
+@login_required
+def view_team_calendar(request, team_id):
+ """ View the team calendar showing what timezone each team member is
+ located at """
+ hack_team = get_object_or_404(HackTeam, id=team_id)
+ timezone = request.GET.get('timezone') or request.user.timezone
+ tz = pytz.timezone(timezone)
+ user_tz_offset = (datetime.now(tz).utcoffset().total_seconds()/60/60)
+ headers = [{'display_name': 'Time', 'description': '',
+ 'timezone': timezone }]
+
+ for member in hack_team.participants.all():
+ offset = calculate_timezone_offset(member.timezone, user_tz_offset)
+ quantifier = 'ahead of' if offset > 0 else 'behind'
+ headers.append({
+ 'display_name': f'{member.slack_display_name}',
+ 'description': (f'{member.slack_display_name} is {abs(offset)}hrs '
+ f'{quantifier} {timezone}'),
+ 'timezone': member.timezone,
+ })
+
+ calendar = []
+ for i in range(24):
+ row = [f'{i}:00']
+ for member in hack_team.participants.all():
+ offset = calculate_timezone_offset(member.timezone, user_tz_offset)
+ if i + offset >= 24:
+ _time = (i + offset) - 24
+ elif i + offset < 0:
+ _time = 24 + i - abs(offset)
+ else:
+ _time = i + offset
+ row.append(f'{int(_time)}:00')
+ calendar.append(row)
+
+ return render(request, 'team_calendar.html', {
+ 'hack_team': hack_team,
+ 'team_id': team_id,
+ 'redirect_url': f'/teams/{team_id}/',
+ 'calendar': calendar,
+ 'headers': headers,
+ 'timezones': TIMEZONE_CHOICES,
+ 'selected_timezone': timezone,
+ })
From 2a11620d7f9728641b18e419bf17dbce9139b52c Mon Sep 17 00:00:00 2001
From: Stefan Dworschak
Date: Thu, 2 Dec 2021 14:40:13 +0000
Subject: [PATCH 4/6] Adding styles and new icon
---
static/css/style.css | 28 ++++++++++++++++---
.../templates/includes/create_slack_mpim.html | 4 +--
teams/templates/team.html | 17 ++++++++++-
teams/views.py | 2 +-
4 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/static/css/style.css b/static/css/style.css
index 7ed07d70..99df5705 100644
--- a/static/css/style.css
+++ b/static/css/style.css
@@ -583,6 +583,21 @@ form.distribute-teams-form, form.clear-teams-form {
border: none;
}
+.team-menu-dropdown-container {
+ position: absolute;
+ top: 0;
+ right: 60px;
+ min-width: 150px;
+}
+
+.teams-dropdown {
+ transform: translate3d(-130px, 38px, 0) !important;
+}
+
+.black {
+ color: var(--black);
+}
+
/* Team Calendar Page */
.table.calendar td {
text-align: center;
@@ -595,12 +610,12 @@ form.distribute-teams-form, form.clear-teams-form {
}
.table.calendar tr:hover {
- border: 1px solid black;
+ border: 1px solid var(--black);
font-weight: 600;
}
.table.calendar tr:hover * {
- background: #FAFAFA;
+ background: var(--bg-grey);
}
/* Ensure teams in paginated view are centered at all times even when odd number of
@@ -643,12 +658,17 @@ form.distribute-teams-form, form.clear-teams-form {
justify-content: center;
}
-.dropdown-menu.judge-dropdown {
+.dropdown-menu.judge-dropdown, .dropdown-menu.teams-dropdown {
width: 100%;
border: 3px solid var(--p-orange);
}
-.dropdown-menu.judge-dropdown .dropdown-item:hover {
+.dropdown-menu.teams-dropdown {
+ width: fit-content;
+}
+
+.dropdown-menu.judge-dropdown .dropdown-item:hover,
+.dropdown-menu.teams-dropdown .dropdown-item:hover {
width: 100%;
background: var(--p-orange);
color: var(--white);
diff --git a/teams/templates/includes/create_slack_mpim.html b/teams/templates/includes/create_slack_mpim.html
index 9e8d0e4f..8f50bc80 100644
--- a/teams/templates/includes/create_slack_mpim.html
+++ b/teams/templates/includes/create_slack_mpim.html
@@ -8,8 +8,8 @@
{% else %}
diff --git a/teams/templates/team.html b/teams/templates/team.html
index 4fc54860..a3243331 100644
--- a/teams/templates/team.html
+++ b/teams/templates/team.html
@@ -54,6 +54,7 @@ Team: {{team}}
+
About the team
{% if request.user in team.participants.all or request.user == team.mentor or request.user.user_type|is_types:authorised_types %}
@@ -66,7 +67,21 @@
About the team
{% endif %}
{% endif %}
- {% include 'includes/create_slack_mpim.html' %}
+
+
{% if showcase %}
diff --git a/teams/views.py b/teams/views.py
index fd72ef96..86412fea 100644
--- a/teams/views.py
+++ b/teams/views.py
@@ -280,7 +280,7 @@ def view_team_calendar(request, team_id):
tz = pytz.timezone(timezone)
user_tz_offset = (datetime.now(tz).utcoffset().total_seconds()/60/60)
headers = [{'display_name': 'Time', 'description': '',
- 'timezone': timezone }]
+ 'timezone': timezone}]
for member in hack_team.participants.all():
offset = calculate_timezone_offset(member.timezone, user_tz_offset)
From 09ffa19fc10f587ae90d174e5024598683567458 Mon Sep 17 00:00:00 2001
From: Stefan Dworschak
Date: Thu, 2 Dec 2021 14:52:08 +0000
Subject: [PATCH 5/6] Adding timezone to be retrieved from Slack on
registration
---
custom_slack_provider/adapter.py | 2 ++
custom_slack_provider/provider.py | 4 +++-
custom_slack_provider/views.py | 5 +++--
3 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/custom_slack_provider/adapter.py b/custom_slack_provider/adapter.py
index a8811ae7..4ed52d3b 100644
--- a/custom_slack_provider/adapter.py
+++ b/custom_slack_provider/adapter.py
@@ -46,6 +46,7 @@ def populate_user(self,
email = data.get('email')
profile_image = data.get('profile_image')
about = data.get('about')
+ timezone = data.get('timezone')
user = sociallogin.user
user_username(user, username or '')
user_email(user, valid_email_or_none(email) or '')
@@ -57,6 +58,7 @@ def populate_user(self,
user_field(user, 'username', username)
user_field(user, 'profile_image', profile_image)
user_field(user, 'about', about)
+ user_field(user, 'timezone', timezone)
return user
def is_auto_signup_allowed(self, request, sociallogin):
diff --git a/custom_slack_provider/provider.py b/custom_slack_provider/provider.py
index 9a4d6a45..fa0fa6b9 100644
--- a/custom_slack_provider/provider.py
+++ b/custom_slack_provider/provider.py
@@ -55,7 +55,9 @@ def extract_common_fields(self, data):
'slack_display_name': user.get('display_name'),
'email': user.get('email', None),
'profile_image': user.get('image_original'),
- 'about': user.get('title')}
+ 'about': user.get('title'),
+ 'timezone': user.get('timezone')
+ }
def get_default_scope(self):
return ['identify']
diff --git a/custom_slack_provider/views.py b/custom_slack_provider/views.py
index eb4f882e..45ab8c39 100644
--- a/custom_slack_provider/views.py
+++ b/custom_slack_provider/views.py
@@ -76,7 +76,7 @@ def get_data(self, token):
resp['user']['full_name'] = user_info.get('profile',
{}).get('real_name')
resp['user']['first_name'] = user_info.get('profile',
- {}).get('first_name')
+ {}).get('first_name')
resp['user']['last_name'] = user_info.get('profile',
{}).get('last_name')
# This key is not present in the response if the user has not
@@ -84,7 +84,8 @@ def get_data(self, token):
resp['user']['image_original'] = (user_info.get(
'profile', {}).get('image_original') or '')
resp['user']['title'] = user_info.get('profile',
- {}).get('title')
+ {}).get('title')
+ resp['user']['timezone'] = user_info.get('tz')
return resp
From 33980c9a51a73122b85d92f8cf4a14de9938de65 Mon Sep 17 00:00:00 2001
From: Stefan Dworschak
Date: Fri, 3 Dec 2021 11:41:21 +0000
Subject: [PATCH 6/6] Fixing some linting
---
custom_slack_provider/views.py | 3 +--
teams/templates/team_calendar.html | 2 +-
teams/templatetags/teams_tags.py | 1 -
3 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/custom_slack_provider/views.py b/custom_slack_provider/views.py
index 45ab8c39..391543ad 100644
--- a/custom_slack_provider/views.py
+++ b/custom_slack_provider/views.py
@@ -43,7 +43,6 @@ def complete_login(self, request, app, token, **kwargs):
return self.get_provider().sociallogin_from_response(request,
extra_data)
-
def get_data(self, token):
# Verify the user first
resp = requests.get(
@@ -53,7 +52,7 @@ def get_data(self, token):
resp = resp.json()
if not resp.get('ok'):
- raise OAuth2Error(f'UserInfo Exception: {user_info.get("error")}')
+ raise OAuth2Error(f'UserInfo Exception: {resp.get("error")}')
userid = resp.get('user', {}).get('id')
user_info = requests.get(
diff --git a/teams/templates/team_calendar.html b/teams/templates/team_calendar.html
index 9a470f8d..07a0a8f9 100644
--- a/teams/templates/team_calendar.html
+++ b/teams/templates/team_calendar.html
@@ -61,7 +61,7 @@
{% for header in headers %}
- {{header.display_name}}
+ {{header.display_name}}
{{header.timezone}}
|
{% endfor%}
diff --git a/teams/templatetags/teams_tags.py b/teams/templatetags/teams_tags.py
index a382ac2c..9b76ae22 100644
--- a/teams/templatetags/teams_tags.py
+++ b/teams/templatetags/teams_tags.py
@@ -45,4 +45,3 @@ def extract_userid(username):
def is_working_time(num):
_num = int(num.split(':')[0])
return 8 <= _num <= 20
- return num
\ No newline at end of file