mirror of https://github.com/jumpserver/jumpserver
perf: country code api (#13672)
* perf: remove notification migrations * perf: country code api --------- Co-authored-by: ibuler <ibuler@qq.com>pull/13673/head
parent
5c1d0238e1
commit
e36d51cc0b
|
@ -5,18 +5,18 @@ import uuid
|
||||||
|
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
|
||||||
from rest_framework.views import APIView
|
|
||||||
from rest_framework.response import Response
|
|
||||||
from rest_framework import generics, serializers
|
from rest_framework import generics, serializers
|
||||||
|
from rest_framework.permissions import AllowAny
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
|
from common.const import KEY_CACHE_RESOURCE_IDS, COUNTRY_CALLING_CODES
|
||||||
from common.permissions import IsValidUser
|
from common.permissions import IsValidUser
|
||||||
from common.views.http import HttpResponseTemporaryRedirect
|
|
||||||
from common.utils import get_logger
|
from common.utils import get_logger
|
||||||
from common.const import KEY_CACHE_RESOURCE_IDS
|
from common.views.http import HttpResponseTemporaryRedirect
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
'LogTailApi', 'ResourcesIDCacheApi'
|
'LogTailApi', 'ResourcesIDCacheApi', 'CountryListApi'
|
||||||
]
|
]
|
||||||
|
|
||||||
logger = get_logger(__file__)
|
logger = get_logger(__file__)
|
||||||
|
@ -96,6 +96,13 @@ class ResourcesIDCacheApi(APIView):
|
||||||
return Response({'spm': spm})
|
return Response({'spm': spm})
|
||||||
|
|
||||||
|
|
||||||
|
class CountryListApi(APIView):
|
||||||
|
permission_classes = (AllowAny,)
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
return Response(COUNTRY_CALLING_CODES)
|
||||||
|
|
||||||
|
|
||||||
@csrf_exempt
|
@csrf_exempt
|
||||||
def redirect_plural_name_api(request, *args, **kwargs):
|
def redirect_plural_name_api(request, *args, **kwargs):
|
||||||
resource = kwargs.get("resource", "")
|
resource = kwargs.get("resource", "")
|
||||||
|
|
|
@ -1,11 +1,58 @@
|
||||||
|
import phonenumbers
|
||||||
|
import pycountry
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from phonenumbers import PhoneMetadata
|
||||||
|
|
||||||
ADMIN = 'Admin'
|
ADMIN = 'Admin'
|
||||||
USER = 'User'
|
USER = 'User'
|
||||||
AUDITOR = 'Auditor'
|
AUDITOR = 'Auditor'
|
||||||
|
|
||||||
|
|
||||||
|
def get_country_phone_codes():
|
||||||
|
phone_codes = []
|
||||||
|
for region_code in phonenumbers.SUPPORTED_REGIONS:
|
||||||
|
phone_metadata = PhoneMetadata.metadata_for_region(region_code)
|
||||||
|
if phone_metadata:
|
||||||
|
phone_codes.append((region_code, phone_metadata.country_code))
|
||||||
|
return phone_codes
|
||||||
|
|
||||||
|
|
||||||
|
def get_country(region_code):
|
||||||
|
country = pycountry.countries.get(alpha_2=region_code)
|
||||||
|
if country:
|
||||||
|
return country
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def get_country_phone_choices():
|
||||||
|
codes = get_country_phone_codes()
|
||||||
|
choices = []
|
||||||
|
for code, phone in codes:
|
||||||
|
country = get_country(code)
|
||||||
|
if not country:
|
||||||
|
continue
|
||||||
|
country_name = country.name
|
||||||
|
flag = country.flag
|
||||||
|
|
||||||
|
if country.name == 'China':
|
||||||
|
country_name = _('China')
|
||||||
|
|
||||||
|
if code == 'TW':
|
||||||
|
country_name = 'Taiwan'
|
||||||
|
flag = get_country('CN').flag
|
||||||
|
choices.append({
|
||||||
|
'name': country_name,
|
||||||
|
'phone_code': f'+{phone}',
|
||||||
|
'flag': flag,
|
||||||
|
'code': code,
|
||||||
|
})
|
||||||
|
|
||||||
|
choices.sort(key=lambda x: x['name'])
|
||||||
|
return choices
|
||||||
|
|
||||||
|
|
||||||
class Trigger(models.TextChoices):
|
class Trigger(models.TextChoices):
|
||||||
manual = 'manual', _('Manual trigger')
|
manual = 'manual', _('Manual trigger')
|
||||||
timing = 'timing', _('Timing trigger')
|
timing = 'timing', _('Timing trigger')
|
||||||
|
@ -28,17 +75,4 @@ class Language(models.TextChoices):
|
||||||
jp = 'ja', '日本語',
|
jp = 'ja', '日本語',
|
||||||
|
|
||||||
|
|
||||||
COUNTRY_CALLING_CODES = [
|
COUNTRY_CALLING_CODES = get_country_phone_choices()
|
||||||
{'name': 'China(中国)', 'value': '+86'},
|
|
||||||
{'name': 'HongKong(中国香港)', 'value': '+852'},
|
|
||||||
{'name': 'Macao(中国澳门)', 'value': '+853'},
|
|
||||||
{'name': 'Taiwan(中国台湾)', 'value': '+886'},
|
|
||||||
{'name': 'America(America)', 'value': '+1'},
|
|
||||||
{'name': 'Russia(Россия)', 'value': '+7'},
|
|
||||||
{'name': 'France(français)', 'value': '+33'},
|
|
||||||
{'name': 'Britain(Britain)', 'value': '+44'},
|
|
||||||
{'name': 'Germany(Deutschland)', 'value': '+49'},
|
|
||||||
{'name': 'Japan(日本)', 'value': '+81'},
|
|
||||||
{'name': 'Korea(한국)', 'value': '+82'},
|
|
||||||
{'name': 'India(भारत)', 'value': '+91'}
|
|
||||||
]
|
|
||||||
|
|
|
@ -9,4 +9,5 @@ app_name = 'common'
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('resources/cache/', api.ResourcesIDCacheApi.as_view(), name='resources-cache'),
|
path('resources/cache/', api.ResourcesIDCacheApi.as_view(), name='resources-cache'),
|
||||||
|
path('countries/', api.CountryListApi.as_view(), name='resources-cache'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -3,7 +3,7 @@ from rest_framework import generics
|
||||||
from rest_framework.permissions import AllowAny
|
from rest_framework.permissions import AllowAny
|
||||||
|
|
||||||
from authentication.permissions import IsValidUserOrConnectionToken
|
from authentication.permissions import IsValidUserOrConnectionToken
|
||||||
from common.const.choices import COUNTRY_CALLING_CODES, Language
|
from common.const.choices import Language
|
||||||
from common.utils import get_logger, lazyproperty
|
from common.utils import get_logger, lazyproperty
|
||||||
from common.utils.timezone import local_now
|
from common.utils.timezone import local_now
|
||||||
from .. import serializers
|
from .. import serializers
|
||||||
|
@ -26,7 +26,6 @@ class OpenPublicSettingApi(generics.RetrieveAPIView):
|
||||||
return {
|
return {
|
||||||
"XPACK_ENABLED": settings.XPACK_ENABLED,
|
"XPACK_ENABLED": settings.XPACK_ENABLED,
|
||||||
"INTERFACE": self.interface_setting,
|
"INTERFACE": self.interface_setting,
|
||||||
"COUNTRY_CALLING_CODES": COUNTRY_CALLING_CODES,
|
|
||||||
"LANGUAGES": [
|
"LANGUAGES": [
|
||||||
{
|
{
|
||||||
'name': title,
|
'name': title,
|
||||||
|
|
|
@ -11,7 +11,6 @@ __all__ = [
|
||||||
class PublicSettingSerializer(serializers.Serializer):
|
class PublicSettingSerializer(serializers.Serializer):
|
||||||
XPACK_ENABLED = serializers.BooleanField()
|
XPACK_ENABLED = serializers.BooleanField()
|
||||||
INTERFACE = serializers.DictField()
|
INTERFACE = serializers.DictField()
|
||||||
COUNTRY_CALLING_CODES = serializers.ListField()
|
|
||||||
LANGUAGES = serializers.ListField()
|
LANGUAGES = serializers.ListField()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4258,6 +4258,17 @@ files = [
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pyasn1 = ">=0.4.6,<0.7.0"
|
pyasn1 = ">=0.4.6,<0.7.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pycountry"
|
||||||
|
version = "24.6.1"
|
||||||
|
description = "ISO country, subdivision, language, currency and script definitions and their translations"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "pycountry-24.6.1-py3-none-any.whl", hash = "sha256:f1a4fb391cd7214f8eefd39556d740adcc233c778a27f8942c8dca351d6ce06f"},
|
||||||
|
{file = "pycountry-24.6.1.tar.gz", hash = "sha256:b61b3faccea67f87d10c1f2b0fc0be714409e8fcdcc1315613174f6466c10221"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pycparser"
|
name = "pycparser"
|
||||||
version = "2.21"
|
version = "2.21"
|
||||||
|
@ -6474,4 +6485,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.11"
|
python-versions = "^3.11"
|
||||||
content-hash = "663cfb5f4a5c53f2d667e7eb5436ed81ceebf97521008e7118e3db47f6ce20bf"
|
content-hash = "750e14deaf075de2d69164d39ea3d7908de2bb60b75e28a8702077dbf5eb60f1"
|
||||||
|
|
|
@ -167,6 +167,7 @@ elasticsearch8 = "8.13.2"
|
||||||
polib = "^1.2.0"
|
polib = "^1.2.0"
|
||||||
# psycopg2 = "2.9.6"
|
# psycopg2 = "2.9.6"
|
||||||
psycopg2-binary = "2.9.6"
|
psycopg2-binary = "2.9.6"
|
||||||
|
pycountry = "^24.6.1"
|
||||||
|
|
||||||
[tool.poetry.group.xpack]
|
[tool.poetry.group.xpack]
|
||||||
optional = true
|
optional = true
|
||||||
|
|
Loading…
Reference in New Issue