mirror of
https://github.com/langgenius/dify.git
synced 2026-04-05 19:52:03 +08:00
feat: add autocomplete for institution search
This commit is contained in:
@@ -3,25 +3,20 @@ import datetime
|
|||||||
import pytz
|
import pytz
|
||||||
from flask import request
|
from flask import request
|
||||||
from flask_login import current_user # type: ignore
|
from flask_login import current_user # type: ignore
|
||||||
from flask_restful import Resource, fields, marshal_with, reqparse # type: ignore
|
from flask_restful import (Resource, fields, marshal_with, # type: ignore
|
||||||
|
reqparse)
|
||||||
|
|
||||||
from configs import dify_config
|
from configs import dify_config
|
||||||
from constants.languages import supported_language
|
from constants.languages import supported_language
|
||||||
from controllers.console import api
|
from controllers.console import api
|
||||||
from controllers.console.workspace.error import (
|
from controllers.console.workspace.error import (
|
||||||
AccountAlreadyInitedError,
|
AccountAlreadyInitedError, CurrentPasswordIncorrectError,
|
||||||
CurrentPasswordIncorrectError,
|
InvalidAccountDeletionCodeError, InvalidInvitationCodeError,
|
||||||
InvalidAccountDeletionCodeError,
|
RepeatPasswordNotMatchError)
|
||||||
InvalidInvitationCodeError,
|
from controllers.console.wraps import (account_initialization_required,
|
||||||
RepeatPasswordNotMatchError,
|
cloud_edition_billing_enabled,
|
||||||
)
|
enterprise_license_required,
|
||||||
from controllers.console.wraps import (
|
only_edition_cloud, setup_required)
|
||||||
account_initialization_required,
|
|
||||||
cloud_edition_billing_enabled,
|
|
||||||
enterprise_license_required,
|
|
||||||
only_edition_cloud,
|
|
||||||
setup_required,
|
|
||||||
)
|
|
||||||
from extensions.ext_database import db
|
from extensions.ext_database import db
|
||||||
from fields.member_fields import account_fields
|
from fields.member_fields import account_fields
|
||||||
from libs.helper import TimestampField, timezone
|
from libs.helper import TimestampField, timezone
|
||||||
@@ -29,7 +24,8 @@ from libs.login import login_required
|
|||||||
from models import AccountIntegrate, InvitationCode
|
from models import AccountIntegrate, InvitationCode
|
||||||
from services.account_service import AccountService
|
from services.account_service import AccountService
|
||||||
from services.billing_service import BillingService
|
from services.billing_service import BillingService
|
||||||
from services.errors.account import CurrentPasswordIncorrectError as ServiceCurrentPasswordIncorrectError
|
from services.errors.account import \
|
||||||
|
CurrentPasswordIncorrectError as ServiceCurrentPasswordIncorrectError
|
||||||
|
|
||||||
|
|
||||||
class AccountInitApi(Resource):
|
class AccountInitApi(Resource):
|
||||||
@@ -330,9 +326,10 @@ class EducationApi(Resource):
|
|||||||
|
|
||||||
parser = reqparse.RequestParser()
|
parser = reqparse.RequestParser()
|
||||||
parser.add_argument("token", type=str, required=True, location="json")
|
parser.add_argument("token", type=str, required=True, location="json")
|
||||||
|
parser.add_argument("institution", type=str, required=True, location="json")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
return BillingService.EducationIdentity.activate(account, args["token"])
|
return BillingService.EducationIdentity.activate(account, args["token"], args["institution"])
|
||||||
|
|
||||||
@setup_required
|
@setup_required
|
||||||
@login_required
|
@login_required
|
||||||
@@ -346,6 +343,29 @@ class EducationApi(Resource):
|
|||||||
return BillingService.EducationIdentity.is_active(account.id)
|
return BillingService.EducationIdentity.is_active(account.id)
|
||||||
|
|
||||||
|
|
||||||
|
class EducationAutoCompleteApi(Resource):
|
||||||
|
data_fields = {
|
||||||
|
"data": fields.List(fields.String),
|
||||||
|
"curr_page": fields.Integer,
|
||||||
|
"has_next": fields.Boolean,
|
||||||
|
}
|
||||||
|
|
||||||
|
@setup_required
|
||||||
|
@login_required
|
||||||
|
@account_initialization_required
|
||||||
|
@only_edition_cloud
|
||||||
|
@cloud_edition_billing_enabled
|
||||||
|
@marshal_with(data_fields)
|
||||||
|
def get(self):
|
||||||
|
parser = reqparse.RequestParser()
|
||||||
|
parser.add_argument("keywords", type=str, required=True, location="args")
|
||||||
|
parser.add_argument("page", type=int, required=False, location="args", default=0)
|
||||||
|
parser.add_argument("limit", type=int, required=False, location="args", default=20)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
return BillingService.EducationIdentity.autocomplete(args["keywords"], args["page"], args["limit"])
|
||||||
|
|
||||||
|
|
||||||
# Register API resources
|
# Register API resources
|
||||||
api.add_resource(AccountInitApi, "/account/init")
|
api.add_resource(AccountInitApi, "/account/init")
|
||||||
api.add_resource(AccountProfileApi, "/account/profile")
|
api.add_resource(AccountProfileApi, "/account/profile")
|
||||||
@@ -361,5 +381,6 @@ api.add_resource(AccountDeleteApi, "/account/delete")
|
|||||||
api.add_resource(AccountDeleteUpdateFeedbackApi, "/account/delete/feedback")
|
api.add_resource(AccountDeleteUpdateFeedbackApi, "/account/delete/feedback")
|
||||||
api.add_resource(EducationVerifyApi, "/account/education/verify")
|
api.add_resource(EducationVerifyApi, "/account/education/verify")
|
||||||
api.add_resource(EducationApi, "/account/education")
|
api.add_resource(EducationApi, "/account/education")
|
||||||
|
api.add_resource(EducationAutoCompleteApi, "/account/education/autocomplete")
|
||||||
# api.add_resource(AccountEmailApi, '/account/email')
|
# api.add_resource(AccountEmailApi, '/account/email')
|
||||||
# api.add_resource(AccountEmailVerifyApi, '/account/email-verify')
|
# api.add_resource(AccountEmailVerifyApi, '/account/email-verify')
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ import os
|
|||||||
from typing import Literal, Optional
|
from typing import Literal, Optional
|
||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
from tenacity import retry, retry_if_exception_type, stop_before_delay, wait_fixed
|
from tenacity import (retry, retry_if_exception_type, stop_before_delay,
|
||||||
|
wait_fixed)
|
||||||
|
|
||||||
from extensions.ext_database import db
|
from extensions.ext_database import db
|
||||||
from libs.helper import RateLimiter
|
from libs.helper import RateLimiter
|
||||||
@@ -115,15 +116,22 @@ class BillingService:
|
|||||||
return BillingService._send_request("GET", "/education/status", params=params)
|
return BillingService._send_request("GET", "/education/status", params=params)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def activate(cls, account: Account, token: str):
|
def activate(cls, account: Account, token: str, institution: str):
|
||||||
if cls.activation_rate_limit.is_rate_limited(account.email):
|
if cls.activation_rate_limit.is_rate_limited(account.email):
|
||||||
from controllers.console.error import EducationActivateLimitError
|
from controllers.console.error import \
|
||||||
|
EducationActivateLimitError
|
||||||
|
|
||||||
raise EducationActivateLimitError()
|
raise EducationActivateLimitError()
|
||||||
|
|
||||||
cls.activation_rate_limit.increment_rate_limit(account.email)
|
cls.activation_rate_limit.increment_rate_limit(account.email)
|
||||||
json = {
|
json = {
|
||||||
"account_id": account.id,
|
"account_id": account.id,
|
||||||
|
"institution": institution,
|
||||||
"token": token,
|
"token": token,
|
||||||
}
|
}
|
||||||
return BillingService._send_request("POST", "/education/", json=json)
|
return BillingService._send_request("POST", "/education/", json=json)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def autocomplete(cls, keywords: str, page: int = 0, limit: int = 20):
|
||||||
|
params = {"keywords": keywords, "page": page, "limit": limit}
|
||||||
|
return BillingService._send_request("GET", "/education/autocomplete", params=params)
|
||||||
|
|||||||
Reference in New Issue
Block a user