site.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from flask_restful import fields, marshal_with
  2. from werkzeug.exceptions import Forbidden
  3. from configs import dify_config
  4. from controllers.web import api
  5. from controllers.web.wraps import WebApiResource
  6. from extensions.ext_database import db
  7. from libs.helper import AppIconUrlField
  8. from models.account import TenantStatus
  9. from models.model import Site
  10. from services.feature_service import FeatureService
  11. class AppSiteApi(WebApiResource):
  12. """Resource for app sites."""
  13. model_config_fields = {
  14. "opening_statement": fields.String,
  15. "suggested_questions": fields.Raw(attribute="suggested_questions_list"),
  16. "suggested_questions_after_answer": fields.Raw(attribute="suggested_questions_after_answer_dict"),
  17. "more_like_this": fields.Raw(attribute="more_like_this_dict"),
  18. "model": fields.Raw(attribute="model_dict"),
  19. "user_input_form": fields.Raw(attribute="user_input_form_list"),
  20. "pre_prompt": fields.String,
  21. }
  22. site_fields = {
  23. "title": fields.String,
  24. "chat_color_theme": fields.String,
  25. "chat_color_theme_inverted": fields.Boolean,
  26. "icon_type": fields.String,
  27. "icon": fields.String,
  28. "icon_background": fields.String,
  29. "icon_url": AppIconUrlField,
  30. "description": fields.String,
  31. "copyright": fields.String,
  32. "privacy_policy": fields.String,
  33. "custom_disclaimer": fields.String,
  34. "default_language": fields.String,
  35. "prompt_public": fields.Boolean,
  36. "show_workflow_steps": fields.Boolean,
  37. "use_icon_as_answer_icon": fields.Boolean,
  38. }
  39. app_fields = {
  40. "app_id": fields.String,
  41. "end_user_id": fields.String,
  42. "enable_site": fields.Boolean,
  43. "site": fields.Nested(site_fields),
  44. "model_config": fields.Nested(model_config_fields, allow_null=True),
  45. "plan": fields.String,
  46. "can_replace_logo": fields.Boolean,
  47. "custom_config": fields.Raw(attribute="custom_config"),
  48. }
  49. @marshal_with(app_fields)
  50. def get(self, app_model, end_user):
  51. """Retrieve app site info."""
  52. # get site
  53. site = db.session.query(Site).filter(Site.app_id == app_model.id).first()
  54. if not site:
  55. raise Forbidden()
  56. if app_model.tenant.status == TenantStatus.ARCHIVE:
  57. raise Forbidden()
  58. can_replace_logo = FeatureService.get_features(app_model.tenant_id).can_replace_logo
  59. return AppSiteInfo(app_model.tenant, app_model, site, end_user.id, can_replace_logo)
  60. api.add_resource(AppSiteApi, "/site")
  61. class AppSiteInfo:
  62. """Class to store site information."""
  63. def __init__(self, tenant, app, site, end_user, can_replace_logo):
  64. """Initialize AppSiteInfo instance."""
  65. self.app_id = app.id
  66. self.end_user_id = end_user
  67. self.enable_site = app.enable_site
  68. self.site = site
  69. self.model_config = None
  70. self.plan = tenant.plan
  71. self.can_replace_logo = can_replace_logo
  72. if can_replace_logo:
  73. base_url = dify_config.FILES_URL
  74. remove_webapp_brand = tenant.custom_config_dict.get("remove_webapp_brand", False)
  75. replace_webapp_logo = (
  76. f"{base_url}/files/workspaces/{tenant.id}/webapp-logo"
  77. if tenant.custom_config_dict.get("replace_webapp_logo")
  78. else None
  79. )
  80. self.custom_config = {
  81. "remove_webapp_brand": remove_webapp_brand,
  82. "replace_webapp_logo": replace_webapp_logo,
  83. }