Repository: tableau/server-client-python

Issue:
Modernize samples a bit to ensure they work with Python 3.x
* Run 2to3 to see what changes are proposed and whether they are needed/worthwhile
* Replace obsolete `env` package
* Update "samples list" in docs page to mention every sample that exists

Discussion:
github-actions[bot]: <!-- Pytest Coverage Comment: build -->
<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/README.md"><img alt="Coverage" src="https://img.shields.io/badge/Coverage-88%25-green.svg" /></a><details><summary>Coverage Report </summary><table><tr><th>File</th><th>Stmts</th><th>Miss</th><th>Cover</th><th>Missing</th></tr><tbody><tr><td colspan="5"><b>tableauserverclient</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/__init__.py">\_\_init\_\_.py</a></td><td>5</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/_version.py">_version.py</a></td><td>278</td><td>163</td><td>163</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/_version.py#L 41%"> 41%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/config.py">config.py</a></td><td>13</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/datetime_helpers.py">datetime_helpers.py</a></td><td>25</td><td>1</td><td>1</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/datetime_helpers.py#L 96%"> 96%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/exponential_backoff.py">exponential_backoff.py</a></td><td>20</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/filesys_helpers.py">filesys_helpers.py</a></td><td>31</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/namespace.py">namespace.py</a></td><td>26</td><td>3</td><td>3</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/namespace.py#L 88%"> 88%</a></td></tr><tr><td colspan="5"><b>tableauserverclient/helpers</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/helpers/__init__.py">\_\_init\_\_.py</a></td><td>1</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/helpers/headers.py">headers.py</a></td><td>13</td><td>8</td><td>8</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/helpers/headers.py#L 38%"> 38%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/helpers/logging.py">logging.py</a></td><td>2</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/helpers/strings.py">strings.py</a></td><td>27</td><td>1</td><td>1</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/helpers/strings.py#L 96%"> 96%</a></td></tr><tr><td colspan="5"><b>tableauserverclient/models</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/__init__.py">\_\_init\_\_.py</a></td><td>41</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/column_item.py">column_item.py</a></td><td>55</td><td>32</td><td>32</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/column_item.py#L 42%"> 42%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/connection_credentials.py">connection_credentials.py</a></td><td>35</td><td>11</td><td>11</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/connection_credentials.py#L 69%"> 69%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/connection_item.py">connection_item.py</a></td><td>77</td><td>10</td><td>10</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/connection_item.py#L 87%"> 87%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/custom_view_item.py">custom_view_item.py</a></td><td>119</td><td>9</td><td>9</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/custom_view_item.py#L 92%"> 92%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/data_acceleration_report_item.py">data_acceleration_report_item.py</a></td><td>54</td><td>1</td><td>1</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/data_acceleration_report_item.py#L 98%"> 98%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/data_alert_item.py">data_alert_item.py</a></td><td>159</td><td>3</td><td>3</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/data_alert_item.py#L 98%"> 98%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/data_freshness_policy_item.py">data_freshness_policy_item.py</a></td><td>156</td><td>15</td><td>15</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/data_freshness_policy_item.py#L 90%"> 90%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/database_item.py">database_item.py</a></td><td>207</td><td>36</td><td>36</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/database_item.py#L 83%"> 83%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/datasource_item.py">datasource_item.py</a></td><td>247</td><td>11</td><td>11</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/datasource_item.py#L 96%"> 96%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/dqw_item.py">dqw_item.py</a></td><td>104</td><td>5</td><td>5</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/dqw_item.py#L 95%"> 95%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/exceptions.py">exceptions.py</a></td><td>4</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/favorites_item.py">favorites_item.py</a></td><td>56</td><td>8</td><td>8</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/favorites_item.py#L 86%"> 86%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/fileupload_item.py">fileupload_item.py</a></td><td>19</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/flow_item.py">flow_item.py</a></td><td>149</td><td>10</td><td>10</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/flow_item.py#L 93%"> 93%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/flow_run_item.py">flow_run_item.py</a></td><td>72</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/group_item.py">group_item.py</a></td><td>81</td><td>3</td><td>3</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/group_item.py#L 96%"> 96%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/groupset_item.py">groupset_item.py</a></td><td>39</td><td>1</td><td>1</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/groupset_item.py#L 97%"> 97%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/interval_item.py">interval_item.py</a></td><td>182</td><td>32</td><td>32</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/interval_item.py#L 82%"> 82%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/job_item.py">job_item.py</a></td><td>187</td><td>10</td><td>10</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/job_item.py#L 95%"> 95%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/linked_tasks_item.py">linked_tasks_item.py</a></td><td>80</td><td>1</td><td>1</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/linked_tasks_item.py#L 99%"> 99%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/metric_item.py">metric_item.py</a></td><td>130</td><td>12</td><td>12</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/metric_item.py#L 91%"> 91%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/pagination_item.py">pagination_item.py</a></td><td>34</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/permissions_item.py">permissions_item.py</a></td><td>108</td><td>12</td><td>12</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/permissions_item.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/project_item.py">project_item.py</a></td><td>145</td><td>31</td><td>31</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/project_item.py#L 79%"> 79%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/property_decorators.py">property_decorators.py</a></td><td>100</td><td>18</td><td>18</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/property_decorators.py#L 82%"> 82%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/reference_item.py">reference_item.py</a></td><td>23</td><td>1</td><td>1</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/reference_item.py#L 96%"> 96%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/revision_item.py">revision_item.py</a></td><td>60</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/schedule_item.py">schedule_item.py</a></td><td>206</td><td>6</td><td>6</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/schedule_item.py#L 97%"> 97%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/server_info_item.py">server_info_item.py</a></td><td>39</td><td>5</td><td>5</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/server_info_item.py#L 87%"> 87%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/site_item.py">site_item.py</a></td><td>610</td><td>12</td><td>12</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/site_item.py#L 98%"> 98%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/subscription_item.py">subscription_item.py</a></td><td>103</td><td>3</td><td>3</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/subscription_item.py#L 97%"> 97%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/table_item.py">table_item.py</a></td><td>118</td><td>18</td><td>18</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/table_item.py#L 85%"> 85%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/tableau_auth.py">tableau_auth.py</a></td><td>61</td><td>24</td><td>24</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/tableau_auth.py#L 61%"> 61%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/tableau_types.py">tableau_types.py</a></td><td>25</td><td>1</td><td>1</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/tableau_types.py#L 96%"> 96%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/tag_item.py">tag_item.py</a></td><td>15</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/target.py">target.py</a></td><td>6</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/task_item.py">task_item.py</a></td><td>57</td><td>2</td><td>2</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/task_item.py#L 96%"> 96%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/user_item.py">user_item.py</a></td><td>277</td><td>17</td><td>17</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/user_item.py#L 94%"> 94%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/view_item.py">view_item.py</a></td><td>179</td><td>15</td><td>15</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/view_item.py#L 92%"> 92%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/virtual_connection_item.py">virtual_connection_item.py</a></td><td>64</td><td>8</td><td>8</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/virtual_connection_item.py#L 88%"> 88%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/webhook_item.py">webhook_item.py</a></td><td>66</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/workbook_item.py">workbook_item.py</a></td><td>275</td><td>16</td><td>16</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/models/workbook_item.py#L 94%"> 94%</a></td></tr><tr><td colspan="5"><b>tableauserverclient/server</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/__init__.py">\_\_init\_\_.py</a></td><td>9</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/exceptions.py">exceptions.py</a></td><td>4</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/filter.py">filter.py</a></td><td>21</td><td>1</td><td>1</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/filter.py#L 95%"> 95%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/pager.py">pager.py</a></td><td>35</td><td>1</td><td>1</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/pager.py#L 97%"> 97%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/query.py">query.py</a></td><td>139</td><td>15</td><td>15</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/query.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/request_factory.py">request_factory.py</a></td><td>1090</td><td>148</td><td>148</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/request_factory.py#L 86%"> 86%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/request_options.py">request_options.py</a></td><td>269</td><td>4</td><td>4</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/request_options.py#L 99%"> 99%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/server.py">server.py</a></td><td>167</td><td>17</td><td>17</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/server.py#L 90%"> 90%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/sort.py">sort.py</a></td><td>6</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>tableauserverclient/server/endpoint</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/__init__.py">\_\_init\_\_.py</a></td><td>33</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/auth_endpoint.py">auth_endpoint.py</a></td><td>76</td><td>12</td><td>12</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/auth_endpoint.py#L 84%"> 84%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/custom_views_endpoint.py">custom_views_endpoint.py</a></td><td>118</td><td>7</td><td>7</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/custom_views_endpoint.py#L 94%"> 94%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/data_acceleration_report_endpoint.py">data_acceleration_report_endpoint.py</a></td><td>21</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/data_alert_endpoint.py">data_alert_endpoint.py</a></td><td>97</td><td>25</td><td>25</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/data_alert_endpoint.py#L 74%"> 74%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/databases_endpoint.py">databases_endpoint.py</a></td><td>110</td><td>30</td><td>30</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/databases_endpoint.py#L 73%"> 73%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/datasources_endpoint.py">datasources_endpoint.py</a></td><td>311</td><td>36</td><td>36</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/datasources_endpoint.py#L 88%"> 88%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/default_permissions_endpoint.py">default_permissions_endpoint.py</a></td><td>47</td><td>5</td><td>5</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/default_permissions_endpoint.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/dqw_endpoint.py">dqw_endpoint.py</a></td><td>43</td><td>16</td><td>16</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/dqw_endpoint.py#L 63%"> 63%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/endpoint.py">endpoint.py</a></td><td>181</td><td>20</td><td>20</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/endpoint.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/exceptions.py">exceptions.py</a></td><td>60</td><td>6</td><td>6</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/exceptions.py#L 90%"> 90%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/favorites_endpoint.py">favorites_endpoint.py</a></td><td>95</td><td>22</td><td>22</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/favorites_endpoint.py#L 77%"> 77%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/fileuploads_endpoint.py">fileuploads_endpoint.py</a></td><td>51</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/flow_runs_endpoint.py">flow_runs_endpoint.py</a></td><td>65</td><td>11</td><td>11</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/flow_runs_endpoint.py#L 83%"> 83%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/flow_task_endpoint.py">flow_task_endpoint.py</a></td><td>23</td><td>3</td><td>3</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/flow_task_endpoint.py#L 87%"> 87%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/flows_endpoint.py">flows_endpoint.py</a></td><td>216</td><td>58</td><td>58</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/flows_endpoint.py#L 73%"> 73%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/groups_endpoint.py">groups_endpoint.py</a></td><td>127</td><td>10</td><td>10</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/groups_endpoint.py#L 92%"> 92%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/groupsets_endpoint.py">groupsets_endpoint.py</a></td><td>74</td><td>8</td><td>8</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/groupsets_endpoint.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/jobs_endpoint.py">jobs_endpoint.py</a></td><td>71</td><td>12</td><td>12</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/jobs_endpoint.py#L 83%"> 83%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/linked_tasks_endpoint.py">linked_tasks_endpoint.py</a></td><td>38</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/metadata_endpoint.py">metadata_endpoint.py</a></td><td>88</td><td>14</td><td>14</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/metadata_endpoint.py#L 84%"> 84%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/metrics_endpoint.py">metrics_endpoint.py</a></td><td>58</td><td>8</td><td>8</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/metrics_endpoint.py#L 86%"> 86%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/permissions_endpoint.py">permissions_endpoint.py</a></td><td>47</td><td>5</td><td>5</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/permissions_endpoint.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/projects_endpoint.py">projects_endpoint.py</a></td><td>125</td><td>20</td><td>20</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/projects_endpoint.py#L 84%"> 84%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/resource_tagger.py">resource_tagger.py</a></td><td>135</td><td>43</td><td>43</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/resource_tagger.py#L 68%"> 68%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/schedules_endpoint.py">schedules_endpoint.py</a></td><td>100</td><td>11</td><td>11</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/schedules_endpoint.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/server_info_endpoint.py">server_info_endpoint.py</a></td><td>35</td><td>10</td><td>10</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/server_info_endpoint.py#L 71%"> 71%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/sites_endpoint.py">sites_endpoint.py</a></td><td>126</td><td>28</td><td>28</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/sites_endpoint.py#L 78%"> 78%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/subscriptions_endpoint.py">subscriptions_endpoint.py</a></td><td>58</td><td>15</td><td>15</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/subscriptions_endpoint.py#L 74%"> 74%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/tables_endpoint.py">tables_endpoint.py</a></td><td>108</td><td>36</td><td>36</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/tables_endpoint.py#L 67%"> 67%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/tasks_endpoint.py">tasks_endpoint.py</a></td><td>65</td><td>7</td><td>7</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/tasks_endpoint.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/users_endpoint.py">users_endpoint.py</a></td><td>130</td><td>16</td><td>16</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/users_endpoint.py#L 88%"> 88%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/views_endpoint.py">views_endpoint.py</a></td><td>138</td><td>10</td><td>10</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/views_endpoint.py#L 93%"> 93%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/virtual_connections_endpoint.py">virtual_connections_endpoint.py</a></td><td>115</td><td>11</td><td>11</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/virtual_connections_endpoint.py#L 90%"> 90%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/webhooks_endpoint.py">webhooks_endpoint.py</a></td><td>57</td><td>11</td><td>11</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/webhooks_endpoint.py#L 81%"> 81%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/workbooks_endpoint.py">workbooks_endpoint.py</a></td><td>333</td><td>27</td><td>27</td><td><a href="https://github.com/tableau/server-client-python/blob/97092615cdb830f370605b2d4317de75b173aa37/tableauserverclient/server/endpoint/workbooks_endpoint.py#L 92%"> 92%</a></td></tr><tr><td><b>TOTAL</b></td><td><b>10580</b></td><td><b>1314</b></td><td><b>88%</b></td><td>&nbsp;</td></tr></tbody></table></details>


