Add user profile with a timezone
This commit is contained in:
0
vrobbler/apps/profiles/__init__.py
Normal file
0
vrobbler/apps/profiles/__init__.py
Normal file
9
vrobbler/apps/profiles/admin.py
Normal file
9
vrobbler/apps/profiles/admin.py
Normal file
@ -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
vrobbler/apps/profiles/constants.py
Normal file
17
vrobbler/apps/profiles/constants.py
Normal file
@ -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
vrobbler/apps/profiles/migrations/0001_initial.py
Normal file
1035
vrobbler/apps/profiles/migrations/0001_initial.py
Normal file
File diff suppressed because it is too large
Load Diff
0
vrobbler/apps/profiles/migrations/__init__.py
Normal file
0
vrobbler/apps/profiles/migrations/__init__.py
Normal file
18
vrobbler/apps/profiles/models.py
Normal file
18
vrobbler/apps/profiles/models.py
Normal file
@ -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
vrobbler/apps/profiles/signals.py
Normal file
13
vrobbler/apps/profiles/signals.py
Normal file
@ -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
vrobbler/apps/profiles/utils.py
Normal file
25
vrobbler/apps/profiles/utils.py
Normal file
@ -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))
|
||||
)
|
||||
@ -84,6 +84,7 @@ INSTALLED_APPS = [
|
||||
"django_extensions",
|
||||
'rest_framework.authtoken',
|
||||
"cachalot",
|
||||
"profiles",
|
||||
"scrobbles",
|
||||
"videos",
|
||||
"music",
|
||||
|
||||
Reference in New Issue
Block a user