2323from ..abstract_base import AbstractBase
2424from ..base_model import BaseModel
2525from ..mixin import ModelRefMixin
26+ from .abstract_view import AbstractView
2627from .component_view import ComponentView , ComponentViewIO
2728from .configuration import Configuration , ConfigurationIO
2829from .container_view import ContainerView , ContainerViewIO
2930from .deployment_view import DeploymentView , DeploymentViewIO
3031from .dynamic_view import DynamicView , DynamicViewIO
32+ from .filtered_view import FilteredView , FilteredViewIO
3133from .system_context_view import SystemContextView , SystemContextViewIO
3234from .system_landscape_view import SystemLandscapeView , SystemLandscapeViewIO
3335from .view import View
@@ -60,9 +62,7 @@ class ViewSetIO(BaseModel):
6062 default = (), alias = "deploymentViews"
6163 )
6264 dynamic_views : List [DynamicViewIO ] = Field (default = (), alias = "dynamicViews" )
63-
64- # TODO:
65- # filtered_views: List[FilteredView] = Field(set(), alias="filteredViews")
65+ filtered_views : List [FilteredViewIO ] = Field (default = (), alias = "filteredViews" )
6666
6767
6868class ViewSet (ModelRefMixin , AbstractBase ):
@@ -83,9 +83,10 @@ def __init__(
8383 container_views : Iterable [ContainerView ] = (),
8484 component_views : Iterable [ComponentView ] = (),
8585 deployment_views : Iterable [DeploymentView ] = (),
86+ filtered_views : Iterable [FilteredView ] = (),
8687 dynamic_views : Iterable [DynamicView ] = (),
8788 configuration : Optional [Configuration ] = None ,
88- ** kwargs
89+ ** kwargs ,
8990 ) -> None :
9091 """Initialize a view set."""
9192 super ().__init__ (** kwargs )
@@ -98,6 +99,7 @@ def __init__(
9899 self .component_views : Set [ComponentView ] = set (component_views )
99100 self .deployment_views : Set [DeploymentView ] = set (deployment_views )
100101 self .dynamic_views : Set [DynamicView ] = set (dynamic_views )
102+ self .filtered_views : Set [FilteredView ] = set (filtered_views )
101103 self .configuration = Configuration () if configuration is None else configuration
102104 self .set_model (model )
103105
@@ -150,7 +152,12 @@ def hydrate(cls, views: ViewSetIO, model: "Model") -> "ViewSet":
150152 cls ._hydrate_view (view , model = model )
151153 dynamic_views .append (view )
152154
153- return cls (
155+ filtered_views = []
156+ for view_io in views .filtered_views :
157+ view = FilteredView .hydrate (view_io )
158+ filtered_views .append (view )
159+
160+ result = cls (
154161 model = model ,
155162 # TODO:
156163 # enterprise_context_views: Iterable[EnterpriseContextView] = (),
@@ -160,9 +167,17 @@ def hydrate(cls, views: ViewSetIO, model: "Model") -> "ViewSet":
160167 component_views = component_views ,
161168 deployment_views = deployment_views ,
162169 dynamic_views = dynamic_views ,
170+ filtered_views = filtered_views ,
163171 configuration = Configuration .hydrate (views .configuration ),
164172 )
165173
174+ # Patch up filtered views
175+ for filtered_view in result .filtered_views :
176+ base_view = result [filtered_view .base_view_key ]
177+ filtered_view .view = base_view
178+
179+ return result
180+
166181 @classmethod
167182 def _hydrate_view (cls , view : View , model : "Model" ) -> None :
168183 for element_view in view .element_views :
@@ -287,6 +302,40 @@ def create_dynamic_view(self, **kwargs) -> DynamicView:
287302 self .dynamic_views .add (dynamic_view )
288303 return dynamic_view
289304
305+ def create_filtered_view (self , ** kwargs ) -> FilteredView :
306+ """
307+ Add a new FilteredView to the ViewSet.
308+
309+ Args:
310+ **kwargs: Provide keyword arguments for instantiating a `FilteredView`.
311+ """
312+ # TODO:
313+ # AssertThatTheViewKeyIsUnique(key);
314+ filtered_view = FilteredView (** kwargs )
315+ filtered_view .set_viewset (self )
316+ self .filtered_views .add (filtered_view )
317+ return filtered_view
318+
319+ def get_view (self , key : str ) -> Optional [AbstractView ]:
320+ """Return the view with the given key, or None."""
321+ all_views = (
322+ self .system_landscape_views
323+ | self .system_context_views
324+ | self .container_views
325+ | self .component_views
326+ | self .deployment_views
327+ | self .dynamic_views
328+ | self .filtered_views
329+ )
330+ return next ((view for view in all_views if view .key == key ), None )
331+
332+ def __getitem__ (self , key : str ) -> AbstractView :
333+ """Return the view with the given key or raise a KeyError."""
334+ result = self .get_view (key )
335+ if not result :
336+ raise KeyError (f"No view with key '{ key } ' in ViewSet" )
337+ return result
338+
290339 def copy_layout_information_from (self , source : "ViewSet" ) -> None :
291340 """Copy all the layout information from a source ViewSet."""
292341 for source_view in source .system_landscape_views :
0 commit comments