bcantoni: @jacalata could you please review? Then I will squash and merge.

Patch:
diff --git a/samples/export.py b/samples/export.py
index e337104..b2506cf 100644
--- a/samples/export.py
+++ b/samples/export.py
@@ -41,6 +41,7 @@ def main():
         "--language", help="Text such as 'Average' will appear in this language. Use values like fr, de, es, en"
     )
     parser.add_argument("--workbook", action="store_true")
+    parser.add_argument("--custom_view", action="store_true")
 
     parser.add_argument("--file", "-f", help="filename to store the exported data")
     parser.add_argument("--filter", "-vf", metavar="COLUMN:VALUE", help="View filter to apply to the view")
@@ -58,6 +59,8 @@ def main():
         print("Connected")
         if args.workbook:
             item = server.workbooks.get_by_id(args.resource_id)
+        elif args.custom_view:
+            item = server.custom_views.get_by_id(args.resource_id)
         else:
             item = server.views.get_by_id(args.resource_id)
 
@@ -74,6 +77,8 @@ def main():
         populate = getattr(server.views, populate_func_name)
         if args.workbook:
             populate = getattr(server.workbooks, populate_func_name)
+        elif args.custom_view:
+            populate = getattr(server.custom_views, populate_func_name)
 
         option_factory = getattr(TSC, option_factory_name)
         options: TSC.PDFRequestOptions = option_factory()
