old_console/core/serializers.py
2024-11-02 14:12:45 +03:00

124 lines
4.8 KiB
Python

import datetime
import logging
from django.forms.utils import to_current_timezone
from django.utils.formats import get_format
from django.utils.translation import gettext_lazy
from rest_framework import serializers, ISO_8601
from rest_framework.serializers import *
from core.models import ConsoleAuthSettings, TLSSettings
_log = logging.getLogger(__name__)
class AuthSettingsSerializer(serializers.ModelSerializer):
class Meta:
model = ConsoleAuthSettings
fields = ('login_attempts_limit', 'login_block_timeout')
class TLSSettingsSerializer(serializers.ModelSerializer):
class Meta:
model = TLSSettings
fields = ["enabled", "certificate", "key"]
extra_kwargs = {
'enabled': {
'required': True
}
}
def validate(self, attrs):
file_count = 0
if attrs.get("certificate", None):
file_count += 1
if attrs.get("key", None):
file_count += 1
_log.info(f"File count: {file_count}")
attrs['file_count'] = file_count
if attrs['enabled'] and file_count == 0 and (not self.instance.certificate.name or
not self.instance.key.name):
_log.error("No cert or key provided from model")
raise ValidationError(gettext_lazy("No certificate or key provided"))
if file_count == 1:
_log.error("No cert or key provided from request")
raise ValidationError(gettext_lazy("No certificate or key provided"))
return attrs
def to_representation(self, tls_settings: TLSSettings) -> OrderedDict:
data = super(TLSSettingsSerializer, self).to_representation(tls_settings)
if tls_settings.certificate:
data['certificate'] = tls_settings.certificate.url
if tls_settings.key:
data['key'] = tls_settings.key.url
return data
class DateTimeLocalizedField(serializers.DateTimeField):
def __init__(self, format=empty, input_formats=None, default_timezone=None, *args, unix=False, **kwargs):
if unix:
format, input_formats = '%s', ['%s']
else:
if format is empty:
format = get_format('DATETIME_INPUT_FORMATS')[0]
if input_formats is None:
input_formats = get_format('DATETIME_INPUT_FORMATS')
input_formats.append(ISO_8601) # any locale support iso-8601
super().__init__(format, input_formats, default_timezone, *args, **kwargs)
class DateLocalizedField(serializers.DateField):
def __init__(self, format=empty, input_formats=None, *args, unix=False, **kwargs):
if unix:
format, input_formats = '%s', ['%s']
else:
if format is empty:
format = get_format('DATE_INPUT_FORMATS')[0]
if input_formats is None:
input_formats = get_format('DATE_INPUT_FORMATS')
input_formats.append(ISO_8601) # any locale support iso-8601
super().__init__(format, input_formats, *args, **kwargs)
class TimeLocalizedField(serializers.TimeField):
def __init__(self, format=empty, input_formats=None, *args, **kwargs):
if format is empty:
format = '%H:%M'
if input_formats is None:
input_formats = get_format('TIME_INPUT_FORMATS')
input_formats.append(ISO_8601) # any locale support iso-8601
super().__init__(format, input_formats, *args, **kwargs)
class TimeLocalizedTzAwareField(TimeLocalizedField):
@staticmethod
def _replace_time(datetime_obj, time_obj):
return datetime_obj.replace(hour=time_obj.hour, minute=time_obj.minute, second=time_obj.second,
microsecond=time_obj.microsecond)
def to_internal_value(self, value):
t_tz_naive = super().to_internal_value(value)
if isinstance(t_tz_naive, datetime.time):
dt_tz_aware = TimeLocalizedTzAwareField._replace_time(timezone.localtime(), t_tz_naive)
t_utc_naive = dt_tz_aware.astimezone().time()
value = t_utc_naive
return value
def to_representation(self, value):
t_utc_naive = value
if isinstance(t_utc_naive, datetime.time):
dt_utc_aware = TimeLocalizedTzAwareField._replace_time(timezone.now(), t_utc_naive)
t_tz_naive = to_current_timezone(dt_utc_aware).time()
value = t_tz_naive
return super().to_representation(value)
class ModelLocalizedSerializer(serializers.ModelSerializer):
serializer_field_mapping = serializers.ModelSerializer.serializer_field_mapping.copy()
serializer_field_mapping[models.DateField] = DateLocalizedField
serializer_field_mapping[models.DateTimeField] = DateTimeLocalizedField
serializer_field_mapping[models.TimeField] = TimeLocalizedTzAwareField