geobox 2.0.1__py3-none-any.whl → 2.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. geobox/__init__.py +61 -63
  2. geobox/aio/__init__.py +61 -63
  3. geobox/aio/api.py +489 -473
  4. geobox/aio/apikey.py +263 -263
  5. geobox/aio/attachment.py +341 -339
  6. geobox/aio/base.py +261 -262
  7. geobox/aio/basemap.py +196 -196
  8. geobox/aio/dashboard.py +340 -342
  9. geobox/aio/feature.py +23 -33
  10. geobox/aio/field.py +315 -321
  11. geobox/aio/file.py +72 -72
  12. geobox/aio/layout.py +340 -341
  13. geobox/aio/log.py +23 -23
  14. geobox/aio/map.py +1033 -1034
  15. geobox/aio/model3d.py +415 -415
  16. geobox/aio/mosaic.py +696 -696
  17. geobox/aio/plan.py +314 -314
  18. geobox/aio/query.py +693 -693
  19. geobox/aio/raster.py +907 -869
  20. geobox/aio/raster_analysis.py +740 -0
  21. geobox/aio/route.py +4 -4
  22. geobox/aio/scene.py +340 -342
  23. geobox/aio/settings.py +18 -18
  24. geobox/aio/task.py +404 -402
  25. geobox/aio/tile3d.py +337 -339
  26. geobox/aio/tileset.py +102 -103
  27. geobox/aio/usage.py +52 -51
  28. geobox/aio/user.py +506 -507
  29. geobox/aio/vector_tool.py +1968 -0
  30. geobox/aio/vectorlayer.py +315 -306
  31. geobox/aio/version.py +272 -273
  32. geobox/aio/view.py +1019 -983
  33. geobox/aio/workflow.py +340 -341
  34. geobox/api.py +18 -2
  35. geobox/apikey.py +262 -262
  36. geobox/attachment.py +336 -337
  37. geobox/base.py +384 -384
  38. geobox/basemap.py +194 -194
  39. geobox/dashboard.py +339 -341
  40. geobox/enums.py +432 -348
  41. geobox/feature.py +5 -5
  42. geobox/field.py +320 -320
  43. geobox/file.py +4 -4
  44. geobox/layout.py +339 -340
  45. geobox/log.py +4 -4
  46. geobox/map.py +1031 -1032
  47. geobox/model3d.py +410 -410
  48. geobox/mosaic.py +696 -696
  49. geobox/plan.py +313 -313
  50. geobox/query.py +691 -691
  51. geobox/raster.py +907 -863
  52. geobox/raster_analysis.py +737 -0
  53. geobox/scene.py +341 -342
  54. geobox/settings.py +194 -194
  55. geobox/task.py +399 -400
  56. geobox/tile3d.py +337 -338
  57. geobox/tileset.py +4 -4
  58. geobox/usage.py +3 -3
  59. geobox/user.py +503 -503
  60. geobox/vector_tool.py +1968 -0
  61. geobox/vectorlayer.py +5 -5
  62. geobox/version.py +272 -272
  63. geobox/view.py +981 -981
  64. geobox/workflow.py +338 -339
  65. {geobox-2.0.1.dist-info → geobox-2.2.0.dist-info}/METADATA +15 -1
  66. geobox-2.2.0.dist-info/RECORD +72 -0
  67. geobox-2.0.1.dist-info/RECORD +0 -68
  68. {geobox-2.0.1.dist-info → geobox-2.2.0.dist-info}/WHEEL +0 -0
  69. {geobox-2.0.1.dist-info → geobox-2.2.0.dist-info}/licenses/LICENSE +0 -0
  70. {geobox-2.0.1.dist-info → geobox-2.2.0.dist-info}/top_level.txt +0 -0
