nlbone 0.7.29__tar.gz → 0.7.31__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nlbone-0.7.29 → nlbone-0.7.31}/PKG-INFO +1 -1
- {nlbone-0.7.29 → nlbone-0.7.31}/pyproject.toml +1 -1
- nlbone-0.7.31/src/nlbone/adapters/i18n/__init__.py +11 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/i18n/engine.py +10 -3
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/i18n/loaders.py +35 -12
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/i18n/locales/fa-IR.json +0 -7
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/config/settings.py +2 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/exception_handlers.py +8 -4
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/exceptions.py +7 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/middleware/add_request_context.py +1 -0
- nlbone-0.7.29/src/nlbone/adapters/i18n/__init__.py +0 -7
- {nlbone-0.7.29 → nlbone-0.7.31}/.gitignore +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/LICENSE +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/README.md +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/auth/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/auth/auth_service.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/auth/keycloak.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/auth/token_provider.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/cache/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/cache/async_redis.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/cache/memory.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/cache/pubsub_listener.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/cache/redis.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/postgres/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/postgres/audit.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/postgres/base.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/postgres/engine.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/postgres/query_builder.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/postgres/repository.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/postgres/schema.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/postgres/types.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/postgres/uow.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/redis/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/db/redis/client.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/http_clients/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/http_clients/pricing/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/http_clients/pricing/pricing_service.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/http_clients/uploadchi/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/http_clients/uploadchi/uploadchi.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/http_clients/uploadchi/uploadchi_async.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/messaging/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/messaging/event_bus.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/messaging/rabbitmq.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/outbox/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/outbox/outbox_consumer.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/outbox/outbox_repo.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/percolation/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/percolation/connection.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/repositories/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/snowflake.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/ticketing/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/ticketing/client.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/config/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/config/logging.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/container.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/application/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/application/base_worker.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/application/bus.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/application/di.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/application/registry.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/application/services/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/application/use_case.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/domain/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/domain/base.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/domain/models.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/ports/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/ports/auth.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/ports/cache.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/ports/event_bus.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/ports/files.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/ports/outbox.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/ports/repository.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/ports/translation.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/core/ports/uow.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/additional_filed/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/additional_filed/assembler.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/additional_filed/default_field_rules/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/additional_filed/default_field_rules/image_field_rules.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/additional_filed/field_registry.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/additional_filed/resolver.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/dependencies/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/dependencies/async_auth.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/dependencies/auth.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/dependencies/client_credential.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/dependencies/db.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/dependencies/uow.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/middleware/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/middleware/access_log.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/middleware/authentication.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/pagination/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/pagination/offset_base.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/routers.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/schema/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/schema/adaptive_schema.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/schema/base_response_model.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/schemas.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/cli/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/cli/crypto.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/cli/init_db.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/cli/main.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/cli/ticket.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/jobs/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/jobs/dispatch_outbox.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/jobs/sync_tokens.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/types.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/__init__.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/cache.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/cache_keys.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/cache_registry.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/context.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/crypto.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/flatten_sqlalchemy_result.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/http.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/normalize_mobile.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/redactor.py +0 -0
- {nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/utils/time.py +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
from nlbone.config.settings import get_settings
|
|
4
|
+
|
|
5
|
+
from .engine import I18nAdapter
|
|
6
|
+
from .loaders import JSONFileLoader, CompositeLoader
|
|
7
|
+
|
|
8
|
+
loader = CompositeLoader()
|
|
9
|
+
loader.add_loader(JSONFileLoader(locales_path=Path(__file__).parent.joinpath("./locales").__str__()))
|
|
10
|
+
JSONFileLoader(locales_path=lambda: get_settings().PROJECT_LOCALE_PATH)
|
|
11
|
+
translator = I18nAdapter(loader=loader, default_locale="fa-IR")
|
|
@@ -7,12 +7,19 @@ from .loaders import BaseLoader
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class I18nAdapter(TranslationPort):
|
|
10
|
-
def __init__(self, loader: BaseLoader, default_locale: str = "fa"):
|
|
10
|
+
def __init__(self, loader: BaseLoader, default_locale: str = "fa-IR"):
|
|
11
11
|
self.default_locale = default_locale
|
|
12
|
-
self.
|
|
12
|
+
self.loader = loader
|
|
13
|
+
self._translations: Optional[Dict[str, Dict[str, str]]] = None
|
|
14
|
+
|
|
15
|
+
def _ensure_loaded(self):
|
|
16
|
+
if self._translations is None:
|
|
17
|
+
self._translations = self.loader.load()
|
|
13
18
|
|
|
14
19
|
def translate(self, key: str, locale: Optional[str] = None, **kwargs) -> str:
|
|
15
|
-
|
|
20
|
+
self._ensure_loaded()
|
|
21
|
+
|
|
22
|
+
target_locale = locale or self.default_locale
|
|
16
23
|
|
|
17
24
|
locale_data = self._translations.get(target_locale, {})
|
|
18
25
|
text = locale_data.get(key)
|
|
@@ -2,7 +2,7 @@ import json
|
|
|
2
2
|
import logging
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Any, Dict
|
|
5
|
+
from typing import Any, Dict, List, Callable, Union
|
|
6
6
|
|
|
7
7
|
logger = logging.getLogger(__name__)
|
|
8
8
|
|
|
@@ -13,33 +13,38 @@ class BaseLoader(ABC):
|
|
|
13
13
|
pass
|
|
14
14
|
|
|
15
15
|
|
|
16
|
+
from typing import Callable, Union
|
|
17
|
+
|
|
18
|
+
|
|
16
19
|
class JSONFileLoader(BaseLoader):
|
|
17
|
-
def __init__(self, locales_path: str):
|
|
18
|
-
self.
|
|
20
|
+
def __init__(self, locales_path: Union[str, Callable[[], str]]):
|
|
21
|
+
self.locales_path_provider = locales_path
|
|
19
22
|
|
|
20
23
|
def load(self) -> Dict[str, Dict[str, str]]:
|
|
21
24
|
translations: Dict[str, Dict[str, str]] = {}
|
|
22
25
|
|
|
23
|
-
|
|
26
|
+
if callable(self.locales_path_provider):
|
|
27
|
+
path_str = self.locales_path_provider()
|
|
28
|
+
else:
|
|
29
|
+
path_str = self.locales_path_provider
|
|
30
|
+
|
|
31
|
+
if not path_str:
|
|
32
|
+
return translations
|
|
33
|
+
|
|
34
|
+
path_obj = Path(path_str)
|
|
24
35
|
|
|
25
36
|
if not path_obj.exists():
|
|
26
|
-
logger.warning(f"Locales directory not found at: {self.locales_path}")
|
|
27
37
|
return translations
|
|
28
38
|
|
|
29
39
|
for file_path in path_obj.glob("*.json"):
|
|
30
40
|
try:
|
|
31
41
|
lang_code = file_path.stem
|
|
32
|
-
|
|
33
42
|
with open(file_path, "r", encoding="utf-8") as f:
|
|
34
43
|
data = json.load(f)
|
|
35
44
|
|
|
36
45
|
flat_data = self._flatten_dict(data)
|
|
37
46
|
translations[lang_code] = flat_data
|
|
38
47
|
|
|
39
|
-
logger.info(f"Loaded locale '{lang_code}' with {len(flat_data)} keys.")
|
|
40
|
-
|
|
41
|
-
except json.JSONDecodeError as e:
|
|
42
|
-
logger.error(f"Invalid JSON format in {file_path}: {e}")
|
|
43
48
|
except Exception as e:
|
|
44
49
|
logger.error(f"Error loading locale {file_path}: {e}")
|
|
45
50
|
|
|
@@ -49,10 +54,28 @@ class JSONFileLoader(BaseLoader):
|
|
|
49
54
|
items = []
|
|
50
55
|
for k, v in d.items():
|
|
51
56
|
new_key = f"{parent_key}{sep}{k}" if parent_key else k
|
|
52
|
-
|
|
53
57
|
if isinstance(v, dict):
|
|
54
58
|
items.extend(self._flatten_dict(v, new_key, sep=sep).items())
|
|
55
59
|
else:
|
|
56
60
|
items.append((new_key, str(v)))
|
|
57
|
-
|
|
58
61
|
return dict(items)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class CompositeLoader(BaseLoader):
|
|
65
|
+
def __init__(self):
|
|
66
|
+
self.loaders = []
|
|
67
|
+
|
|
68
|
+
def add_loader(self, loader: BaseLoader):
|
|
69
|
+
self.loaders.append(loader)
|
|
70
|
+
|
|
71
|
+
def load(self) -> Dict[str, Dict[str, str]]:
|
|
72
|
+
merged_translations: Dict[str, Dict[str, str]] = {}
|
|
73
|
+
|
|
74
|
+
for loader in self.loaders:
|
|
75
|
+
data = loader.load()
|
|
76
|
+
for lang, keys in data.items():
|
|
77
|
+
if lang not in merged_translations:
|
|
78
|
+
merged_translations[lang] = {}
|
|
79
|
+
merged_translations[lang].update(keys)
|
|
80
|
+
|
|
81
|
+
return merged_translations
|
|
@@ -113,6 +113,8 @@ class Settings(BaseSettings):
|
|
|
113
113
|
RABBITMQ_TICKETING_EXCHANGE: str = "crm_stage.ticket"
|
|
114
114
|
RABBITMQ_TICKETING_ROUTING_KEY_CREATE_V1: str = "crm_stage.ticket.create.v1"
|
|
115
115
|
|
|
116
|
+
PROJECT_LOCALE_PATH: str = ""
|
|
117
|
+
|
|
116
118
|
model_config = SettingsConfigDict(
|
|
117
119
|
env_prefix="",
|
|
118
120
|
env_file=None,
|
|
@@ -60,7 +60,8 @@ def install_exception_handlers(
|
|
|
60
60
|
"http_error",
|
|
61
61
|
extra={"status": exc.status_code, "detail": exc.detail, "path": request.url.path},
|
|
62
62
|
)
|
|
63
|
-
|
|
63
|
+
locale = locale = getattr(request.state, "locale", None)
|
|
64
|
+
return _json_response(request, exc.status_code, detail=_(exc.detail, locale=locale))
|
|
64
65
|
|
|
65
66
|
@app.exception_handler(FastAPIHTTPException)
|
|
66
67
|
async def _handle_fastapi_http_exception(request: Request, exc: FastAPIHTTPException):
|
|
@@ -69,7 +70,8 @@ def install_exception_handlers(
|
|
|
69
70
|
"fastapi_http_error",
|
|
70
71
|
extra={"status": exc.status_code, "detail": exc.detail, "path": request.url.path},
|
|
71
72
|
)
|
|
72
|
-
|
|
73
|
+
locale = locale = getattr(request.state, "locale", None)
|
|
74
|
+
return _json_response(request, exc.status_code, detail=_(exc.detail, locale=locale))
|
|
73
75
|
|
|
74
76
|
@app.exception_handler(StarletteHTTPException)
|
|
75
77
|
async def _handle_starlette_http_exception(request: Request, exc: StarletteHTTPException):
|
|
@@ -78,7 +80,8 @@ def install_exception_handlers(
|
|
|
78
80
|
"starlette_http_error",
|
|
79
81
|
extra={"status": exc.status_code, "detail": exc.detail, "path": request.url.path},
|
|
80
82
|
)
|
|
81
|
-
|
|
83
|
+
locale = locale = getattr(request.state, "locale", None)
|
|
84
|
+
return _json_response(request, exc.status_code, detail=_(exc.detail, locale=locale))
|
|
82
85
|
|
|
83
86
|
# 3) خطاهای اعتبارسنجی FastAPI (request body/query/path)
|
|
84
87
|
@app.exception_handler(RequestValidationError)
|
|
@@ -107,4 +110,5 @@ def install_exception_handlers(
|
|
|
107
110
|
if logger:
|
|
108
111
|
logger.exception("unhandled_exception", extra={"trace_id": tid, "path": request.url.path})
|
|
109
112
|
detail = str(exc) if expose_server_errors else "internal server error"
|
|
110
|
-
|
|
113
|
+
locale = locale = getattr(request.state, "locale", None)
|
|
114
|
+
return _json_response(request, 500, detail=_(detail, locale=locale), trace_id=tid)
|
|
@@ -99,3 +99,10 @@ class GoneException(BaseHttpException):
|
|
|
99
99
|
status_code=status.HTTP_410_GONE,
|
|
100
100
|
detail=detail,
|
|
101
101
|
)
|
|
102
|
+
|
|
103
|
+
class TooManyRequestsException(BaseHttpException):
|
|
104
|
+
def __init__(self, detail: str = "TooManyRequests"):
|
|
105
|
+
super().__init__(
|
|
106
|
+
status_code=status.HTTP_429_TOO_MANY_REQUESTS,
|
|
107
|
+
detail=detail,
|
|
108
|
+
)
|
|
@@ -46,6 +46,7 @@ class AddRequestContextMiddleware(BaseHTTPMiddleware):
|
|
|
46
46
|
ip = request.client.host if request.client else None
|
|
47
47
|
ua = request.headers.get("user-agent")
|
|
48
48
|
locale = request.headers.get("Accept-Language", 'fa-IR')
|
|
49
|
+
request.state.locale = locale
|
|
49
50
|
|
|
50
51
|
tokens = bind_context(request=request, request_id=req_id, user_id=user_id, ip=ip, user_agent=ua, locale=locale)
|
|
51
52
|
try:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/adapters/http_clients/uploadchi/uploadchi_async.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nlbone-0.7.29 → nlbone-0.7.31}/src/nlbone/interfaces/api/additional_filed/field_registry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|