diff --git a/samples/extracts.py b/samples/extracts.py
index d21bfdd..c0dd885 100644
--- a/samples/extracts.py
+++ b/samples/extracts.py
@@ -1,13 +1,7 @@
 ####
-# This script demonstrates how to use the Tableau Server Client
-# to interact with workbooks. It explores the different
-# functions that the Server API supports on workbooks.
-#
-# With no flags set, this sample will query all workbooks,
-# pick one workbook and populate its connections/views, and update
-# the workbook. Adding flags will demonstrate the specific feature
-# on top of the general operations.
-####
+# This script demonstrates how to use the Tableau Server Client to interact with extracts.
+# It explores the different functions that the REST API supports on extracts.
+#####
 
 import argparse
 import logging
diff --git a/samples/login.py b/samples/login.py
index 847d355..bc99385 100644
--- a/samples/login.py
+++ b/samples/login.py
@@ -7,9 +7,15 @@
 import argparse
 import getpass
 import logging
+import os
 
 import tableauserverclient as TSC
-import env
+
+
+def get_env(key):
+    if key in os.environ:
+        return os.environ[key]
+    return None
 
 
 # If a sample has additional arguments, then it should copy this code and insert them after the call to
@@ -20,13 +26,13 @@ def set_up_and_log_in():
     sample_define_common_options(parser)
     args = parser.parse_args()
     if not args.server:
