nlbone 0.7.3__py3-none-any.whl → 0.7.9__py3-none-any.whl

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.
@@ -7,7 +7,7 @@ from nlbone.config.settings import get_settings
7
7
 
8
8
 
9
9
  class CreateTicketIn(BaseModel):
10
- assignee_id: str
10
+ assignee_id: str | None = None
11
11
  category_id: int
12
12
  channel: str
13
13
  direction: str
@@ -18,7 +18,7 @@ class DomainError(Exception):
18
18
 
19
19
 
20
20
 
21
- class Message(BaseModel):
21
+ class Message:
22
22
  pass
23
23
 
24
24
 
@@ -33,6 +33,13 @@ class DomainEvent(Message):
33
33
  def name(self):
34
34
  return self.__class__.__name__
35
35
 
36
+ def model_dump(self):
37
+ d = self.__dict__
38
+ for k, v in d.items():
39
+ if isinstance(v, BaseId):
40
+ d[k] = v.value
41
+ return d
42
+
36
43
 
37
44
  @dataclass(frozen=True)
38
45
  class Command:
@@ -106,3 +113,6 @@ class BaseId(ValueObject):
106
113
  @classmethod
107
114
  def from_int(cls: type[ID], v: int) -> ID:
108
115
  return cls(v)
116
+
117
+ def __repr__(self):
118
+ return f"<{self.value}>"
@@ -74,6 +74,7 @@ class Outbox(Base):
74
74
  self.status = OutboxStatus.FAILED
75
75
  self.last_error = error
76
76
  self.next_attempt_at = now() + backoff
77
+ self.attempts += 1
77
78
 
78
79
  def mark_published(self):
79
80
  self.status = OutboxStatus.PUBLISHED
@@ -1,5 +1,6 @@
1
1
  import functools
2
2
 
3
+ from .auth import client_has_access_func
3
4
  from nlbone.adapters.auth import KeycloakAuthService
4
5
  from nlbone.interfaces.api.exceptions import ForbiddenException, UnauthorizedException
5
6
  from nlbone.utils.context import current_request
@@ -23,10 +24,7 @@ def client_has_access(*, permissions=None):
23
24
  def decorator(func):
24
25
  @functools.wraps(func)
25
26
  async def wrapper(*args, **kwargs):
26
- request = current_request()
27
- if not KeycloakAuthService().client_has_access(request.state.token, permissions=permissions):
28
- raise ForbiddenException(f"Forbidden {permissions}")
29
-
27
+ client_has_access_func(permissions=permissions)
30
28
  return await func(*args, **kwargs)
31
29
 
32
30
  return wrapper
@@ -1,10 +1,18 @@
1
1
  from pydantic import BaseModel, ConfigDict, model_serializer
2
2
 
3
+ from nlbone.core.domain.base import BaseId
4
+
3
5
  EXCLUDE_NONE = "exclude_none"
4
6
 
5
7
 
6
8
  class BaseResponseModel(BaseModel):
7
- model_config = ConfigDict(from_attributes=True)
9
+ model_config = ConfigDict(
10
+ from_attributes=True,
11
+ arbitrary_types_allowed=True,
12
+ json_encoders={
13
+ BaseId: lambda v: v.value,
14
+ },
15
+ )
8
16
 
9
17
  @model_serializer(mode="wrap")
10
18
  def _auto_hide_none_fields(self, handler):
nlbone/utils/http.py CHANGED
@@ -4,13 +4,15 @@ import json
4
4
  from typing import Any
5
5
  from urllib.parse import urlparse, urlunparse
6
6
 
7
+ from nlbone.utils.context import current_request
8
+
7
9
 
8
10
  def auth_headers(token: str | None) -> dict[str, str]:
9
11
  return {"Authorization": f"Bearer {token}"} if token else {}
10
12
 
11
13
 
12
14
  def build_list_query(
13
- limit: int, offset: int, filters: dict[str, Any] | None, sort: list[tuple[str, str]] | None
15
+ limit: int, offset: int, filters: dict[str, Any] | None, sort: list[tuple[str, str]] | None
14
16
  ) -> dict[str, Any]:
15
17
  q: dict[str, Any] = {"limit": limit, "offset": offset}
16
18
  if filters:
@@ -27,3 +29,7 @@ def normalize_https_base(url: str, enforce_https: bool = True) -> str:
27
29
  if p.path.endswith("/"):
28
30
  p = p._replace(path=p.path.rstrip("/"))
29
31
  return str(urlunparse(p))
