mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
feat: user timezones (#2009)
* dev: user timezones * feat: user timezones
This commit is contained in:
parent
23f5d5d172
commit
426f65898b
@ -1,24 +1,41 @@
|
|||||||
|
# Python imports
|
||||||
|
import zoneinfo
|
||||||
|
|
||||||
# Django imports
|
# Django imports
|
||||||
from django.urls import resolve
|
from django.urls import resolve
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.utils import timezone
|
||||||
# Third part imports
|
# Third part imports
|
||||||
|
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.viewsets import ModelViewSet
|
from rest_framework.viewsets import ModelViewSet
|
||||||
from rest_framework.exceptions import APIException
|
from rest_framework.exceptions import APIException
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.filters import SearchFilter
|
from rest_framework.filters import SearchFilter
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
from rest_framework.exceptions import NotFound
|
|
||||||
from sentry_sdk import capture_exception
|
from sentry_sdk import capture_exception
|
||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend
|
||||||
|
|
||||||
# Module imports
|
# Module imports
|
||||||
from plane.db.models import Workspace, Project
|
|
||||||
from plane.utils.paginator import BasePaginator
|
from plane.utils.paginator import BasePaginator
|
||||||
|
|
||||||
|
|
||||||
class BaseViewSet(ModelViewSet, BasePaginator):
|
class TimezoneMixin:
|
||||||
|
"""
|
||||||
|
This enables timezone conversion according
|
||||||
|
to the user set timezone
|
||||||
|
"""
|
||||||
|
def initial(self, request, *args, **kwargs):
|
||||||
|
super().initial(request, *args, **kwargs)
|
||||||
|
if request.user.is_authenticated:
|
||||||
|
timezone.activate(zoneinfo.ZoneInfo(request.user.user_timezone))
|
||||||
|
else:
|
||||||
|
timezone.deactivate()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class BaseViewSet(TimezoneMixin, ModelViewSet, BasePaginator):
|
||||||
|
|
||||||
model = None
|
model = None
|
||||||
|
|
||||||
@ -67,7 +84,7 @@ class BaseViewSet(ModelViewSet, BasePaginator):
|
|||||||
return self.kwargs.get("pk", None)
|
return self.kwargs.get("pk", None)
|
||||||
|
|
||||||
|
|
||||||
class BaseAPIView(APIView, BasePaginator):
|
class BaseAPIView(TimezoneMixin, APIView, BasePaginator):
|
||||||
|
|
||||||
permission_classes = [
|
permission_classes = [
|
||||||
IsAuthenticated,
|
IsAuthenticated,
|
||||||
|
File diff suppressed because one or more lines are too long
@ -2,6 +2,7 @@
|
|||||||
import uuid
|
import uuid
|
||||||
import string
|
import string
|
||||||
import random
|
import random
|
||||||
|
import pytz
|
||||||
|
|
||||||
# Django imports
|
# Django imports
|
||||||
from django.db import models
|
from django.db import models
|
||||||
@ -9,9 +10,6 @@ from django.db.models.signals import post_save
|
|||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.contrib.auth.models import AbstractBaseUser, UserManager, PermissionsMixin
|
from django.contrib.auth.models import AbstractBaseUser, UserManager, PermissionsMixin
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.core.mail import EmailMultiAlternatives
|
|
||||||
from django.template.loader import render_to_string
|
|
||||||
from django.utils.html import strip_tags
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
# Third party imports
|
# Third party imports
|
||||||
@ -66,7 +64,8 @@ class User(AbstractBaseUser, PermissionsMixin):
|
|||||||
billing_address = models.JSONField(null=True)
|
billing_address = models.JSONField(null=True)
|
||||||
has_billing_address = models.BooleanField(default=False)
|
has_billing_address = models.BooleanField(default=False)
|
||||||
|
|
||||||
user_timezone = models.CharField(max_length=255, default="Asia/Kolkata")
|
USER_TIMEZONE_CHOICES = tuple(zip(pytz.all_timezones, pytz.all_timezones))
|
||||||
|
user_timezone = models.CharField(max_length=255, default="UTC", choices=USER_TIMEZONE_CHOICES)
|
||||||
|
|
||||||
last_active = models.DateTimeField(default=timezone.now, null=True)
|
last_active = models.DateTimeField(default=timezone.now, null=True)
|
||||||
last_login_time = models.DateTimeField(null=True)
|
last_login_time = models.DateTimeField(null=True)
|
||||||
|
@ -49,7 +49,7 @@ MIDDLEWARE = [
|
|||||||
"django.middleware.clickjacking.XFrameOptionsMiddleware",
|
"django.middleware.clickjacking.XFrameOptionsMiddleware",
|
||||||
"crum.CurrentRequestUserMiddleware",
|
"crum.CurrentRequestUserMiddleware",
|
||||||
"django.middleware.gzip.GZipMiddleware",
|
"django.middleware.gzip.GZipMiddleware",
|
||||||
]
|
]
|
||||||
|
|
||||||
REST_FRAMEWORK = {
|
REST_FRAMEWORK = {
|
||||||
"DEFAULT_AUTHENTICATION_CLASSES": (
|
"DEFAULT_AUTHENTICATION_CLASSES": (
|
||||||
@ -161,7 +161,7 @@ MEDIA_URL = "/media/"
|
|||||||
|
|
||||||
LANGUAGE_CODE = "en-us"
|
LANGUAGE_CODE = "en-us"
|
||||||
|
|
||||||
TIME_ZONE = "Asia/Kolkata"
|
TIME_ZONE = "UTC"
|
||||||
|
|
||||||
USE_I18N = True
|
USE_I18N = True
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user