Skip to content

Commit 19008dc

Browse files
refactor: api/controllers/console/version.py to v3 (langgenius#31463)
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
1 parent 92011d0 commit 19008dc

File tree

2 files changed

+85
-62
lines changed

2 files changed

+85
-62
lines changed

api/controllers/console/version.py

Lines changed: 50 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1-
import json
21
import logging
32

43
import httpx
5-
from flask import request
6-
from flask_restx import Resource, fields
74
from packaging import version
85
from pydantic import BaseModel, Field
96

107
from configs import dify_config
11-
12-
from . import console_ns
8+
from controllers.fastopenapi import console_router
139

1410
logger = logging.getLogger(__name__)
1511

@@ -18,68 +14,60 @@ class VersionQuery(BaseModel):
1814
current_version: str = Field(..., description="Current application version")
1915

2016

21-
console_ns.schema_model(
22-
VersionQuery.__name__,
23-
VersionQuery.model_json_schema(ref_template="#/definitions/{model}"),
24-
)
17+
class VersionFeatures(BaseModel):
18+
can_replace_logo: bool = Field(description="Whether logo replacement is supported")
19+
model_load_balancing_enabled: bool = Field(description="Whether model load balancing is enabled")
20+
2521

22+
class VersionResponse(BaseModel):
23+
version: str = Field(description="Latest version number")
24+
release_date: str = Field(description="Release date of latest version")
25+
release_notes: str = Field(description="Release notes for latest version")
26+
can_auto_update: bool = Field(description="Whether auto-update is supported")
27+
features: VersionFeatures = Field(description="Feature flags and capabilities")
2628

27-
@console_ns.route("/version")
28-
class VersionApi(Resource):
29-
@console_ns.doc("check_version_update")
30-
@console_ns.doc(description="Check for application version updates")
31-
@console_ns.expect(console_ns.models[VersionQuery.__name__])
32-
@console_ns.response(
33-
200,
34-
"Success",
35-
console_ns.model(
36-
"VersionResponse",
37-
{
38-
"version": fields.String(description="Latest version number"),
39-
"release_date": fields.String(description="Release date of latest version"),
40-
"release_notes": fields.String(description="Release notes for latest version"),
41-
"can_auto_update": fields.Boolean(description="Whether auto-update is supported"),
42-
"features": fields.Raw(description="Feature flags and capabilities"),
43-
},
29+
30+
@console_router.get(
31+
"/version",
32+
response_model=VersionResponse,
33+
tags=["console"],
34+
)
35+
def check_version_update(query: VersionQuery) -> VersionResponse:
36+
"""Check for application version updates."""
37+
check_update_url = dify_config.CHECK_UPDATE_URL
38+
39+
result = VersionResponse(
40+
version=dify_config.project.version,
41+
release_date="",
42+
release_notes="",
43+
can_auto_update=False,
44+
features=VersionFeatures(
45+
can_replace_logo=dify_config.CAN_REPLACE_LOGO,
46+
model_load_balancing_enabled=dify_config.MODEL_LB_ENABLED,
4447
),
4548
)
46-
def get(self):
47-
"""Check for application version updates"""
48-
args = VersionQuery.model_validate(request.args.to_dict(flat=True)) # type: ignore
49-
check_update_url = dify_config.CHECK_UPDATE_URL
50-
51-
result = {
52-
"version": dify_config.project.version,
53-
"release_date": "",
54-
"release_notes": "",
55-
"can_auto_update": False,
56-
"features": {
57-
"can_replace_logo": dify_config.CAN_REPLACE_LOGO,
58-
"model_load_balancing_enabled": dify_config.MODEL_LB_ENABLED,
59-
},
60-
}
61-
62-
if not check_update_url:
63-
return result
64-
65-
try:
66-
response = httpx.get(
67-
check_update_url,
68-
params={"current_version": args.current_version},
69-
timeout=httpx.Timeout(timeout=10.0, connect=3.0),
70-
)
71-
except Exception as error:
72-
logger.warning("Check update version error: %s.", str(error))
73-
result["version"] = args.current_version
74-
return result
75-
76-
content = json.loads(response.content)
77-
if _has_new_version(latest_version=content["version"], current_version=f"{args.current_version}"):
78-
result["version"] = content["version"]
79-
result["release_date"] = content["releaseDate"]
80-
result["release_notes"] = content["releaseNotes"]
81-
result["can_auto_update"] = content["canAutoUpdate"]
49+
50+
if not check_update_url:
51+
return result
52+
53+
try:
54+
response = httpx.get(
55+
check_update_url,
56+
params={"current_version": query.current_version},
57+
timeout=httpx.Timeout(timeout=10.0, connect=3.0),
58+
)
59+
content = response.json()
60+
except Exception as error:
61+
logger.warning("Check update version error: %s.", str(error))
62+
result.version = query.current_version
8263
return result
64+
latest_version = content.get("version", result.version)
65+
if _has_new_version(latest_version=latest_version, current_version=f"{query.current_version}"):
66+
result.version = latest_version
67+
result.release_date = content.get("releaseDate", "")
68+
result.release_notes = content.get("releaseNotes", "")
69+
result.can_auto_update = content.get("canAutoUpdate", False)
70+
return result
8371

8472

8573
def _has_new_version(*, latest_version: str, current_version: str) -> bool:
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import builtins
2+
from unittest.mock import patch
3+
4+
import pytest
5+
from flask import Flask
6+
from flask.views import MethodView
7+
8+
from configs import dify_config
9+
from extensions import ext_fastopenapi
10+
11+
if not hasattr(builtins, "MethodView"):
12+
builtins.MethodView = MethodView # type: ignore[attr-defined]
13+
14+
15+
@pytest.fixture
16+
def app() -> Flask:
17+
app = Flask(__name__)
18+
app.config["TESTING"] = True
19+
return app
20+
21+
22+
def test_console_version_fastopenapi_returns_current_version(app: Flask):
23+
ext_fastopenapi.init_app(app)
24+
25+
with patch("controllers.console.version.dify_config.CHECK_UPDATE_URL", None):
26+
client = app.test_client()
27+
response = client.get("/console/api/version", query_string={"current_version": "0.0.0"})
28+
29+
assert response.status_code == 200
30+
data = response.get_json()
31+
assert data["version"] == dify_config.project.version
32+
assert data["release_date"] == ""
33+
assert data["release_notes"] == ""
34+
assert data["can_auto_update"] is False
35+
assert "features" in data

0 commit comments

Comments
 (0)