dart-tools 0.4.7__tar.gz → 0.4.10__tar.gz

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.

Potentially problematic release.


This version of dart-tools might be problematic. Click here for more details.

Files changed (186) hide show
  1. {dart-tools-0.4.7/dart_tools.egg-info → dart-tools-0.4.10}/PKG-INFO +8 -8
  2. {dart-tools-0.4.7 → dart-tools-0.4.10}/README.md +7 -7
  3. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/__init__.py +2 -0
  4. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/dart.py +46 -18
  5. dart-tools-0.4.10/dart/exception.py +6 -0
  6. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/__init__.py +24 -0
  7. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/comment.py +8 -0
  8. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/filter_applicability.py +2 -0
  9. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/filter_assignee.py +2 -0
  10. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/filter_set.py +2 -0
  11. dart-tools-0.4.10/dart/generated/models/form.py +153 -0
  12. dart-tools-0.4.10/dart/generated/models/form_create.py +165 -0
  13. dart-tools-0.4.10/dart/generated/models/form_field.py +124 -0
  14. dart-tools-0.4.10/dart/generated/models/form_field_create.py +126 -0
  15. dart-tools-0.4.10/dart/generated/models/form_field_create_default.py +44 -0
  16. dart-tools-0.4.10/dart/generated/models/form_field_default.py +44 -0
  17. dart-tools-0.4.10/dart/generated/models/form_field_update.py +129 -0
  18. dart-tools-0.4.10/dart/generated/models/form_field_update_default.py +44 -0
  19. dart-tools-0.4.10/dart/generated/models/form_update.py +166 -0
  20. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout.py +18 -0
  21. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/models_response.py +44 -0
  22. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/operation.py +106 -40
  23. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/operation_model_kind.py +2 -0
  24. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/property_.py +4 -1
  25. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/property_create.py +4 -1
  26. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/property_kind.py +3 -0
  27. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/property_update.py +4 -1
  28. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/status_create.py +8 -0
  29. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/status_update.py +8 -0
  30. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task.py +27 -13
  31. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_create.py +45 -9
  32. dart-tools-0.4.10/dart/generated/models/task_create_properties.py +44 -0
  33. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_source_type.py +2 -0
  34. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_update.py +45 -9
  35. dart-tools-0.4.10/dart/generated/models/task_update_properties.py +44 -0
  36. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/transaction.py +3 -0
  37. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/transaction_kind.py +3 -0
  38. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/user.py +11 -0
  39. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/user_create.py +19 -0
  40. dart-tools-0.4.10/dart/generated/models/user_role.py +10 -0
  41. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/user_update.py +19 -0
  42. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/order_manager.py +6 -6
  43. dart-tools-0.4.10/dart/webhook.py +18 -0
  44. {dart-tools-0.4.7 → dart-tools-0.4.10/dart_tools.egg-info}/PKG-INFO +8 -8
  45. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart_tools.egg-info/SOURCES.txt +14 -0
  46. {dart-tools-0.4.7 → dart-tools-0.4.10}/pyproject.toml +1 -1
  47. {dart-tools-0.4.7 → dart-tools-0.4.10}/LICENSE +0 -0
  48. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/__init__.py +0 -0
  49. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/api/__init__.py +0 -0
  50. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/api/transactions/__init__.py +0 -0
  51. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/api/transactions/transactions_create.py +0 -0
  52. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/client.py +0 -0
  53. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/errors.py +0 -0
  54. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/batch.py +0 -0
  55. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/color_name.py +0 -0
  56. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/comment_create.py +0 -0
  57. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/comment_create_text.py +0 -0
  58. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/comment_reaction.py +0 -0
  59. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/comment_reaction_create.py +0 -0
  60. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/comment_reaction_update.py +0 -0
  61. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/comment_text.py +0 -0
  62. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/comment_update.py +0 -0
  63. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/comment_update_text.py +0 -0
  64. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/cycle_mode.py +0 -0
  65. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/dartboard.py +0 -0
  66. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/dartboard_create.py +0 -0
  67. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/dartboard_kind.py +0 -0
  68. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/dartboard_update.py +0 -0
  69. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/discord_integration.py +0 -0
  70. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/doc.py +0 -0
  71. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/doc_create.py +0 -0
  72. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/doc_create_text.py +0 -0
  73. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/doc_source_type.py +0 -0
  74. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/doc_text.py +0 -0
  75. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/doc_update.py +0 -0
  76. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/doc_update_text.py +0 -0
  77. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/event.py +0 -0
  78. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/event_adtl.py +0 -0
  79. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/event_create.py +0 -0
  80. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/event_create_adtl.py +0 -0
  81. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/event_kind.py +0 -0
  82. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/event_subscription.py +0 -0
  83. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/event_subscription_create.py +0 -0
  84. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/event_subscription_update.py +0 -0
  85. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/event_update.py +0 -0
  86. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/event_update_adtl.py +0 -0
  87. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/filter_connector.py +0 -0
  88. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/filter_group.py +0 -0
  89. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/filter_search.py +0 -0
  90. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/folder.py +0 -0
  91. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/folder_create.py +0 -0
  92. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/folder_kind.py +0 -0
  93. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/folder_update.py +0 -0
  94. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/github_integration.py +0 -0
  95. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/github_integration_tenant_extension_status.py +0 -0
  96. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/google_data.py +0 -0
  97. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/icon_kind.py +0 -0
  98. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_config.py +0 -0
  99. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_create.py +0 -0
  100. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_create_filter_group.py +0 -0
  101. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_create_kind_config_map.py +0 -0
  102. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_create_sorts.py +0 -0
  103. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_kind.py +0 -0
  104. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_kind_config_map.py +0 -0
  105. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_update.py +0 -0
  106. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_update_filter_group.py +0 -0
  107. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_update_kind_config_map.py +0 -0
  108. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/layout_update_sorts.py +0 -0
  109. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/notion_integration.py +0 -0
  110. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/notion_integration_tenant_extension_status.py +0 -0
  111. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/operation_kind.py +0 -0
  112. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/option.py +0 -0
  113. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/option_create.py +0 -0
  114. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/option_update.py +0 -0
  115. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/priority.py +0 -0
  116. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/property_adtl.py +0 -0
  117. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/property_create_adtl.py +0 -0
  118. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/property_update_adtl.py +0 -0
  119. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/recommendation_status.py +0 -0
  120. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/relationship.py +0 -0
  121. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/relationship_create.py +0 -0
  122. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/relationship_kind.py +0 -0
  123. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/relationship_kind_create.py +0 -0
  124. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/relationship_kind_kind.py +0 -0
  125. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/relationship_kind_update.py +0 -0
  126. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/relationship_update.py +0 -0
  127. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/request_body.py +0 -0
  128. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/response_body.py +0 -0
  129. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/slack_integration.py +0 -0
  130. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/slack_integration_tenant_extension_status.py +0 -0
  131. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/sort.py +0 -0
  132. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/space.py +0 -0
  133. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/space_create.py +0 -0
  134. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/space_kind.py +0 -0
  135. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/space_update.py +0 -0
  136. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/status.py +0 -0
  137. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/status_kind.py +0 -0
  138. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/subscription.py +0 -0
  139. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/subtask_display_mode.py +0 -0
  140. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/summary_statistic_kind.py +0 -0
  141. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_attachment.py +0 -0
  142. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_attachment_create.py +0 -0
  143. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_attachment_update.py +0 -0
  144. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_create_description.py +0 -0
  145. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_create_recurrence.py +0 -0
  146. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_description.py +0 -0
  147. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_doc_relationship.py +0 -0
  148. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_doc_relationship_create.py +0 -0
  149. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_doc_relationship_update.py +0 -0
  150. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_link.py +0 -0
  151. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_link_adtl.py +0 -0
  152. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_link_create.py +0 -0
  153. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_link_kind.py +0 -0
  154. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_link_update.py +0 -0
  155. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_notion_document.py +0 -0
  156. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_notion_document_block_children_map.py +0 -0
  157. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_notion_document_block_map.py +0 -0
  158. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_notion_document_page_map.py +0 -0
  159. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_properties.py +0 -0
  160. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_recurrence.py +0 -0
  161. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_update_description.py +0 -0
  162. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/task_update_recurrence.py +0 -0
  163. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/tenant.py +0 -0
  164. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/tenant_create.py +0 -0
  165. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/tenant_entitlement_overrides.py +0 -0
  166. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/tenant_update.py +0 -0
  167. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/theme.py +0 -0
  168. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/transaction_response.py +0 -0
  169. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/user_dartboard_layout.py +0 -0
  170. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/user_dartboard_layout_create.py +0 -0
  171. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/user_dartboard_layout_update.py +0 -0
  172. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/user_status.py +0 -0
  173. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/validation_error_response.py +0 -0
  174. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/validation_error_response_items.py +0 -0
  175. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/view.py +0 -0
  176. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/view_create.py +0 -0
  177. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/view_kind.py +0 -0
  178. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/view_update.py +0 -0
  179. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/models/yc_integration.py +0 -0
  180. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart/generated/types.py +0 -0
  181. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart_tools.egg-info/dependency_links.txt +0 -0
  182. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart_tools.egg-info/dist/dart-tools-0.3.3.tar.gz +0 -0
  183. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart_tools.egg-info/entry_points.txt +0 -0
  184. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart_tools.egg-info/requires.txt +0 -0
  185. {dart-tools-0.4.7 → dart-tools-0.4.10}/dart_tools.egg-info/top_level.txt +0 -0
  186. {dart-tools-0.4.7 → dart-tools-0.4.10}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dart-tools
