Underground-Digital/Workflow-Engine
0
1from flask_restful import fields, marshal_with2from werkzeug.exceptions import Forbidden3 4from configs import dify_config5from controllers.web import api6from controllers.web.wraps import WebApiResource7from extensions.ext_database import db8from libs.helper import AppIconUrlField9from models.account import TenantStatus10from models.model import Site11from services.feature_service import FeatureService12 13 14class AppSiteApi(WebApiResource):15 """Resource for app sites."""16 17 model_config_fields = {18 "opening_statement": fields.String,19 "suggested_questions": fields.Raw(attribute="suggested_questions_list"),20 "suggested_questions_after_answer": fields.Raw(attribute="suggested_questions_after_answer_dict"),21 "more_like_this": fields.Raw(attribute="more_like_this_dict"),22 "model": fields.Raw(attribute="model_dict"),23 "user_input_form": fields.Raw(attribute="user_input_form_list"),24 "pre_prompt": fields.String,25 }26 27 site_fields = {28 "title": fields.String,29 "chat_color_theme": fields.String,30 "chat_color_theme_inverted": fields.Boolean,31 "icon_type": fields.String,32 "icon": fields.String,33 "icon_background": fields.String,34 "icon_url": AppIconUrlField,35 "description": fields.String,36 "copyright": fields.String,37 "privacy_policy": fields.String,38 "custom_disclaimer": fields.String,39 "default_language": fields.String,40 "prompt_public": fields.Boolean,41 "show_workflow_steps": fields.Boolean,42 "use_icon_as_answer_icon": fields.Boolean,43 }44 45 app_fields = {46 "app_id": fields.String,47 "end_user_id": fields.String,48 "enable_site": fields.Boolean,49 "site": fields.Nested(site_fields),50 "model_config": fields.Nested(model_config_fields, allow_null=True),51 "plan": fields.String,52 "can_replace_logo": fields.Boolean,53 "custom_config": fields.Raw(attribute="custom_config"),54 }55 56 @marshal_with(app_fields)57 def get(self, app_model, end_user):58 """Retrieve app site info."""59 # get site60 site = db.session.query(Site).filter(Site.app_id == app_model.id).first()61 62 if not site:63 raise Forbidden()64 65 if app_model.tenant.status == TenantStatus.ARCHIVE:66 raise Forbidden()67 68 can_replace_logo = FeatureService.get_features(app_model.tenant_id).can_replace_logo69 70 return AppSiteInfo(app_model.tenant, app_model, site, end_user.id, can_replace_logo)71 72 73api.add_resource(AppSiteApi, "/site")74 75 76class AppSiteInfo:77 """Class to store site information."""78 79 def __init__(self, tenant, app, site, end_user, can_replace_logo):80 """Initialize AppSiteInfo instance."""81 self.app_id = app.id82 self.end_user_id = end_user83 self.enable_site = app.enable_site84 self.site = site85 self.model_config = None86 self.plan = tenant.plan87 self.can_replace_logo = can_replace_logo88 89 if can_replace_logo:90 base_url = dify_config.FILES_URL91 remove_webapp_brand = tenant.custom_config_dict.get("remove_webapp_brand", False)92 replace_webapp_logo = (93 f"{base_url}/files/workspaces/{tenant.id}/webapp-logo"94 if tenant.custom_config_dict.get("replace_webapp_logo")95 else None96 )97 self.custom_config = {98 "remove_webapp_brand": remove_webapp_brand,99 "replace_webapp_logo": replace_webapp_logo,100 }101 