Skip to content

Commit dd801be

Browse files
authored
fix(custom_datasources): custom datasources actions charts and segments are no longer ignored (#322)
1 parent ea51ce6 commit dd801be

File tree

6 files changed

+33
-11
lines changed

6 files changed

+33
-11
lines changed

src/datasource_toolkit/forestadmin/datasource_toolkit/decorators/action/collections.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def _set_watch_changes_attr(
160160
self._set_watch_changes_attr(element["elements"], context) # type:ignore
161161

162162
def _refine_schema(self, sub_schema: CollectionSchema) -> CollectionSchema:
163-
actions_schema = {}
163+
actions_schema = {**sub_schema["actions"]}
164164
for name, action in self._actions.items():
165165
dynamics: List[bool] = []
166166
for field in action.get("form", []):

src/datasource_toolkit/forestadmin/datasource_toolkit/decorators/chart/chart_collection_decorator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ async def render_chart(self, caller: User, name: str, record_id: List) -> Chart:
3737
return await self.child_collection.render_chart(caller, name, record_id)
3838

3939
def _refine_schema(self, sub_schema: CollectionSchema) -> CollectionSchema:
40-
charts = {}
40+
charts = {**sub_schema["charts"]}
4141
for name, chart in self._charts.items():
4242
charts[name] = chart
4343

src/datasource_toolkit/forestadmin/datasource_toolkit/decorators/segments/collections.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def add_segment(self, name: str, segment: SegmentAlias):
2424
self.mark_schema_as_dirty()
2525

2626
def _refine_schema(self, sub_schema: CollectionSchema) -> CollectionSchema:
27-
return {**sub_schema, "segments": [*self._segments.keys()]}
27+
return {**sub_schema, "segments": [*sub_schema["segments"], *self._segments.keys()]}
2828

2929
async def _refine_filter(
3030
self, caller: User, _filter: Union[Optional[PaginatedFilter], Optional[Filter]]

src/datasource_toolkit/tests/decorators/action/test_action_decorator.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,3 +859,10 @@ def test_get_form_should_return_hidden_fields_when_asked(self):
859859
],
860860
)
861861
if_fn.assert_not_called()
862+
863+
def test_should_schema_should_contains_actions_define_in_custom_datasource(self):
864+
with patch.dict(self.collection_product.schema, {"actions": {"action_test": {}}}):
865+
self.assertIn(
866+
"action_test",
867+
self.datasource_decorator.get_collection("Product").schema["actions"],
868+
)

src/datasource_toolkit/tests/decorators/chart/test_chart_collection_decorator.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ def setUpClass(cls) -> None:
2424
cls.datasource: Datasource = Datasource()
2525
Collection.__abstractmethods__ = set() # to instantiate abstract class
2626

27-
cls.collection_book = Collection("Product", cls.datasource)
28-
cls.collection_book.add_fields(
27+
cls.collection_product = Collection("Product", cls.datasource)
28+
cls.collection_product.add_fields(
2929
{
3030
"id": {
3131
"column_type": PrimitiveType.NUMBER,
@@ -35,7 +35,7 @@ def setUpClass(cls) -> None:
3535
},
3636
}
3737
)
38-
cls.datasource.add_collection(cls.collection_book)
38+
cls.datasource.add_collection(cls.collection_product)
3939

4040
cls.mocked_caller = User(
4141
rendering_id=1,
@@ -54,7 +54,7 @@ def setUp(self) -> None:
5454
self.decorated_collection: ChartCollectionDecorator = self.decorated_datasource.get_collection("Product")
5555

5656
def test_schema_should_not_change(self):
57-
assert self.decorated_collection.schema["charts"] == self.collection_book.schema["charts"]
57+
assert self.decorated_collection.schema["charts"] == self.collection_product.schema["charts"]
5858

5959
def test_add_chart_should_raise_if_chart_name_already_exists(self):
6060
self.decorated_collection.add_chart("test_chart", lambda ctx, result_builder: True)
@@ -67,7 +67,7 @@ def test_add_chart_should_raise_if_chart_name_already_exists(self):
6767
)
6868

6969
def test_render_chart_should_call_child_collection(self):
70-
with patch.object(self.collection_book, "render_chart", new_callable=AsyncMock) as mock_render_chart:
70+
with patch.object(self.collection_product, "render_chart", new_callable=AsyncMock) as mock_render_chart:
7171
self.loop.run_until_complete(self.decorated_collection.render_chart(self.mocked_caller, "child_chart", [1]))
7272

7373
mock_render_chart.assert_awaited_once_with(self.mocked_caller, "child_chart", [1])
@@ -82,3 +82,10 @@ async def chart_fn(context, result_builder: ResultBuilder, record_id):
8282
)
8383

8484
assert result == {"countCurrent": 1, "countPrevious": None}
85+
86+
def test_should_schema_should_contains_charts_define_in_custom_datasource(self):
87+
with patch.dict(self.collection_product._schema, {"charts": {"chart_test": None}}):
88+
self.assertIn(
89+
"chart_test",
90+
self.decorated_collection.schema["charts"],
91+
)

src/datasource_toolkit/tests/decorators/segments/test_segments_decorator.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import asyncio
22
import sys
33
from unittest import TestCase
4+
from unittest.mock import patch
45

56
if sys.version_info >= (3, 9):
67
import zoneinfo
@@ -26,8 +27,8 @@ def setUpClass(cls) -> None:
2627
cls.datasource: Datasource = Datasource()
2728

2829
Collection.__abstractmethods__ = set() # to instantiate abstract class
29-
cls.collection_book = Collection("Product", cls.datasource)
30-
cls.collection_book.add_fields(
30+
cls.collection_product = Collection("Product", cls.datasource)
31+
cls.collection_product.add_fields(
3132
{
3233
"id": Column(column_type=PrimitiveType.NUMBER, is_primary_key=True, type=FieldType.COLUMN),
3334
"name": Column(column_type=PrimitiveType.STRING, type=FieldType.COLUMN),
@@ -38,7 +39,7 @@ def setUpClass(cls) -> None:
3839
}
3940
)
4041

41-
cls.datasource.add_collection(cls.collection_book)
42+
cls.datasource.add_collection(cls.collection_product)
4243
cls.datasource_decorator = DatasourceDecorator(cls.datasource, SegmentCollectionDecorator)
4344

4445
cls.mocked_caller = User(
@@ -121,3 +122,10 @@ async def segment_fn(context: CollectionCustomizationContext):
121122
self.decorated_collection_product._refine_filter(self.mocked_caller, filter_)
122123
)
123124
assert returned_filter == Filter({"condition_tree": ConditionTreeLeaf("name", Operator.EQUAL, "a_name_value")})
125+
126+
def test_should_schema_should_contains_segments_define_in_custom_datasource(self):
127+
with patch.dict(self.collection_product._schema, {"segments": ["segment_test"]}):
128+
self.assertIn(
129+
"segment_test",
130+
self.decorated_collection_product.schema["segments"],
131+
)

0 commit comments

Comments
 (0)