3
- Version: 0.4.7
3
+ Version: 0.4.10
4
4
  Summary: The Dart CLI and Python Library
5
5
  Author-email: Dart Software Team <software@itsdart.com>
6
6
  License: MIT License
@@ -106,17 +106,17 @@ In Python, you can run something like
106
106
  import os
107
107
  from dart import is_logged_in, login, create_task, update_task
108
108
 
109
- # login based on information stored in environment variables, but only if needed
109
+ # Login based on information stored in environment variables, but only if needed
110
110
  if not is_logged_in():
111
111
  login(email=os.environ["DART_EMAIL"], password=os.environ["DART_PASSWORD"])
112
112
 
113
- # create a new task called 'Update the landing page'
114
- # with priority 'Critical' (i.e. p0) and with the 'marketing' tag
113
+ # Create a new task called 'Update the landing page'
114
+ # With priority 'Critical' (i.e. p0) and with the 'marketing' tag
115
115
  new_task = create_task(
116
116
  "Update the landing page", priority_int=0, tag_titles=["marketing"]
117
117
  )
118
118
 
119
- # update the task to be 'Done'
119
+ # Update the task to be 'Done'
120
120
  update_task(new_task.duid, status_title="Done")
121
121
  ```
122
122
 
@@ -140,10 +140,10 @@ from dart import (
140
140
  TransactionKind,
141
141
  )
142
142
 
143
- # initialize the inner client
143
+ # Initialize the inner client
144
144
  dart = Dart()
145
145
 
146
- # prepare the update operation
146
+ # Prepare the update operation
147
147
  task_update = TaskUpdate(
148
148
  duid="[DUID]",
149
149
  size=5,
@@ -154,7 +154,7 @@ task_update_op = Operation(
154
154
  data=task_update,
155
155
  )
156
156
 
157
- # call the operation transactionally to preform the update
157
+ # Call the operation transactionally to preform the update
158
158
  response = dart.transact([task_update_op], TransactionKind.TASK_UPDATE)
159
159
  ```
