superannotate 4.4.15.dev1__tar.gz → 4.4.16__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.
Files changed (140) hide show
  1. {superannotate-4.4.15.dev1/src/superannotate.egg-info → superannotate-4.4.16}/PKG-INFO +5 -5
  2. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/requirements.txt +3 -3
  3. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/setup.py +1 -1
  4. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/__init__.py +1 -1
  5. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/interface/base_interface.py +6 -9
  6. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/interface/sdk_interface.py +29 -9
  7. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/interface/types.py +7 -7
  8. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/serializers.py +1 -1
  9. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/entities/base.py +12 -12
  10. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/entities/classes.py +9 -10
  11. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/entities/folder.py +1 -1
  12. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/entities/integrations.py +7 -2
  13. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/entities/items.py +2 -2
  14. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/entities/project.py +7 -7
  15. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/plugin.py +2 -2
  16. superannotate-4.4.16/src/superannotate/lib/core/pydantic_v1.py +36 -0
  17. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/service_types.py +3 -3
  18. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/serviceproviders.py +1 -0
  19. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/types.py +3 -3
  20. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/annotations.py +7 -1
  21. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/models.py +3 -0
  22. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/video_convertor.py +5 -1
  23. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/controller.py +2 -0
  24. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/serviceprovider.py +3 -1
  25. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/annotation.py +14 -15
  26. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/http_client.py +9 -3
  27. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/validators.py +8 -6
  28. {superannotate-4.4.15.dev1 → superannotate-4.4.16/src/superannotate.egg-info}/PKG-INFO +5 -5
  29. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate.egg-info/SOURCES.txt +1 -0
  30. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate.egg-info/requires.txt +3 -3
  31. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/LICENSE +0 -0
  32. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/MANIFEST.in +0 -0
  33. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/README.rst +0 -0
  34. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/setup.cfg +0 -0
  35. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/__init__.py +0 -0
  36. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/__init__.py +0 -0
  37. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/analytics/__init__.py +0 -0
  38. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/analytics/aggregators.py +0 -0
  39. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/analytics/common.py +0 -0
  40. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/bin/__init__.py +0 -0
  41. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/bin/superannotate.py +0 -0
  42. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/common.py +0 -0
  43. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/exceptions.py +0 -0
  44. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/helpers.py +0 -0
  45. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/__init__.py +0 -0
  46. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/conversion.py +0 -0
  47. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/__init__.py +0 -0
  48. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/baseStrategy.py +0 -0
  49. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/coco_converters/__init__.py +0 -0
  50. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/coco_converters/coco_api.py +0 -0
  51. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/coco_converters/coco_converter.py +0 -0
  52. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/coco_converters/coco_strategies.py +0 -0
  53. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/coco_converters/coco_to_sa_pixel.py +0 -0
  54. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/coco_converters/coco_to_sa_vector.py +0 -0
  55. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/coco_converters/sa_pixel_to_coco.py +0 -0
  56. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/coco_converters/sa_vector_to_coco.py +0 -0
  57. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/converters.py +0 -0
  58. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/dataloop_converters/__init__.py +0 -0
  59. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/dataloop_converters/dataloop_helper.py +0 -0
  60. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/dataloop_converters/dataloop_strategies.py +0 -0
  61. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/dataloop_converters/dataloop_to_sa_vector.py +0 -0
  62. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/googlecloud_converters/__init__.py +0 -0
  63. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/googlecloud_converters/googlecloud_strategies.py +0 -0
  64. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/googlecloud_converters/googlecloud_to_sa_vector.py +0 -0
  65. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/labelbox_converters/__init__.py +0 -0
  66. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/labelbox_converters/labelbox_helper.py +0 -0
  67. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/labelbox_converters/labelbox_strategies.py +0 -0
  68. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/labelbox_converters/labelbox_to_sa_pixel.py +0 -0
  69. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/labelbox_converters/labelbox_to_sa_vector.py +0 -0
  70. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/sa_json_helper.py +0 -0
  71. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/sagemaker_converters/__init__.py +0 -0
  72. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/sagemaker_converters/sagemaker_strategies.py +0 -0
  73. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/sagemaker_converters/sagemaker_to_sa_pixel.py +0 -0
  74. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/sagemaker_converters/sagemaker_to_sa_vector.py +0 -0
  75. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/supervisely_converters/__init__.py +0 -0
  76. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/supervisely_converters/supervisely_helper.py +0 -0
  77. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/supervisely_converters/supervisely_strategies.py +0 -0
  78. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/supervisely_converters/supervisely_to_sa_pixel.py +0 -0
  79. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/supervisely_converters/supervisely_to_sa_vector.py +0 -0
  80. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/vgg_converters/__init__.py +0 -0
  81. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/vgg_converters/vgg_helper.py +0 -0
  82. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/vgg_converters/vgg_strategies.py +0 -0
  83. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/vgg_converters/vgg_to_sa_vector.py +0 -0
  84. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/voc_converters/__init__.py +0 -0
  85. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/voc_converters/voc_helper.py +0 -0
  86. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/voc_converters/voc_strategies.py +0 -0
  87. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/voc_converters/voc_to_sa_pixel.py +0 -0
  88. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/voc_converters/voc_to_sa_vector.py +0 -0
  89. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/vott_converters/__init__.py +0 -0
  90. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/vott_converters/vott_strategies.py +0 -0
  91. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/vott_converters/vott_to_sa_vector.py +0 -0
  92. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/yolo_converters/__init__.py +0 -0
  93. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/yolo_converters/yolo_strategies.py +0 -0
  94. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/converters/yolo_converters/yolo_to_sa_vector.py +0 -0
  95. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/export_from_sa_conversions.py +0 -0
  96. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/import_to_sa_conversions.py +0 -0
  97. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/input_converters/sa_conversion.py +0 -0
  98. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/interface/__init__.py +0 -0
  99. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/interface/cli_interface.py +0 -0
  100. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/interface/sdk/__init__.py +0 -0
  101. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/interface/sdk/folders.py +0 -0
  102. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/app/interface/sdk/project.py +0 -0
  103. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/__init__.py +0 -0
  104. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/base_usecases.py +0 -0
  105. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/conditions.py +0 -0
  106. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/config.py +0 -0
  107. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/entities/__init__.py +0 -0
  108. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/entities/project_entities.py +0 -0
  109. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/enums.py +0 -0
  110. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/exceptions.py +0 -0
  111. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/reporter.py +0 -0
  112. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/repositories.py +0 -0
  113. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/response.py +0 -0
  114. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/__init__.py +0 -0
  115. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/base.py +0 -0
  116. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/classes.py +0 -0
  117. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/custom_fields.py +0 -0
  118. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/folders.py +0 -0
  119. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/images.py +0 -0
  120. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/integrations.py +0 -0
  121. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/items.py +0 -0
  122. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/core/usecases/projects.py +0 -0
  123. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/__init__.py +0 -0
  124. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/helpers.py +0 -0
  125. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/repositories.py +0 -0
  126. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/__init__.py +0 -0
  127. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/annotation_class.py +0 -0
  128. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/custom_field.py +0 -0
  129. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/folder.py +0 -0
  130. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/integration.py +0 -0
  131. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/item.py +0 -0
  132. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/models.py +0 -0
  133. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/project.py +0 -0
  134. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/services/subset.py +0 -0
  135. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/stream_data_handler.py +0 -0
  136. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/lib/infrastructure/utils.py +0 -0
  137. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate/logger.py +0 -0
  138. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate.egg-info/dependency_links.txt +0 -0
  139. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate.egg-info/entry_points.txt +0 -0
  140. {superannotate-4.4.15.dev1 → superannotate-4.4.16}/src/superannotate.egg-info/top_level.txt +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: superannotate
