@@ -17,7 +17,7 @@ class QuickSight():
1717 # Define defaults
1818 cidAccountId = '223485597511'
1919 _dashboards : Dict [str , Dashboard ] = None
20- _datasets : Dict [str , Dataset ] = {}
20+ _datasets : Dict [str , Dataset ] = None
2121 _datasources : dict () = {}
2222 _user : dict = None
2323
@@ -93,6 +93,13 @@ def dashboards(self) -> Dict[str, Dashboard]:
9393 self .discover_dashboards ()
9494 return self ._dashboards
9595
96+ @property
97+ def datasets (self ) -> Dict [str , Dataset ]:
98+ """Returns a list of deployed dashboards"""
99+ if self ._datasets is None :
100+ self .discover_datasets ()
101+ return self ._datasets or {}
102+
96103 @property
97104 def athena_datasources (self ) -> dict :
98105 """Returns a list of existing athena datasources"""
@@ -109,7 +116,6 @@ def datasources(self) -> dict:
109116
110117 def discover_dashboard (self , dashboardId : str ):
111118 """Discover single dashboard"""
112-
113119 dashboard = self .describe_dashboard (DashboardId = dashboardId )
114120 # Look for dashboard definition by DashboardId
115121 _definition = next ((v for v in self .supported_dashboards .values () if v ['dashboardId' ] == dashboard .id ), None )
@@ -152,7 +158,7 @@ def _recoursive_add_view(view):
152158 for dep_view in self .supported_views .get (view , {}).get ('dependsOn' , {}).get ('views' , []):
153159 _recoursive_add_view (dep_view )
154160 for dataset_name in dashboard .datasets .keys ():
155- for view in self .supported_datasets .get (dataset_name ).get ('dependsOn' , {}).get ('views' , []):
161+ for view in self .supported_datasets .get (dataset_name , {} ).get ('dependsOn' , {}).get ('views' , []):
156162 _recoursive_add_view (view )
157163 dashboard .views = all_views
158164 self ._dashboards = self ._dashboards or {}
@@ -267,7 +273,7 @@ def discover_data_sources(self) -> None:
267273 self .describe_data_source (v .get ('DataSourceId' ))
268274 except Exception as e :
269275 logger .debug (e , stack_info = True )
270- for _ ,v in self ._datasets .items ():
276+ for _ ,v in self .datasets .items ():
271277 for d in v .datasources :
272278 logger .info (f'Discovering data source { d } ' )
273279 self .describe_data_source (d )
@@ -517,7 +523,7 @@ def delete_dataset(self, id: str) -> bool:
517523 AwsAccountId = self .account_id ,
518524 DataSetId = id
519525 )
520- self ._datasets .pop (id )
526+ self .datasets .pop (id )
521527 except self .client .exceptions .AccessDeniedException :
522528 logger .info ('Access denied deleting dataset' )
523529 return False
@@ -529,10 +535,24 @@ def delete_dataset(self, id: str) -> bool:
529535 return True
530536
531537
538+ def get_datasets (self , id : str = None , name : str = None ) -> Dataset :
539+ """ get dataset that match parameters """
540+ result = []
541+ for dataset in self .datasets .values ():
542+ if id is not None and dataset .id != id :
543+ continue
544+ if name is not None and dataset .name != name :
545+ continue
546+ result .append (dataset )
547+ return result
548+
549+
550+
532551 def describe_dataset (self , id , timeout : int = 1 ) -> dict :
533552 """ Describes an AWS QuickSight dataset """
534- if id in self ._datasets :
553+ if self . _datasets and id in self ._datasets :
535554 return self ._datasets .get (id )
555+ self ._datasets = self ._datasets or {}
536556 poll_interval = 1
537557 _dataset = None
538558 deadline = time .time () + timeout
@@ -556,6 +576,7 @@ def discover_datasets(self):
556576 """ Discover datasets in the account """
557577
558578 logger .info ('Discovering datasets' )
579+ self ._datasets = self ._datasets or {}
559580 try :
560581 for dataset in self .list_data_sets ():
561582 try :
@@ -626,6 +647,7 @@ def create_dataset(self, definition: dict) -> str:
626647 dataset_id = None
627648 try :
628649 logger .info (f'Creating dataset { definition .get ("Name" )} ({ dataset_id } )' )
650+ logger .debug (f'Dataset definition: { definition } ' )
629651 response = self .client .create_data_set (** definition )
630652 dataset_id = response .get ('DataSetId' )
631653 except self .client .exceptions .ResourceExistsException :
@@ -646,6 +668,19 @@ def create_dataset(self, definition: dict) -> str:
646668 return dataset_id
647669
648670
671+ def update_dataset (self , definition : dict ) -> str :
672+ """ Creates an AWS QuickSight dataset """
673+ definition .update ({'AwsAccountId' : self .account_id })
674+ logger .info (f'Updating dataset { definition .get ("Name" )} ' )
675+
676+ if "Permissions" in definition :
677+ logger .info ('Ignoring permissions for dataset update.' )
678+ del definition ['Permissions' ]
679+ response = self .client .update_data_set (** definition )
680+ logger .info (f'Dataset { definition .get ("Name" )} is updated' )
681+ return True
682+
683+
649684 def create_dashboard (self , definition : dict , ** kwargs ) -> Dashboard :
650685 """ Creates an AWS QuickSight dashboard """
651686 DataSetReferences = list ()
@@ -684,9 +719,12 @@ def create_dashboard(self, definition: dict, **kwargs) -> Dashboard:
684719
685720 create_parameters = always_merger .merge (create_parameters , kwargs )
686721 try :
722+ logger .info (f'Creating dashboard "{ definition .get ("name" )} "' )
723+ logger .debug (create_parameters )
687724 create_status = self .client .create_dashboard (** create_parameters )
688725 logger .debug (create_status )
689726 except self .client .exceptions .ResourceExistsException :
727+ logger .info (f'Dashboard { definition .get ("name" )} already exists' )
690728 raise
691729 created_version = int (create_status ['VersionArn' ].split ('/' )[- 1 ])
692730
@@ -726,6 +764,7 @@ def update_dashboard(self, dashboard: Dashboard, **kwargs):
726764 }
727765
728766 update_parameters = always_merger .merge (update_parameters , kwargs )
767+ logger .info (f'Updating dashboard "{ dashboard .name } "' )
729768 logger .debug (f"Update parameters: { update_parameters } " )
730769 update_status = self .client .update_dashboard (** update_parameters )
731770 logger .debug (update_status )
@@ -742,6 +781,7 @@ def update_dashboard(self, dashboard: Dashboard, **kwargs):
742781 'VersionNumber' : updated_version
743782 }
744783 result = self .client .update_dashboard_published_version (** update_params )
784+ logger .debug (result )
745785 if result ['Status' ] != 200 :
746786 raise Exception (result )
747787
0 commit comments