| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | from typing import Literalfrom flask import request, send_filefrom flask_login import current_user  # type: ignorefrom flask_restful import Resource, fields, marshal, marshal_with  # type: ignorefrom werkzeug.exceptions import Forbidden, NotFoundimport servicesfrom controllers.common.errors import FilenameNotExistsErrorfrom controllers.console import apifrom controllers.console.app.error import (    ProviderModelCurrentlyNotSupportError,    ProviderNotInitializeError,    ProviderQuotaExceededError,)from controllers.console.error import (    FileTooLargeError,    NoFileUploadedError,    TooManyFilesError,    UnsupportedFileTypeError,)from controllers.console.wraps import (    account_initialization_required,    cloud_edition_billing_resource_check,    setup_required,)from core.errors.error import (    ModelCurrentlyNotSupportError,    ProviderTokenNotInitError,    QuotaExceededError,)from fields.template_fields import (    template_fields,)from libs.login import login_requiredfrom models import Templatefrom services.dataset_service import DatasetService, TemplateServicefrom services.file_service import FileServiceclass DatasetTemplateListApi(Resource):    @setup_required    @login_required    @account_initialization_required    def get(self, dataset_id):        dataset_id = str(dataset_id)        page = request.args.get("page", default=1, type=int)        limit = request.args.get("limit", default=20, type=int)        search = request.args.get("keyword", default=None, type=str)        dataset = DatasetService.get_dataset(dataset_id)        if not dataset:            raise NotFound("Dataset not found.")        try:            DatasetService.check_dataset_permission(dataset, current_user)        except services.errors.account.NoPermissionError as e:            raise Forbidden(str(e))        query = Template.query.filter_by(dataset_id=str(dataset_id), tenant_id=current_user.current_tenant_id)        if search:            search = f"%{search}%"            query = query.filter(Template.name.like(search))        paginated_templates = query.paginate(page=page, per_page=limit, max_per_page=100, error_out=False)        templates = paginated_templates.items        data = marshal(templates, template_fields)        response = {            "data": data,            "has_more": len(templates) == limit,            "limit": limit,            "total": paginated_templates.total,            "page": page,        }        return response    templates_and_batch_fields = {"templates": fields.List(fields.Nested(template_fields)), "batch": fields.String}    @setup_required    @login_required    @account_initialization_required    @marshal_with(templates_and_batch_fields)    @cloud_edition_billing_resource_check("vector_space")    def post(self, dataset_id):        if not current_user.is_admin_or_owner:            raise Forbidden()        dataset_id = str(dataset_id)        dataset = DatasetService.get_dataset(dataset_id)        if not dataset:            raise NotFound("Dataset not found.")        if not current_user.is_dataset_editor:            raise Forbidden()        try:            DatasetService.check_dataset_permission(dataset, current_user)        except services.errors.account.NoPermissionError as e:            raise Forbidden(str(e))        file = request.files["file"]        source_str = request.form.get("source")        source: Literal["datasets"] | None = "datasets" if source_str == "datasets" else None        if "file" not in request.files:            raise NoFileUploadedError()        if len(request.files) > 1:            raise TooManyFilesError()        if not file.filename:            raise FilenameNotExistsError        if source == "datasets" and not current_user.is_dataset_editor:            raise Forbidden()        if source not in ("datasets", None):            source = None        try:            upload_file = FileService.upload_file(                filename=file.filename,                content=file.read(),                mimetype=file.mimetype,                user=current_user,                source=source,            )        except services.errors.file.FileTooLargeError as file_too_large_error:            raise FileTooLargeError(file_too_large_error.description)        except services.errors.file.UnsupportedFileTypeError:            raise UnsupportedFileTypeError()        try:            templates, batch = TemplateService.save_template_with_dataset_id(upload_file, dataset, current_user)        except ProviderTokenNotInitError as ex:            raise ProviderNotInitializeError(ex.description)        except QuotaExceededError:            raise ProviderQuotaExceededError()        except ModelCurrentlyNotSupportError:            raise ProviderModelCurrentlyNotSupportError()        return {"templates": templates, "batch": batch}    @setup_required    @login_required    @account_initialization_required    def delete(self, dataset_id):        if not current_user.is_admin_or_owner:            raise Forbidden()        dataset_id = str(dataset_id)        dataset = DatasetService.get_dataset(dataset_id)        if dataset is None:            raise NotFound("Dataset not found.")        DatasetService.check_dataset_model_setting(dataset)        template_ids = request.args.getlist("template_id")        TemplateService.delete_templates(dataset, template_ids)        return {"result": "success"}, 204class DatasetTemplateApi(Resource):    @setup_required    @login_required    @account_initialization_required    def get(self, template_id):        # The role of the current user in the ta table must be admin, owner, or editor        # if not current_user.is_editor:        #    raise Forbidden()        template_id = str(template_id)        template = Template.query.filter_by(id=template_id).first()        file_name = template.name        # as_attachment下载作为附件下载        return send_file(template.file_url, as_attachment=True, download_name=file_name)    @setup_required    @login_required    @account_initialization_required    def delete(self, template_id):        if not current_user.is_admin_or_owner:            raise Forbidden()        template_id = str(template_id)        template = TemplateService.get_templates(template_id)        if template is None:            raise NotFound("Dataset not found.")        TemplateService.delete_template(template)        return {"result": "success"}, 204api.add_resource(DatasetTemplateListApi, "/datasets/<uuid:dataset_id>/templates")api.add_resource(DatasetTemplateApi, "/datasets/template/<uuid:template_id>")
 |