from widgetastic.exceptions import NoSuchElementException
from widgetastic.widget import View
from widgetastic_manageiq import SettingsNavDropdown
from widgetastic_patternfly import NavDropdown, VerticalNavigation, FlashMessages
from cfme.exceptions import CFMEException
[docs]class BaseLoggedInPage(View):
"""This page should be subclassed by any page that models any other page that is available as
logged in.
"""
CSRF_TOKEN = '//meta[@name="csrf-token"]'
flash = FlashMessages(
'.//div[@id="flash_msg_div"]/div[@id="flash_text_div" or '
'contains(@class, "flash_text_div")] | '
'.//div[starts-with(@class, "flash_text_div") or @id="flash_text_div"]'
)
help = NavDropdown('.//li[./a[@id="dropdownMenu1"]]|.//li[./a[@id="help-menu"]]')
settings = SettingsNavDropdown('.//li[./a[@id="dropdownMenu2"]]')
navigation = VerticalNavigation('#maintab')
@property
def is_displayed(self):
return self.logged_in_as_current_user
[docs] def logged_in_as_user(self, user):
if self.logged_out:
return False
return user.name == self.current_fullname
[docs] def change_group(self, group_name):
""" From the settings menu change to the group specified by 'group_name'
Only available in versions >= 5.9
User is required to be currently logged in
"""
if self.extra.appliance.version < '5.9':
raise CFMEException("Changing the user group is not supported in versions < 5.9")
if not self.logged_in_as_user:
raise CFMEException("Unable to change group when a user is not logged in")
if group_name not in self.group_names:
raise CFMEException("{} is not an assigned group for {}".format(
group_name, self.current_username))
self.settings.groups.select_item(group_name)
return True
@property
def logged_in_as_current_user(self):
return self.logged_in_as_user(self.extra.appliance.user)
@property
def current_username(self):
try:
return self.extra.appliance.user.principal
except AttributeError:
return None
@property
def current_fullname(self):
try:
# When the view isn't displayed self.settings.text is None, resulting in AttributeError
return self.settings.text.strip().split('|', 1)[0].strip()
except AttributeError:
return None
@property
def current_groupname(self):
current_groups = self.settings.groups.items
# User is only assigned to one group
if len(current_groups) == 1:
return current_groups[0]
for group in current_groups:
if self.settings.groups.SELECTED_GROUP_MARKER in group:
return group.replace(self.settings.groups.SELECTED_GROUP_MARKER, '')
else:
# Handle some weird case where we don't detect a current group
raise CFMEException("User is not currently assigned to a group")
@property
def group_names(self):
""" Return a list of the logged in user's assigned groups.
Returns:
Version >= 5.9 - list containing all groups the logged in user is assigned to
Version < 5.9 - single item list containing the user's current group
"""
return [
group.replace(self.settings.groups.SELECTED_GROUP_MARKER, '')
for group in self.settings.groups.items]
@property
def logged_in(self):
return self.settings.is_displayed
@property
def logged_out(self):
return not self.logged_in
[docs] def logout(self):
self.settings.select_item('Logout')
self.browser.handle_alert(wait=None)
self.extra.appliance.user = None
@property
def csrf_token(self):
return self.browser.get_attribute('content', self.CSRF_TOKEN)
@csrf_token.setter
def csrf_token(self, value):
self.browser.set_attribute('content', value, self.CSRF_TOKEN)
@property
def unexpected_error(self):
if not self.browser.elements('//h1[contains(., "Unexpected error encountered")]'):
return None
try:
err_el = self.browser.element('//h2[contains(., "Error text:")]/following-sibling::h3')
return self.browser.text(err_el)
except NoSuchElementException:
return None