32
+
33
+
34
+ def get_service_base_url() -> str:
35
+ return current_request().base_url
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nlbone
3
- Version: 0.7.3
3
+ Version: 0.7.9
4
4
  Summary: Backbone package for interfaces and infrastructure in Python projects
5
5
  Author-email: Amir Hosein Kahkbazzadeh <a.khakbazzadeh@gmail.com>
6
6
  License: MIT
@@ -40,7 +40,7 @@ nlbone/adapters/percolation/__init__.py,sha256=0h1Bw7FzxgkDIHxeoyQXSfegrhP6VbpYV
40
40
  nlbone/adapters/percolation/connection.py,sha256=1iJISSwMEh4r_6nJI7mYf_v64Q0eeU1eSI0wLIfOK14,415
41
41
  nlbone/adapters/repositories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
42
  nlbone/adapters/ticketing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- nlbone/adapters/ticketing/client.py,sha256=V5_u7cxV67eAG4jj4vUD23VWGiMXIXSAU362pNS6hYU,1289
43
+ nlbone/adapters/ticketing/client.py,sha256=GAr0_4DVqVCDV7tT2gkxRyKIsvLwJRlT-xx8fsfOVJE,1303
44
44
  nlbone/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  nlbone/config/logging.py,sha256=Ot6Ctf7EQZlW8YNB-uBdleqI6wixn5fH0Eo6QRgNkQk,4358
46
46
  nlbone/config/settings.py,sha256=o5kJBHuv-XKFOe_yQtkR0YrEbI2uZ89JpGjzDYhE7o4,4507
@@ -53,8 +53,8 @@ nlbone/core/application/registry.py,sha256=dTqV_4bkMsLJ60CesZuEel5xO36cD1qikiaCL
53
53
  nlbone/core/application/use_case.py,sha256=3GMQZ3CFK5cbLoBNBgohPft6GBq2j9_wr8iKRq_osQA,247
54
54
  nlbone/core/application/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  nlbone/core/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
- nlbone/core/domain/base.py,sha256=EpjTDjSFV3or26_4qWh96JQ2hEIyStymhp16L9cuxJ4,2309
57
- nlbone/core/domain/models.py,sha256=VEIfzruBXcF5XrDrWEvh9q-Ba9-9x_JG20wZsBF5thc,3270
56
+ nlbone/core/domain/base.py,sha256=CZvnZQ5qcAufLnyttBAr1dAKeAkqLpkjuMzFUldkHQI,2525
57
+ nlbone/core/domain/models.py,sha256=zHVrCl_8ogmShrH0lRZQam0BpMJ7iIM-ojKNoGVzx2M,3297
58
58
  nlbone/core/ports/__init__.py,sha256=syJg3fAjQALD5Rjfm9wi9bQpkIvNTWjE9AURBmy587o,132
59
59
  nlbone/core/ports/auth.py,sha256=C-GmUqHNx4bAku6KbW_OTpPXCEfurBWWyDi9KxpTi9M,553
60
60
  nlbone/core/ports/cache.py,sha256=8pP_z4ta7PNNG8UiSrEF4xMZRm2wLPxISZvdPt7QnxQ,2351
@@ -76,7 +76,7 @@ nlbone/interfaces/api/additional_filed/resolver.py,sha256=jv1TIBBHN4LBIMwHGipcy4
76
76
  nlbone/interfaces/api/additional_filed/default_field_rules/__init__.py,sha256=LUSAOO3xRUt5ptlraIx7H-7dSkdr1D-WprmnqXRB16g,48
77
77
  nlbone/interfaces/api/additional_filed/default_field_rules/image_field_rules.py,sha256=ecKqPeXZ-YiF14RK9PmK7ln3PCzpCUc18S5zm5IF3fw,339
78
78
  nlbone/interfaces/api/dependencies/__init__.py,sha256=rnYRrFVZCfICQrp_PVFlzNg3BeC57yM08wn2DbOHCfk,359
79
- nlbone/interfaces/api/dependencies/async_auth.py,sha256=bfxgBXhp29WqevjTG4jrdPNR-75APm4jKyHdOOtxnp4,1825
79
+ nlbone/interfaces/api/dependencies/async_auth.py,sha256=FBa73JUE2D82k2P1k4daN4IdvZbrbCwREqPJKfYc-4Q,1710
80
80
  nlbone/interfaces/api/dependencies/auth.py,sha256=dKq3TIJN4CqKZcRIlMV3rz3v8sFgh9Rz_slIP2VNcvs,3083
