metadata.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. from flask_login import current_user # type: ignore # type: ignore
  2. from flask_restful import marshal, reqparse # type: ignore
  3. from werkzeug.exceptions import NotFound
  4. from controllers.service_api import api
  5. from controllers.service_api.wraps import DatasetApiResource
  6. from fields.dataset_fields import dataset_metadata_fields
  7. from services.dataset_service import DatasetService
  8. from services.entities.knowledge_entities.knowledge_entities import (
  9. MetadataArgs,
  10. MetadataOperationData,
  11. )
  12. from services.metadata_service import MetadataService
  13. def _validate_name(name):
  14. if not name or len(name) < 1 or len(name) > 40:
  15. raise ValueError("Name must be between 1 to 40 characters.")
  16. return name
  17. def _validate_description_length(description):
  18. if len(description) > 400:
  19. raise ValueError("Description cannot exceed 400 characters.")
  20. return description
  21. class DatasetMetadataCreateServiceApi(DatasetApiResource):
  22. def post(self, tenant_id, dataset_id):
  23. parser = reqparse.RequestParser()
  24. parser.add_argument("type", type=str, required=True, nullable=True, location="json")
  25. parser.add_argument("name", type=str, required=True, nullable=True, location="json")
  26. args = parser.parse_args()
  27. metadata_args = MetadataArgs(**args)
  28. dataset_id_str = str(dataset_id)
  29. dataset = DatasetService.get_dataset(dataset_id_str)
  30. if dataset is None:
  31. raise NotFound("Dataset not found.")
  32. DatasetService.check_dataset_permission(dataset, current_user)
  33. metadata = MetadataService.create_metadata(dataset_id_str, metadata_args)
  34. return marshal(metadata, dataset_metadata_fields), 201
  35. def get(self, tenant_id, dataset_id):
  36. dataset_id_str = str(dataset_id)
  37. dataset = DatasetService.get_dataset(dataset_id_str)
  38. if dataset is None:
  39. raise NotFound("Dataset not found.")
  40. return MetadataService.get_dataset_metadatas(dataset), 200
  41. class DatasetMetadataServiceApi(DatasetApiResource):
  42. def patch(self, tenant_id, dataset_id, metadata_id):
  43. parser = reqparse.RequestParser()
  44. parser.add_argument("name", type=str, required=True, nullable=True, location="json")
  45. args = parser.parse_args()
  46. dataset_id_str = str(dataset_id)
  47. metadata_id_str = str(metadata_id)
  48. dataset = DatasetService.get_dataset(dataset_id_str)
  49. if dataset is None:
  50. raise NotFound("Dataset not found.")
  51. DatasetService.check_dataset_permission(dataset, current_user)
  52. metadata = MetadataService.update_metadata_name(dataset_id_str, metadata_id_str, args.get("name"))
  53. return marshal(metadata, dataset_metadata_fields), 200
  54. def delete(self, tenant_id, dataset_id, metadata_id):
  55. dataset_id_str = str(dataset_id)
  56. metadata_id_str = str(metadata_id)
  57. dataset = DatasetService.get_dataset(dataset_id_str)
  58. if dataset is None:
  59. raise NotFound("Dataset not found.")
  60. DatasetService.check_dataset_permission(dataset, current_user)
  61. MetadataService.delete_metadata(dataset_id_str, metadata_id_str)
  62. return 200
  63. class DatasetMetadataBuiltInFieldServiceApi(DatasetApiResource):
  64. def get(self, tenant_id):
  65. built_in_fields = MetadataService.get_built_in_fields()
  66. return {"fields": built_in_fields}, 200
  67. class DatasetMetadataBuiltInFieldActionServiceApi(DatasetApiResource):
  68. def post(self, tenant_id, dataset_id, action):
  69. dataset_id_str = str(dataset_id)
  70. dataset = DatasetService.get_dataset(dataset_id_str)
  71. if dataset is None:
  72. raise NotFound("Dataset not found.")
  73. DatasetService.check_dataset_permission(dataset, current_user)
  74. if action == "enable":
  75. MetadataService.enable_built_in_field(dataset)
  76. elif action == "disable":
  77. MetadataService.disable_built_in_field(dataset)
  78. return 200
  79. class DocumentMetadataEditServiceApi(DatasetApiResource):
  80. def post(self, tenant_id, dataset_id):
  81. dataset_id_str = str(dataset_id)
  82. dataset = DatasetService.get_dataset(dataset_id_str)
  83. if dataset is None:
  84. raise NotFound("Dataset not found.")
  85. DatasetService.check_dataset_permission(dataset, current_user)
  86. parser = reqparse.RequestParser()
  87. parser.add_argument("operation_data", type=list, required=True, nullable=True, location="json")
  88. args = parser.parse_args()
  89. metadata_args = MetadataOperationData(**args)
  90. MetadataService.update_documents_metadata(dataset, metadata_args)
  91. return 200
  92. api.add_resource(DatasetMetadataCreateServiceApi, "/datasets/<uuid:dataset_id>/metadata")
  93. api.add_resource(DatasetMetadataServiceApi, "/datasets/<uuid:dataset_id>/metadata/<uuid:metadata_id>")
  94. api.add_resource(DatasetMetadataBuiltInFieldServiceApi, "/datasets/metadata/built-in")
  95. api.add_resource(
  96. DatasetMetadataBuiltInFieldActionServiceApi, "/datasets/<uuid:dataset_id>/metadata/built-in/<string:action>"
  97. )
  98. api.add_resource(DocumentMetadataEditServiceApi, "/datasets/<uuid:dataset_id>/documents/metadata")