160
160
 
@@ -49,17 +49,17 @@ In Python, you can run something like
49
49
  import os
50
50
  from dart import is_logged_in, login, create_task, update_task
51
51
 
52
- # login based on information stored in environment variables, but only if needed
52
+ # Login based on information stored in environment variables, but only if needed
53
53
  if not is_logged_in():
54
54
  login(email=os.environ["DART_EMAIL"], password=os.environ["DART_PASSWORD"])
55
55
 
56
- # create a new task called 'Update the landing page'
57
- # with priority 'Critical' (i.e. p0) and with the 'marketing' tag
56
+ # Create a new task called 'Update the landing page'
57
+ # With priority 'Critical' (i.e. p0) and with the 'marketing' tag
58
58
  new_task = create_task(
59
59
  "Update the landing page", priority_int=0, tag_titles=["marketing"]
60
60
  )
61
61
 
62
- # update the task to be 'Done'
62
+ # Update the task to be 'Done'
63
63
  update_task(new_task.duid, status_title="Done")
64
64
  ```
65
65
 
@@ -83,10 +83,10 @@ from dart import (
83
83
  TransactionKind,
84
84
  )
85
85
 
86
- # initialize the inner client
86
+ # Initialize the inner client
87
87
  dart = Dart()
88
88
 
89
- # prepare the update operation
89
+ # Prepare the update operation
90
90
  task_update = TaskUpdate(
91
91
  duid="[DUID]",
92
92
  size=5,
@@ -97,7 +97,7 @@ task_update_op = Operation(
97
97
  data=task_update,
98
98
  )
99
99
 
100
- # call the operation transactionally to preform the update
100
+ # Call the operation transactionally to preform the update
101
101
  response = dart.transact([task_update_op], TransactionKind.TASK_UPDATE)
102
102
  ```
103
103
 
@@ -8,4 +8,6 @@ from .dart import (
8
8
  create_task,
9
9
  update_task,
10
10
  begin_task,
11
+ replicate_space,
11
12
  )
13
+ from .webhook import is_signature_correct
@@ -23,6 +23,7 @@ import dateparser
23
23
  from pick import pick
24
24
  import requests
25
25
 
26
+ from .exception import DartException
26
27
  from .generated import Client
