from flask_restful import fields, marshal_with from werkzeug.exceptions import Forbidden from configs import dify_config from controllers.web import api from controllers.web.wraps import WebApiResource from extensions.ext_database import db from libs.helper import AppIconUrlField from models.account import TenantStatus from models.model import Site from services.feature_service import FeatureService class AppSiteApi(WebApiResource): """Resource for app sites.""" model_config_fields = { "opening_statement": fields.String, "suggested_questions": fields.Raw(attribute="suggested_questions_list"), "suggested_questions_after_answer": fields.Raw(attribute="suggested_questions_after_answer_dict"), "more_like_this": fields.Raw(attribute="more_like_this_dict"), "model": fields.Raw(attribute="model_dict"), "user_input_form": fields.Raw(attribute="user_input_form_list"), "pre_prompt": fields.String, } site_fields = { "title": fields.String, "chat_color_theme": fields.String, "chat_color_theme_inverted": fields.Boolean, "icon_type": fields.String, "icon": fields.String, "icon_background": fields.String, "icon_url": AppIconUrlField, "description": fields.String, "copyright": fields.String, "privacy_policy": fields.String, "custom_disclaimer": fields.String, "default_language": fields.String, "prompt_public": fields.Boolean, "show_workflow_steps": fields.Boolean, "use_icon_as_answer_icon": fields.Boolean, } app_fields = { "app_id": fields.String, "end_user_id": fields.String, "enable_site": fields.Boolean, "site": fields.Nested(site_fields), "model_config": fields.Nested(model_config_fields, allow_null=True), "plan": fields.String, "can_replace_logo": fields.Boolean, "custom_config": fields.Raw(attribute="custom_config"), } @marshal_with(app_fields) def get(self, app_model, end_user): """Retrieve app site info.""" # get site site = db.session.query(Site).filter(Site.app_id == app_model.id).first() if not site: raise Forbidden() if app_model.tenant.status == TenantStatus.ARCHIVE: raise Forbidden() can_replace_logo = FeatureService.get_features(app_model.tenant_id).can_replace_logo return AppSiteInfo(app_model.tenant, app_model, site, end_user.id, can_replace_logo) api.add_resource(AppSiteApi, "/site") class AppSiteInfo: """Class to store site information.""" def __init__(self, tenant, app, site, end_user, can_replace_logo): """Initialize AppSiteInfo instance.""" self.app_id = app.id self.end_user_id = end_user self.enable_site = app.enable_site self.site = site self.model_config = None self.plan = tenant.plan self.can_replace_logo = can_replace_logo if can_replace_logo: base_url = dify_config.FILES_URL remove_webapp_brand = tenant.custom_config_dict.get("remove_webapp_brand", False) replace_webapp_logo = ( f"{base_url}/files/workspaces/{tenant.id}/webapp-logo" if tenant.custom_config_dict.get("replace_webapp_logo") else None ) self.custom_config = { "remove_webapp_brand": remove_webapp_brand, "replace_webapp_logo": replace_webapp_logo, }