diff --git a/poetry.lock b/poetry.lock index b1ddf25..9312010 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1100,7 +1100,7 @@ postgresql = ["psycopg2"] [[package]] name = "pytz" -version = "2022.7" +version = "2022.7.1" description = "World timezone definitions, modern and historical" category = "main" optional = false @@ -1487,7 +1487,7 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f2e10b828fa5d1a92dd93e7549c06425b4b70a7910f57d22f56e4c6ad9d80a00" +content-hash = "d17f83d59ef4f4e588d10a40d71090833fa7604880abde498d37771d8ca8b698" [metadata.files] amqp = [ @@ -2224,8 +2224,8 @@ python3-openid = [ {file = "python3_openid-3.2.0-py3-none-any.whl", hash = "sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b"}, ] pytz = [ - {file = "pytz-2022.7-py2.py3-none-any.whl", hash = "sha256:93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd"}, - {file = "pytz-2022.7.tar.gz", hash = "sha256:7ccfae7b4b2c067464a6733c6261673fdb8fd1be905460396b97a073e9fa683a"}, + {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, + {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, diff --git a/pyproject.toml b/pyproject.toml index 204181a..b9faf00 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ musicbrainzngs = "^0.7.1" cinemagoer = "^2022.12.27" pysportsdb = "^0.1.0" django-cachalot = "^2.5.2" +pytz = "^2022.7.1" [tool.poetry.dev-dependencies] Werkzeug = "2.0.3" diff --git a/vrobbler/apps/profiles/__init__.py b/vrobbler/apps/profiles/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vrobbler/apps/profiles/admin.py b/vrobbler/apps/profiles/admin.py new file mode 100644 index 0000000..1a39682 --- /dev/null +++ b/vrobbler/apps/profiles/admin.py @@ -0,0 +1,9 @@ +from django.contrib import admin + +from profiles.models import UserProfile + + +@admin.register(UserProfile) +class UserProfileAdmin(admin.ModelAdmin): + date_hierarchy = "created" + ordering = ("-created",) diff --git a/vrobbler/apps/profiles/constants.py b/vrobbler/apps/profiles/constants.py new file mode 100644 index 0000000..c43de3e --- /dev/null +++ b/vrobbler/apps/profiles/constants.py @@ -0,0 +1,17 @@ +from datetime import datetime + +import pytz + +ALL_TIMEZONE_CHOICES = tuple(zip(pytz.all_timezones, pytz.all_timezones)) +COMMON_TIMEZONE_CHOICES = tuple( + zip(pytz.common_timezones, pytz.common_timezones) +) +PRETTY_TIMEZONE_CHOICES = [] + +for tz in pytz.common_timezones: + now = datetime.now(pytz.timezone(tz)) + ofs = now.strftime("%z") + PRETTY_TIMEZONE_CHOICES.append((int(ofs), tz, "(GMT%s) %s" % (ofs, tz))) +PRETTY_TIMEZONE_CHOICES.sort() +for i in range(len(PRETTY_TIMEZONE_CHOICES)): + PRETTY_TIMEZONE_CHOICES[i] = PRETTY_TIMEZONE_CHOICES[i][1:] diff --git a/vrobbler/apps/profiles/migrations/0001_initial.py b/vrobbler/apps/profiles/migrations/0001_initial.py new file mode 100644 index 0000000..22d4ebe --- /dev/null +++ b/vrobbler/apps/profiles/migrations/0001_initial.py @@ -0,0 +1,1035 @@ +# Generated by Django 4.1.5 on 2023-01-18 03:11 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django_extensions.db.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ( + 'id', + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'created', + django_extensions.db.fields.CreationDateTimeField( + auto_now_add=True, verbose_name='created' + ), + ), + ( + 'modified', + django_extensions.db.fields.ModificationDateTimeField( + auto_now=True, verbose_name='modified' + ), + ), + ( + 'timezone', + models.CharField( + choices=[ + ('Pacific/Midway', '(GMT-1100) Pacific/Midway'), + ('Pacific/Niue', '(GMT-1100) Pacific/Niue'), + ( + 'Pacific/Pago_Pago', + '(GMT-1100) Pacific/Pago_Pago', + ), + ('America/Adak', '(GMT-1000) America/Adak'), + ( + 'Pacific/Honolulu', + '(GMT-1000) Pacific/Honolulu', + ), + ( + 'Pacific/Rarotonga', + '(GMT-1000) Pacific/Rarotonga', + ), + ('Pacific/Tahiti', '(GMT-1000) Pacific/Tahiti'), + ('US/Hawaii', '(GMT-1000) US/Hawaii'), + ( + 'Pacific/Marquesas', + '(GMT-0930) Pacific/Marquesas', + ), + ( + 'America/Anchorage', + '(GMT-0900) America/Anchorage', + ), + ('America/Juneau', '(GMT-0900) America/Juneau'), + ( + 'America/Metlakatla', + '(GMT-0900) America/Metlakatla', + ), + ('America/Nome', '(GMT-0900) America/Nome'), + ('America/Sitka', '(GMT-0900) America/Sitka'), + ('America/Yakutat', '(GMT-0900) America/Yakutat'), + ('Pacific/Gambier', '(GMT-0900) Pacific/Gambier'), + ('US/Alaska', '(GMT-0900) US/Alaska'), + ( + 'America/Los_Angeles', + '(GMT-0800) America/Los_Angeles', + ), + ('America/Tijuana', '(GMT-0800) America/Tijuana'), + ( + 'America/Vancouver', + '(GMT-0800) America/Vancouver', + ), + ('Canada/Pacific', '(GMT-0800) Canada/Pacific'), + ( + 'Pacific/Pitcairn', + '(GMT-0800) Pacific/Pitcairn', + ), + ('US/Pacific', '(GMT-0800) US/Pacific'), + ('America/Boise', '(GMT-0700) America/Boise'), + ( + 'America/Cambridge_Bay', + '(GMT-0700) America/Cambridge_Bay', + ), + ( + 'America/Ciudad_Juarez', + '(GMT-0700) America/Ciudad_Juarez', + ), + ('America/Creston', '(GMT-0700) America/Creston'), + ('America/Dawson', '(GMT-0700) America/Dawson'), + ( + 'America/Dawson_Creek', + '(GMT-0700) America/Dawson_Creek', + ), + ('America/Denver', '(GMT-0700) America/Denver'), + ( + 'America/Edmonton', + '(GMT-0700) America/Edmonton', + ), + ( + 'America/Fort_Nelson', + '(GMT-0700) America/Fort_Nelson', + ), + ( + 'America/Hermosillo', + '(GMT-0700) America/Hermosillo', + ), + ('America/Inuvik', '(GMT-0700) America/Inuvik'), + ( + 'America/Mazatlan', + '(GMT-0700) America/Mazatlan', + ), + ('America/Phoenix', '(GMT-0700) America/Phoenix'), + ( + 'America/Whitehorse', + '(GMT-0700) America/Whitehorse', + ), + ( + 'America/Yellowknife', + '(GMT-0700) America/Yellowknife', + ), + ('Canada/Mountain', '(GMT-0700) Canada/Mountain'), + ('US/Arizona', '(GMT-0700) US/Arizona'), + ('US/Mountain', '(GMT-0700) US/Mountain'), + ( + 'America/Bahia_Banderas', + '(GMT-0600) America/Bahia_Banderas', + ), + ('America/Belize', '(GMT-0600) America/Belize'), + ('America/Chicago', '(GMT-0600) America/Chicago'), + ( + 'America/Chihuahua', + '(GMT-0600) America/Chihuahua', + ), + ( + 'America/Costa_Rica', + '(GMT-0600) America/Costa_Rica', + ), + ( + 'America/El_Salvador', + '(GMT-0600) America/El_Salvador', + ), + ( + 'America/Guatemala', + '(GMT-0600) America/Guatemala', + ), + ( + 'America/Indiana/Knox', + '(GMT-0600) America/Indiana/Knox', + ), + ( + 'America/Indiana/Tell_City', + '(GMT-0600) America/Indiana/Tell_City', + ), + ('America/Managua', '(GMT-0600) America/Managua'), + ( + 'America/Matamoros', + '(GMT-0600) America/Matamoros', + ), + ( + 'America/Menominee', + '(GMT-0600) America/Menominee', + ), + ('America/Merida', '(GMT-0600) America/Merida'), + ( + 'America/Mexico_City', + '(GMT-0600) America/Mexico_City', + ), + ( + 'America/Monterrey', + '(GMT-0600) America/Monterrey', + ), + ( + 'America/North_Dakota/Beulah', + '(GMT-0600) America/North_Dakota/Beulah', + ), + ( + 'America/North_Dakota/Center', + '(GMT-0600) America/North_Dakota/Center', + ), + ( + 'America/North_Dakota/New_Salem', + '(GMT-0600) America/North_Dakota/New_Salem', + ), + ('America/Ojinaga', '(GMT-0600) America/Ojinaga'), + ( + 'America/Rankin_Inlet', + '(GMT-0600) America/Rankin_Inlet', + ), + ('America/Regina', '(GMT-0600) America/Regina'), + ( + 'America/Resolute', + '(GMT-0600) America/Resolute', + ), + ( + 'America/Swift_Current', + '(GMT-0600) America/Swift_Current', + ), + ( + 'America/Tegucigalpa', + '(GMT-0600) America/Tegucigalpa', + ), + ( + 'America/Winnipeg', + '(GMT-0600) America/Winnipeg', + ), + ('Canada/Central', '(GMT-0600) Canada/Central'), + ( + 'Pacific/Galapagos', + '(GMT-0600) Pacific/Galapagos', + ), + ('US/Central', '(GMT-0600) US/Central'), + ( + 'America/Atikokan', + '(GMT-0500) America/Atikokan', + ), + ('America/Bogota', '(GMT-0500) America/Bogota'), + ('America/Cancun', '(GMT-0500) America/Cancun'), + ('America/Cayman', '(GMT-0500) America/Cayman'), + ('America/Detroit', '(GMT-0500) America/Detroit'), + ( + 'America/Eirunepe', + '(GMT-0500) America/Eirunepe', + ), + ( + 'America/Grand_Turk', + '(GMT-0500) America/Grand_Turk', + ), + ( + 'America/Guayaquil', + '(GMT-0500) America/Guayaquil', + ), + ('America/Havana', '(GMT-0500) America/Havana'), + ( + 'America/Indiana/Indianapolis', + '(GMT-0500) America/Indiana/Indianapolis', + ), + ( + 'America/Indiana/Marengo', + '(GMT-0500) America/Indiana/Marengo', + ), + ( + 'America/Indiana/Petersburg', + '(GMT-0500) America/Indiana/Petersburg', + ), + ( + 'America/Indiana/Vevay', + '(GMT-0500) America/Indiana/Vevay', + ), + ( + 'America/Indiana/Vincennes', + '(GMT-0500) America/Indiana/Vincennes', + ), + ( + 'America/Indiana/Winamac', + '(GMT-0500) America/Indiana/Winamac', + ), + ('America/Iqaluit', '(GMT-0500) America/Iqaluit'), + ('America/Jamaica', '(GMT-0500) America/Jamaica'), + ( + 'America/Kentucky/Louisville', + '(GMT-0500) America/Kentucky/Louisville', + ), + ( + 'America/Kentucky/Monticello', + '(GMT-0500) America/Kentucky/Monticello', + ), + ('America/Lima', '(GMT-0500) America/Lima'), + ('America/Nassau', '(GMT-0500) America/Nassau'), + ( + 'America/New_York', + '(GMT-0500) America/New_York', + ), + ('America/Panama', '(GMT-0500) America/Panama'), + ( + 'America/Port-au-Prince', + '(GMT-0500) America/Port-au-Prince', + ), + ( + 'America/Rio_Branco', + '(GMT-0500) America/Rio_Branco', + ), + ('America/Toronto', '(GMT-0500) America/Toronto'), + ('Canada/Eastern', '(GMT-0500) Canada/Eastern'), + ('Pacific/Easter', '(GMT-0500) Pacific/Easter'), + ('US/Eastern', '(GMT-0500) US/Eastern'), + ( + 'America/Anguilla', + '(GMT-0400) America/Anguilla', + ), + ('America/Antigua', '(GMT-0400) America/Antigua'), + ('America/Aruba', '(GMT-0400) America/Aruba'), + ( + 'America/Barbados', + '(GMT-0400) America/Barbados', + ), + ( + 'America/Blanc-Sablon', + '(GMT-0400) America/Blanc-Sablon', + ), + ( + 'America/Boa_Vista', + '(GMT-0400) America/Boa_Vista', + ), + ( + 'America/Campo_Grande', + '(GMT-0400) America/Campo_Grande', + ), + ('America/Caracas', '(GMT-0400) America/Caracas'), + ('America/Cuiaba', '(GMT-0400) America/Cuiaba'), + ('America/Curacao', '(GMT-0400) America/Curacao'), + ( + 'America/Dominica', + '(GMT-0400) America/Dominica', + ), + ( + 'America/Glace_Bay', + '(GMT-0400) America/Glace_Bay', + ), + ( + 'America/Goose_Bay', + '(GMT-0400) America/Goose_Bay', + ), + ('America/Grenada', '(GMT-0400) America/Grenada'), + ( + 'America/Guadeloupe', + '(GMT-0400) America/Guadeloupe', + ), + ('America/Guyana', '(GMT-0400) America/Guyana'), + ('America/Halifax', '(GMT-0400) America/Halifax'), + ( + 'America/Kralendijk', + '(GMT-0400) America/Kralendijk', + ), + ('America/La_Paz', '(GMT-0400) America/La_Paz'), + ( + 'America/Lower_Princes', + '(GMT-0400) America/Lower_Princes', + ), + ('America/Manaus', '(GMT-0400) America/Manaus'), + ('America/Marigot', '(GMT-0400) America/Marigot'), + ( + 'America/Martinique', + '(GMT-0400) America/Martinique', + ), + ('America/Moncton', '(GMT-0400) America/Moncton'), + ( + 'America/Montserrat', + '(GMT-0400) America/Montserrat', + ), + ( + 'America/Port_of_Spain', + '(GMT-0400) America/Port_of_Spain', + ), + ( + 'America/Porto_Velho', + '(GMT-0400) America/Porto_Velho', + ), + ( + 'America/Puerto_Rico', + '(GMT-0400) America/Puerto_Rico', + ), + ( + 'America/Santo_Domingo', + '(GMT-0400) America/Santo_Domingo', + ), + ( + 'America/St_Barthelemy', + '(GMT-0400) America/St_Barthelemy', + ), + ( + 'America/St_Kitts', + '(GMT-0400) America/St_Kitts', + ), + ( + 'America/St_Lucia', + '(GMT-0400) America/St_Lucia', + ), + ( + 'America/St_Thomas', + '(GMT-0400) America/St_Thomas', + ), + ( + 'America/St_Vincent', + '(GMT-0400) America/St_Vincent', + ), + ('America/Thule', '(GMT-0400) America/Thule'), + ('America/Tortola', '(GMT-0400) America/Tortola'), + ( + 'Atlantic/Bermuda', + '(GMT-0400) Atlantic/Bermuda', + ), + ('Canada/Atlantic', '(GMT-0400) Canada/Atlantic'), + ( + 'America/St_Johns', + '(GMT-0330) America/St_Johns', + ), + ( + 'Canada/Newfoundland', + '(GMT-0330) Canada/Newfoundland', + ), + ( + 'America/Araguaina', + '(GMT-0300) America/Araguaina', + ), + ( + 'America/Argentina/Buenos_Aires', + '(GMT-0300) America/Argentina/Buenos_Aires', + ), + ( + 'America/Argentina/Catamarca', + '(GMT-0300) America/Argentina/Catamarca', + ), + ( + 'America/Argentina/Cordoba', + '(GMT-0300) America/Argentina/Cordoba', + ), + ( + 'America/Argentina/Jujuy', + '(GMT-0300) America/Argentina/Jujuy', + ), + ( + 'America/Argentina/La_Rioja', + '(GMT-0300) America/Argentina/La_Rioja', + ), + ( + 'America/Argentina/Mendoza', + '(GMT-0300) America/Argentina/Mendoza', + ), + ( + 'America/Argentina/Rio_Gallegos', + '(GMT-0300) America/Argentina/Rio_Gallegos', + ), + ( + 'America/Argentina/Salta', + '(GMT-0300) America/Argentina/Salta', + ), + ( + 'America/Argentina/San_Juan', + '(GMT-0300) America/Argentina/San_Juan', + ), + ( + 'America/Argentina/San_Luis', + '(GMT-0300) America/Argentina/San_Luis', + ), + ( + 'America/Argentina/Tucuman', + '(GMT-0300) America/Argentina/Tucuman', + ), + ( + 'America/Argentina/Ushuaia', + '(GMT-0300) America/Argentina/Ushuaia', + ), + ( + 'America/Asuncion', + '(GMT-0300) America/Asuncion', + ), + ('America/Bahia', '(GMT-0300) America/Bahia'), + ('America/Belem', '(GMT-0300) America/Belem'), + ('America/Cayenne', '(GMT-0300) America/Cayenne'), + ( + 'America/Fortaleza', + '(GMT-0300) America/Fortaleza', + ), + ('America/Maceio', '(GMT-0300) America/Maceio'), + ( + 'America/Miquelon', + '(GMT-0300) America/Miquelon', + ), + ( + 'America/Montevideo', + '(GMT-0300) America/Montevideo', + ), + ('America/Nuuk', '(GMT-0300) America/Nuuk'), + ( + 'America/Paramaribo', + '(GMT-0300) America/Paramaribo', + ), + ( + 'America/Punta_Arenas', + '(GMT-0300) America/Punta_Arenas', + ), + ('America/Recife', '(GMT-0300) America/Recife'), + ( + 'America/Santarem', + '(GMT-0300) America/Santarem', + ), + ( + 'America/Santiago', + '(GMT-0300) America/Santiago', + ), + ( + 'America/Sao_Paulo', + '(GMT-0300) America/Sao_Paulo', + ), + ( + 'Antarctica/Palmer', + '(GMT-0300) Antarctica/Palmer', + ), + ( + 'Antarctica/Rothera', + '(GMT-0300) Antarctica/Rothera', + ), + ( + 'Atlantic/Stanley', + '(GMT-0300) Atlantic/Stanley', + ), + ('America/Noronha', '(GMT-0200) America/Noronha'), + ( + 'Atlantic/South_Georgia', + '(GMT-0200) Atlantic/South_Georgia', + ), + ( + 'America/Scoresbysund', + '(GMT-0100) America/Scoresbysund', + ), + ('Atlantic/Azores', '(GMT-0100) Atlantic/Azores'), + ( + 'Atlantic/Cape_Verde', + '(GMT-0100) Atlantic/Cape_Verde', + ), + ('Africa/Abidjan', '(GMT+0000) Africa/Abidjan'), + ('Africa/Accra', '(GMT+0000) Africa/Accra'), + ('Africa/Bamako', '(GMT+0000) Africa/Bamako'), + ('Africa/Banjul', '(GMT+0000) Africa/Banjul'), + ('Africa/Bissau', '(GMT+0000) Africa/Bissau'), + ('Africa/Conakry', '(GMT+0000) Africa/Conakry'), + ('Africa/Dakar', '(GMT+0000) Africa/Dakar'), + ('Africa/Freetown', '(GMT+0000) Africa/Freetown'), + ('Africa/Lome', '(GMT+0000) Africa/Lome'), + ('Africa/Monrovia', '(GMT+0000) Africa/Monrovia'), + ( + 'Africa/Nouakchott', + '(GMT+0000) Africa/Nouakchott', + ), + ( + 'Africa/Ouagadougou', + '(GMT+0000) Africa/Ouagadougou', + ), + ('Africa/Sao_Tome', '(GMT+0000) Africa/Sao_Tome'), + ( + 'America/Danmarkshavn', + '(GMT+0000) America/Danmarkshavn', + ), + ( + 'Antarctica/Troll', + '(GMT+0000) Antarctica/Troll', + ), + ('Atlantic/Canary', '(GMT+0000) Atlantic/Canary'), + ('Atlantic/Faroe', '(GMT+0000) Atlantic/Faroe'), + ( + 'Atlantic/Madeira', + '(GMT+0000) Atlantic/Madeira', + ), + ( + 'Atlantic/Reykjavik', + '(GMT+0000) Atlantic/Reykjavik', + ), + ( + 'Atlantic/St_Helena', + '(GMT+0000) Atlantic/St_Helena', + ), + ('Europe/Dublin', '(GMT+0000) Europe/Dublin'), + ('Europe/Guernsey', '(GMT+0000) Europe/Guernsey'), + ( + 'Europe/Isle_of_Man', + '(GMT+0000) Europe/Isle_of_Man', + ), + ('Europe/Jersey', '(GMT+0000) Europe/Jersey'), + ('Europe/Lisbon', '(GMT+0000) Europe/Lisbon'), + ('Europe/London', '(GMT+0000) Europe/London'), + ('GMT', '(GMT+0000) GMT'), + ('UTC', '(GMT+0000) UTC'), + ('Africa/Algiers', '(GMT+0100) Africa/Algiers'), + ('Africa/Bangui', '(GMT+0100) Africa/Bangui'), + ( + 'Africa/Brazzaville', + '(GMT+0100) Africa/Brazzaville', + ), + ( + 'Africa/Casablanca', + '(GMT+0100) Africa/Casablanca', + ), + ('Africa/Ceuta', '(GMT+0100) Africa/Ceuta'), + ('Africa/Douala', '(GMT+0100) Africa/Douala'), + ('Africa/El_Aaiun', '(GMT+0100) Africa/El_Aaiun'), + ('Africa/Kinshasa', '(GMT+0100) Africa/Kinshasa'), + ('Africa/Lagos', '(GMT+0100) Africa/Lagos'), + ( + 'Africa/Libreville', + '(GMT+0100) Africa/Libreville', + ), + ('Africa/Luanda', '(GMT+0100) Africa/Luanda'), + ('Africa/Malabo', '(GMT+0100) Africa/Malabo'), + ('Africa/Ndjamena', '(GMT+0100) Africa/Ndjamena'), + ('Africa/Niamey', '(GMT+0100) Africa/Niamey'), + ( + 'Africa/Porto-Novo', + '(GMT+0100) Africa/Porto-Novo', + ), + ('Africa/Tunis', '(GMT+0100) Africa/Tunis'), + ( + 'Arctic/Longyearbyen', + '(GMT+0100) Arctic/Longyearbyen', + ), + ( + 'Europe/Amsterdam', + '(GMT+0100) Europe/Amsterdam', + ), + ('Europe/Andorra', '(GMT+0100) Europe/Andorra'), + ('Europe/Belgrade', '(GMT+0100) Europe/Belgrade'), + ('Europe/Berlin', '(GMT+0100) Europe/Berlin'), + ( + 'Europe/Bratislava', + '(GMT+0100) Europe/Bratislava', + ), + ('Europe/Brussels', '(GMT+0100) Europe/Brussels'), + ('Europe/Budapest', '(GMT+0100) Europe/Budapest'), + ('Europe/Busingen', '(GMT+0100) Europe/Busingen'), + ( + 'Europe/Copenhagen', + '(GMT+0100) Europe/Copenhagen', + ), + ( + 'Europe/Gibraltar', + '(GMT+0100) Europe/Gibraltar', + ), + ( + 'Europe/Ljubljana', + '(GMT+0100) Europe/Ljubljana', + ), + ( + 'Europe/Luxembourg', + '(GMT+0100) Europe/Luxembourg', + ), + ('Europe/Madrid', '(GMT+0100) Europe/Madrid'), + ('Europe/Malta', '(GMT+0100) Europe/Malta'), + ('Europe/Monaco', '(GMT+0100) Europe/Monaco'), + ('Europe/Oslo', '(GMT+0100) Europe/Oslo'), + ('Europe/Paris', '(GMT+0100) Europe/Paris'), + ( + 'Europe/Podgorica', + '(GMT+0100) Europe/Podgorica', + ), + ('Europe/Prague', '(GMT+0100) Europe/Prague'), + ('Europe/Rome', '(GMT+0100) Europe/Rome'), + ( + 'Europe/San_Marino', + '(GMT+0100) Europe/San_Marino', + ), + ('Europe/Sarajevo', '(GMT+0100) Europe/Sarajevo'), + ('Europe/Skopje', '(GMT+0100) Europe/Skopje'), + ( + 'Europe/Stockholm', + '(GMT+0100) Europe/Stockholm', + ), + ('Europe/Tirane', '(GMT+0100) Europe/Tirane'), + ('Europe/Vaduz', '(GMT+0100) Europe/Vaduz'), + ('Europe/Vatican', '(GMT+0100) Europe/Vatican'), + ('Europe/Vienna', '(GMT+0100) Europe/Vienna'), + ('Europe/Warsaw', '(GMT+0100) Europe/Warsaw'), + ('Europe/Zagreb', '(GMT+0100) Europe/Zagreb'), + ('Europe/Zurich', '(GMT+0100) Europe/Zurich'), + ('Africa/Blantyre', '(GMT+0200) Africa/Blantyre'), + ( + 'Africa/Bujumbura', + '(GMT+0200) Africa/Bujumbura', + ), + ('Africa/Cairo', '(GMT+0200) Africa/Cairo'), + ('Africa/Gaborone', '(GMT+0200) Africa/Gaborone'), + ('Africa/Harare', '(GMT+0200) Africa/Harare'), + ( + 'Africa/Johannesburg', + '(GMT+0200) Africa/Johannesburg', + ), + ('Africa/Juba', '(GMT+0200) Africa/Juba'), + ('Africa/Khartoum', '(GMT+0200) Africa/Khartoum'), + ('Africa/Kigali', '(GMT+0200) Africa/Kigali'), + ( + 'Africa/Lubumbashi', + '(GMT+0200) Africa/Lubumbashi', + ), + ('Africa/Lusaka', '(GMT+0200) Africa/Lusaka'), + ('Africa/Maputo', '(GMT+0200) Africa/Maputo'), + ('Africa/Maseru', '(GMT+0200) Africa/Maseru'), + ('Africa/Mbabane', '(GMT+0200) Africa/Mbabane'), + ('Africa/Tripoli', '(GMT+0200) Africa/Tripoli'), + ('Africa/Windhoek', '(GMT+0200) Africa/Windhoek'), + ('Asia/Beirut', '(GMT+0200) Asia/Beirut'), + ('Asia/Famagusta', '(GMT+0200) Asia/Famagusta'), + ('Asia/Gaza', '(GMT+0200) Asia/Gaza'), + ('Asia/Hebron', '(GMT+0200) Asia/Hebron'), + ('Asia/Jerusalem', '(GMT+0200) Asia/Jerusalem'), + ('Asia/Nicosia', '(GMT+0200) Asia/Nicosia'), + ('Europe/Athens', '(GMT+0200) Europe/Athens'), + ( + 'Europe/Bucharest', + '(GMT+0200) Europe/Bucharest', + ), + ('Europe/Chisinau', '(GMT+0200) Europe/Chisinau'), + ('Europe/Helsinki', '(GMT+0200) Europe/Helsinki'), + ( + 'Europe/Kaliningrad', + '(GMT+0200) Europe/Kaliningrad', + ), + ('Europe/Kyiv', '(GMT+0200) Europe/Kyiv'), + ( + 'Europe/Mariehamn', + '(GMT+0200) Europe/Mariehamn', + ), + ('Europe/Riga', '(GMT+0200) Europe/Riga'), + ('Europe/Sofia', '(GMT+0200) Europe/Sofia'), + ('Europe/Tallinn', '(GMT+0200) Europe/Tallinn'), + ('Europe/Vilnius', '(GMT+0200) Europe/Vilnius'), + ( + 'Africa/Addis_Ababa', + '(GMT+0300) Africa/Addis_Ababa', + ), + ('Africa/Asmara', '(GMT+0300) Africa/Asmara'), + ( + 'Africa/Dar_es_Salaam', + '(GMT+0300) Africa/Dar_es_Salaam', + ), + ('Africa/Djibouti', '(GMT+0300) Africa/Djibouti'), + ('Africa/Kampala', '(GMT+0300) Africa/Kampala'), + ( + 'Africa/Mogadishu', + '(GMT+0300) Africa/Mogadishu', + ), + ('Africa/Nairobi', '(GMT+0300) Africa/Nairobi'), + ( + 'Antarctica/Syowa', + '(GMT+0300) Antarctica/Syowa', + ), + ('Asia/Aden', '(GMT+0300) Asia/Aden'), + ('Asia/Amman', '(GMT+0300) Asia/Amman'), + ('Asia/Baghdad', '(GMT+0300) Asia/Baghdad'), + ('Asia/Bahrain', '(GMT+0300) Asia/Bahrain'), + ('Asia/Damascus', '(GMT+0300) Asia/Damascus'), + ('Asia/Kuwait', '(GMT+0300) Asia/Kuwait'), + ('Asia/Qatar', '(GMT+0300) Asia/Qatar'), + ('Asia/Riyadh', '(GMT+0300) Asia/Riyadh'), + ('Europe/Istanbul', '(GMT+0300) Europe/Istanbul'), + ('Europe/Kirov', '(GMT+0300) Europe/Kirov'), + ('Europe/Minsk', '(GMT+0300) Europe/Minsk'), + ('Europe/Moscow', '(GMT+0300) Europe/Moscow'), + ( + 'Europe/Simferopol', + '(GMT+0300) Europe/Simferopol', + ), + ( + 'Europe/Volgograd', + '(GMT+0300) Europe/Volgograd', + ), + ( + 'Indian/Antananarivo', + '(GMT+0300) Indian/Antananarivo', + ), + ('Indian/Comoro', '(GMT+0300) Indian/Comoro'), + ('Indian/Mayotte', '(GMT+0300) Indian/Mayotte'), + ('Asia/Tehran', '(GMT+0330) Asia/Tehran'), + ('Asia/Baku', '(GMT+0400) Asia/Baku'), + ('Asia/Dubai', '(GMT+0400) Asia/Dubai'), + ('Asia/Muscat', '(GMT+0400) Asia/Muscat'), + ('Asia/Tbilisi', '(GMT+0400) Asia/Tbilisi'), + ('Asia/Yerevan', '(GMT+0400) Asia/Yerevan'), + ( + 'Europe/Astrakhan', + '(GMT+0400) Europe/Astrakhan', + ), + ('Europe/Samara', '(GMT+0400) Europe/Samara'), + ('Europe/Saratov', '(GMT+0400) Europe/Saratov'), + ( + 'Europe/Ulyanovsk', + '(GMT+0400) Europe/Ulyanovsk', + ), + ('Indian/Mahe', '(GMT+0400) Indian/Mahe'), + ( + 'Indian/Mauritius', + '(GMT+0400) Indian/Mauritius', + ), + ('Indian/Reunion', '(GMT+0400) Indian/Reunion'), + ('Asia/Kabul', '(GMT+0430) Asia/Kabul'), + ( + 'Antarctica/Mawson', + '(GMT+0500) Antarctica/Mawson', + ), + ('Asia/Aqtau', '(GMT+0500) Asia/Aqtau'), + ('Asia/Aqtobe', '(GMT+0500) Asia/Aqtobe'), + ('Asia/Ashgabat', '(GMT+0500) Asia/Ashgabat'), + ('Asia/Atyrau', '(GMT+0500) Asia/Atyrau'), + ('Asia/Dushanbe', '(GMT+0500) Asia/Dushanbe'), + ('Asia/Karachi', '(GMT+0500) Asia/Karachi'), + ('Asia/Oral', '(GMT+0500) Asia/Oral'), + ('Asia/Qyzylorda', '(GMT+0500) Asia/Qyzylorda'), + ('Asia/Samarkand', '(GMT+0500) Asia/Samarkand'), + ('Asia/Tashkent', '(GMT+0500) Asia/Tashkent'), + ( + 'Asia/Yekaterinburg', + '(GMT+0500) Asia/Yekaterinburg', + ), + ( + 'Indian/Kerguelen', + '(GMT+0500) Indian/Kerguelen', + ), + ('Indian/Maldives', '(GMT+0500) Indian/Maldives'), + ('Asia/Colombo', '(GMT+0530) Asia/Colombo'), + ('Asia/Kolkata', '(GMT+0530) Asia/Kolkata'), + ('Asia/Kathmandu', '(GMT+0545) Asia/Kathmandu'), + ( + 'Antarctica/Vostok', + '(GMT+0600) Antarctica/Vostok', + ), + ('Asia/Almaty', '(GMT+0600) Asia/Almaty'), + ('Asia/Bishkek', '(GMT+0600) Asia/Bishkek'), + ('Asia/Dhaka', '(GMT+0600) Asia/Dhaka'), + ('Asia/Omsk', '(GMT+0600) Asia/Omsk'), + ('Asia/Qostanay', '(GMT+0600) Asia/Qostanay'), + ('Asia/Thimphu', '(GMT+0600) Asia/Thimphu'), + ('Asia/Urumqi', '(GMT+0600) Asia/Urumqi'), + ('Indian/Chagos', '(GMT+0600) Indian/Chagos'), + ('Asia/Yangon', '(GMT+0630) Asia/Yangon'), + ('Indian/Cocos', '(GMT+0630) Indian/Cocos'), + ( + 'Antarctica/Davis', + '(GMT+0700) Antarctica/Davis', + ), + ('Asia/Bangkok', '(GMT+0700) Asia/Bangkok'), + ('Asia/Barnaul', '(GMT+0700) Asia/Barnaul'), + ( + 'Asia/Ho_Chi_Minh', + '(GMT+0700) Asia/Ho_Chi_Minh', + ), + ('Asia/Hovd', '(GMT+0700) Asia/Hovd'), + ('Asia/Jakarta', '(GMT+0700) Asia/Jakarta'), + ( + 'Asia/Krasnoyarsk', + '(GMT+0700) Asia/Krasnoyarsk', + ), + ( + 'Asia/Novokuznetsk', + '(GMT+0700) Asia/Novokuznetsk', + ), + ( + 'Asia/Novosibirsk', + '(GMT+0700) Asia/Novosibirsk', + ), + ('Asia/Phnom_Penh', '(GMT+0700) Asia/Phnom_Penh'), + ('Asia/Pontianak', '(GMT+0700) Asia/Pontianak'), + ('Asia/Tomsk', '(GMT+0700) Asia/Tomsk'), + ('Asia/Vientiane', '(GMT+0700) Asia/Vientiane'), + ( + 'Indian/Christmas', + '(GMT+0700) Indian/Christmas', + ), + ('Asia/Brunei', '(GMT+0800) Asia/Brunei'), + ('Asia/Choibalsan', '(GMT+0800) Asia/Choibalsan'), + ('Asia/Hong_Kong', '(GMT+0800) Asia/Hong_Kong'), + ('Asia/Irkutsk', '(GMT+0800) Asia/Irkutsk'), + ( + 'Asia/Kuala_Lumpur', + '(GMT+0800) Asia/Kuala_Lumpur', + ), + ('Asia/Kuching', '(GMT+0800) Asia/Kuching'), + ('Asia/Macau', '(GMT+0800) Asia/Macau'), + ('Asia/Makassar', '(GMT+0800) Asia/Makassar'), + ('Asia/Manila', '(GMT+0800) Asia/Manila'), + ('Asia/Shanghai', '(GMT+0800) Asia/Shanghai'), + ('Asia/Singapore', '(GMT+0800) Asia/Singapore'), + ('Asia/Taipei', '(GMT+0800) Asia/Taipei'), + ( + 'Asia/Ulaanbaatar', + '(GMT+0800) Asia/Ulaanbaatar', + ), + ('Australia/Perth', '(GMT+0800) Australia/Perth'), + ('Australia/Eucla', '(GMT+0845) Australia/Eucla'), + ('Asia/Chita', '(GMT+0900) Asia/Chita'), + ('Asia/Dili', '(GMT+0900) Asia/Dili'), + ('Asia/Jayapura', '(GMT+0900) Asia/Jayapura'), + ('Asia/Khandyga', '(GMT+0900) Asia/Khandyga'), + ('Asia/Pyongyang', '(GMT+0900) Asia/Pyongyang'), + ('Asia/Seoul', '(GMT+0900) Asia/Seoul'), + ('Asia/Tokyo', '(GMT+0900) Asia/Tokyo'), + ('Asia/Yakutsk', '(GMT+0900) Asia/Yakutsk'), + ('Pacific/Palau', '(GMT+0900) Pacific/Palau'), + ( + 'Australia/Darwin', + '(GMT+0930) Australia/Darwin', + ), + ( + 'Antarctica/DumontDUrville', + '(GMT+1000) Antarctica/DumontDUrville', + ), + ('Asia/Ust-Nera', '(GMT+1000) Asia/Ust-Nera'), + ( + 'Asia/Vladivostok', + '(GMT+1000) Asia/Vladivostok', + ), + ( + 'Australia/Brisbane', + '(GMT+1000) Australia/Brisbane', + ), + ( + 'Australia/Lindeman', + '(GMT+1000) Australia/Lindeman', + ), + ('Pacific/Chuuk', '(GMT+1000) Pacific/Chuuk'), + ('Pacific/Guam', '(GMT+1000) Pacific/Guam'), + ( + 'Pacific/Port_Moresby', + '(GMT+1000) Pacific/Port_Moresby', + ), + ('Pacific/Saipan', '(GMT+1000) Pacific/Saipan'), + ( + 'Australia/Adelaide', + '(GMT+1030) Australia/Adelaide', + ), + ( + 'Australia/Broken_Hill', + '(GMT+1030) Australia/Broken_Hill', + ), + ( + 'Antarctica/Casey', + '(GMT+1100) Antarctica/Casey', + ), + ( + 'Antarctica/Macquarie', + '(GMT+1100) Antarctica/Macquarie', + ), + ('Asia/Magadan', '(GMT+1100) Asia/Magadan'), + ('Asia/Sakhalin', '(GMT+1100) Asia/Sakhalin'), + ( + 'Asia/Srednekolymsk', + '(GMT+1100) Asia/Srednekolymsk', + ), + ( + 'Australia/Hobart', + '(GMT+1100) Australia/Hobart', + ), + ( + 'Australia/Lord_Howe', + '(GMT+1100) Australia/Lord_Howe', + ), + ( + 'Australia/Melbourne', + '(GMT+1100) Australia/Melbourne', + ), + ( + 'Australia/Sydney', + '(GMT+1100) Australia/Sydney', + ), + ( + 'Pacific/Bougainville', + '(GMT+1100) Pacific/Bougainville', + ), + ('Pacific/Efate', '(GMT+1100) Pacific/Efate'), + ( + 'Pacific/Guadalcanal', + '(GMT+1100) Pacific/Guadalcanal', + ), + ('Pacific/Kosrae', '(GMT+1100) Pacific/Kosrae'), + ('Pacific/Noumea', '(GMT+1100) Pacific/Noumea'), + ('Pacific/Pohnpei', '(GMT+1100) Pacific/Pohnpei'), + ('Asia/Anadyr', '(GMT+1200) Asia/Anadyr'), + ('Asia/Kamchatka', '(GMT+1200) Asia/Kamchatka'), + ('Pacific/Fiji', '(GMT+1200) Pacific/Fiji'), + ( + 'Pacific/Funafuti', + '(GMT+1200) Pacific/Funafuti', + ), + ( + 'Pacific/Kwajalein', + '(GMT+1200) Pacific/Kwajalein', + ), + ('Pacific/Majuro', '(GMT+1200) Pacific/Majuro'), + ('Pacific/Nauru', '(GMT+1200) Pacific/Nauru'), + ('Pacific/Norfolk', '(GMT+1200) Pacific/Norfolk'), + ('Pacific/Tarawa', '(GMT+1200) Pacific/Tarawa'), + ('Pacific/Wake', '(GMT+1200) Pacific/Wake'), + ('Pacific/Wallis', '(GMT+1200) Pacific/Wallis'), + ( + 'Antarctica/McMurdo', + '(GMT+1300) Antarctica/McMurdo', + ), + ('Pacific/Apia', '(GMT+1300) Pacific/Apia'), + ( + 'Pacific/Auckland', + '(GMT+1300) Pacific/Auckland', + ), + ('Pacific/Fakaofo', '(GMT+1300) Pacific/Fakaofo'), + ('Pacific/Kanton', '(GMT+1300) Pacific/Kanton'), + ( + 'Pacific/Tongatapu', + '(GMT+1300) Pacific/Tongatapu', + ), + ('Pacific/Chatham', '(GMT+1345) Pacific/Chatham'), + ( + 'Pacific/Kiritimati', + '(GMT+1400) Pacific/Kiritimati', + ), + ], + max_length=255, + ), + ), + ( + 'user', + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name='profile', + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + 'get_latest_by': 'modified', + 'abstract': False, + }, + ), + ] diff --git a/vrobbler/apps/profiles/migrations/__init__.py b/vrobbler/apps/profiles/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vrobbler/apps/profiles/models.py b/vrobbler/apps/profiles/models.py new file mode 100644 index 0000000..ef7f12e --- /dev/null +++ b/vrobbler/apps/profiles/models.py @@ -0,0 +1,18 @@ +from django.contrib.auth import get_user_model +from django.db import models +from django_extensions.db.models import TimeStampedModel +from profiles.constants import PRETTY_TIMEZONE_CHOICES + +User = get_user_model() + + +class UserProfile(TimeStampedModel): + user = models.OneToOneField( + User, on_delete=models.CASCADE, related_name="profile" + ) + timezone = models.CharField( + max_length=255, choices=PRETTY_TIMEZONE_CHOICES + ) + + def __str__(self): + return f"User profile for {self.user}" diff --git a/vrobbler/apps/profiles/signals.py b/vrobbler/apps/profiles/signals.py new file mode 100644 index 0000000..7ac45cc --- /dev/null +++ b/vrobbler/apps/profiles/signals.py @@ -0,0 +1,13 @@ +from django.contrib.auth import get_user_model +from django.db.models.base import post_save +from django.dispatch import receiver + +from profiles.models import UserProfile + +User = get_user_model() + + +@receiver(post_save, sender=User) +def create_profile(sender, instance, created, **kwargs): + if created: + UserProfile.objects.create(user=instance) diff --git a/vrobbler/apps/profiles/utils.py b/vrobbler/apps/profiles/utils.py new file mode 100644 index 0000000..effd5bb --- /dev/null +++ b/vrobbler/apps/profiles/utils.py @@ -0,0 +1,25 @@ +import datetime +import settings +import pytz + +# need to translate to a non-naive timezone, even if timezone == settings.TIME_ZONE, so we can compare two dates +def to_user_timezone(date, profile): + timezone = profile.timezone if profile.timezone else settings.TIME_ZONE + return date.replace(tzinfo=pytz.timezone(settings.TIME_ZONE)).astimezone( + pytz.timezone(timezone) + ) + + +def to_system_timezone(date, profile): + timezone = profile.timezone if profile.timezone else settings.TIME_ZONE + return date.replace(tzinfo=pytz.timezone(timezone)).astimezone( + pytz.timezone(settings.TIME_ZONE) + ) + + +def now_timezone(): + return ( + datetime.datetime.now() + .replace(tzinfo=pytz.timezone(settings.TIME_ZONE)) + .astimezone(pytz.timezone(settings.TIME_ZONE)) + ) diff --git a/vrobbler/settings.py b/vrobbler/settings.py index 56da7d7..938b97c 100644 --- a/vrobbler/settings.py +++ b/vrobbler/settings.py @@ -84,6 +84,7 @@ INSTALLED_APPS = [ "django_extensions", 'rest_framework.authtoken', "cachalot", + "profiles", "scrobbles", "videos", "music",