27
28
  from .generated.models import (
28
29
  DartboardKind,
@@ -32,6 +33,7 @@ from .generated.models import (
32
33
  Priority,
33
34
  PropertyKind,
34
35
  RequestBody,
36
+ Space,
35
37
  SpaceKind,
36
38
  StatusKind,
37
39
  Task,
@@ -62,6 +64,7 @@ _CSRF_URL_FRAG = _ROOT_API_URL_FRAG + "/csrf-token"
62
64
  _LOGIN_URL_FRAG = _ROOT_API_URL_FRAG + "/login"
63
65
  _CURRENT_USER_URL_FRAG = _ROOT_API_URL_FRAG + "/user-data?mode=auto"
64
66
  _COPY_BRANCH_URL_FRAG = _ROOT_API_URL_FRAG + "/vcs/copy-branch-link"
67
+ _REPLICATE_SPACE_URL_FRAG_FMT = _ROOT_API_URL_FRAG + "/spaces/replicate/{duid}"
65
68
 
66
69
  _CONFIG_FPATH = os.path.expanduser("~/.dart-tools")
67
70
  _CSRF_TOKEN_COOKIE = "csrftoken"
@@ -96,6 +99,10 @@ def _run_cmd(cmd):
96
99
  return subprocess.check_output(cmd, shell=True).decode()
97
100
 
98
101
 
102
+ def _get_space_url(host, duid):
103
+ return f"{host}/s/{duid}"
104
+
105
+
99
106
  def _get_task_url(host, duid):
100
107
  return f"{host}/t/{duid}"
101
108
 
@@ -111,8 +118,14 @@ def _suppress_exception(fn):
111
118
  return wrapper
112
119
 
113
120
 
121
+ def _dart_exit(message):
122
+ if _is_cli:
123
+ sys.exit(message)
124
+ raise DartException(message)
125
+
126
+
114
127
  def _exit_gracefully(_signal_received, _frame) -> None:
115
- sys.exit("Quitting.")
128
+ _dart_exit("Quitting.")
116
129
 
117
130
 
118
131
  def _log(s):
@@ -343,13 +356,13 @@ class _Git:
343
356
  def ensure_in_repo():
344
357
  if _Git._cmd_succeeds("git rev-parse --is-inside-work-tree"):
345
358
  return
346
- sys.exit("You are not in a git repo.")
359
+ _dart_exit("You are not in a git repo.")
347
360
 
348
361
  @staticmethod
349
362
  def ensure_no_unstaged_changes():
350
363
  if _run_cmd("git status --porcelain") == "":
351
364
  return
352
- sys.exit("You have uncommitted changes. Please commit or stash them.")
365
+ _dart_exit("You have uncommitted changes. Please commit or stash them.")
353
366
 
354
367
  @staticmethod
355
368
  def ensure_on_main_or_intended():
@@ -396,11 +409,11 @@ def set_host(host):
396
409
 
397
410
 
398
411
  def _auth_failure_exit():
399
- sys.exit(f"Not logged in, run\n\n{_PROG} {_LOGIN_CMD}\n\nto log in.")
412
+ _dart_exit(f"Not logged in, run\n\n{_PROG} {_LOGIN_CMD}\n\nto log in.")
400
413
 
401
414
 
402
415
  def _unknown_failure_exit() -> NoReturn:
403
- sys.exit(f"Not logged in, run\n\n{_PROG} {_LOGIN_CMD}\n\nto log in.")
416
+ _dart_exit(f"Not logged in, run\n\n{_PROG} {_LOGIN_CMD}\n\nto log in.")
404
417
 
405
418
 
406
419
  def _check_request_response_and_maybe_exit(response):
@@ -475,7 +488,7 @@ def login(*, email=None, password=None):
475
488
 
476
489
  result = session.post(_LOGIN_URL_FRAG, json={"email": email, "password": password})
477
490
  if result.status_code in {401, 403}:
478
- sys.exit("Invalid login information.")
491
+ _dart_exit("Invalid login information.")
479
492
  _check_request_response_and_maybe_exit(result)
480
493
 
481
494
  cookies = result.cookies.get_dict()
@@ -538,7 +551,7 @@ def begin_task():
538
551
  filtered_tasks.sort(key=lambda e: e["order"])
539
552
 
540
553
  if len(filtered_tasks) == 0:
541
- sys.exit("No active, incomplete tasks found.")
554
+ _dart_exit("No active, incomplete tasks found.")
542
555
 
543
556
  picked_idx = pick(
544
557
  [e["title"] for e in filtered_tasks],
@@ -587,7 +600,7 @@ def create_task(
587
600
  None,
588
601
  )
589
602
  if dartboard is None:
590
- sys.exit(f"No dartboard found with title '{dartboard_title}'.")
603
+ _dart_exit(f"No dartboard found with title '{dartboard_title}'.")
591
604
  else:
592
605
  dartboard = next(e for e in dartboards if e["kind"] == DartboardKind.ACTIVE)
593
606
  dartboard_duid = dartboard["duid"]
@@ -605,7 +618,7 @@ def create_task(
605
618
  (e for e in statuses if e["title"].lower() == status_title_norm), None
606
619
  )
607
620
  if status is None:
608
- sys.exit(f"No status found with title '{status_title}'.")
621
+ _dart_exit(f"No status found with title '{status_title}'.")
609
622
  else:
610
623
  status = next(
611
624
  e for e in statuses if e["kind"] == StatusKind.UNSTARTED and e["locked"]
@@ -620,7 +633,7 @@ def create_task(
620
633
  for assignee_email in assignee_emails:
621
634
  assignee_email_norm = assignee_email.strip().lower()
622
635
  if assignee_email_norm not in user_emails_to_duids:
623
- sys.exit(f"No user found with email '{assignee_email}'.")
636
+ _dart_exit(f"No user found with email '{assignee_email}'.")
624
637
  assignee_duids.append(user_emails_to_duids[assignee_email_norm])
625
638
  subscriber_duids.append(user_emails_to_duids[assignee_email_norm])
626
639
  else:
@@ -636,7 +649,7 @@ def create_task(
636
649
  for tag_title in tag_titles:
637
650
  tag_title_norm = tag_title.strip().lower()
638
651
  if tag_title_norm not in tag_titles_to_duids:
639
- sys.exit(f"No tag found with title '{tag_title}'.")
652
+ _dart_exit(f"No tag found with title '{tag_title}'.")
640
653
  tag_duids.append(tag_titles_to_duids[tag_title_norm])
641
654
 
642
655
  priority = None
@@ -649,7 +662,7 @@ def create_task(
649
662
  if due_at_str is not None:
650
663
  due_at = dateparser.parse(due_at_str)
651
664
  if due_at is None:
652
- sys.exit(f"Could not parse due date '{due_at_str}'.")
665
+ _dart_exit(f"Could not parse due date '{due_at_str}'.")
653
666
  due_at = due_at.replace(
654
667
  hour=9, minute=0, second=0, microsecond=0, tzinfo=timezone.utc
655
668
  )
@@ -712,7 +725,7 @@ def update_task(
712
725
  tasks = user_bundle.tasks
713
726
  old_task = next((e for e in tasks if e["duid"] == duid), None)
714
727
  if old_task is None:
715
- sys.exit(f"No task found with DUID '{duid}'.")
728
+ _dart_exit(f"No task found with DUID '{duid}'.")
716
729
 
717
730
  task_update_kwargs = {"duid": duid}
718
731
 
@@ -731,7 +744,7 @@ def update_task(
731
744
  None,
732
745
  )
733
746
  if dartboard is None:
734
- sys.exit(f"No dartboard found with title '{dartboard_title}'.")
747
+ _dart_exit(f"No dartboard found with title '{dartboard_title}'.")
735
748
  dartboard_duid = dartboard["duid"]
736
749
  if dartboard_duid != old_task["dartboardDuid"]:
737
750
  task_update_kwargs["dartboard_duid"] = dartboard_duid
@@ -743,7 +756,7 @@ def update_task(
743
756
  (e for e in statuses if e["title"].lower() == status_title_norm), None
744
757
  )
745
758
  if status is None:
746
- sys.exit(f"No status found with title '{status_title}'.")
759
+ _dart_exit(f"No status found with title '{status_title}'.")
747
760
  status_duid = status["duid"]
748
761
  if status_duid != old_task["statusDuid"]:
749
762
  task_update_kwargs["status_duid"] = status_duid
@@ -756,7 +769,7 @@ def update_task(
756
769
  for assignee_email in assignee_emails:
757
770
  assignee_email_norm = assignee_email.strip().lower()
758
771
  if assignee_email_norm not in user_emails_to_duids:
759
- sys.exit(f"No user found with email '{assignee_email}'.")
772
+ _dart_exit(f"No user found with email '{assignee_email}'.")
760
773
  assignee_duids.append(user_emails_to_duids[assignee_email_norm])
761
774
  subscriber_duids.append(user_emails_to_duids[assignee_email_norm])
762
775
  assignee_duids = sorted(set(assignee_duids))
@@ -777,7 +790,7 @@ def update_task(
777
790
  for tag_title in tag_titles:
778
791
  tag_title_norm = tag_title.strip().lower()
779
792
  if tag_title_norm not in tag_titles_to_duids:
780
- sys.exit(f"No tag found with title '{tag_title}'.")
793
+ _dart_exit(f"No tag found with title '{tag_title}'.")
781
794
  tag_duids.append(tag_titles_to_duids[tag_title_norm])
782
795
  task_update_kwargs["tag_duids"] = tag_duids
783
796
 
@@ -795,7 +808,7 @@ def update_task(
795
808
  if due_at_str is not None:
796
809
  due_at = dateparser.parse(due_at_str)
797
810
  if due_at is None:
798
- sys.exit(f"Could not parse due date '{due_at_str}'.")
811
+ _dart_exit(f"Could not parse due date '{due_at_str}'.")
799
812
  due_at = due_at.replace(
800
813
  hour=9, minute=0, second=0, microsecond=0, tzinfo=timezone.utc
801
814
  )
@@ -819,6 +832,21 @@ def update_task(
819
832
  return task
820
833
 
821
834
 
835
+ def replicate_space(duid):
836
+ config = _Config()
837
+ session = _Session(config)
838
+
839
+ response = session.post(_REPLICATE_SPACE_URL_FRAG_FMT.format(duid=duid))
840
+ print()
841
+ _check_request_response_and_maybe_exit(response)
842
+
843
+ space = Space.from_dict(response.json()["item"])
844
+
845
+ _log(f"Replicated space {space.title} at {_get_space_url(config.host, space.duid)}")
846
+ _log("Done.")
847
+ return space
848
+
849
+
822
850
  def _add_standard_task_arguments(parser):
823
851
  parser.add_argument(
824
852
  "-d", "--dartboard", dest="dartboard_title", help="dartboard title"
@@ -0,0 +1,6 @@
1
+ class DartException(Exception):
2
+ pass
3
+
4
+
5
+ class OrderException(Exception):
6
+ pass
@@ -44,6 +44,15 @@ from .folder import Folder
44
44
  from .folder_create import FolderCreate
45
45
  from .folder_kind import FolderKind
46
46
  from .folder_update import FolderUpdate
47
+ from .form import Form
48
+ from .form_create import FormCreate
49
+ from .form_field import FormField
50
+ from .form_field_create import FormFieldCreate
51
+ from .form_field_create_default import FormFieldCreateDefault
52
+ from .form_field_default import FormFieldDefault
53
+ from .form_field_update import FormFieldUpdate
54
+ from .form_field_update_default import FormFieldUpdateDefault
55
+ from .form_update import FormUpdate
47
56
  from .github_integration import GithubIntegration
48
57
  from .github_integration_tenant_extension_status import GithubIntegrationTenantExtensionStatus
49
58
  from .google_data import GoogleData
@@ -107,6 +116,7 @@ from .task_attachment_create import TaskAttachmentCreate
107
116
  from .task_attachment_update import TaskAttachmentUpdate
108
117
  from .task_create import TaskCreate
109
118
  from .task_create_description import TaskCreateDescription
119
+ from .task_create_properties import TaskCreateProperties
110
120
  from .task_create_recurrence import TaskCreateRecurrence
111
121
  from .task_description import TaskDescription
112
122
  from .task_doc_relationship import TaskDocRelationship
@@ -126,6 +136,7 @@ from .task_recurrence import TaskRecurrence
126
136
  from .task_source_type import TaskSourceType
127
137
  from .task_update import TaskUpdate
128
138
  from .task_update_description import TaskUpdateDescription
139
+ from .task_update_properties import TaskUpdateProperties
129
140
  from .task_update_recurrence import TaskUpdateRecurrence
130
141
  from .tenant import Tenant
131
142
  from .tenant_create import TenantCreate
@@ -140,6 +151,7 @@ from .user_create import UserCreate
140
151
  from .user_dartboard_layout import UserDartboardLayout
141
152
  from .user_dartboard_layout_create import UserDartboardLayoutCreate
142
153
  from .user_dartboard_layout_update import UserDartboardLayoutUpdate
154
+ from .user_role import UserRole
143
155
  from .user_status import UserStatus
144
156
  from .user_update import UserUpdate
145
157
  from .validation_error_response import ValidationErrorResponse
@@ -195,6 +207,15 @@ __all__ = (
195
207
  "FolderCreate",
196
208
  "FolderKind",
197
209
  "FolderUpdate",
210
+ "Form",
211
+ "FormCreate",
212
+ "FormField",
213
+ "FormFieldCreate",
214
+ "FormFieldCreateDefault",
215
+ "FormFieldDefault",
216
+ "FormFieldUpdate",
217
+ "FormFieldUpdateDefault",
218
+ "FormUpdate",
198
219
  "GithubIntegration",
199
220
  "GithubIntegrationTenantExtensionStatus",
200
221
  "GoogleData",
@@ -258,6 +279,7 @@ __all__ = (
258
279
  "TaskAttachmentUpdate",
259
280
  "TaskCreate",
260
281
  "TaskCreateDescription",
282
+ "TaskCreateProperties",
261
283
  "TaskCreateRecurrence",
262
284
  "TaskDescription",
263
285
  "TaskDocRelationship",
@@ -277,6 +299,7 @@ __all__ = (
277
299
  "TaskSourceType",
278
300
  "TaskUpdate",
279
301
  "TaskUpdateDescription",
302
+ "TaskUpdateProperties",
280
303
  "TaskUpdateRecurrence",
281
304
  "Tenant",
282
305
  "TenantCreate",
@@ -291,6 +314,7 @@ __all__ = (
291
314
  "UserDartboardLayout",
292
315
  "UserDartboardLayoutCreate",
293
316
  "UserDartboardLayoutUpdate",
317
+ "UserRole",
294
318
  "UserStatus",
295
319
  "UserUpdate",
296
320
  "ValidationErrorResponse",
@@ -20,6 +20,7 @@ class Comment:
20
20
  """
21
21
  Attributes:
22
22
  duid (str):
23
+ created_at (datetime.datetime):
23
24
  updated_at (datetime.datetime):
24
25
  task_duid (str):
25
26
  authored_by_ai (bool):
@@ -34,6 +35,7 @@ class Comment:
34
35
  """
35
36
 
36
37
  duid: str
38
+ created_at: datetime.datetime
37
39
  updated_at: datetime.datetime
38
40
  task_duid: str
39
41
  authored_by_ai: bool
@@ -49,6 +51,8 @@ class Comment:
49
51
 
50
52
  def to_dict(self) -> Dict[str, Any]:
51
53
  duid = self.duid
54
+ created_at = self.created_at.isoformat()
55
+
52
56
  updated_at = self.updated_at.isoformat()
53
57
 
54
58
  task_duid = self.task_duid
@@ -73,6 +77,7 @@ class Comment:
73
77
  field_dict.update(
74
78
  {
75
79
  "duid": duid,
80
+ "createdAt": created_at,
76
81
  "updatedAt": updated_at,
77
82
  "taskDuid": task_duid,
78
83
  "authoredByAi": authored_by_ai,
@@ -98,6 +103,8 @@ class Comment:
98
103
  d = src_dict.copy()
99
104
  duid = d.pop("duid")
100
105
 
106
+ created_at = isoparse(d.pop("createdAt"))
107
+
101
108
  updated_at = isoparse(d.pop("updatedAt"))
102
109
 
103
110
  task_duid = d.pop("taskDuid")
@@ -132,6 +139,7 @@ class Comment:
132
139
 
133
140
  comment = cls(
134
141
  duid=duid,
142
+ created_at=created_at,
135
143
  updated_at=updated_at,
136
144
  task_duid=task_duid,
137
145
  authored_by_ai=authored_by_ai,
@@ -13,8 +13,10 @@ class FilterApplicability(str, Enum):
13
13
  IS_AFTER = "is after"
14
14
  IS_BEFORE = "is before"
15
15
  IS_BETWEEN = "is between"
16
+ IS_CHECKED = "is checked"
16
17
  IS_NOT = "is not"
17
18
  IS_NOT_SET = "is not set"
19
+ IS_UNCHECKED = "is unchecked"
18
20
 
19
21
  def __str__(self) -> str:
20
22
  return str(self.value)
@@ -29,6 +29,8 @@ class FilterAssignee:
29
29
  * `is before` - IS_BEFORE
30
30
  * `is after` - IS_AFTER
31
31
  * `is between` - IS_BETWEEN
32
+ * `is checked` - IS_CHECKED
33
+ * `is unchecked` - IS_UNCHECKED
32
34
  connector (FilterConnector): * `or` - OR
33
35
  * `and` - AND
34
36
  values (List[Any]):
@@ -29,6 +29,8 @@ class FilterSet:
29
29
  * `is before` - IS_BEFORE
30
30
  * `is after` - IS_AFTER
31
31
  * `is between` - IS_BETWEEN
32
+ * `is checked` - IS_CHECKED
33
+ * `is unchecked` - IS_UNCHECKED
32
34
  connector (FilterConnector): * `or` - OR
33
35
  * `and` - AND
34
36
  values (List[Any]):
@@ -0,0 +1,153 @@
1
+ from typing import Any, Dict, List, Type, TypeVar, Union
2
+
3
+ from attrs import define as _attrs_define
4
+ from attrs import field as _attrs_field
5
+
6
+ from ..models.color_name import ColorName
7
+ from ..models.icon_kind import IconKind
8
+ from ..types import UNSET, Unset
9
+
10
+ T = TypeVar("T", bound="Form")
11
+
12
+
13
+ @_attrs_define
14
+ class Form:
15
+ """
16
+ Attributes:
17
+ duid (str):
18
+ hidden (bool):
19
+ public (bool):
20
+ order (str):
21
+ title (str):
22
+ description (str):
23
+ icon_kind (IconKind): * `None` - NONE
24
+ * `Icon` - ICON
25
+ * `Emoji` - EMOJI
26
+ icon_name_or_emoji (str):
27
+ color_name (ColorName): * `Red` - RED
28
+ * `Dark Blue` - DARK_BLUE
29
+ * `Dark Orange` - DARK_ORANGE
30
+ * `Dark Green` - DARK_GREEN
31
+ * `Purple` - PURPLE
32
+ * `Dark Teal` - DARK_TEAL
33
+ * `Pink` - PINK
34
+ * `Orange` - ORANGE
35
+ * `Green` - GREEN
36
+ * `Yellow` - YELLOW
37
+ * `Brown` - BROWN
38
+ * `Dark Red` - DARK_RED
39
+ * `Flat Green` - FLAT_GREEN
40
+ * `Red Orange` - RED_ORANGE
41
+ * `Teal` - TEAL
42
+ * `Light Green` - LIGHT_GREEN
43
+ * `Light Blue` - LIGHT_BLUE
44
+ * `Light Purple` - LIGHT_PURPLE
45
+ * `Light Orange` - LIGHT_ORANGE
46
+ * `Light Pink` - LIGHT_PINK
47
+ * `Tan` - TAN
48
+ * `Dark Gray` - DARK_GRAY
49
+ * `Light Brown` - LIGHT_BROWN
50
+ * `Light Gray` - LIGHT_GRAY
51
+ updated_by_client_duid (Union[Unset, None, str]):
52
+ """
53
+
54
+ duid: str
55
+ hidden: bool
56
+ public: bool
57
+ order: str
58
+ title: str
59
+ description: str
60
+ icon_kind: IconKind
61
+ icon_name_or_emoji: str
62
+ color_name: ColorName
63
+ updated_by_client_duid: Union[Unset, None, str] = UNSET
64
+ additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
65
+
66
+ def to_dict(self) -> Dict[str, Any]:
67
+ duid = self.duid
68
+ hidden = self.hidden
69
+ public = self.public
70
+ order = self.order
71
+ title = self.title
72
+ description = self.description
73
+ icon_kind = self.icon_kind.value
74
+
75
+ icon_name_or_emoji = self.icon_name_or_emoji
76
+ color_name = self.color_name.value
77
+
78
+ updated_by_client_duid = self.updated_by_client_duid
79
+
80
+ field_dict: Dict[str, Any] = {}
81
+ field_dict.update(self.additional_properties)
82
+ field_dict.update(
83
+ {
84
+ "duid": duid,
85
+ "hidden": hidden,
86
+ "public": public,
87
+ "order": order,
88
+ "title": title,
89
+ "description": description,
90
+ "iconKind": icon_kind,
91
+ "iconNameOrEmoji": icon_name_or_emoji,
92
+ "colorName": color_name,
93
+ }
94
+ )
95
+ if updated_by_client_duid is not UNSET:
96
+ field_dict["updatedByClientDuid"] = updated_by_client_duid
97
+
98
+ return field_dict
99
+
100
+ @classmethod
101
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
102
+ d = src_dict.copy()
103
+ duid = d.pop("duid")
104
+
105
+ hidden = d.pop("hidden")
106
+
107
+ public = d.pop("public")
108
+
109
+ order = d.pop("order")
110
+
111
+ title = d.pop("title")
112
+
113
+ description = d.pop("description")
114
+
115
+ icon_kind = IconKind(d.pop("iconKind"))
116
+
117
+ icon_name_or_emoji = d.pop("iconNameOrEmoji")
118
+
119
+ color_name = ColorName(d.pop("colorName"))
120
+
121
+ updated_by_client_duid = d.pop("updatedByClientDuid", UNSET)
122
+
123
+ form = cls(
124
+ duid=duid,
125
+ hidden=hidden,
126
+ public=public,
127
+ order=order,
128
+ title=title,
129
+ description=description,
130
+ icon_kind=icon_kind,
131
+ icon_name_or_emoji=icon_name_or_emoji,
132
+ color_name=color_name,
133
+ updated_by_client_duid=updated_by_client_duid,
134
+ )
135
+
136
+ form.additional_properties = d
137
+ return form
138
+
139
+ @property
140
+ def additional_keys(self) -> List[str]:
141
+ return list(self.additional_properties.keys())
142
+
143
+ def __getitem__(self, key: str) -> Any:
144
+ return self.additional_properties[key]
145
+
146
+ def __setitem__(self, key: str, value: Any) -> None:
147
+ self.additional_properties[key] = value
148
+
149
+ def __delitem__(self, key: str) -> None:
150
+ del self.additional_properties[key]
151
+
152
+ def __contains__(self, key: str) -> bool:
153
+ return key in self.additional_properties