| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- from flask import request
- from flask_restx import Resource, fields, reqparse
-
- from configs import dify_config
- from libs.helper import StrLen, email, extract_remote_ip
- from libs.password import valid_password
- from models.model import DifySetup, db
- from services.account_service import RegisterService, TenantService
-
- from . import api, console_ns
- from .error import AlreadySetupError, NotInitValidateError
- from .init_validate import get_init_validate_status
- from .wraps import only_edition_self_hosted
-
-
- @console_ns.route("/setup")
- class SetupApi(Resource):
- @api.doc("get_setup_status")
- @api.doc(description="Get system setup status")
- @api.response(
- 200,
- "Success",
- api.model(
- "SetupStatusResponse",
- {
- "step": fields.String(description="Setup step status", enum=["not_started", "finished"]),
- "setup_at": fields.String(description="Setup completion time (ISO format)", required=False),
- },
- ),
- )
- def get(self):
- """Get system setup status"""
- if dify_config.EDITION == "SELF_HOSTED":
- setup_status = get_setup_status()
- # Check if setup_status is a DifySetup object rather than a bool
- if setup_status and not isinstance(setup_status, bool):
- return {"step": "finished", "setup_at": setup_status.setup_at.isoformat()}
- elif setup_status:
- return {"step": "finished"}
- return {"step": "not_started"}
- return {"step": "finished"}
-
- @api.doc("setup_system")
- @api.doc(description="Initialize system setup with admin account")
- @api.expect(
- api.model(
- "SetupRequest",
- {
- "email": fields.String(required=True, description="Admin email address"),
- "name": fields.String(required=True, description="Admin name (max 30 characters)"),
- "password": fields.String(required=True, description="Admin password"),
- },
- )
- )
- @api.response(201, "Success", api.model("SetupResponse", {"result": fields.String(description="Setup result")}))
- @api.response(400, "Already setup or validation failed")
- @only_edition_self_hosted
- def post(self):
- """Initialize system setup with admin account"""
- # is set up
- if get_setup_status():
- raise AlreadySetupError()
-
- # is tenant created
- tenant_count = TenantService.get_tenant_count()
- if tenant_count > 0:
- raise AlreadySetupError()
-
- if not get_init_validate_status():
- raise NotInitValidateError()
-
- parser = reqparse.RequestParser()
- parser.add_argument("email", type=email, required=True, location="json")
- parser.add_argument("name", type=StrLen(30), required=True, location="json")
- parser.add_argument("password", type=valid_password, required=True, location="json")
- args = parser.parse_args()
-
- # setup
- RegisterService.setup(
- email=args["email"], name=args["name"], password=args["password"], ip_address=extract_remote_ip(request)
- )
-
- return {"result": "success"}, 201
-
-
- def get_setup_status():
- if dify_config.EDITION == "SELF_HOSTED":
- return db.session.query(DifySetup).first()
- else:
- return True
|