3
- Version: 4.4.15.dev1
3
+ Version: 4.4.16
4
4
  Summary: Python SDK to SuperAnnotate platform
5
5
  Home-page: https://github.com/superannotateai/superannotate-python-sdk
6
6
  Author: SuperAnnotate AI
7
- Author-email: suppoort@superannotate.com
7
+ Author-email: support@superannotate.com
8
8
  License: MIT
9
9
  Project-URL: Documentation, https://superannotate.readthedocs.io/en/stable/
10
10
  Classifier: Programming Language :: Python
@@ -17,16 +17,16 @@ Classifier: Programming Language :: Python :: 3.11
17
17
  Requires-Python: >=3.7
18
18
  Description-Content-Type: text/x-rst
19
19
  License-File: LICENSE
20
- Requires-Dist: pydantic~=1.10
20
+ Requires-Dist: pydantic!=2.0.*,>=1.10
21
21
  Requires-Dist: aiohttp~=3.8
22
22
  Requires-Dist: boto3~=1.26
23
- Requires-Dist: opencv-python~=4.7
23
+ Requires-Dist: opencv-python-headless~=4.7
24
24
  Requires-Dist: packaging~=23.1
25
25
  Requires-Dist: plotly~=5.14
26
26
  Requires-Dist: email-validator~=2.0
27
27
  Requires-Dist: pandas~=1.3
28
28
  Requires-Dist: ffmpeg-python~=0.2
