diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index db23a028cd..7b2411b96f 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -93,7 +93,7 @@ class AppImportApi(Resource): args = parser.parse_args() app_service = AppService() - app = app_service.import_app(current_user.current_tenant_id, args, current_user) + app = app_service.import_app(current_user.current_tenant_id, args['data'], args, current_user) return app, 201 @@ -180,6 +180,32 @@ class AppApi(Resource): return {'result': 'success'}, 204 +class AppCopyApi(Resource): + @setup_required + @login_required + @account_initialization_required + @get_app_model + @marshal_with(app_detail_fields_with_site) + def post(self, app_model): + """Copy app""" + # The role of the current user in the ta table must be admin or owner + if not current_user.is_admin_or_owner: + raise Forbidden() + + parser = reqparse.RequestParser() + parser.add_argument('name', type=str, location='json') + parser.add_argument('description', type=str, location='json') + parser.add_argument('icon', type=str, location='json') + parser.add_argument('icon_background', type=str, location='json') + args = parser.parse_args() + + app_service = AppService() + data = app_service.export_app(app_model) + app = app_service.import_app(current_user.current_tenant_id, data, args, current_user) + + return app, 201 + + class AppExportApi(Resource): @setup_required @login_required @@ -266,6 +292,7 @@ class AppApiStatus(Resource): api.add_resource(AppListApi, '/apps') api.add_resource(AppImportApi, '/apps/import') api.add_resource(AppApi, '/apps/') +api.add_resource(AppCopyApi, '/apps//copy') api.add_resource(AppExportApi, '/apps//export') api.add_resource(AppNameApi, '/apps//name') api.add_resource(AppIconApi, '/apps//icon') diff --git a/api/services/app_service.py b/api/services/app_service.py index e0a7835cb7..f1d0e3df19 100644 --- a/api/services/app_service.py +++ b/api/services/app_service.py @@ -124,15 +124,16 @@ class AppService: return app - def import_app(self, tenant_id: str, args: dict, account: Account) -> App: + def import_app(self, tenant_id: str, data: str, args: dict, account: Account) -> App: """ Import app :param tenant_id: tenant id + :param data: import data :param args: request args :param account: Account instance """ try: - import_data = yaml.safe_load(args['data']) + import_data = yaml.safe_load(data) except yaml.YAMLError as e: raise ValueError("Invalid YAML format in data argument.")