Skip to content

Commit 85b182c

Browse files
authored
Merge pull request #269 from eadwinCode/model_controller_prefix
fix: ModelController Prefix With Parameters
2 parents 66dcfa2 + dd27eaf commit 85b182c

File tree

9 files changed

+661
-185
lines changed

9 files changed

+661
-185
lines changed

ninja_extra/controllers/base.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,19 @@ def __init__(
442442
if is_async(_call_back):
443443
self.has_auth_async = True
444444
break
445+
# `_prefix_route_params` a collection of route parameters that are used in the prefix
446+
# for example:
447+
# `api_controller("/{int:id}/{str:name}/{slug}")` will have `_prefix_route_params` = {"id": int, "name": str, "slug": str}
448+
self._prefix_route_params = {}
449+
if self._prefix_has_route_param:
450+
for match in re.finditer(self._PATH_PARAMETER_COMPONENT_RE, self.prefix):
451+
self._prefix_route_params[match.group("parameter")] = match.group(
452+
"converter"
453+
)
454+
455+
@property
456+
def prefix_route_params(self) -> Dict[str, str]:
457+
return self._prefix_route_params
445458

446459
@property
447460
def controller_class(self) -> Type["ControllerBase"]:

ninja_extra/controllers/model/builder.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44

55
from ninja_extra.constants import ROUTE_FUNCTION
66

7-
from .endpoints import ModelAsyncEndpointFactory, ModelEndpointFactory
7+
from .endpoints import (
8+
ModelAsyncEndpointFactory,
9+
ModelEndpointFactory,
10+
ModelEndpointFunction,
11+
)
812
from .schemas import ModelConfig
913

1014
if t.TYPE_CHECKING:
@@ -64,7 +68,7 @@ def _register_create_endpoint(self) -> None:
6468
**kw, # type:ignore[arg-type]
6569
)
6670

67-
self._add_to_controller(create_item)
71+
self._add_to_controller(create_item.setup(self._base_cls))
6872

6973
def _register_update_endpoint(self) -> None:
7074
_path = "/{%s:%s}" % (
@@ -86,7 +90,7 @@ def _register_update_endpoint(self) -> None:
8690
**kw, # type:ignore[arg-type]
8791
)
8892

89-
self._add_to_controller(update_item)
93+
self._add_to_controller(update_item.setup(self._base_cls))
9094

9195
def _register_patch_endpoint(self) -> None:
9296
_pk_type = self._pk_type
@@ -110,7 +114,7 @@ def _register_patch_endpoint(self) -> None:
110114
**kw, # type:ignore[arg-type]
111115
)
112116

113-
self._add_to_controller(patch_item)
117+
self._add_to_controller(patch_item.setup(self._base_cls))
114118

115119
def _register_find_one_endpoint(self) -> None:
116120
_path = "/{%s:%s}" % (
@@ -131,7 +135,7 @@ def _register_find_one_endpoint(self) -> None:
131135
**kw, # type:ignore[arg-type]
132136
)
133137

134-
self._add_to_controller(get_item)
138+
self._add_to_controller(get_item.setup(self._base_cls))
135139

136140
def _register_list_endpoint(self) -> None:
137141
kw = {
@@ -159,7 +163,7 @@ def _register_list_endpoint(self) -> None:
159163
**paginate_kwargs,
160164
)
161165

162-
self._add_to_controller(list_items)
166+
self._add_to_controller(list_items.setup(self._base_cls))
163167

164168
def _register_delete_endpoint(self) -> None:
165169
_path = "/{%s:%s}" % (
@@ -179,7 +183,7 @@ def _register_delete_endpoint(self) -> None:
179183
**kw, # type:ignore[arg-type]
180184
)
181185

182-
self._add_to_controller(delete_item)
186+
self._add_to_controller(delete_item.setup(self._base_cls))
183187

184188
def register_model_routes(self) -> None:
185189
for action in self._config.allowed_routes:
@@ -191,3 +195,11 @@ def register_model_routes(self) -> None:
191195
f"is not recognized as ModelController action"
192196
)
193197
action_registration()
198+
199+
# check for ModelEndpointFunction in the base_cls
200+
for attr_name in dir(self._base_cls):
201+
attr = getattr(self._base_cls, attr_name)
202+
if isinstance(attr, ModelEndpointFunction):
203+
self._add_to_controller(attr.setup(self._base_cls))
204+
# remove the attribute from the base_cls
205+
delattr(self._base_cls, attr_name)

0 commit comments

Comments
 (0)