Browse Source

Add user profile with a timezone

Colin Powell 2 years ago
parent
commit
a0af0bce05

+ 4 - 4
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"},

+ 1 - 0
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"

+ 0 - 0
vrobbler/apps/profiles/__init__.py


+ 9 - 0
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",)

+ 17 - 0
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:]

+ 1035 - 0
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,
+            },
+        ),
+    ]

+ 0 - 0
vrobbler/apps/profiles/migrations/__init__.py


+ 18 - 0
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}"

+ 13 - 0
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)

+ 25 - 0
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))
+    )

+ 1 - 0
vrobbler/settings.py

@@ -84,6 +84,7 @@ INSTALLED_APPS = [
     "django_extensions",
     'rest_framework.authtoken',
     "cachalot",
+    "profiles",
     "scrobbles",
     "videos",
     "music",