1414from tableauserverclient .server .endpoint .exceptions import (
1515 InternalServerError ,
1616 MissingRequiredFieldError ,
17+ ServerResponseError ,
1718 UnsupportedAttributeError ,
1819)
1920from tableauserverclient .server .endpoint .permissions_endpoint import _PermissionsEndpoint
@@ -125,7 +126,7 @@ def get_by_id(self, workbook_id: str) -> WorkbookItem:
125126 return WorkbookItem .from_response (server_response .content , self .parent_srv .namespace )[0 ]
126127
127128 @api (version = "2.8" )
128- def refresh (self , workbook_item : Union [WorkbookItem , str ], incremental : bool = False ) -> JobItem :
129+ def refresh (self , workbook_item : Union [WorkbookItem , str ], incremental : bool = False ) -> JobItem | None :
129130 """
130131 Refreshes the extract of an existing workbook.
131132
@@ -138,13 +139,19 @@ def refresh(self, workbook_item: Union[WorkbookItem, str], incremental: bool = F
138139
139140 Returns
140141 -------
141- JobItem
142- The job item.
142+ JobItem | None
143+ The job item, or None if a refresh job is already queued for this workbook .
143144 """
144145 id_ = getattr (workbook_item , "id" , workbook_item )
145146 url = f"{ self .baseurl } /{ id_ } /refresh"
146147 refresh_req = RequestFactory .Task .refresh_req (incremental , self .parent_srv )
147- server_response = self .post_request (url , refresh_req )
148+ try :
149+ server_response = self .post_request (url , refresh_req )
150+ except ServerResponseError as e :
151+ if e .code .startswith ("409" ) and "already" in e .detail :
152+ logger .warning (f"{ e .summary } { e .detail } " )
153+ return None
154+ raise
148155 new_job = JobItem .from_response (server_response .content , self .parent_srv .namespace )[0 ]
149156 return new_job
150157
0 commit comments