site.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. }
  38. app_fields = {
  39. 'app_id': fields.String,
  40. 'end_user_id': fields.String,
  41. 'enable_site': fields.Boolean,
  42. 'site': fields.Nested(site_fields),
  43. 'model_config': fields.Nested(model_config_fields, allow_null=True),
  44. 'plan': fields.String,
  45. 'can_replace_logo': fields.Boolean,
  46. 'custom_config': fields.Raw(attribute='custom_config'),
  47. }
  48. @marshal_with(app_fields)
  49. def get(self, app_model, end_user):
  50. """Retrieve app site info."""
  51. # get site
  52. site = db.session.query(Site).filter(Site.app_id == app_model.id).first()
  53. if not site:
  54. raise Forbidden()
  55. if app_model.tenant.status == TenantStatus.ARCHIVE:
  56. raise Forbidden()
  57. can_replace_logo = FeatureService.get_features(app_model.tenant_id).can_replace_logo
  58. return AppSiteInfo(app_model.tenant, app_model, site, end_user.id, can_replace_logo)
  59. api.add_resource(AppSiteApi, '/site')
  60. class AppSiteInfo:
  61. """Class to store site information."""
  62. def __init__(self, tenant, app, site, end_user, can_replace_logo):
  63. """Initialize AppSiteInfo instance."""
  64. self.app_id = app.id
  65. self.end_user_id = end_user
  66. self.enable_site = app.enable_site
  67. self.site = site
  68. self.model_config = None
  69. self.plan = tenant.plan
  70. self.can_replace_logo = can_replace_logo
  71. if can_replace_logo:
  72. base_url = dify_config.FILES_URL
  73. remove_webapp_brand = tenant.custom_config_dict.get('remove_webapp_brand', False)
  74. replace_webapp_logo = f'{base_url}/files/workspaces/{tenant.id}/webapp-logo' if tenant.custom_config_dict.get('replace_webapp_logo') else None
  75. self.custom_config = {
  76. 'remove_webapp_brand': remove_webapp_brand,
  77. 'replace_webapp_logo': replace_webapp_logo,
  78. }