diff --git a/core/api_urls.py b/core/api_urls.py index 724a3311..e30eb698 100644 --- a/core/api_urls.py +++ b/core/api_urls.py @@ -2,14 +2,15 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from .api_views import UserAgentViewSet, StreamProfileViewSet, CoreSettingsViewSet, environment +from .api_views import UserAgentViewSet, StreamProfileViewSet, CoreSettingsViewSet, environment, version router = DefaultRouter() router.register(r'useragents', UserAgentViewSet, basename='useragent') router.register(r'streamprofiles', StreamProfileViewSet, basename='streamprofile') router.register(r'settings', CoreSettingsViewSet, basename='coresettings') - +router.register(r'settings', CoreSettingsViewSet, basename='settings') urlpatterns = [ path('settings/env/', environment, name='token_refresh'), + path('version/', version, name='version'), path('', include(router.urls)), ] diff --git a/core/api_views.py b/core/api_views.py index a2cbab94..1baa3793 100644 --- a/core/api_views.py +++ b/core/api_views.py @@ -42,8 +42,7 @@ class CoreSettingsViewSet(viewsets.ModelViewSet): @api_view(['GET']) @permission_classes([IsAuthenticated]) def environment(request): - # Import version information - from version import __version__, __build__ + public_ip = None local_ip = None @@ -86,6 +85,18 @@ def environment(request): 'country_code': country_code, 'country_name': country_name, 'env_mode': "dev" if os.getenv('DISPATCHARR_ENV') == "dev" else "prod", + }) + +@swagger_auto_schema( + method='get', + operation_description="Get application version information", + responses={200: "Version information"} +) +@api_view(['GET']) +def version(request): + # Import version information + from version import __version__, __build__ + return Response({ 'version': __version__, 'build': __build__, - }) + }) \ No newline at end of file diff --git a/frontend/src/api.js b/frontend/src/api.js index b1db3f42..5890d731 100644 --- a/frontend/src/api.js +++ b/frontend/src/api.js @@ -899,6 +899,17 @@ export default class API { return retval; } + static async getVersion() { + const response = await fetch(`${host}/api/core/version/`, { + headers: { + 'Content-Type': 'application/json', + }, + }); + + const retval = await response.json(); + return retval; + } + static async updateSetting(values) { const { id, ...payload } = values; const response = await fetch(`${host}/api/core/settings/${id}/`, { diff --git a/frontend/src/components/Sidebar.jsx b/frontend/src/components/Sidebar.jsx index dbf3cbcb..a1ca5601 100644 --- a/frontend/src/components/Sidebar.jsx +++ b/frontend/src/components/Sidebar.jsx @@ -74,10 +74,6 @@ const Sidebar = ({ collapsed, toggleDrawer, drawerWidth, miniDrawerWidth }) => { const fetchEnvironment = async () => { try { const envData = await API.getEnvironmentSettings(); - setAppVersion({ - version: envData.version || '', - build: envData.build || '' - }); } catch (error) { console.error('Failed to fetch environment settings:', error); } @@ -85,7 +81,23 @@ const Sidebar = ({ collapsed, toggleDrawer, drawerWidth, miniDrawerWidth }) => { fetchEnvironment(); }, []); + // Fetch version information on component mount (regardless of authentication) + useEffect(() => { + const fetchVersion = async () => { + try { + const versionData = await API.getVersion(); + setAppVersion({ + version: versionData.version || '', + build: versionData.build || '' + }); + } catch (error) { + console.error('Failed to fetch version information:', error); + // Keep using default values from useState initialization + } + }; + fetchVersion(); + }, []); // Navigation Items const navItems = [ {