diff --git a/superset/assets/spec/javascripts/components/Menu_spec.jsx b/superset/assets/spec/javascripts/components/Menu_spec.jsx index ce7e912370d..29d6e3a5cf0 100644 --- a/superset/assets/spec/javascripts/components/Menu_spec.jsx +++ b/superset/assets/spec/javascripts/components/Menu_spec.jsx @@ -17,7 +17,7 @@ * under the License. */ import React from 'react'; -import { shallow } from 'enzyme'; +import { shallow, mount } from 'enzyme'; import { Nav } from 'react-bootstrap'; import Menu from '../../../src/components/Menu/Menu'; @@ -137,4 +137,26 @@ describe('Menu', () => { expect(loggedOutWrapper.find('i.fa-sign-in')).toHaveLength(1); expect(loggedOutWrapper.find('i.fa-user')).toHaveLength(0); }); + + it('renders version number and SHA', () => { + const overrideProps = { + data: { + ...defaultProps.data, + navbar_right: { + ...defaultProps.data.navbar_right, + version_string: 'A1', + version_sha: 'X', + }, + }, + }; + + const props = { + ...defaultProps, + ...overrideProps, + }; + + const versionedWrapper = mount(); + + expect(versionedWrapper.find('.version-info div')).toHaveLength(2); + }); }); diff --git a/superset/assets/src/components/Menu/Menu.jsx b/superset/assets/src/components/Menu/Menu.jsx index 7375d22594d..a9301da171b 100644 --- a/superset/assets/src/components/Menu/Menu.jsx +++ b/superset/assets/src/components/Menu/Menu.jsx @@ -36,6 +36,8 @@ const propTypes = { }).isRequired, navbar_right: PropTypes.shape({ bug_report_url: PropTypes.string, + version_string: PropTypes.string, + version_sha: PropTypes.string, documentation_url: PropTypes.string, languages: PropTypes.object, show_language_picker: PropTypes.bool.isRequired, @@ -91,6 +93,8 @@ export default function Menu({ )} {navbarRight.user_is_anonymous && ( diff --git a/superset/assets/src/components/Menu/Menu.less b/superset/assets/src/components/Menu/Menu.less index 6a785282e11..2e597fdb004 100644 --- a/superset/assets/src/components/Menu/Menu.less +++ b/superset/assets/src/components/Menu/Menu.less @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ +@import '../../../stylesheets/less/variables.less'; #main-menu { .navbar .caret { @@ -26,4 +27,12 @@ top: -2px; } } + .version-info { + padding: 5px 20px; + color: @gray-heading; + font-size: @font-size-xs; + div { + white-space: nowrap; + } + } } diff --git a/superset/assets/src/components/Menu/UserMenu.jsx b/superset/assets/src/components/Menu/UserMenu.jsx index a9eca15576f..d70c5795e73 100644 --- a/superset/assets/src/components/Menu/UserMenu.jsx +++ b/superset/assets/src/components/Menu/UserMenu.jsx @@ -24,9 +24,16 @@ import { t } from '@superset-ui/translation'; const propTypes = { userInfoUrl: PropTypes.string.isRequired, userLogoutUrl: PropTypes.string.isRequired, + versionString: PropTypes.string, + versionSha: PropTypes.string, }; -export default function UserMenu({ userInfoUrl, userLogoutUrl }) { +export default function UserMenu({ + userInfoUrl, + userLogoutUrl, + versionString, + versionSha, +}) { return ( {t('Logout')} + {(versionString || versionSha) && ( +
  • + {versionString &&
    Version: {versionString}
    } + {versionSha &&
    SHA: {versionSha}
    } +
  • + )}
    ); } diff --git a/superset/config.py b/superset/config.py index cc069a58032..51b5e91bbaf 100644 --- a/superset/config.py +++ b/superset/config.py @@ -55,7 +55,7 @@ else: # --------------------------------------------------------- PACKAGE_DIR = os.path.join(BASE_DIR, "static", "assets") VERSION_INFO_FILE = os.path.join(PACKAGE_DIR, "version_info.json") -PACKAGE_JSON_FILE = os.path.join(BASE_DIR, "assets" "package.json") +PACKAGE_JSON_FILE = os.path.join(BASE_DIR, "assets", "package.json") def _try_json_readversion(filepath): @@ -69,7 +69,7 @@ def _try_json_readversion(filepath): def _try_json_readsha(filepath, length): # pylint: disable=unused-argument try: with open(filepath, "r") as f: - return json.load(f).get("GIT_SHA") + return json.load(f).get("GIT_SHA")[:length] except Exception: # pylint: disable=broad-except return None diff --git a/superset/views/base.py b/superset/views/base.py index 6db5b03577a..54ed0811b18 100644 --- a/superset/views/base.py +++ b/superset/views/base.py @@ -208,6 +208,8 @@ def menu_data(): "navbar_right": { "bug_report_url": appbuilder.app.config.get("BUG_REPORT_URL"), "documentation_url": appbuilder.app.config.get("DOCUMENTATION_URL"), + "version_string": appbuilder.app.config.get("VERSION_STRING"), + "version_sha": appbuilder.app.config.get("VERSION_SHA"), "languages": languages, "show_language_picker": len(languages.keys()) > 1, "user_is_anonymous": g.user.is_anonymous,