1
1
import copy
2
2
import datetime
3
3
import xml .etree .ElementTree as ET
4
- from typing import Optional
4
+ from typing import Optional , overload
5
5
6
6
from defusedxml .ElementTree import fromstring
7
7
8
8
from tableauserverclient .datetime_helpers import parse_datetime
9
9
from tableauserverclient .models .connection_item import ConnectionItem
10
10
from tableauserverclient .models .exceptions import UnpopulatedPropertyError
11
11
from tableauserverclient .models .permissions_item import PermissionsRule
12
+ from tableauserverclient .models .project_item import ProjectItem
12
13
from tableauserverclient .models .property_decorators import (
13
14
property_not_nullable ,
14
15
property_is_boolean ,
15
16
property_is_enum ,
16
17
)
17
18
from tableauserverclient .models .revision_item import RevisionItem
18
19
from tableauserverclient .models .tag_item import TagItem
20
+ from tableauserverclient .models .user_item import UserItem
19
21
20
22
21
23
class DatasourceItem :
@@ -143,6 +145,13 @@ def __init__(self, project_id: Optional[str] = None, name: Optional[str] = None)
143
145
self .owner_id : Optional [str ] = None
144
146
self .project_id : Optional [str ] = project_id
145
147
self .tags : set [str ] = set ()
148
+ self ._connected_workbooks_count : Optional [int ] = None
149
+ self ._favorites_total : Optional [int ] = None
150
+ self ._has_alert : Optional [bool ] = None
151
+ self ._is_published : Optional [bool ] = None
152
+ self ._server_name : Optional [str ] = None
153
+ self ._project : Optional [ProjectItem ] = None
154
+ self ._owner : Optional [UserItem ] = None
146
155
147
156
self ._permissions = None
148
157
self ._data_quality_warnings = None
@@ -274,6 +283,34 @@ def revisions(self) -> list[RevisionItem]:
274
283
def size (self ) -> Optional [int ]:
275
284
return self ._size
276
285
286
+ @property
287
+ def connected_workbooks_count (self ) -> Optional [int ]:
288
+ return self ._connected_workbooks_count
289
+
290
+ @property
291
+ def favorites_total (self ) -> Optional [int ]:
292
+ return self ._favorites_total
293
+
294
+ @property
295
+ def has_alert (self ) -> Optional [bool ]:
296
+ return self ._has_alert
297
+
298
+ @property
299
+ def is_published (self ) -> Optional [bool ]:
300
+ return self ._is_published
301
+
302
+ @property
303
+ def server_name (self ) -> Optional [str ]:
304
+ return self ._server_name
305
+
306
+ @property
307
+ def project (self ) -> Optional [ProjectItem ]:
308
+ return self ._project
309
+
310
+ @property
311
+ def owner (self ) -> Optional [UserItem ]:
312
+ return self ._owner
313
+
277
314
def _set_connections (self , connections ) -> None :
278
315
self ._connections = connections
279
316
@@ -310,6 +347,13 @@ def _parse_common_elements(self, datasource_xml, ns):
310
347
use_remote_query_agent ,
311
348
webpage_url ,
312
349
size ,
350
+ connected_workbooks_count ,
351
+ favorites_total ,
352
+ has_alert ,
353
+ is_published ,
354
+ server_name ,
355
+ project ,
356
+ owner ,
313
357
) = self ._parse_element (datasource_xml , ns )
314
358
self ._set_values (
315
359
ask_data_enablement ,
@@ -331,6 +375,13 @@ def _parse_common_elements(self, datasource_xml, ns):
331
375
use_remote_query_agent ,
332
376
webpage_url ,
333
377
size ,
378
+ connected_workbooks_count ,
379
+ favorites_total ,
380
+ has_alert ,
381
+ is_published ,
382
+ server_name ,
383
+ project ,
384
+ owner ,
334
385
)
335
386
return self
336
387
@@ -355,6 +406,13 @@ def _set_values(
355
406
use_remote_query_agent ,
356
407
webpage_url ,
357
408
size ,
409
+ connected_workbooks_count ,
410
+ favorites_total ,
411
+ has_alert ,
412
+ is_published ,
413
+ server_name ,
414
+ project ,
415
+ owner ,
358
416
):
359
417
if ask_data_enablement is not None :
360
418
self ._ask_data_enablement = ask_data_enablement
@@ -394,6 +452,20 @@ def _set_values(
394
452
self ._webpage_url = webpage_url
395
453
if size is not None :
396
454
self ._size = int (size )
455
+ if connected_workbooks_count is not None :
456
+ self ._connected_workbooks_count = connected_workbooks_count
457
+ if favorites_total is not None :
458
+ self ._favorites_total = favorites_total
459
+ if has_alert is not None :
460
+ self ._has_alert = has_alert
461
+ if is_published is not None :
462
+ self ._is_published = is_published
463
+ if server_name is not None :
464
+ self ._server_name = server_name
465
+ if project is not None :
466
+ self ._project = project
467
+ if owner is not None :
468
+ self ._owner = owner
397
469
398
470
@classmethod
399
471
def from_response (cls , resp : str , ns : dict ) -> list ["DatasourceItem" ]:
@@ -428,6 +500,11 @@ def _parse_element(datasource_xml: ET.Element, ns: dict) -> tuple:
428
500
use_remote_query_agent = datasource_xml .get ("useRemoteQueryAgent" , None )
429
501
webpage_url = datasource_xml .get ("webpageUrl" , None )
430
502
size = datasource_xml .get ("size" , None )
503
+ connected_workbooks_count = nullable_str_to_int (datasource_xml .get ("connectedWorkbooksCount" , None ))
504
+ favorites_total = nullable_str_to_int (datasource_xml .get ("favoritesTotal" , None ))
505
+ has_alert = nullable_str_to_bool (datasource_xml .get ("hasAlert" , None ))
506
+ is_published = nullable_str_to_bool (datasource_xml .get ("isPublished" , None ))
507
+ server_name = datasource_xml .get ("serverName" , None )
431
508
432
509
tags = None
433
510
tags_elem = datasource_xml .find (".//t:tags" , namespaces = ns )
@@ -438,12 +515,14 @@ def _parse_element(datasource_xml: ET.Element, ns: dict) -> tuple:
438
515
project_name = None
439
516
project_elem = datasource_xml .find (".//t:project" , namespaces = ns )
440
517
if project_elem is not None :
518
+ project = ProjectItem .from_xml (project_elem , ns )
441
519
project_id = project_elem .get ("id" , None )
442
520
project_name = project_elem .get ("name" , None )
443
521
444
522
owner_id = None
445
523
owner_elem = datasource_xml .find (".//t:owner" , namespaces = ns )
446
524
if owner_elem is not None :
525
+ owner = UserItem .from_xml (owner_elem , ns )
447
526
owner_id = owner_elem .get ("id" , None )
448
527
449
528
ask_data_enablement = None
@@ -471,4 +550,35 @@ def _parse_element(datasource_xml: ET.Element, ns: dict) -> tuple:
471
550
use_remote_query_agent ,
472
551
webpage_url ,
473
552
size ,
553
+ connected_workbooks_count ,
554
+ favorites_total ,
555
+ has_alert ,
556
+ is_published ,
557
+ server_name ,
558
+ project ,
559
+ owner ,
474
560
)
561
+
562
+
563
+ @overload
564
+ def nullable_str_to_int (value : None ) -> None : ...
565
+
566
+
567
+ @overload
568
+ def nullable_str_to_int (value : str ) -> int : ...
569
+
570
+
571
+ def nullable_str_to_int (value ):
572
+ return int (value ) if value is not None else None
573
+
574
+
575
+ @overload
576
+ def nullable_str_to_bool (value : None ) -> None : ...
577
+
578
+
579
+ @overload
580
+ def nullable_str_to_bool (value : str ) -> bool : ...
581
+
582
+
583
+ def nullable_str_to_bool (value ):
584
+ return str (value ).lower () == "true" if value is not None else None
0 commit comments