-        args.server = env.server
+        args.server = get_env("SERVER")
     if not args.site:
-        args.site = env.site
+        args.site = get_env("SITE")
     if not args.token_name:
-        args.token_name = env.token_name
+        args.token_name = get_env("TOKEN_NAME")
     if not args.token_value:
-        args.token_value = env.token_value
+        args.token_value = get_env("TOKEN_VALUE")
     args.logging_level = "debug"
 
     server = sample_connect_to_server(args)
@@ -79,10 +85,7 @@ def sample_connect_to_server(args):
     # Make sure we use an updated version of the rest apis, and pass in our cert handling choice
     server = TSC.Server(args.server, use_server_version=True, http_options={"verify": check_ssl_certificate})
     server.auth.sign_in(tableau_auth)
-    server.version = "2.6"
-    new_site: TSC.SiteItem = TSC.SiteItem("cdnear", content_url=env.site)
-    server.auth.switch_site(new_site)
-    print("Logged in successfully")
+    server.version = "3.19"
 
     return server
 
diff --git a/samples/publish_datasource.py b/samples/publish_datasource.py
index 85f63fb..c674e68 100644
--- a/samples/publish_datasource.py
+++ b/samples/publish_datasource.py
@@ -21,12 +21,17 @@
 import argparse
 import logging
 
+import os
 import tableauserverclient as TSC
-
-import env
 import tableauserverclient.datetime_helpers
 
 
+def get_env(key):
+    if key in os.environ:
+        return os.environ[key]
+    return None
+
+
 def main():
     parser = argparse.ArgumentParser(description="Publish a datasource to server.")
     # Common options; please keep those in sync across all samples
@@ -52,13 +57,13 @@ def main():
 
     args = parser.parse_args()
     if not args.server:
-        args.server = env.server
+        args.server = get_env("SERVER")
     if not args.site:
-        args.site = env.site
+        args.site = get_env("SITE")
     if not args.token_name:
-        args.token_name = env.token_name
+        args.token_name = get_env("TOKEN_NAME")
     if not args.token_value:
-        args.token_value = env.token_value
+        args.token_value = get_env("TOKEN_VALUE")
     args.logging = "debug"
     args.file = "C:/dev/tab-samples/5M.tdsx"
     args.async_ = True
