Source code for tvb.interfaces.web.controllers.common
# -*- coding: utf-8 -*-
#
#
# TheVirtualBrain-Framework Package. This package holds all Data Management, and
# Web-UI helpful to run brain-simulations. To use it, you also need to download
# TheVirtualBrain-Scientific Package (for simulators). See content of the
# documentation-folder for more details. See also http://www.thevirtualbrain.org
#
# (c) 2012-2023, Baycrest Centre for Geriatric Care ("Baycrest") and others
#
# This program is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with this
# program. If not, see <http://www.gnu.org/licenses/>.
#
#
# CITATION:
# When using The Virtual Brain for scientific publications, please cite it as explained here:
# https://www.thevirtualbrain.org/tvb/zwei/neuroscience-publications
#
#
"""
Constants and functions used by all controllers
Custom exceptions
.. moduleauthor:: Mihai Andrei <mihai.andrei@codemart.ro>
"""
from copy import copy
import cherrypy
from tvb.basic.exceptions import TVBException
# These are global constants, used for session attributes and template variables.
# Message, Current Project and User values are stored in session, because they
# need to be translated between multiple pages.
# The rest of the values are stored in the template dictionary.
TYPE_ERROR = "ERROR"
TYPE_WARNING = "WARNING"
TYPE_INFO = "INFO"
TYPE_IMPORTANT = "IMPORTANT"
KEY_KEYCLOAK_WEB = "keycloakConfigWebFile"
KEY_CURRENT_VERSION = "currentVersion"
KEY_CURRENT_JS_VERSION = "currentVersionJS"
KEY_DEPLOY_CONTEXT = "deploy_context"
KEY_SESSION = "session"
KEY_SESSION_TREE = "treeSessionKey"
KEY_USER = "user"
KEY_SHOW_ONLINE_HELP = "showOnlineHelp"
KEY_MESSAGE = "message"
KEY_MESSAGE_TYPE = "messageType"
KEY_PROJECT = "selectedProject"
KEY_ERRORS = "errors"
KEY_FORM_DATA = "data"
KEY_PARAMETERS_CONFIG = "param_checkbox_config"
KEY_FIRST_RUN = "first_run"
KEY_LINK_ANALYZE = "analyzeCategoryLink"
KEY_LINK_CONNECTIVITY_TAB = "connectivityTabLink"
KEY_TITLE = "title"
KEY_ADAPTER = "currentAlgoId"
KEY_SECTION = "section_name"
KEY_SUB_SECTION = 'subsection_name'
KEY_INCLUDE_RESOURCES = 'includedResources'
KEY_SUBMENU_LIST = 'submenu_list'
KEY_SUBMIT_LINK = 'submitLink'
KEY_DISPLAY_MENU = "displayControl"
KEY_PARENT_DIV = "parent_div"
# User section and settings section specific
KEY_IS_RESTART = "tvbRestarted"
KEY_INCLUDE_TOOLTIP = "includeTooltip"
KEY_WRAP_CONTENT_IN_MAIN_DIV = "wrapContentInMainDiv"
KEY_CURRENT_TAB = "currentTab"
KEY_BACK_PAGE = "back_page_link"
KEY_SECTION_TITLES = "section_titles"
KEY_SUBSECTION_TITLES = "sub_section_titles"
# Overlay specific keys
KEY_OVERLAY_TITLE = "overlay_title"
KEY_OVERLAY_DESCRIPTION = "overlay_description"
KEY_OVERLAY_CLASS = "overlay_class"
KEY_OVERLAY_CONTENT_TEMPLATE = "overlay_content_template"
KEY_OVERLAY_TABS_HORIZONTAL = "overlay_tabs_horizontal"
KEY_OVERLAY_TABS_VERTICAL = "overlay_tabs_vertical"
KEY_OVERLAY_INDEXES = "overlay_indexes"
KEY_OVERLAY_PAGINATION = "show_overlay_pagination"
KEY_OVERLAY_PREVIOUS = "action_overlay_previous"
KEY_OVERLAY_NEXT = "action_overlay_next"
[docs]def set_message(msg, m_type=TYPE_INFO):
""" Set in session a message of a given type"""
cherrypy.session.acquire_lock()
cherrypy.session[KEY_MESSAGE] = msg
cherrypy.session[KEY_MESSAGE_TYPE] = m_type
cherrypy.session.release_lock()
[docs]def pop_message_from_session():
"""
Pops the message stored in the session and it's type
If no message is present returns an empty info message
:returns: a message dict
"""
m_type = remove_from_session(KEY_MESSAGE_TYPE)
msg = remove_from_session(KEY_MESSAGE)
if m_type is None:
m_type = TYPE_INFO
if msg is None:
msg = ""
return {KEY_MESSAGE: msg, KEY_MESSAGE_TYPE: m_type}
[docs]def get_message_from_session():
m_type = get_from_session(KEY_MESSAGE_TYPE)
msg = get_from_session(KEY_MESSAGE)
return msg, m_type
[docs]def set_error_message(msg):
""" Set error message in session"""
set_message(msg, TYPE_ERROR)
[docs]def set_warning_message(msg):
""" Set warning message in session"""
set_message(msg, TYPE_WARNING)
[docs]def set_info_message(msg):
""" Set info message in session"""
set_message(msg, TYPE_INFO)
[docs]def set_important_message(msg):
""" Set info message in session"""
set_message(msg, TYPE_IMPORTANT)
[docs]def get_from_session(attribute):
""" check if something exists in session and return"""
return cherrypy.session.get(attribute)
[docs]def has_error_message():
""" check if the session contains an error message """
msg, msg_type = get_message_from_session()
return msg_type == TYPE_ERROR
[docs]def remove_from_session(key):
""" Remove from session an attributes if exists."""
cherrypy.session.acquire_lock()
if key in cherrypy.session:
result = copy(cherrypy.session[key])
del cherrypy.session[key]
cherrypy.session.release_lock()
return result
cherrypy.session.release_lock()
return None
[docs]def expire_session():
"""
Expires and cleans current session.
"""
# remove all session items
cherrypy.session.acquire_lock()
cherrypy.session.clear()
# clear any caches held by cherrypy
cherrypy.session.clean_up()
# expire client side cookie
cherrypy.lib.sessions.expire()
cherrypy.session.release_lock()
[docs]def add2session(key, value):
""" Set in session, at a key, a value"""
cherrypy.session.acquire_lock()
cherrypy.session[key] = value
cherrypy.session.release_lock()
[docs]def get_logged_user():
"""Get current logged User from session"""
return get_from_session(KEY_USER)
[docs]def get_current_project():
"""Get current Project from session"""
return get_from_session(KEY_PROJECT)
[docs]def remove_project_from_session():
remove_from_session(KEY_PROJECT)
[docs]class NotAllowed(TVBException):
"""
Raised when accessing a resource is not allowed
"""
def __init__(self, message, redirect_url):
TVBException.__init__(self, message)
self.redirect_url = redirect_url
self.status = 403
[docs]class NotAuthenticated(NotAllowed):
"""
Raised when accessing a protected method with no user logged in
"""
def __init__(self, message, redirect_url):
NotAllowed.__init__(self, message, redirect_url)
self.status = 401
[docs]class MissingDataException(TVBException):
def __init__(self, message):
TVBException.__init__(self, message)