81
81
  nlbone/interfaces/api/dependencies/db.py,sha256=-UD39J_86UU7ZJs2ZncpdND0yhAG0NeeeALrgSDuuFw,466
82
82
  nlbone/interfaces/api/dependencies/uow.py,sha256=QfLEvLYLNWZJQN1k-0q0hBVtUld3D75P4j39q_RjcnE,1181
@@ -88,7 +88,7 @@ nlbone/interfaces/api/pagination/__init__.py,sha256=pA1uC4rK6eqDI5IkLVxmgO2B6lEx
88
88
  nlbone/interfaces/api/pagination/offset_base.py,sha256=65UgQZ70IlWUbP9Usd--IxVYW_V0hQLoyXHVffnLFZ0,3940
89
89
  nlbone/interfaces/api/schema/__init__.py,sha256=LAqgynfupeqOQ6u0I5ucrcYnojRMZUg9yW8IjKSQTNI,119
90
90
  nlbone/interfaces/api/schema/adaptive_schema.py,sha256=bdWBNpP2NfOJ_in4btXn0lrZOK70x-OqfmZ-NpIJdoQ,3347
91
- nlbone/interfaces/api/schema/base_response_model.py,sha256=lkBs7k0IcQiSQdJ3KvqDQPr_zwqKNbwaQjcwAE_chnU,599
91
+ nlbone/interfaces/api/schema/base_response_model.py,sha256=LHsjP8Axy1ASqmjXYt9wrTVzvB0S_bP7tYorOWW3vi4,770
92
92
  nlbone/interfaces/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
93
  nlbone/interfaces/cli/crypto.py,sha256=lh2uUbSYKT6XxAt9uP1-VksopqAgdxiSKoKgXwXB0aE,692
94
94
  nlbone/interfaces/cli/init_db.py,sha256=Hk3aZ8w9KdfgQfDWaOnIgNEAegn2uNggkkSgDXQLgyc,1791
@@ -103,12 +103,12 @@ nlbone/utils/cache_keys.py,sha256=Y2YSellHTbUOcoaNbl1jaD4r485VU_e4KXsfBWhYTBo,10
103
103
  nlbone/utils/cache_registry.py,sha256=w28sEfUQZAhzCCqVH5TflWQY3nyDXyEcFWt8hkuHRHw,823
104
104
  nlbone/utils/context.py,sha256=MmclJ24BG2uvSTg1IK7J-Da9BhVFDQ5ag4Ggs2FF1_w,1600
105
105
  nlbone/utils/crypto.py,sha256=PX0Tlf2nqXcGbuv16J26MoUPzo2c4xcD4sZBXxhBXgQ,746
106
- nlbone/utils/http.py,sha256=UXUoXgQdTRNT08ho8zl-C5ekfDsD8uf-JiMQ323ooqw,872
106
+ nlbone/utils/http.py,sha256=MPDEyaC16AKsL0YH6sWCPp8NC2TgzEHpWERYK5HcaYQ,1001
107
107
  nlbone/utils/normalize_mobile.py,sha256=sGH4tV9gX-6eVKozviNWJhm1DN1J28Nj-ERldCYkS_E,732
108
108
  nlbone/utils/redactor.py,sha256=-V4HrHmHwPi3Kez587Ek1uJlgK35qGSrwBOvcbw8Jas,1279
109
109
  nlbone/utils/time.py,sha256=DjjyQ9GLsfXoT6NK8RDW2rOlJg3e6sF04Jw6PBUrSvg,1268
110
- nlbone-0.7.3.dist-info/METADATA,sha256=oE6yopvG_cQ_3S7k4a2WqDnaMnDmH6ZiY4oYUiRzCRA,2294
111
- nlbone-0.7.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
112
- nlbone-0.7.3.dist-info/entry_points.txt,sha256=CpIL45t5nbhl1dGQPhfIIDfqqak3teK0SxPGBBr7YCk,59
113
- nlbone-0.7.3.dist-info/licenses/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
- nlbone-0.7.3.dist-info/RECORD,,
110
+ nlbone-0.7.9.dist-info/METADATA,sha256=1-hx7pAzBEG6b6Ca4FWuNul73MaIbAfktgUlyvyQS9w,2294
111
+ nlbone-0.7.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
112
+ nlbone-0.7.9.dist-info/entry_points.txt,sha256=CpIL45t5nbhl1dGQPhfIIDfqqak3teK0SxPGBBr7YCk,59
113
+ nlbone-0.7.9.dist-info/licenses/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
+ nlbone-0.7.9.dist-info/RECORD,,
File without changes