@@ -118,8 +123,10 @@ def main():
                 new_datasource, args.file, publish_mode, connection_credentials=new_conn_creds
             )
             print(
-                "{}Datasource published. Datasource ID: {}".format(
-                    new_datasource.id, tableauserverclient.datetime_helpers.timestamp()
+                (
+                    "{}Datasource published. Datasource ID: {}".format(
+                        new_datasource.id, tableauserverclient.datetime_helpers.timestamp()
+                    )
                 )
             )
             print("\t\tClosing connection")
diff --git a/samples/set_refresh_schedule.py b/samples/set_refresh_schedule.py
index 56fd12e..153bb0e 100644
--- a/samples/set_refresh_schedule.py
+++ b/samples/set_refresh_schedule.py
@@ -38,7 +38,7 @@ def usage(args):
 
 def make_filter(**kwargs):
     options = TSC.RequestOptions()
-    for item, value in kwargs.items():
+    for item, value in list(kwargs.items()):
         name = getattr(TSC.RequestOptions.Field, item)
         options.filter.add(TSC.Filter(name, TSC.RequestOptions.Operator.Equals, value))
     return options
diff --git a/samples/update_connection.py b/samples/update_connection.py
index 4af6592..0fe2f34 100644
--- a/samples/update_connection.py
+++ b/samples/update_connection.py
@@ -45,7 +45,7 @@ def main():
         update_function = endpoint.update_connection
         resource = endpoint.get_by_id(args.resource_id)
         endpoint.populate_connections(resource)
-        connections = list(filter(lambda x: x.id == args.connection_id, resource.connections))
+        connections = list([x for x in resource.connections if x.id == args.connection_id])
         assert len(connections) == 1
         connection = connections[0]
         connection.username = args.datasource_username
diff --git a/samples/update_workbook_data_acceleration.py b/samples/update_workbook_data_acceleration.py
deleted file mode 100644
index 57a1363..0000000
--- a/samples/update_workbook_data_acceleration.py
+++ /dev/null
@@ -1,109 +0,0 @@
-####
-# This script demonstrates how to update workbook data acceleration  using the Tableau
-# Server Client.
-#
-# To run the script, you must have installed Python 3.7 or later.
-####
-
-
-import argparse
-import logging
-
-import tableauserverclient as TSC
-from tableauserverclient import IntervalItem
-
-
-def main():
-    parser = argparse.ArgumentParser(description="Creates sample schedules for each type of frequency.")
-    # Common options; please keep those in sync across all samples
-    parser.add_argument("--server", "-s", help="server address")
-    parser.add_argument("--site", "-S", help="site name")
-    parser.add_argument("--token-name", "-p", help="name of the personal access token used to sign into the server")
-    parser.add_argument("--token-value", "-v", help="value of the personal access token used to sign into the server")
-    parser.add_argument(
-        "--logging-level",
-        "-l",
-        choices=["debug", "info", "error"],
-        default="error",
-        help="desired logging level (set to error by default)",
-    )
-    # Options specific to this sample:
-    # This sample has no additional options, yet. If you add some, please add them here
-
-    args = parser.parse_args()
-
-    # Set logging level based on user input, or error by default
-    logging_level = getattr(logging, args.logging_level.upper())
-    logging.basicConfig(level=logging_level)
-
-    tableau_auth = TSC.PersonalAccessTokenAuth(args.token_name, args.token_value, site_id=args.site)
-    server = TSC.Server(args.server, use_server_version=False)
-    server.add_http_options({"verify": False})
-    server.use_server_version()
-    with server.auth.sign_in(tableau_auth):
-        # Get workbook
-        all_workbooks, pagination_item = server.workbooks.get()
-        print(f"\nThere are {pagination_item.total_available} workbooks on site: ")
-        print([workbook.name for workbook in all_workbooks])
-
-        if all_workbooks:
-            # Pick 1 workbook to try data acceleration.
-            # Note that data acceleration has a couple of requirements, please check the Tableau help page
-            # to verify your workbook/view is eligible for data acceleration.
-
-            # Assuming 1st workbook is eligible for sample purposes
-            sample_workbook = all_workbooks[2]
-
-            # Enable acceleration for all the views in the workbook
-            enable_config = dict()
-            enable_config["acceleration_enabled"] = True
-            enable_config["accelerate_now"] = True
-
-            sample_workbook.data_acceleration_config = enable_config
-            updated: TSC.WorkbookItem = server.workbooks.update(sample_workbook)
-            # Since we did not set any specific view, we will enable all views in the workbook
-            print("Enable acceleration for all the views in the workbook " + updated.name + ".")
-
-            # Disable acceleration on one of the view in the workbook
-            # You have to populate_views first, then set the views of the workbook
-            # to the ones you want to update.
-            server.workbooks.populate_views(sample_workbook)
-            view_to_disable = sample_workbook.views[0]
-            sample_workbook.views = [view_to_disable]
-
-            disable_config = dict()
-            disable_config["acceleration_enabled"] = False
-            disable_config["accelerate_now"] = True
-
-            sample_workbook.data_acceleration_config = disable_config
-            # To get the acceleration status on the response, set includeViewAccelerationStatus=true
-            # Note that you have to populate_views first to get the acceleration status, since
-            # acceleration status is per view basis (not per workbook)
-            updated: TSC.WorkbookItem = server.workbooks.update(sample_workbook, True)
-            view1 = updated.views[0]
-            print('Disabled acceleration for 1 view "' + view1.name + '" in the workbook ' + updated.name + ".")
-
-            # Get acceleration status of the views in workbook using workbooks.get_by_id
-            # This won't need to do populate_views beforehand
-            my_workbook = server.workbooks.get_by_id(sample_workbook.id)
-            view1 = my_workbook.views[0]
-            view2 = my_workbook.views[1]
-            print(
-                "Fetching acceleration status for views in the workbook "
-                + updated.name
-                + ".\n"
-                + 'View "'
-                + view1.name
-                + '" has acceleration_status = '
-                + view1.data_acceleration_config["acceleration_status"]
-                + ".\n"
-                + 'View "'
-                + view2.name
-                + '" has acceleration_status = '
-                + view2.data_acceleration_config["acceleration_status"]
-                + "."
-            )
-
-
-if __name__ == "__main__":
-    main()
diff --git a/tableauserverclient/models/custom_view_item.py b/tableauserverclient/models/custom_view_item.py
index de917bf..a0c0a98 100644
--- a/tableauserverclient/models/custom_view_item.py
+++ b/tableauserverclient/models/custom_view_item.py
@@ -3,6 +3,7 @@ from datetime import datetime
 from defusedxml import ElementTree
 from defusedxml.ElementTree import fromstring, tostring
 from typing import Callable, Optional
+from collections.abc import Iterator
 
 from .exceptions import UnpopulatedPropertyError
 from .user_item import UserItem
@@ -17,6 +18,8 @@ class CustomViewItem:
         self._created_at: Optional["datetime"] = None
         self._id: Optional[str] = id
         self._image: Optional[Callable[[], bytes]] = None
+        self._pdf: Optional[Callable[[], bytes]] = None
+        self._csv: Optional[Callable[[], Iterator[bytes]]] = None
         self._name: Optional[str] = name
         self._shared: Optional[bool] = False
         self._updated_at: Optional["datetime"] = None
@@ -40,6 +43,12 @@ class CustomViewItem:
     def _set_image(self, image):
         self._image = image
 
+    def _set_pdf(self, pdf):
+        self._pdf = pdf
+
+    def _set_csv(self, csv):
+        self._csv = csv
+
     @property
     def content_url(self) -> Optional[str]:
         return self._content_url
@@ -55,10 +64,24 @@ class CustomViewItem:
     @property
     def image(self) -> bytes:
         if self._image is None:
-            error = "View item must be populated with its png image first."
+            error = "Custom View item must be populated with its png image first."
             raise UnpopulatedPropertyError(error)
         return self._image()
 
+    @property
+    def pdf(self) -> bytes:
+        if self._pdf is None:
+            error = "Custom View item must be populated with its pdf first."
+            raise UnpopulatedPropertyError(error)
+        return self._pdf()
+
+    @property
+    def csv(self) -> Iterator[bytes]:
+        if self._csv is None:
+            error = "Custom View item must be populated with its csv first."
+            raise UnpopulatedPropertyError(error)
+        return self._csv()
+
     @property
     def name(self) -> Optional[str]:
         return self._name
diff --git a/tableauserverclient/server/endpoint/custom_views_endpoint.py b/tableauserverclient/server/endpoint/custom_views_endpoint.py
index 63899ba..b02b05d 100644
--- a/tableauserverclient/server/endpoint/custom_views_endpoint.py
+++ b/tableauserverclient/server/endpoint/custom_views_endpoint.py
@@ -1,15 +1,23 @@
 import io
 import logging
 import os
+from contextlib import closing
 from pathlib import Path
 from typing import Optional, Union
+from collections.abc import Iterator
 
 from tableauserverclient.config import BYTES_PER_MB, config
 from tableauserverclient.filesys_helpers import get_file_object_size
 from tableauserverclient.server.endpoint.endpoint import QuerysetEndpoint, api
 from tableauserverclient.server.endpoint.exceptions import MissingRequiredFieldError
 from tableauserverclient.models import CustomViewItem, PaginationItem
-from tableauserverclient.server import RequestFactory, RequestOptions, ImageRequestOptions
+from tableauserverclient.server import (
+    RequestFactory,
+    RequestOptions,
+    ImageRequestOptions,
+    PDFRequestOptions,
+    CSVRequestOptions,
+)
 
 from tableauserverclient.helpers.logging import logger
 
@@ -91,9 +99,45 @@ class CustomViews(QuerysetEndpoint[CustomViewItem]):
         image = server_response.content
         return image
 
-    """
-    Not yet implemented: pdf or csv exports
-    """
+    @api(version="3.23")
+    def populate_pdf(self, custom_view_item: CustomViewItem, req_options: Optional["PDFRequestOptions"] = None) -> None:
+        if not custom_view_item.id:
+            error = "Custom View item missing ID."
+            raise MissingRequiredFieldError(error)
+
+        def pdf_fetcher():
+            return self._get_custom_view_pdf(custom_view_item, req_options)
+
+        custom_view_item._set_pdf(pdf_fetcher)
+        logger.info(f"Populated pdf for custom view (ID: {custom_view_item.id})")
+
+    def _get_custom_view_pdf(
+        self, custom_view_item: CustomViewItem, req_options: Optional["PDFRequestOptions"]
+    ) -> bytes:
+        url = f"{self.baseurl}/{custom_view_item.id}/pdf"
+        server_response = self.get_request(url, req_options)
+        pdf = server_response.content
+        return pdf
+
+    @api(version="3.23")
+    def populate_csv(self, custom_view_item: CustomViewItem, req_options: Optional["CSVRequestOptions"] = None) -> None:
+        if not custom_view_item.id:
+            error = "Custom View item missing ID."
+            raise MissingRequiredFieldError(error)
+
+        def csv_fetcher():
+            return self._get_custom_view_csv(custom_view_item, req_options)
+
+        custom_view_item._set_csv(csv_fetcher)
+        logger.info(f"Populated csv for custom view (ID: {custom_view_item.id})")
+
+    def _get_custom_view_csv(
+        self, custom_view_item: CustomViewItem, req_options: Optional["CSVRequestOptions"]
+    ) -> Iterator[bytes]:
+        url = f"{self.baseurl}/{custom_view_item.id}/data"
+
+        with closing(self.get_request(url, request_object=req_options, parameters={"stream": True})) as server_response:
+            yield from server_response.iter_content(1024)
 
     @api(version="3.18")
     def update(self, view_item: CustomViewItem) -> Optional[CustomViewItem]:
diff --git a/tableauserverclient/server/endpoint/schedules_endpoint.py b/tableauserverclient/server/endpoint/schedules_endpoint.py
index 4ed243b..eec4536 100644
--- a/tableauserverclient/server/endpoint/schedules_endpoint.py
+++ b/tableauserverclient/server/endpoint/schedules_endpoint.py
@@ -115,8 +115,7 @@ class Schedules(Endpoint):
             )  # type:ignore[arg-type]
 
         results = (self._add_to(*x) for x in items)
