diff --git a/apps/audits/models.py b/apps/audits/models.py index aef9cb480..c07b9de0f 100644 --- a/apps/audits/models.py +++ b/apps/audits/models.py @@ -12,7 +12,7 @@ from django.utils.translation import gettext, gettext_lazy as _ from common.db.encoder import ModelJSONFieldEncoder from common.sessions.cache import user_session_manager -from common.utils import lazyproperty, i18n_trans +from common.utils import lazyproperty, i18n_trans, get_ip_city from ops.models import JobExecution from orgs.mixins.models import OrgModelMixin, Organization from orgs.utils import current_org @@ -38,6 +38,13 @@ __all__ = [ ] +def _get_city_display(ip, city='') -> str: + try: + return get_ip_city(ip) or gettext(city or '') + except Exception: + return gettext(city or '') + + class JobLog(JobExecution): @property def creator_name(self) -> str: @@ -241,6 +248,10 @@ class UserLoginLog(models.Model): def backend_display(self) -> str: return gettext(self.backend) + @lazyproperty + def city_display(self) -> str: + return _get_city_display(self.ip, self.city) + @classmethod def get_login_logs(cls, date_from=None, date_to=None, user=None, keyword=None): login_logs = cls.objects.all() @@ -321,6 +332,10 @@ class UserSession(models.Model): def __str__(self): return '%s(%s)' % (self.user, self.ip) + @lazyproperty + def city_display(self) -> str: + return _get_city_display(self.ip, self.city) + @property def backend_display(self) -> str: return gettext(self.backend) diff --git a/apps/audits/serializers.py b/apps/audits/serializers.py index bfcf1e81c..357010601 100644 --- a/apps/audits/serializers.py +++ b/apps/audits/serializers.py @@ -75,6 +75,7 @@ class UserLoginLogSerializer(serializers.ModelSerializer): mfa = LabeledChoiceField(choices=MFAChoices.choices, label=_("MFA")) type = LabeledChoiceField(choices=LoginTypeChoices.choices, label=_("Type")) status = LabeledChoiceField(choices=LoginStatusChoices.choices, label=_("Status")) + city = serializers.ReadOnlyField(source='city_display', label=_("Login city")) class Meta: model = models.UserLoginLog @@ -223,6 +224,7 @@ class UserSessionSerializer(serializers.ModelSerializer): user = ObjectRelatedField(required=False, queryset=User.objects, label=_('User')) date_expired = serializers.DateTimeField(format="%Y/%m/%d %H:%M:%S", label=_('Date expired')) is_current_user_session = serializers.SerializerMethodField() + city = serializers.ReadOnlyField(source='city_display', label=_("Login city")) class Meta: model = models.UserSession