Невозможно получить время даты graphql в часовом поясе арендатора
Мы работаем над приложением django для нескольких арендаторов, в котором необходимо отображать даты в часовых поясах арендаторов.
Мы добиваемся многопользовательской аренды с помощью django-tenants, он разделяет арендаторов через Posgresql на разные схемы.
Мы используем graphql через graphene для демонстрации наших API, и мы хотели бы сделать эту реализацию прозрачной для него, таким образом избегая манипулирования каждым временем даты, которое мы получаем на вход с помощью timezone.localtime(received_datetime).
Мы написали промежуточное программное обеспечение, которое должно делать эту работу, но запросы в graphene продолжают отображать наивные времена даты, насколько мы понимаем, это происходит потому, что django, хотя и знает временные зоны, управляет временными зонами дат только на уровне форм и шаблонов, согласно документации: https://docs.djangoproject.com/en/4.1/topics/i18n/timezones/
Когда поддержка часовых поясов включена, Django хранит информацию о времени в UTC в базе данных, использует объекты времени с учетом часовых поясов внутри, и переводит их в часовой пояс конечного пользователя в шаблонах и формах.
При просмотре значений timezone.now и timezone.localtime(timezone.now) мы получаем правильные результаты, но каждая дата, которую мы получаем из graphql, является одновременно известной и с временной зоной django "from settings" (UTC), вместо временной зоны арендатора:
timezone.now(). # prints 2022-09-02 13:38:46.658864+00:00
timezone.localtime(timezone.now()) # prints 2022-09-02 22:56:16.620355+09:00
Запрос graphql api вместо этого выводит:
"edges”: [
{
“node”: {
“id”: “UG9saWN5Tm9kZToxNQ==“,
“createdAt”: “2022-09-01T13:55:04.542763+00:00" # in UTC timezone, instead of tenant's timezone
}
}
]
middleware.py
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
tenant = request.tenant
if not tenant.schema_name == "public":
if tenant.timezone:
timezone.activate(pytz.timezone(tenant.timezone))
else:
timezone.deactivate()
return self.get_response(request)
settings.py
...
TIME_ZONE = "UTC"
USE_TZ = True
...
tenant_model.py
class Client(TenantMixin):
TIERS = [
('1', '1'),
('2', '2'),
('3','3')
]
name = models.CharField(max_length=100)
paid_until = models.DateField()
on_trial = models.BooleanField()
tier = models.CharField(max_length=20, choices=TIERS, default = '1')
created_on = models.DateField(auto_now_add=True)
storage_name = models.CharField(max_length=254, default='local')
dashboard_base_url = models.CharField(max_length=254, default='https://foo.bar')
auto_create_schema = True
timezone = models.CharField(max_length=254, default="Asia/Tokyo")
Каждое время даты, которое мы получаем на вход, является наивным временем (формат YYYY-MM-DDTHH:mm:ss), есть ли способ автоматически (через промежуточное ПО) сделать его осведомленным, используя часовой пояс арендатора?