-        # list() is needed for python 3.x compatibility
-        return list(filter(lambda x: not x.result, results))  # type:ignore[arg-type]
+        return [x for x in results if not x.result]
 
     def _add_to(
         self,
diff --git a/tableauserverclient/server/request_options.py b/tableauserverclient/server/request_options.py
index 0d47abf..d79ac7f 100644
--- a/tableauserverclient/server/request_options.py
+++ b/tableauserverclient/server/request_options.py
@@ -213,6 +213,46 @@ class _DataExportOptions(RequestOptionsBase):
             params[name] = value
 
 
+class _ImagePDFCommonExportOptions(_DataExportOptions):
+    def __init__(self, maxage=-1, viz_height=None, viz_width=None):
+        super().__init__(maxage=maxage)
+        self.viz_height = viz_height
+        self.viz_width = viz_width
+
+    @property
+    def viz_height(self):
+        return self._viz_height
+
+    @viz_height.setter
+    @property_is_int(range=(0, sys.maxsize), allowed=(None,))
+    def viz_height(self, value):
+        self._viz_height = value
+
+    @property
+    def viz_width(self):
+        return self._viz_width
+
+    @viz_width.setter
+    @property_is_int(range=(0, sys.maxsize), allowed=(None,))
+    def viz_width(self, value):
+        self._viz_width = value
+
+    def get_query_params(self) -> dict:
+        params = super().get_query_params()
+
+        # XOR. Either both are None or both are not None.
+        if (self.viz_height is None) ^ (self.viz_width is None):
+            raise ValueError("viz_height and viz_width must be specified together")
+
+        if self.viz_height is not None:
+            params["vizHeight"] = self.viz_height
+
+        if self.viz_width is not None:
+            params["vizWidth"] = self.viz_width
+
+        return params
+
+
 class CSVRequestOptions(_DataExportOptions):
     extension = "csv"
 
@@ -221,15 +261,15 @@ class ExcelRequestOptions(_DataExportOptions):
     extension = "xlsx"
 
 
-class ImageRequestOptions(_DataExportOptions):
+class ImageRequestOptions(_ImagePDFCommonExportOptions):
     extension = "png"
 
     # if 'high' isn't specified, the REST API endpoint returns an image with standard resolution
     class Resolution:
         High = "high"
 
-    def __init__(self, imageresolution=None, maxage=-1):
-        super().__init__(maxage=maxage)
+    def __init__(self, imageresolution=None, maxage=-1, viz_height=None, viz_width=None):
+        super().__init__(maxage=maxage, viz_height=viz_height, viz_width=viz_width)
         self.image_resolution = imageresolution
 
     def get_query_params(self):
@@ -239,7 +279,7 @@ class ImageRequestOptions(_DataExportOptions):
         return params
 
 
-class PDFRequestOptions(_DataExportOptions):
+class PDFRequestOptions(_ImagePDFCommonExportOptions):
     class PageType:
         A3 = "a3"
         A4 = "a4"
@@ -261,29 +301,9 @@ class PDFRequestOptions(_DataExportOptions):
         Landscape = "landscape"
 
     def __init__(self, page_type=None, orientation=None, maxage=-1, viz_height=None, viz_width=None):
-        super().__init__(maxage=maxage)
+        super().__init__(maxage=maxage, viz_height=viz_height, viz_width=viz_width)
         self.page_type = page_type
         self.orientation = orientation
-        self.viz_height = viz_height
-        self.viz_width = viz_width
-
-    @property
-    def viz_height(self):
-        return self._viz_height
-
-    @viz_height.setter
-    @property_is_int(range=(0, sys.maxsize), allowed=(None,))
-    def viz_height(self, value):
-        self._viz_height = value
-
-    @property
-    def viz_width(self):
-        return self._viz_width
-
-    @viz_width.setter
-    @property_is_int(range=(0, sys.maxsize), allowed=(None,))
-    def viz_width(self, value):
-        self._viz_width = value
 
     def get_query_params(self) -> dict:
         params = super().get_query_params()
@@ -293,14 +313,4 @@ class PDFRequestOptions(_DataExportOptions):
         if self.orientation:
             params["orientation"] = self.orientation
 
-        # XOR. Either both are None or both are not None.
-        if (self.viz_height is None) ^ (self.viz_width is None):
-            raise ValueError("viz_height and viz_width must be specified together")
-
-        if self.viz_height is not None:
-            params["vizHeight"] = self.viz_height
-
-        if self.viz_width is not None:
-            params["vizWidth"] = self.viz_width
-
         return params


Test patch:
diff --git a/test/test_custom_view.py b/test/test_custom_view.py
index 80800c8..6e863a8 100644
--- a/test/test_custom_view.py
+++ b/test/test_custom_view.py
@@ -18,6 +18,8 @@ GET_XML = os.path.join(TEST_ASSET_DIR, "custom_view_get.xml")
 GET_XML_ID = os.path.join(TEST_ASSET_DIR, "custom_view_get_id.xml")
 POPULATE_PREVIEW_IMAGE = os.path.join(TEST_ASSET_DIR, "Sample View Image.png")
 CUSTOM_VIEW_UPDATE_XML = os.path.join(TEST_ASSET_DIR, "custom_view_update.xml")
+CUSTOM_VIEW_POPULATE_PDF = os.path.join(TEST_ASSET_DIR, "populate_pdf.pdf")
+CUSTOM_VIEW_POPULATE_CSV = os.path.join(TEST_ASSET_DIR, "populate_csv.csv")
 CUSTOM_VIEW_DOWNLOAD = TEST_ASSET_DIR / "custom_view_download.json"
 FILE_UPLOAD_INIT = TEST_ASSET_DIR / "fileupload_initialize.xml"
 FILE_UPLOAD_APPEND = TEST_ASSET_DIR / "fileupload_append.xml"
@@ -246,3 +248,73 @@ class CustomViewTests(unittest.TestCase):
         assert isinstance(view, TSC.CustomViewItem)
         assert view.id is not None
         assert view.name is not None
+
+    def test_populate_pdf(self) -> None:
+        self.server.version = "3.23"
+        self.baseurl = self.server.custom_views.baseurl
+        with open(CUSTOM_VIEW_POPULATE_PDF, "rb") as f:
+            response = f.read()
+        with requests_mock.mock() as m:
+            m.get(
+                self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/pdf?type=letter&orientation=portrait&maxAge=5",
+                content=response,
+            )
+            custom_view = TSC.CustomViewItem()
+            custom_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5"
+
+            size = TSC.PDFRequestOptions.PageType.Letter
+            orientation = TSC.PDFRequestOptions.Orientation.Portrait
+            req_option = TSC.PDFRequestOptions(size, orientation, 5)
+
+            self.server.custom_views.populate_pdf(custom_view, req_option)
+            self.assertEqual(response, custom_view.pdf)
+
+    def test_populate_csv(self) -> None:
+        self.server.version = "3.23"
+        self.baseurl = self.server.custom_views.baseurl
+        with open(CUSTOM_VIEW_POPULATE_CSV, "rb") as f:
+            response = f.read()
+        with requests_mock.mock() as m:
+            m.get(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/data?maxAge=1", content=response)
+            custom_view = TSC.CustomViewItem()
+            custom_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5"
+            request_option = TSC.CSVRequestOptions(maxage=1)
+            self.server.custom_views.populate_csv(custom_view, request_option)
+
+            csv_file = b"".join(custom_view.csv)
+            self.assertEqual(response, csv_file)
+
+    def test_populate_csv_default_maxage(self) -> None:
+        self.server.version = "3.23"
+        self.baseurl = self.server.custom_views.baseurl
+        with open(CUSTOM_VIEW_POPULATE_CSV, "rb") as f:
+            response = f.read()
+        with requests_mock.mock() as m:
+            m.get(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/data", content=response)
+            custom_view = TSC.CustomViewItem()
+            custom_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5"
+            self.server.custom_views.populate_csv(custom_view)
+
+            csv_file = b"".join(custom_view.csv)
+            self.assertEqual(response, csv_file)
+
+    def test_pdf_height(self) -> None:
+        self.server.version = "3.23"
+        self.baseurl = self.server.custom_views.baseurl
+        with open(CUSTOM_VIEW_POPULATE_PDF, "rb") as f:
+            response = f.read()
+        with requests_mock.mock() as m:
+            m.get(
+                self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/pdf?vizHeight=1080&vizWidth=1920",
+                content=response,
+            )
+            custom_view = TSC.CustomViewItem()
+            custom_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5"
+
+            req_option = TSC.PDFRequestOptions(
+                viz_height=1080,
+                viz_width=1920,
+            )
+
+            self.server.custom_views.populate_pdf(custom_view, req_option)
+            self.assertEqual(response, custom_view.pdf)