def test_get_dash_layout_settings(self): # slip in some fake users self.setupUserInfoMocks() # mock out the App Engine Users API self.setupUsersAPIMocks() data1 = AppDashboardData() # First call, not logged in. self.assertEqual(data1.get_dash_layout_settings(), {}) # First user: [email protected], upload=True, cloud_admin=True self.assertEqual( self.flatten_dash_layout(data1.get_dash_layout_settings()), self.user_info1_cloud_admin_dict) # Second user: [email protected], upload=True, cloud_admin=False self.assertEqual( self.flatten_dash_layout(data1.get_dash_layout_settings()), self.user_info2_can_upload_apps_dict) # Third user: [email protected], upload=False, cloud_admin=False self.assertEqual( self.flatten_dash_layout(data1.get_dash_layout_settings()), self.user_info3_cannot_upload_apps_dict) # Fourth user: [email protected], upload=False, cloud_admin=False self.assertEqual( self.flatten_dash_layout(data1.get_dash_layout_settings()), self.user_info4_cannot_upload_and_owns_no_apps_dict)
def test_get_dash_layout_settings(self): # slip in some fake users self.setupUserInfoMocks() # mock out the App Engine Users API self.setupUsersAPIMocks() data1 = AppDashboardData() # First call, not logged in. self.assertEqual(data1.get_dash_layout_settings(), {}) # First user: [email protected], upload=True, cloud_admin=True self.assertEqual(self.flatten_dash_layout( data1.get_dash_layout_settings()), self.user_info1_cloud_admin_dict) # Second user: [email protected], upload=True, cloud_admin=False self.assertEqual(self.flatten_dash_layout( data1.get_dash_layout_settings()), self.user_info2_can_upload_apps_dict) # Third user: [email protected], upload=False, cloud_admin=False self.assertEqual(self.flatten_dash_layout( data1.get_dash_layout_settings()), self.user_info3_cannot_upload_apps_dict) # Fourth user: [email protected], upload=False, cloud_admin=False self.assertEqual(self.flatten_dash_layout( data1.get_dash_layout_settings()), self.user_info4_cannot_upload_and_owns_no_apps_dict)
class AppDashboard(webapp2.RequestHandler): """ Class that all pages in the Dashboard must inherit from. """ # Regular expression to capture the continue url. CONTINUE_URL_REGEX = 'continue=(.*)$' # The dashboard's project ID. PROJECT_ID = 'appscaledashboard' # Regular expression for updating user permissions. USER_PERMISSION_REGEX = '^user_permission_' # Regular expression that matches email addresses. USER_EMAIL_REGEX = '^\w[^@\s]*@[^@\s]{2,}$' # The frequency, in seconds, that defines how often Task Queue tasks are fired # to update the Dashboard's Datastore cache. REFRESH_WAIT_TIME = 10 def __init__(self, request, response): """ Constructor. Args: request: The webapp2.Request object that contains information about the current web request. response: The webapp2.Response object that contains the response to be sent back to the browser. """ self.initialize(request, response) self.helper = AppDashboardHelper() self.dstore = AppDashboardData(self.helper) def render_template(self, template_file, values=None): """ Renders a template file with all variables loaded. Args: template_file: A str with the relative path to template file. values: A dict with key/value pairs used as variables in the jinja template files. Returns: A str with the rendered template. """ if values is None: values = {} is_cloud_admin = self.helper.is_user_cloud_admin() all_versions = self.helper.get_version_info() if is_cloud_admin: apps_user_owns = list({version.split('_')[0] for version in all_versions}) else: apps_user_owns = self.helper.get_owned_apps() versions_user_is_admin_on = { version: all_versions[version] for version in all_versions if version.split('_')[0] in apps_user_owns} self.helper.update_cookie_app_list(apps_user_owns, self.request, self.response) template = jinja_environment.get_template(template_file) sub_vars = { 'logged_in': self.helper.is_user_logged_in(), 'user_email': self.helper.get_user_email(), 'is_user_cloud_admin': self.dstore.is_user_cloud_admin(), 'can_upload_apps': self.dstore.can_upload_apps(), 'versions_user_is_admin_on': versions_user_is_admin_on, 'user_layout_pref': self.dstore.get_dash_layout_settings(), 'flower_url': self.dstore.get_flower_url(), 'monit_url': self.dstore.get_monit_url() } for key in values.keys(): sub_vars[key] = values[key] return template.render(sub_vars) def get_shared_navigation(self, page): """ Renders the shared navigation. Args: page: A string specifying the page ID. Returns: A str with the navigation bar rendered. """ show_create_account = True if AppDashboardHelper.USE_SHIBBOLETH: show_create_account = False # These sections do not lend themselves well to having panels. panel_blacklist = ['monit', 'taskqueue', 'datastore_viewer'] return self.render_template(template_file='shared/navigation.html', values={'show_create_account': show_create_account, 'page_name': page, 'panel_blacklist': panel_blacklist}) def render_page(self, page, template_file, values=None): """ Renders a template with the main layout and nav bar. Args: page: A string specifying the page ID. template_file: A string specifying the template to use. values: A dictionary containing template variables. """ if values is None: values = {} self.response.headers['Content-Type'] = 'text/html' template = jinja_environment.get_template('layouts/main.html') self.response.out.write(template.render( page_name=page, page_body=self.render_template(template_file, values), shared_navigation=self.get_shared_navigation(page) )) def render_app_page(self, page, values=None): """ Render a typical page using the app_page template. Args: page: A string specifying the page ID. values: A dictionary containing template variables. """ self.render_page(page=page, template_file="layouts/app_page.html", values=values)
class AppDashboard(webapp2.RequestHandler): """ Class that all pages in the Dashboard must inherit from. """ # Regular expression to capture the continue url. CONTINUE_URL_REGEX = 'continue=(.*)$' # Regular expression for updating user permissions. USER_PERMISSION_REGEX = '^user_permission_' # Regular expression that matches email addresses. USER_EMAIL_REGEX = '^\w[^@\s]*@[^@\s]{2,}$' # The frequency, in seconds, that defines how often Task Queue tasks are fired # to update the Dashboard's Datastore cache. REFRESH_WAIT_TIME = 10 def __init__(self, request, response): """ Constructor. Args: request: The webapp2.Request object that contains information about the current web request. response: The webapp2.Response object that contains the response to be sent back to the browser. """ self.initialize(request, response) self.helper = AppDashboardHelper() self.dstore = AppDashboardData(self.helper) def render_template(self, template_file, values=None): """ Renders a template file with all variables loaded. Args: template_file: A str with the relative path to template file. values: A dict with key/value pairs used as variables in the jinja template files. Returns: A str with the rendered template. """ if values is None: values = {} is_cloud_admin = self.helper.is_user_cloud_admin() apps_user_is_admin_on = self.helper.get_application_info() if not is_cloud_admin: apps_user_owns = self.helper.get_owned_apps() new_app_dict = {} for app_name in apps_user_owns: if app_name in apps_user_is_admin_on: new_app_dict[app_name] = apps_user_is_admin_on.get(app_name) apps_user_is_admin_on = new_app_dict self.helper.update_cookie_app_list(apps_user_is_admin_on.keys(), self.request, self.response) template = jinja_environment.get_template(template_file) sub_vars = { 'logged_in': self.helper.is_user_logged_in(), 'user_email': self.helper.get_user_email(), 'is_user_cloud_admin': self.dstore.is_user_cloud_admin(), 'can_upload_apps': self.dstore.can_upload_apps(), 'apps_user_is_admin_on': apps_user_is_admin_on, 'user_layout_pref': self.dstore.get_dash_layout_settings(), 'flower_url': self.dstore.get_flower_url(), 'monit_url': self.dstore.get_monit_url() } for key in values.keys(): sub_vars[key] = values[key] return template.render(sub_vars) def get_shared_navigation(self, page): """ Renders the shared navigation. Returns: A str with the navigation bar rendered. """ show_create_account = True if AppDashboardHelper.USE_SHIBBOLETH: show_create_account = False return self.render_template(template_file='shared/navigation.html', values={'show_create_account': show_create_account, 'page_name': page}) def render_page(self, page, template_file, values=None): """ Renders a template with the main layout and nav bar. """ if values is None: values = {} self.response.headers['Content-Type'] = 'text/html' template = jinja_environment.get_template('layouts/main.html') self.response.out.write(template.render( page_name=page, page_body=self.render_template(template_file, values), shared_navigation=self.get_shared_navigation(page) )) def render_app_page(self, page, values=None): self.render_page(page=page, template_file="layouts/app_page.html", values=values)