123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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,
- }
|