29
- Requires-Dist: pillow~=9.5
29
+ Requires-Dist: pillow>=9.5,~=10.0
30
30
  Requires-Dist: tqdm~=4.66.1
31
31
  Requires-Dist: requests~=2.31.0
32
32
  Requires-Dist: aiofiles==23.1.0
@@ -1,13 +1,13 @@
1
- pydantic~=1.10
1
+ pydantic>=1.10,!=2.0.*
2
2
  aiohttp~=3.8
3
3
  boto3~=1.26
4
- opencv-python~=4.7
4
+ opencv-python-headless~=4.7
5
5
  packaging~=23.1
6
6
  plotly~=5.14
7
7
  email-validator~=2.0
8
8
  pandas~=1.3
9
9
  ffmpeg-python~=0.2
10
- pillow~=9.5
10
+ pillow>=9.5,~=10.0
11
11
  tqdm~=4.66.1
12
12
  requests~=2.31.0
13
13
  aiofiles==23.1.0
@@ -36,7 +36,7 @@ setup(
36
36
  description="Python SDK to SuperAnnotate platform",
37
37
  license="MIT",
38
38
  author="SuperAnnotate AI",
39
- author_email="suppoort@superannotate.com",
39
+ author_email="support@superannotate.com",
40
40
  url="https://github.com/superannotateai/superannotate-python-sdk",
41
41
  long_description=open("README.rst").read(),
42
42
  long_description_content_type="text/x-rst",
@@ -3,7 +3,7 @@ import os
3
3
  import sys
4
4
 
5
5
 
6
- __version__ = "4.4.15dev1"
6
+ __version__ = "4.4.16"
7
7
 
8
8
  sys.path.append(os.path.split(os.path.realpath(__file__))[0])
9
9
 
@@ -11,13 +11,14 @@ from typing import Iterable
11
11
  from typing import Sized
12
12
 
13
13
  import lib.core as constants
14
- import pydantic
15
14
  from lib.app.interface.types import validate_arguments
16
15
  from lib.core import CONFIG
17
16
  from lib.core import setup_logging
18
17
  from lib.core.entities.base import ConfigEntity
19
18
  from lib.core.entities.base import TokenStr
20
19
  from lib.core.exceptions import AppException
20
+ from lib.core.pydantic_v1 import ErrorWrapper
21
+ from lib.core.pydantic_v1 import ValidationError
21
22
  from lib.infrastructure.controller import Controller
22
23
  from lib.infrastructure.utils import extract_project_folder
23
24
  from lib.infrastructure.validators import wrap_error
@@ -61,7 +62,7 @@ class BaseInterfaceFacade:
61
62
  raise AppException(
62
63
  f"SuperAnnotate config file {constants.CONFIG_INI_FILE_LOCATION} not found."
63
64
  )
64
- except pydantic.ValidationError as e:
65
+ except ValidationError as e:
65
66
  raise AppException(wrap_error(e))
66
67
  except KeyError:
67
68
  raise
@@ -78,13 +79,9 @@ class BaseInterfaceFacade:
78
79
  token = json_data["token"]
79
80
  try:
80
81
  config = ConfigEntity(SA_TOKEN=token)
81
- except pydantic.ValidationError:
82
- raise pydantic.ValidationError(
83
- [
84
- pydantic.error_wrappers.ErrorWrapper(
85
- ValueError("Invalid token."), loc="token"
86
- )
87
- ],
82
+ except ValidationError:
83
+ raise ValidationError(
84
+ [ErrorWrapper(ValueError("Invalid token."), loc="token")],
88
85
  model=ConfigEntity,
89
86
  )
90
87
  host = json_data.get("main_endpoint")
@@ -15,7 +15,6 @@ from typing import Tuple
15
15
  from typing import TypeVar
16
16
  from typing import Union
17
17
 
18
- import pydantic
19
18
  from typing_extensions import Literal
20
19
 
21
20
  if sys.version_info < (3, 11):
@@ -24,10 +23,7 @@ else:
24
23
  from typing import TypedDict, NotRequired, Required # noqa
25
24
 
26
25
  import boto3
27
- from pydantic import conlist
28
- from pydantic import constr
29
- from pydantic import parse_obj_as
30
- from pydantic.error_wrappers import ValidationError
26
+
31
27
  from tqdm import tqdm
32
28
 
33
29
  import lib.core as constants
@@ -61,16 +57,18 @@ from lib.core.exceptions import AppException
61
57
  from lib.core.types import MLModel
62
58
  from lib.core.types import PriorityScoreEntity
63
59
  from lib.core.types import Project
60
+ from lib.core.pydantic_v1 import ValidationError
61
+ from lib.core.pydantic_v1 import constr
62
+ from lib.core.pydantic_v1 import conlist
63
+ from lib.core.pydantic_v1 import parse_obj_as
64
64
  from lib.infrastructure.utils import extract_project_folder
65
65
  from lib.infrastructure.validators import wrap_error
66
66
 
67
67
 
68
68
  logger = logging.getLogger("sa")
69
69
 
70
-
71
70
  NotEmptyStr = TypeVar("NotEmptyStr", bound=constr(strict=True, min_length=1))
72
71
 
73
-
74
72
  PROJECT_STATUS = Literal["NotStarted", "InProgress", "Completed", "OnHold"]
75
73
 
76
74
  PROJECT_TYPE = Literal[
@@ -1131,6 +1129,7 @@ class SAClient(BaseInterfaceFacade, metaclass=TrackableMeta):
1131
1129
  annotation_statuses: Optional[List[ANNOTATION_STATUS]] = None,
1132
1130
  include_fuse: Optional[bool] = False,
1133
1131
  only_pinned=False,
1132
+ **kwargs,
1134
1133
  ):
1135
1134
  """Prepare annotations and classes.json for export. Original and fused images for images with
1136
1135
  annotations can be included with include_fuse flag.
@@ -1147,6 +1146,8 @@ class SAClient(BaseInterfaceFacade, metaclass=TrackableMeta):
1147
1146
  :type include_fuse: bool
1148
1147
  :param only_pinned: enable only pinned output in export. This option disables all other types of output.
1149
1148
  :type only_pinned: bool
1149
+ :param kwargs: Arbitrary kwarg ``integration_name``
1150
+ can be provided which will be used as a storage to store export file
1150
1151
 
1151
1152
  :return: metadata object of the prepared export
1152
1153
  :rtype: dict
@@ -1165,12 +1166,22 @@ class SAClient(BaseInterfaceFacade, metaclass=TrackableMeta):
1165
1166
  constants.AnnotationStatus.COMPLETED.name,
1166
1167
  constants.AnnotationStatus.SKIPPED.name,
1167
1168
  ]
1169
+ integration_name = kwargs.get("integration_name")
1170
+ integration_id = None
1171
+ if integration_name:
1172
+ for integration in self.controller.integrations.list().data:
1173
+ if integration.name == integration_name:
1174
+ integration_id = integration.id
1175
+ break
1176
+ else:
1177
+ raise AppException("Integration not found.")
1168
1178
  response = self.controller.prepare_export(
1169
1179
  project_name=project_name,
1170
1180
  folder_names=folders,
1171
1181
  include_fuse=include_fuse,
1172
1182
  only_pinned=only_pinned,
1173
1183
  annotation_statuses=annotation_statuses,
1184
+ integration_id=integration_id,
1174
1185
  )
1175
1186
  if response.errors:
1176
1187
  raise AppException(response.errors)
@@ -2095,7 +2106,7 @@ class SAClient(BaseInterfaceFacade, metaclass=TrackableMeta):
2095
2106
 
2096
2107
  :param project: project name or folder path (e.g., "project1/folder1")
2097
2108
  :type project: str
2098
- :param item_names: item names. If None, all the items in the specified directory will be deleted.
2109
+ :param item_names: item names. If None, all the annotations in the specified directory will be deleted.
2099
2110
  :type item_names: list of strs
2100
2111
  """
2101
2112
 
@@ -2538,6 +2549,15 @@ class SAClient(BaseInterfaceFacade, metaclass=TrackableMeta):
2538
2549
 
2539
2550
  :return: uploaded, failed and duplicated item names
2540
2551
  :rtype: tuple of list of strs
2552
+
2553
+ Example:
2554
+ ::
2555
+ client = SAClient()
2556
+ client.attach_items(
2557
+ project = "Medical Annotations",
2558
+ attachments = [{"name": "item", "url": "https://..."}]
2559
+ )
2560
+
2541
2561
  """
2542
2562
 
2543
2563
  project_name, folder_name = extract_project_folder(project)
@@ -2549,7 +2569,7 @@ class SAClient(BaseInterfaceFacade, metaclass=TrackableMeta):
2549
2569
  for item, count in collections.Counter(attachments).items()
2550
2570
  if count > 1
2551
2571
  ]
2552
- except pydantic.ValidationError:
2572
+ except ValidationError:
2553
2573
  (
2554
2574
  unique_attachments,
2555
2575
  duplicate_attachments,
@@ -3,14 +3,14 @@ from typing import Union
3
3
 
4
4
  from lib.core.enums import BaseTitledEnum
5
5
  from lib.core.exceptions import AppException
6
+ from lib.core.pydantic_v1 import constr
7
+ from lib.core.pydantic_v1 import errors
8
+ from lib.core.pydantic_v1 import pydantic_validate_arguments
9
+ from lib.core.pydantic_v1 import PydanticTypeError
10
+ from lib.core.pydantic_v1 import StrictStr
11
+ from lib.core.pydantic_v1 import StrRegexError
12
+ from lib.core.pydantic_v1 import ValidationError
6
13
  from lib.infrastructure.validators import wrap_error
7
- from pydantic import constr
8
- from pydantic import errors
9
- from pydantic import StrictStr
10
- from pydantic import validate_arguments as pydantic_validate_arguments
11
- from pydantic import ValidationError
12
- from pydantic.errors import PydanticTypeError
13
- from pydantic.errors import StrRegexError
14
14
 
15
15
 
16
16
  class EnumMemberError(PydanticTypeError):
@@ -5,8 +5,8 @@ from typing import Set
5
5
  from typing import Union
6
6
 
7
7
  import superannotate.lib.core as constance
8
- from pydantic import BaseModel
9
8
  from superannotate.lib.core.entities import BaseEntity
9
+ from superannotate.lib.core.pydantic_v1 import BaseModel
10
10
 
11
11
 
12
12
  class BaseSerializer(ABC):
@@ -13,16 +13,16 @@ from lib.core import BACKEND_URL
13
13
  from lib.core import LOG_FILE_LOCATION
14
14
  from lib.core.enums import AnnotationStatus
15
15
  from lib.core.enums import BaseTitledEnum
16
- from pydantic import BaseModel as PydanticBaseModel
17
- from pydantic import Extra
18
- from pydantic import Field
19
- from pydantic import StrictStr
20
- from pydantic.datetime_parse import parse_datetime
21
- from pydantic.typing import is_namedtuple
22
- from pydantic.utils import ROOT_KEY
23
- from pydantic.utils import sequence_like
24
- from pydantic.utils import ValueItems
25
- from typing_extensions import Literal
16
+ from lib.core.pydantic_v1 import BaseModel
17
+ from lib.core.pydantic_v1 import Extra
18
+ from lib.core.pydantic_v1 import Field
19
+ from lib.core.pydantic_v1 import is_namedtuple
20
+ from lib.core.pydantic_v1 import Literal
21
+ from lib.core.pydantic_v1 import parse_datetime
22
+ from lib.core.pydantic_v1 import ROOT_KEY
23
+ from lib.core.pydantic_v1 import sequence_like
24
+ from lib.core.pydantic_v1 import StrictStr
25
+ from lib.core.pydantic_v1 import ValueItems
26
26
 
27
27
  DATE_TIME_FORMAT_ERROR_MESSAGE = (
28
28
  "does not match expected format YYYY-MM-DDTHH:MM:SS.fffZ"
@@ -37,7 +37,7 @@ except ImportError:
37
37
  _missing = object()
38
38
 
39
39
 
40
- class BaseModel(PydanticBaseModel):
40
+ class BaseModel(BaseModel):
41
41
  """
42
42
  Added new extra keys
43
43
  - use_enum_names: that's for BaseTitledEnum to use names instead of enum objects
@@ -121,7 +121,7 @@ class BaseModel(PydanticBaseModel):
121
121
  exclude_none: bool,
122
122
  ) -> Any:
123
123
 
124
- if isinstance(v, PydanticBaseModel):
124
+ if isinstance(v, BaseModel):
125
125
  v_dict = v.dict(
126
126
  by_alias=by_alias,
127
127
  exclude_unset=exclude_unset,
@@ -5,17 +5,16 @@ from typing import List
5
5
  from typing import Optional
6
6
 
7
7
  from lib.core.entities.base import BaseModel
8
+ from lib.core.entities.base import parse_datetime
8
9
  from lib.core.enums import BaseTitledEnum
9
10
  from lib.core.enums import ClassTypeEnum
10
- from pydantic import BaseModel as BasePydanticModel
11
- from pydantic import Extra
12
- from pydantic import Field
13
- from pydantic import StrictInt
14
- from pydantic import StrictStr
15
- from pydantic import validator
16
- from pydantic.color import Color
17
- from pydantic.color import ColorType
18
- from pydantic.datetime_parse import parse_datetime
11
+ from lib.core.pydantic_v1 import Color
12
+ from lib.core.pydantic_v1 import ColorType
13
+ from lib.core.pydantic_v1 import Extra
14
+ from lib.core.pydantic_v1 import Field
15
+ from lib.core.pydantic_v1 import StrictInt
16
+ from lib.core.pydantic_v1 import StrictStr
17
+ from lib.core.pydantic_v1 import validator
19
18
 
20
19
  DATE_REGEX = r"\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d{3})Z"
21
20
  DATE_TIME_FORMAT_ERROR_MESSAGE = (
@@ -23,7 +22,7 @@ DATE_TIME_FORMAT_ERROR_MESSAGE = (
23
22
  )
24
23
 
25
24
 
26
- class HexColor(BasePydanticModel):
25
+ class HexColor(BaseModel):
27
26
  __root__: ColorType
28
27
 
29
28
  @validator("__root__", pre=True)
@@ -3,7 +3,7 @@ from typing import Optional
3
3
 
4
4
  from lib.core.entities.base import TimedBaseModel
5
5
  from lib.core.enums import FolderStatus
6
- from pydantic import Extra
6
+ from lib.core.pydantic_v1 import Extra
7
7
 
8
8
 
9
9
  class FolderEntity(TimedBaseModel):
@@ -1,7 +1,12 @@
1
1
  from lib.core.entities.base import TimedBaseModel
2
2
  from lib.core.enums import IntegrationTypeEnum
3
- from pydantic import Extra
4
- from pydantic import Field
3
+
4
+ try:
5
+ from pydantic.v1 import Extra
6
+ from pydantic.v1 import Field
7
+ except ImportError:
8
+ from pydantic import Extra
9
+ from pydantic import Field
5
10
 
6
11
 
7
12
  class IntegrationEntity(TimedBaseModel):
@@ -3,8 +3,8 @@ from typing import Optional
3
3
  from lib.core.entities.base import BaseItemEntity
4
4
  from lib.core.enums import ApprovalStatus
5
5
  from lib.core.enums import SegmentationStatus
6
- from pydantic import Extra
7
- from pydantic import Field
6
+ from lib.core.pydantic_v1 import Extra
7
+ from lib.core.pydantic_v1 import Field
8
8
 
9
9
 
10
10
  class ImageEntity(BaseItemEntity):
@@ -11,13 +11,13 @@ from lib.core.enums import BaseTitledEnum
11
11
  from lib.core.enums import ProjectStatus
12
12
  from lib.core.enums import ProjectType
13
13
  from lib.core.enums import UserRole
14
- from pydantic import Extra
15
- from pydantic import Field
16
- from pydantic import StrictBool
17
- from pydantic import StrictFloat
18
- from pydantic import StrictInt
19
- from pydantic import StrictStr
20
- from pydantic.datetime_parse import parse_datetime
14
+ from lib.core.pydantic_v1 import Extra
15
+ from lib.core.pydantic_v1 import Field
16
+ from lib.core.pydantic_v1 import parse_datetime
17
+ from lib.core.pydantic_v1 import StrictBool
18
+ from lib.core.pydantic_v1 import StrictFloat
19
+ from lib.core.pydantic_v1 import StrictInt
20
+ from lib.core.pydantic_v1 import StrictStr
21
21
 
22
22
 
23
23
  class StringDate(datetime.datetime):
@@ -82,7 +82,7 @@ class ImagePlugin:
82
82
 
83
83
  thumbnail_size = (128, 96)
84
84
  background = Image.new("RGB", thumbnail_size, "black")
85
- image.thumbnail(thumbnail_size, Image.ANTIALIAS)
85
+ image.thumbnail(thumbnail_size, Image.LANCZOS)
86
86
  (w, h) = image.size
87
87
  background.paste(
88
88
  image, ((thumbnail_size[0] - w) // 2, (thumbnail_size[1] - h) // 2)
@@ -99,7 +99,7 @@ class ImagePlugin:
99
99
  width, height = im.size
100
100
  buffer = io.BytesIO()
101
101
  h_size = int(height * base_width / width)
102
- im.resize((base_width, h_size), Image.ANTIALIAS).convert("RGB").save(
102
+ im.resize((base_width, h_size), Image.LANCZOS).convert("RGB").save(
103
103
  buffer, "JPEG"
104
104
  )
105
105
  buffer.seek(0)
@@ -0,0 +1,36 @@
1
+ from packaging.version import parse as parse_version
2
+ from pydantic import VERSION
3
+
4
+ if parse_version(VERSION).major < 2:
5
+ import pydantic
6
+ else:
7
+ import pydantic.v1 as pydantic # noqa
8
+
9
+ BaseModel = pydantic.BaseModel
10
+ Field = pydantic.Field
11
+ Extra = pydantic.Extra
12
+ ValidationError = pydantic.ValidationError
13
+ StrictStr = pydantic.StrictStr
14
+ StrictInt = pydantic.StrictInt
15
+ StrictBool = pydantic.StrictBool
16
+ StrictFloat = pydantic.StrictFloat
17
+ ErrorWrapper = pydantic.error_wrappers.ErrorWrapper
18
+ parse_obj_as = pydantic.parse_obj_as
19
+ is_namedtuple = pydantic.typing.is_namedtuple # noqa
20
+ Literal = pydantic.typing.Literal # noqa
21
+ ValueItems = pydantic.utils.ValueItems # noqa
22
+ ROOT_KEY = pydantic.utils.ROOT_KEY # noqa
23
+ sequence_like = pydantic.utils.sequence_like # noqa
24
+ validator = pydantic.validator # noqa
25
+ constr = pydantic.constr # noqa
26
+ conlist = pydantic.conlist # noqa
27
+ parse_datetime = pydantic.datetime_parse.parse_datetime # noqa
28
+ Color = pydantic.color.Color # noqa
29
+ ColorType = pydantic.color.ColorType # noqa
30
+ validators = pydantic.validators # noqa
31
+ WrongConstantError = pydantic.errors.WrongConstantError
32
+ errors = pydantic.errors
33
+ PydanticTypeError = pydantic.errors.PydanticTypeError
34
+ pydantic_validate_arguments = pydantic.validate_arguments
35
+ StrRegexError = pydantic.errors.StrRegexError
36
+ create_model_from_typeddict = pydantic.annotated_types.create_model_from_typeddict
@@ -6,9 +6,9 @@ from typing import Union
6
6
 
7
7
  from lib.core import entities
8
8
  from lib.core.exceptions import AppException
9
- from pydantic import BaseModel
10
- from pydantic import Extra
11
- from pydantic import Field
9
+ from lib.core.pydantic_v1 import BaseModel
10
+ from lib.core.pydantic_v1 import Extra
11
+ from lib.core.pydantic_v1 import Field
12
12
 
13
13
 
14
14
  class Limit(BaseModel):
@@ -562,6 +562,7 @@ class BaseServiceProvider:
562
562
  annotation_statuses: List[str],
563
563
  include_fuse: bool,
564
564
  only_pinned: bool,
565
+ integration_id: int,
565
566
  ) -> ServiceResponse:
566
567
  raise NotImplementedError
567
568
 
@@ -1,8 +1,8 @@
1
1
  from typing import Optional
2
2
 
3
- from pydantic import BaseModel
4
- from pydantic import constr
5
- from pydantic import Extra
3
+ from lib.core.pydantic_v1 import BaseModel
4
+ from lib.core.pydantic_v1 import constr
5
+ from lib.core.pydantic_v1 import Extra
6
6
 
7
7
  NotEmptyStr = constr(strict=True, min_length=1)
8
8
 
@@ -48,7 +48,11 @@ from lib.core.types import PriorityScoreEntity
48
48
  from lib.core.usecases.base import BaseReportableUseCase
49
49
  from lib.core.video_convertor import VideoFrameGenerator
50
50
  from lib.infrastructure.utils import divide_to_chunks
51
- from pydantic import BaseModel
51
+
52
+ try:
53
+ from pydantic.v1 import BaseModel
54
+ except ImportError:
55
+ from pydantic import BaseModel
52
56
 
53
57
  logger = logging.getLogger("sa")
54
58
 
@@ -231,6 +235,8 @@ async def upload_small_annotations(
231
235
  await upload(chunk)
232
236
  chunk = []
233
237
  _size = 0
238
+ if not chunk:
239
+ queue.put_nowait(None)
234
240
  chunk.append(item_data)
235
241
  _size += item_data.file_size
236
242
  if chunk:
@@ -45,6 +45,7 @@ class PrepareExportUseCase(BaseUseCase):
45
45
  include_fuse: bool,
46
46
  only_pinned: bool,
47
47
  annotation_statuses: List[str] = None,
48
+ integration_id: int = None,
48
49
  ):
49
50
  super().__init__(),
50
51
  self._project = project
@@ -53,6 +54,7 @@ class PrepareExportUseCase(BaseUseCase):
53
54
  self._annotation_statuses = annotation_statuses
54
55
  self._include_fuse = include_fuse
55
56
  self._only_pinned = only_pinned
57
+ self._integration_id = integration_id
56
58
 
57
59
  def validate_only_pinned(self):
58
60
  if (
@@ -107,6 +109,7 @@ class PrepareExportUseCase(BaseUseCase):
107
109
  annotation_statuses=self._annotation_statuses,
108
110
  include_fuse=self._include_fuse,
109
111
  only_pinned=self._only_pinned,
112
+ integration_id=self._integration_id,
110
113
  )
111
114
  if not response.ok:
112
115
  raise AppException(response.error)
@@ -6,7 +6,11 @@ from typing import List
6
6
  from typing import Optional
7
7
 
8
8
  from lib.core.enums import AnnotationTypes
9
- from pydantic import BaseModel
9
+
10
+ try:
11
+ from pydantic.v1 import BaseModel
12
+ except ImportError:
13
+ from pydantic import BaseModel
10
14
 
11
15
 
12
16
  class Annotation(BaseModel):
@@ -1011,6 +1011,7 @@ class Controller(BaseController):
1011
1011
  include_fuse: bool,
1012
1012
  only_pinned: bool,
1013
1013
  annotation_statuses: List[str] = None,
1014
+ integration_id: int = None,
1014
1015
  ):
1015
1016
  project = self.get_project(project_name)
1016
1017
  use_case = usecases.PrepareExportUseCase(
@@ -1020,6 +1021,7 @@ class Controller(BaseController):
1020
1021
  include_fuse=include_fuse,
1021
1022
  only_pinned=only_pinned,
1022
1023
  annotation_statuses=annotation_statuses,
1024
+ integration_id=integration_id,
1023
1025
  )
1024
1026
  return use_case.execute()
1025
1027
 
@@ -151,6 +151,7 @@ class ServiceProvider(BaseServiceProvider):
151
151
  annotation_statuses: List[str],
152
152
  include_fuse: bool,
153
153
  only_pinned: bool,
154
+ integration_id: int = None,
154
155
  ):
155
156
  annotation_statuses = ",".join(
156
157
  [str(constants.AnnotationStatus.get_value(i)) for i in annotation_statuses]
@@ -165,7 +166,8 @@ class ServiceProvider(BaseServiceProvider):
165
166
  }
166
167
  if folders:
167
168
  data["folder_names"] = folders
168
-
169
+ if integration_id is not None:
170
+ data["integration_id"] = integration_id
169
171
  return self.client.request(
170
172
  self.URL_PREPARE_EXPORT,
171
173
  "post",
@@ -18,7 +18,12 @@ from lib.core.service_types import UploadAnnotations
18
18
  from lib.core.service_types import UploadAnnotationsResponse
19
19
  from lib.core.serviceproviders import BaseAnnotationService
20
20
  from lib.infrastructure.stream_data_handler import StreamedAnnotations
21
- from pydantic import parse_obj_as
21
+
22
+ try:
23
+ from pydantic.v1 import parse_obj_as
24
+ except ImportError:
25
+ from pydantic import parse_obj_as
26
+
22
27
  from superannotate.lib.infrastructure.services.http_client import AIOHttpSession
23
28
 
24
29
  logger = logging.getLogger("sa")
@@ -90,7 +95,7 @@ class AnnotationService(BaseAnnotationService):
90
95
  synced = await session.get(sync_status_url, params=sync_params)
91
96
  synced = await synced.json()
92
97
  synced = synced["status"]
93
- await asyncio.sleep(1)
98
+ await asyncio.sleep(5)
94
99
  return synced
95
100
 
96
101
  async def get_big_annotation(
@@ -248,13 +253,13 @@ class AnnotationService(BaseAnnotationService):
248
253
  folder: entities.FolderEntity,
249
254
  items_name_data_map: Dict[str, dict],
250
255
  ) -> UploadAnnotationsResponse:
251
- url = urljoin(
252
- self.assets_provider_url,
253
- (
254
- f"{self.URL_UPLOAD_ANNOTATIONS}?{'&'.join(f'image_names[]={item_name}' for item_name in items_name_data_map.keys())}"
255
- ),
256
- )
257
-
256
+ params = [
257
+ ("team_id", project.team_id),
258
+ ("project_id", project.id),
259
+ ("folder_id", folder.id),
260
+ *[("image_names[]", item_name) for item_name in items_name_data_map.keys()],
261
+ ]
262
+ url = urljoin(self.assets_provider_url, f"{self.URL_UPLOAD_ANNOTATIONS}")
258
263
  headers = copy.copy(self.client.default_headers)
259
264
  del headers["Content-Type"]
260
265
  async with AIOHttpSession(
@@ -277,12 +282,6 @@ class AnnotationService(BaseAnnotationService):
277
282
  filename=key,
278
283
  content_type="application/json",
279
284
  )
280
-
281
- params = {
282
- "team_id": project.team_id,
283
- "project_id": project.id,
284
- "folder_id": folder.id,
285
- }
286
285
  _response = await session.request(
287
286
  "post", url, params=params, data=form_data
288
287
  )