Невозможно получить время даты 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), есть ли способ автоматически (через промежуточное ПО) сделать его осведомленным, используя часовой пояс арендатора?

Вернуться на верх