geobox/dashboard.py CHANGED
@@ -1,342 +1,340 @@
1
- from typing import List, Dict, Optional, TYPE_CHECKING, Union
2
- from urllib.parse import urljoin
3
-
4
- from .base import Base
5
-
6
- if TYPE_CHECKING:
7
- from . import GeoboxClient
8
- from .user import User
9
- from .aio import AsyncGeoboxClient
10
- from .aio.dashboard import Dashboard as AsyncDashboard
11
-
12
-
13
- class Dashboard(Base):
14
-
15
- BASE_ENDPOINT = 'dashboards/'
16
-
17
- def __init__(self,
18
- api: 'GeoboxClient',
19
- uuid: str,
20
- data: Optional[Dict] = {}):
21
- """
22
- Initialize a Dashboard instance.
23
-
24
- Args:
25
- api (GeoboxClient): The GeoboxClient instance for making requests.
26
- uuid (str): The unique identifier for the Dashboard.
27
- data (Dict, optional): The data of the Dashboard.
28
- """
29
- super().__init__(api, uuid=uuid, data=data)
30
-
31
-
32
- @classmethod
33
- def get_dashboards(cls, api: 'GeoboxClient', **kwargs) -> Union[List['Dashboard'], int]:
34
- """
35
- Get list of Dashboards
36
-
37
- Args:
38
- api (GeoboxClient): The GeoboxClient instance for making requests.
39
-
40
- Keyword Args:
41
- q (str): query filter based on OGC CQL standard. e.g. "field1 LIKE '%GIS%' AND created_at > '2021-01-01'"
42
- search (str): search term for keyword-based searching among search_fields or all textual fields if search_fields does not have value. NOTE: if q param is defined this param will be ignored.
43
- search_fields (str): comma separated list of fields for searching.
44
- order_by (str): comma separated list of fields for sorting results [field1 A|D, field2 A|D, …]. e.g. name A, type D. NOTE: "A" denotes ascending order and "D" denotes descending order.
45
- return_count (bool): Whether to return total count. default is False.
46
- skip (int): Number of items to skip. default is 0.
47
- limit (int): Number of items to return. default is 10.
48
- user_id (int): Specific user. privileges required.
49
- shared (bool): Whether to return shared Dashboards. default is False.
50
-
51
- Returns:
52
- List[Dashboard] | int: A list of Dashboard instances or the total number of Dashboards.
53
-
54
- Example:
55
- >>> from geobox import GeoboxClient
56
- >>> from geobox.dashboard import Dashboard
57
- >>> client = GeoboxClient()
58
- >>> dashboards = Dashboard.get_dashboards(client)
59
- or
60
- >>> dashboards = client.get_dashboards()
61
- """
62
- params = {
63
- 'f': 'json',
64
- 'q': kwargs.get('q'),
65
- 'search': kwargs.get('search'),
66
- 'search_fields': kwargs.get('search_fields'),
67
- 'order_by': kwargs.get('order_by'),
68
- 'return_count': kwargs.get('return_count', False),
69
- 'skip': kwargs.get('skip', 0),
70
- 'limit': kwargs.get('limit', 10),
71
- 'user_id': kwargs.get('user_id'),
72
- 'shared': kwargs.get('shared', False)
73
- }
74
- return super()._get_list(api, cls.BASE_ENDPOINT, params, factory_func=lambda api, item: Dashboard(api, item['uuid'], item))
75
-
76
-
77
- @classmethod
78
- def create_dashboard(cls,
79
- api: 'GeoboxClient',
80
- name: str,
81
- display_name: str = None,
82
- description: str = None,
83
- settings: Dict = {},
84
- thumbnail: str = None,
85
- user_id: int = None) -> 'Dashboard':
86
- """
87
- Create a new Dashboard.
88
-
89
- Args:
90
- api (GeoboxClient): The GeoboxClient instance for making requests.
91
- name (str): The name of the Dashboard.
92
- display_name (str, optional): The display name of the Dashboard.
93
- description (str, optional): The description of the Dashboard.
94
- settings (Dict, optional): The settings of the sceDashboarde.
95
- thumbnail (str, optional): The thumbnail of the Dashboard.
96
- user_id (int, optional): Specific user. privileges required.
97
-
98
- Returns:
99
- Dashboard: The newly created Dashboard instance.
100
-
101
- Raises:
102
- ValidationError: If the Dashboard data is invalid.
103
-
104
- Example:
105
- >>> from geobox import GeoboxClient
106
- >>> from geobox.dashboard import Dashboard
107
- >>> client = GeoboxClient()
108
- >>> dashboard = Dashboard.create_dashboard(client, name="my_dashboard")
109
- or
110
- >>> dashboard = client.create_dashboard(name="my_dashboard")
111
- """
112
- data = {
113
- "name": name,
114
- "display_name": display_name,
115
- "description": description,
116
- "settings": settings,
117
- "thumbnail": thumbnail,
118
- "user_id": user_id,
119
- }
120
- return super()._create(api, cls.BASE_ENDPOINT, data, factory_func=lambda api, item: Dashboard(api, item['uuid'], item))
121
-
122
-
123
- @classmethod
124
- def get_dashboard(cls, api: 'GeoboxClient', uuid: str, user_id: int = None) -> 'Dashboard':
125
- """
126
- Get a Dashboard by its UUID.
127
-
128
- Args:
129
- api (GeoboxClient): The GeoboxClient instance for making requests.
130
- uuid (str): The UUID of the Dashboard to get.
131
- user_id (int, optional): Specific user. privileges required.
132
-
133
- Returns:
134
- Dashboard: The dashboard object.
135
-
136
- Raises:
137
- NotFoundError: If the Dashboard with the specified UUID is not found.
138
-
139
- Example:
140
- >>> from geobox import GeoboxClient
141
- >>> from geobox.dashboard import Dashboard
142
- >>> client = GeoboxClient()
143
- >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
144
- or
145
- >>> dashboard = client.get_dashboard(uuid="12345678-1234-5678-1234-567812345678")
146
- """
147
- params = {
148
- 'f': 'json',
149
- 'user_id': user_id,
150
- }
151
- return super()._get_detail(api, cls.BASE_ENDPOINT, uuid, params, factory_func=lambda api, item: Dashboard(api, item['uuid'], item))
152
-
153
-
154
- @classmethod
155
- def get_dashboard_by_name(cls, api: 'GeoboxClient', name: str, user_id: int = None) -> Union['Dashboard', None]:
156
- """
157
- Get a dashboard by name
158
-
159
- Args:
160
- api (GeoboxClient): The GeoboxClient instance for making requests.
161
- name (str): the name of the dashboard to get
162
- user_id (int, optional): specific user. privileges required.
163
-
164
- Returns:
165
- Dashboard | None: returns the dashboard if a dashboard matches the given name, else None
166
-
167
- Example:
168
- >>> from geobox import GeoboxClient
169
- >>> from geobox.dashboard import Dashboard
170
- >>> client = GeoboxClient()
171
- >>> dashboard = Dashboard.get_dashboard_by_name(client, name='test')
172
- or
173
- >>> dashboard = client.get_dashboard_by_name(name='test')
174
- """
175
- dashboards = cls.get_dashboards(api, q=f"name = '{name}'", user_id=user_id)
176
- if dashboards and dashboards[0].name == name:
177
- return dashboards[0]
178
- else:
179
- return None
180
-
181
-
182
- def update(self, **kwargs) -> Dict:
183
- """
184
- Update the Dashboard
185
-
186
- Keyword Args:
187
- name (str): The name of the Dashboard.
188
- display_name (str): The display name of the Dashboard.
189
- description (str): The description of the Dashboard.
190
- settings (Dict): The settings of the Dashboard.
191
- thumbnail (str): The thumbnail of the Dashboard.
192
-
193
- Returns:
194
- Dict: The updated Dashboard data.
195
-
196
- Raises:
197
- ValidationError: If the Dashboard data is invalid.
198
-
199
- Example:
200
- >>> from geobox import GeoboxClient
201
- >>> from geobox.dashboard import Dashboard
202
- >>> client = GeoboxClient()
203
- >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
204
- >>> dashboard.update(display_name="New Display Name")
205
- """
206
- data = {
207
- "name": kwargs.get('name'),
208
- "display_name": kwargs.get('display_name'),
209
- "description": kwargs.get('description'),
210
- "settings": kwargs.get('settings'),
211
- "thumbnail": kwargs.get('thumbnail')
212
- }
213
- return super()._update(self.endpoint, data)
214
-
215
-
216
- def delete(self) -> None:
217
- """
218
- Delete the dashboard.
219
-
220
- Returns:
221
- None
222
-
223
- Example:
224
- >>> from geobox import GeoboxClient
225
- >>> from geobox.dashboard import Dashboard
226
- >>> client = GeoboxClient()
227
- >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
228
- >>> dashboard.delete()
229
- """
230
- super().delete(self.endpoint)
231
-
232
-
233
- @property
234
- def thumbnail(self) -> str:
235
- """
236
- Get the thumbnail URL of the dashboard.
237
-
238
- Returns:
239
- str: The thumbnail of the dashboard.
240
-
241
- Example:
242
- >>> from geobox import GeoboxClient
243
- >>> from geobox.dashboard import Dashboard
244
- >>> client = GeoboxClient()
245
- >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
246
- >>> dashboard.thumbnail
247
- 'https://example.com/thumbnail.png'
248
- """
249
- return super().thumbnail()
250
-
251
-
252
- def share(self, users: List['User']) -> None:
253
- """
254
- Shares the Dashboard with specified users.
255
-
256
- Args:
257
- users (List[User]): The list of user objects to share the Dashboard with.
258
-
259
- Returns:
260
- None
261
-
262
- Example:
263
- >>> from geobox import GeoboxClient
264
- >>> from geobox.dashboard import Dashboard
265
- >>> client = GeoboxClient()
266
- >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
267
- >>> users = client.search_users(search='John')
268
- >>> dashboard.share(users=users)
269
- """
270
- super()._share(self.endpoint, users)
271
-
272
-
273
- def unshare(self, users: List['User']) -> None:
274
- """
275
- Unshares the Dashboard with specified users.
276
-
277
- Args:
278
- users (List[User]): The list of user objects to unshare the Dashboard with.
279
-
280
- Returns:
281
- None
282
-
283
- Example:
284
- >>> from geobox import GeoboxClient
285
- >>> from geobox.dashboard import Dashboard
286
- >>> client = GeoboxClient()
287
- >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
288
- >>> users = client.search_users(search='John')
289
- >>> dashboard.unshare(users=users)
290
- """
291
- super()._unshare(self.endpoint, users)
292
-
293
-
294
- def get_shared_users(self, search: str = None, skip: int = 0, limit: int = 10) -> List['User']:
295
- """
296
- Retrieves the list of users the dashboard is shared with.
297
-
298
- Args:
299
- search (str, optional): The search query.
300
- skip (int, optional): The number of users to skip.
301
- limit (int, optional): The maximum number of users to retrieve.
302
-
303
- Returns:
304
- List[User]: The list of shared users.
305
-
306
- Example:
307
- >>> from geobox import GeoboxClient
308
- >>> from geobox.dashboard import Dashboard
309
- >>> client = GeoboxClient()
310
- >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
311
- >>> dashboard.get_shared_users(search='John', skip=0, limit=10)
312
- """
313
- params = {
314
- 'search': search,
315
- 'skip': skip,
316
- 'limit': limit
317
- }
318
- return super()._get_shared_users(self.endpoint, params)
319
-
320
-
321
- def to_async(self, async_client: 'AsyncGeoboxClient') -> 'AsyncDashboard':
322
- """
323
- Switch to async version of the dashboard instance to have access to the async methods
324
-
325
- Args:
326
- async_client (AsyncGeoboxClient): The async version of the GeoboxClient instance for making requests.
327
-
328
- Returns:
329
- geobox.aio.dashboard.Dashboard: the async instance of the dashboard.
330
-
331
- Example:
332
- >>> from geobox import Geoboxclient
333
- >>> from geobox.aio import AsyncGeoboxClient
334
- >>> from geobox.dashboard import Dashboard
335
- >>> client = GeoboxClient()
336
- >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
337
- >>> async with AsyncGeoboxClient() as async_client:
338
- >>> async_dashboard = dashboard.to_async(async_client)
339
- """
340
- from .aio.dashboard import Dashboard as AsyncDashboard
341
-
1
+ from typing import List, Dict, Optional, TYPE_CHECKING, Union
2
+
3
+ from .base import Base
4
+
5
+ if TYPE_CHECKING:
6
+ from . import GeoboxClient
7
+ from .user import User
8
+ from .aio import AsyncGeoboxClient
9
+ from .aio.dashboard import AsyncDashboard
10
+
11
+
12
+ class Dashboard(Base):
13
+
14
+ BASE_ENDPOINT = 'dashboards/'
15
+
16
+ def __init__(self,
17
+ api: 'GeoboxClient',
18
+ uuid: str,
19
+ data: Optional[Dict] = {}):
20
+ """
21
+ Initialize a Dashboard instance.
22
+
23
+ Args:
24
+ api (GeoboxClient): The GeoboxClient instance for making requests.
25
+ uuid (str): The unique identifier for the Dashboard.
26
+ data (Dict, optional): The data of the Dashboard.
27
+ """
28
+ super().__init__(api, uuid=uuid, data=data)
29
+
30
+
31
+ @classmethod
32
+ def get_dashboards(cls, api: 'GeoboxClient', **kwargs) -> Union[List['Dashboard'], int]:
33
+ """
34
+ Get list of Dashboards
35
+
36
+ Args:
37
+ api (GeoboxClient): The GeoboxClient instance for making requests.
38
+
39
+ Keyword Args:
40
+ q (str): query filter based on OGC CQL standard. e.g. "field1 LIKE '%GIS%' AND created_at > '2021-01-01'"
41
+ search (str): search term for keyword-based searching among search_fields or all textual fields if search_fields does not have value. NOTE: if q param is defined this param will be ignored.
42
+ search_fields (str): comma separated list of fields for searching.
43
+ order_by (str): comma separated list of fields for sorting results [field1 A|D, field2 A|D, …]. e.g. name A, type D. NOTE: "A" denotes ascending order and "D" denotes descending order.
44
+ return_count (bool): Whether to return total count. default is False.
45
+ skip (int): Number of items to skip. default is 0.
46
+ limit (int): Number of items to return. default is 10.
47
+ user_id (int): Specific user. privileges required.
48
+ shared (bool): Whether to return shared Dashboards. default is False.
49
+
50
+ Returns:
51
+ List[Dashboard] | int: A list of Dashboard instances or the total number of Dashboards.
52
+
53
+ Example:
54
+ >>> from geobox import GeoboxClient
55
+ >>> from geobox.dashboard import Dashboard
56
+ >>> client = GeoboxClient()
57
+ >>> dashboards = Dashboard.get_dashboards(client)
58
+ or
59
+ >>> dashboards = client.get_dashboards()
60
+ """
61
+ params = {
62
+ 'f': 'json',
63
+ 'q': kwargs.get('q'),
64
+ 'search': kwargs.get('search'),
65
+ 'search_fields': kwargs.get('search_fields'),
66
+ 'order_by': kwargs.get('order_by'),
67
+ 'return_count': kwargs.get('return_count', False),
68
+ 'skip': kwargs.get('skip', 0),
69
+ 'limit': kwargs.get('limit', 10),
70
+ 'user_id': kwargs.get('user_id'),
71
+ 'shared': kwargs.get('shared', False)
72
+ }
73
+ return super()._get_list(api, cls.BASE_ENDPOINT, params, factory_func=lambda api, item: Dashboard(api, item['uuid'], item))
74
+
75
+
76
+ @classmethod
77
+ def create_dashboard(cls,
78
+ api: 'GeoboxClient',
79
+ name: str,
80
+ display_name: str = None,
81
+ description: str = None,
82
+ settings: Dict = {},
83
+ thumbnail: str = None,
84
+ user_id: int = None) -> 'Dashboard':
85
+ """
86
+ Create a new Dashboard.
87
+
88
+ Args:
89
+ api (GeoboxClient): The GeoboxClient instance for making requests.
90
+ name (str): The name of the Dashboard.
91
+ display_name (str, optional): The display name of the Dashboard.
92
+ description (str, optional): The description of the Dashboard.
93
+ settings (Dict, optional): The settings of the sceDashboarde.
94
+ thumbnail (str, optional): The thumbnail of the Dashboard.
95
+ user_id (int, optional): Specific user. privileges required.
96
+
97
+ Returns:
98
+ Dashboard: The newly created Dashboard instance.
99
+
100
+ Raises:
101
+ ValidationError: If the Dashboard data is invalid.
102
+
103
+ Example:
104
+ >>> from geobox import GeoboxClient
105
+ >>> from geobox.dashboard import Dashboard
106
+ >>> client = GeoboxClient()
107
+ >>> dashboard = Dashboard.create_dashboard(client, name="my_dashboard")
108
+ or
109
+ >>> dashboard = client.create_dashboard(name="my_dashboard")
110
+ """
111
+ data = {
112
+ "name": name,
113
+ "display_name": display_name,
114
+ "description": description,
115
+ "settings": settings,
116
+ "thumbnail": thumbnail,
117
+ "user_id": user_id,
118
+ }
119
+ return super()._create(api, cls.BASE_ENDPOINT, data, factory_func=lambda api, item: Dashboard(api, item['uuid'], item))
120
+
121
+
122
+ @classmethod
123
+ def get_dashboard(cls, api: 'GeoboxClient', uuid: str, user_id: int = None) -> 'Dashboard':
124
+ """
125
+ Get a Dashboard by its UUID.
126
+
127
+ Args:
128
+ api (GeoboxClient): The GeoboxClient instance for making requests.
129
+ uuid (str): The UUID of the Dashboard to get.
130
+ user_id (int, optional): Specific user. privileges required.
131
+
132
+ Returns:
133
+ Dashboard: The dashboard object.
134
+
135
+ Raises:
136
+ NotFoundError: If the Dashboard with the specified UUID is not found.
137
+
138
+ Example:
139
+ >>> from geobox import GeoboxClient
140
+ >>> from geobox.dashboard import Dashboard
141
+ >>> client = GeoboxClient()
142
+ >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
143
+ or
144
+ >>> dashboard = client.get_dashboard(uuid="12345678-1234-5678-1234-567812345678")
145
+ """
146
+ params = {
147
+ 'f': 'json',
148
+ 'user_id': user_id,
149
+ }
150
+ return super()._get_detail(api, cls.BASE_ENDPOINT, uuid, params, factory_func=lambda api, item: Dashboard(api, item['uuid'], item))
151
+
152
+
153
+ @classmethod
154
+ def get_dashboard_by_name(cls, api: 'GeoboxClient', name: str, user_id: int = None) -> Union['Dashboard', None]:
155
+ """
156
+ Get a dashboard by name
157
+
158
+ Args:
159
+ api (GeoboxClient): The GeoboxClient instance for making requests.
160
+ name (str): the name of the dashboard to get
161
+ user_id (int, optional): specific user. privileges required.
162
+
163
+ Returns:
164
+ Dashboard | None: returns the dashboard if a dashboard matches the given name, else None
165
+
166
+ Example:
167
+ >>> from geobox import GeoboxClient
168
+ >>> from geobox.dashboard import Dashboard
169
+ >>> client = GeoboxClient()
170
+ >>> dashboard = Dashboard.get_dashboard_by_name(client, name='test')
171
+ or
172
+ >>> dashboard = client.get_dashboard_by_name(name='test')
173
+ """
174
+ dashboards = cls.get_dashboards(api, q=f"name = '{name}'", user_id=user_id)
175
+ if dashboards and dashboards[0].name == name:
176
+ return dashboards[0]
177
+ else:
178
+ return None
179
+
180
+
181
+ def update(self, **kwargs) -> Dict:
182
+ """
183
+ Update the Dashboard
184
+
185
+ Keyword Args:
186
+ name (str): The name of the Dashboard.
187
+ display_name (str): The display name of the Dashboard.
188
+ description (str): The description of the Dashboard.
189
+ settings (Dict): The settings of the Dashboard.
190
+ thumbnail (str): The thumbnail of the Dashboard.
191
+
192
+ Returns:
193
+ Dict: The updated Dashboard data.
194
+
195
+ Raises:
196
+ ValidationError: If the Dashboard data is invalid.
197
+
198
+ Example:
199
+ >>> from geobox import GeoboxClient
200
+ >>> from geobox.dashboard import Dashboard
201
+ >>> client = GeoboxClient()
202
+ >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
203
+ >>> dashboard.update(display_name="New Display Name")
204
+ """
205
+ data = {
206
+ "name": kwargs.get('name'),
207
+ "display_name": kwargs.get('display_name'),
208
+ "description": kwargs.get('description'),
209
+ "settings": kwargs.get('settings'),
210
+ "thumbnail": kwargs.get('thumbnail')
211
+ }
212
+ return super()._update(self.endpoint, data)
213
+
214
+
215
+ def delete(self) -> None:
216
+ """
217
+ Delete the dashboard.
218
+
219
+ Returns:
220
+ None
221
+
222
+ Example:
223
+ >>> from geobox import GeoboxClient
224
+ >>> from geobox.dashboard import Dashboard
225
+ >>> client = GeoboxClient()
226
+ >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
227
+ >>> dashboard.delete()
228
+ """
229
+ super()._delete(self.endpoint)
230
+
231
+
232
+ @property
233
+ def thumbnail(self) -> str:
234
+ """
235
+ Get the thumbnail URL of the dashboard.
236
+
237
+ Returns:
238
+ str: The thumbnail of the dashboard.
239
+
240
+ Example:
241
+ >>> from geobox import GeoboxClient
242
+ >>> from geobox.dashboard import Dashboard
243
+ >>> client = GeoboxClient()
244
+ >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
245
+ >>> dashboard.thumbnail
246
+ """
247
+ return super()._thumbnail()
248
+
249
+
250
+ def share(self, users: List['User']) -> None:
251
+ """
252
+ Shares the Dashboard with specified users.
253
+
254
+ Args:
255
+ users (List[User]): The list of user objects to share the Dashboard with.
256
+
257
+ Returns:
258
+ None
259
+
260
+ Example:
261
+ >>> from geobox import GeoboxClient
262
+ >>> from geobox.dashboard import Dashboard
263
+ >>> client = GeoboxClient()
264
+ >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
265
+ >>> users = client.search_users(search='John')
266
+ >>> dashboard.share(users=users)
267
+ """
268
+ super()._share(self.endpoint, users)
269
+
270
+
271
+ def unshare(self, users: List['User']) -> None:
272
+ """
273
+ Unshares the Dashboard with specified users.
274
+
275
+ Args:
276
+ users (List[User]): The list of user objects to unshare the Dashboard with.
277
+
278
+ Returns:
279
+ None
280
+
281
+ Example:
282
+ >>> from geobox import GeoboxClient
283
+ >>> from geobox.dashboard import Dashboard
284
+ >>> client = GeoboxClient()
285
+ >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
286
+ >>> users = client.search_users(search='John')
287
+ >>> dashboard.unshare(users=users)
288
+ """
289
+ super()._unshare(self.endpoint, users)
290
+
291
+
292
+ def get_shared_users(self, search: str = None, skip: int = 0, limit: int = 10) -> List['User']:
293
+ """
294
+ Retrieves the list of users the dashboard is shared with.
295
+
296
+ Args:
297
+ search (str, optional): The search query.
298
+ skip (int, optional): The number of users to skip.
299
+ limit (int, optional): The maximum number of users to retrieve.
300
+
301
+ Returns:
302
+ List[User]: The list of shared users.
303
+
304
+ Example:
305
+ >>> from geobox import GeoboxClient
306
+ >>> from geobox.dashboard import Dashboard
307
+ >>> client = GeoboxClient()
308
+ >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
309
+ >>> dashboard.get_shared_users(search='John', skip=0, limit=10)
310
+ """
311
+ params = {
312
+ 'search': search,
313
+ 'skip': skip,
314
+ 'limit': limit
315
+ }
316
+ return super()._get_shared_users(self.endpoint, params)
317
+
318
+
319
+ def to_async(self, async_client: 'AsyncGeoboxClient') -> 'AsyncDashboard':
320
+ """
321
+ Switch to async version of the dashboard instance to have access to the async methods
322
+
323
+ Args:
324
+ async_client (AsyncGeoboxClient): The async version of the GeoboxClient instance for making requests.
325
+
326
+ Returns:
327
+ AsyncDashboard: the async instance of the dashboard.
328
+
329
+ Example:
330
+ >>> from geobox import Geoboxclient
331
+ >>> from geobox.aio import AsyncGeoboxClient
332
+ >>> from geobox.dashboard import Dashboard
333
+ >>> client = GeoboxClient()
334
+ >>> dashboard = Dashboard.get_dashboard(client, uuid="12345678-1234-5678-1234-567812345678")
335
+ >>> async with AsyncGeoboxClient() as async_client:
336
+ >>> async_dashboard = dashboard.to_async(async_client)
337
+ """
338
+ from .aio.dashboard import AsyncDashboard
339
+
342
340
  return AsyncDashboard(api=async_client, uuid=self.uuid, data=self.data)