| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | import json | 
					
						
							|  |  |  | import logging | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import requests | 
					
						
							| 
									
										
										
										
											2024-01-12 12:34:01 +08:00
										 |  |  | from flask_restful import Resource, reqparse | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-21 02:11:40 +09:00
										 |  |  | from configs import dify_config | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | from . import api | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class VersionApi(Resource): | 
					
						
							|  |  |  |     def get(self): | 
					
						
							|  |  |  |         parser = reqparse.RequestParser() | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |         parser.add_argument("current_version", type=str, required=True, location="args") | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         args = parser.parse_args() | 
					
						
							| 
									
										
										
										
											2024-07-21 02:11:40 +09:00
										 |  |  |         check_update_url = dify_config.CHECK_UPDATE_URL | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  |         result = { | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |             "version": dify_config.CURRENT_VERSION, | 
					
						
							|  |  |  |             "release_date": "", | 
					
						
							|  |  |  |             "release_notes": "", | 
					
						
							|  |  |  |             "can_auto_update": False, | 
					
						
							|  |  |  |             "features": { | 
					
						
							|  |  |  |                 "can_replace_logo": dify_config.CAN_REPLACE_LOGO, | 
					
						
							|  |  |  |                 "model_load_balancing_enabled": dify_config.MODEL_LB_ENABLED, | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not check_update_url: | 
					
						
							|  |  |  |             return result | 
					
						
							| 
									
										
										
										
											2023-05-23 17:34:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |             response = requests.get(check_update_url, {"current_version": args.get("current_version")}) | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         except Exception as error: | 
					
						
							| 
									
										
										
										
											2023-06-25 16:49:14 +08:00
										 |  |  |             logging.warning("Check update version error: {}.".format(str(error))) | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |             result["version"] = args.get("current_version") | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  |             return result | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         content = json.loads(response.content) | 
					
						
							| 
									
										
										
										
											2024-09-30 11:12:26 +08:00
										 |  |  |         if _has_new_version(latest_version=content["version"], current_version=f"{args.get('current_version')}"): | 
					
						
							|  |  |  |             result["version"] = content["version"] | 
					
						
							|  |  |  |             result["release_date"] = content["releaseDate"] | 
					
						
							|  |  |  |             result["release_notes"] = content["releaseNotes"] | 
					
						
							|  |  |  |             result["can_auto_update"] = content["canAutoUpdate"] | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  |         return result | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-30 11:12:26 +08:00
										 |  |  | def _has_new_version(*, latest_version: str, current_version: str) -> bool: | 
					
						
							|  |  |  |     def parse_version(version: str) -> tuple: | 
					
						
							|  |  |  |         # Split version into parts and pre-release suffix if any | 
					
						
							|  |  |  |         parts = version.split("-") | 
					
						
							|  |  |  |         version_parts = parts[0].split(".") | 
					
						
							|  |  |  |         pre_release = parts[1] if len(parts) > 1 else None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Validate version format | 
					
						
							|  |  |  |         if len(version_parts) != 3: | 
					
						
							|  |  |  |             raise ValueError(f"Invalid version format: {version}") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             # Convert version parts to integers | 
					
						
							|  |  |  |             major, minor, patch = map(int, version_parts) | 
					
						
							|  |  |  |             return (major, minor, patch, pre_release) | 
					
						
							|  |  |  |         except ValueError: | 
					
						
							|  |  |  |             raise ValueError(f"Invalid version format: {version}") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     latest = parse_version(latest_version) | 
					
						
							|  |  |  |     current = parse_version(current_version) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Compare major, minor, and patch versions | 
					
						
							|  |  |  |     for latest_part, current_part in zip(latest[:3], current[:3]): | 
					
						
							|  |  |  |         if latest_part > current_part: | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  |         elif latest_part < current_part: | 
					
						
							|  |  |  |             return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # If versions are equal, check pre-release suffixes | 
					
						
							|  |  |  |     if latest[3] is None and current[3] is not None: | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     elif latest[3] is not None and current[3] is None: | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     elif latest[3] is not None and current[3] is not None: | 
					
						
							|  |  |  |         # Simple string comparison for pre-release versions | 
					
						
							|  |  |  |         return latest[3] > current[3] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  | api.add_resource(VersionApi, "/version") |