class MyView(View): the_reference = Select(id='ewaopaopsdkgnjdsopjf') the_switchable_view = ConditionalSwitchableView( reference='the_reference', ignore_bad_reference=True) @the_switchable_view.register('foo') class FooView(View): widget = Text('//h3[@id="switchabletesting-1"]') @the_switchable_view.register('bar', default=True) class BarView(View): widget = Text('//h3[@id="switchabletesting-2"]')
class MyView(View): the_reference = 'bar' the_switchable_view = ConditionalSwitchableView( reference='the_reference') @the_switchable_view.register('foo') class FooView(View): widget = Text('//h3[@id="switchabletesting-1"]') @the_switchable_view.register('bar') class BarView(View): widget = Text('//h3[@id="switchabletesting-2"]')
class DockerRepository(View): registry_url = EditableEntry(name='Registry URL') upstream_repo_name = EditableEntry(name='Upstream Repository') repo_name = ReadOnlyEntry(name='Name') verify_ssl = EditableEntryCheckbox(name='Verify SSL') upstream_authorization = AuthorizationEntry( name='Upstream Authorization') publish_via_http = EditableEntryCheckbox(name='Publish via HTTP') http_proxy_policy = EditableEntrySelect(name='HTTP Proxy') proxy_policy = ConditionalSwitchableView(reference='http_proxy_policy') @proxy_policy.register(True, default=True) class NoSpecificHttpProxy(View): pass
class MyView(View): the_reference = Select(id='switchabletesting-select') the_switchable_view = ConditionalSwitchableView() @the_switchable_view.register( lambda the_reference: the_reference == 'foo') class FooView(View): widget = Text('//h3[@id="switchabletesting-1"]') @the_switchable_view.register( lambda the_reference: the_reference == 'bar') class BarView(View): widget = Text('//h3[@id="switchabletesting-2"]')
class HostInfraUtilizationView(View): """View for Infrastructure provider Host Utilization""" title = Text(".//div[@id='main-content']//h1") options = View.nested(OptionForm) interval_type = ConditionalSwitchableView(reference='options.interval') @interval_type.register('Daily', default=True) class HostInfraDailyUtilizationView(View): """A view for Daily Interval Host Utilization""" host_cpu = LineChart(id='miq_chart_parent_candu_0') host_cpu_vm_avg = LineChart(id='miq_chart_candu_0_2') host_cpu_state = LineChart(id='miq_chart_parent_candu_1') host_cpu_state_vm_avg = LineChart(id='miq_chart_candu_1_2') host_memory = LineChart(id='miq_chart_parent_candu_2') host_memory_vm_avg = LineChart(id='miq_chart_candu_2_2') host_disk = LineChart(id='miq_chart_parent_candu_3') host_disk_vm_avg = LineChart(id='miq_chart_candu_3_2') host_network = LineChart(id='miq_chart_parent_candu_4') host_network_vm_avg = LineChart(id='miq_chart_candu_4_2') host_vm = LineChart(id='miq_chart_parent_candu_5') @interval_type.register('Hourly') class HostInfraHourlyUtilizationView(View): """A view for Hourly Interval Host Utilization""" host_cpu = LineChart(id='miq_chart_parent_candu_0') host_cpu_vm_avg = LineChart(id='miq_chart_candu_0_2') host_cpu_state = LineChart(id='miq_chart_parent_candu_1') host_cpu_state_vm_avg = LineChart(id='miq_chart_candu_1_2') host_memory = LineChart(id='miq_chart_parent_candu_2') host_memory_vm_avg = LineChart(id='miq_chart_candu_2_2') host_disk = LineChart(id='miq_chart_parent_candu_3') host_disk_vm_avg = LineChart(id='miq_chart_candu_3_2') host_network = LineChart(id='miq_chart_parent_candu_4') host_network_vm_avg = LineChart(id='miq_chart_candu_4_2') host_vm = LineChart(id='miq_chart_parent_candu_5') @interval_type.register('Most Recent Hour') class HostInfraRecentHourUtilizationView(View): """A view for Most Recent Hour Interval Host Utilization""" host_cpu = LineChart(id='miq_chart_parent_candu_0') host_memory = LineChart(id='miq_chart_parent_candu_2') host_disk = LineChart(id='miq_chart_parent_candu_3') host_network = LineChart(id='miq_chart_parent_candu_4') @property def is_displayed(self): expected_title = "{} Capacity & Utilization".format( self.context['object'].name) return self.title.text == expected_title
class CredentialFormView(CredentialsBaseView): name = Input(name="name") credential_form = ConditionalSwitchableView(reference="credential_type") @credential_form.register("<Choose>", default=True) class CredentialFormDefaultView(View): pass @credential_form.register("Machine") class CredentialFormMachineView(View): username = Input(locator='.//input[@title="Username for this credential"]') password = Input(locator='.//input[@title="Password for this credential"][2]') private_key = TextInput( locator='.//textarea[@title="RSA or DSA private key to be used instead of password"][2]' ) private_key_phrase = Input( locator='.//input[@title="Passphrase to unlock SSH private key if encrypted"][2]') privilage_escalation = BootstrapSelect("{{name}}") privilage_escalation_username = Input( locator='.//input[@title="Privilege escalation username"]') privilage_escalation_password = Input( locator='.//input[@title="Password for privilege escalation method"][2]') vault_password = Input(locator='.//input[@title="Vault password"][2]') @credential_form.register("Scm") class CredentialFormScmView(View): username = Input(locator='.//input[@title="Username for this credential"]') password = Input(locator='.//input[@title="Password for this credential"][2]') private_key = TextInput( locator='.//textarea[@title="RSA or DSA private key to be used instead of password"][2]' ) private_key_phrase = Input( locator='.//input[@title="Passphrase to unlock SSH private key if encrypted"][2]') @credential_form.register("Amazon") class CredentialFormAmazonView(View): access_key = Input(locator='.//input[@title="AWS Access Key for this credential"]') secret_key = Input(locator='.//input[@title="AWS Secret Key for this credential"][2]') sts_token = Input( locator='.//input[@title="Security Token Service(STS) Token for this credential"][2]') @credential_form.register("VMware") class CredentialFormVMwareView(View): username = Input(locator='.//input[@title="Username for this credential"]') password = Input(locator='.//input[@title="Password for this credential"][2]') vcenter_host = Input( locator='.//input[@title="The hostname or IP address of the vCenter Host"]') cancel_button = Button("Cancel")
class ProductManageHttpProxy(BaseLoggedInView): """Represents Http Proxy Management page for Products.""" title = Text("//h4[text()='Http Proxy Management']") http_proxy_policy = Select(id="http_proxy_policy") proxy_policy = ConditionalSwitchableView(reference='http_proxy_policy') update = Text('//button[@ng-click="update()"]') @proxy_policy.register('Use specific HTTP Proxy') class ExistingProductForm(View): http_proxy = Select(id="http_proxy") @property def is_displayed(self): return self.browser.wait_for_element(self.title, exception=False) is not None
class schedule(SatTab): period = FilteredDropdown(id='s2id_policy_period') period_selection = ConditionalSwitchableView(reference='period') @period_selection.register('Weekly') class WeeklyPeriodForm(View): weekday = FilteredDropdown(id='s2id_policy_weekday') @period_selection.register('Monthly') class MonthlyPeriodForm(View): day_of_month = FilteredDropdown(id='s2id_policy_day_of_month') @period_selection.register('Custom') class CustomPeriodForm(View): cron_line = TextInput(id='policy_cron_line')
class AnalysisProfileAddView(BaseLoggedInPage): """View for the add form, switches between host/vm based on object type Uses a switchable view based on the profile type widget """ @property def is_displayed(self): return ( self.title.text == 'Adding a new Analysis Profile' and self.profile_type.text == self.context['object'].profile_type) title = Text('//div[@id="main-content"]//h1[@id="explorer_title"]' '/span[@id="explorer_title_text"]') # This is a ALMOST a SummaryFormItem, but there's no div to wrap the items so it doesn't work # instead I have this nasty xpath to hack around that profile_type = Text( locator='.//h3[normalize-space(.)="Basic Information"]' '/following-sibling::div[@class="form-group"]' '/label[normalize-space(.)="Type"]' '/following-sibling::div') form = ConditionalSwitchableView(reference='profile_type') # to avoid dynamic table buttons use title + alt + classes add = Button(title='Add', classes=[Button.PRIMARY], alt='Add') cancel = Button(title='Cancel', classes=[Button.DEFAULT], alt='Cancel') @form.register('Host') class AnalysisProfileAddHost(AnalysisProfileBaseAddForm): """View for the host profile add form""" pass @form.register('Vm') class AnalysisProfileAddVm(AnalysisProfileBaseAddForm): """View for the vm profile add form""" @View.nested class categories(Tab): # noqa TAB_NAME = 'Category' tab_form = CheckboxSelect(search_root='form_div') @View.nested class registry(Tab): # noqa TAB_NAME = 'Registry' tab_form = DynamicTable( locator='.//h3[normalize-space(.)="Registry Entry"]/following-sibling::table', column_widgets={ 'Registry Hive': Text('.//tr[@id="new_tr"]/td[normalize-space(.)="HKLM"]'), 'Registry Key': TextInput(id='entry_kname'), 'Registry Value': TextInput(id='entry_value'), 'Actions': Button(title='Add this entry', classes=table_button_classes)}, assoc_column='Registry Key', rows_ignore_top=1, action_row=0)
class template(SatTab): name = TextInput(id='ptable_name') default = Checkbox(id='ptable_default') snippet = Checkbox(locator="//input[@id='ptable_snippet']") os_family_selection = ConditionalSwitchableView(reference='snippet') @os_family_selection.register(True) class SnippetOption(View): pass @os_family_selection.register(False) class OSFamilyOption(View): os_family = FilteredDropdown(id='s2id_ptable_os_family') template_editor = ACEEditor() audit_comment = TextInput(id='ptable_audit_comment')
class PuppetRepository(View): upstream_url = EditableEntry(name='Upstream URL') verify_ssl = EditableEntryCheckbox(name='Verify SSL') upstream_authorization = AuthorizationEntry(name='Upstream Authorization') mirror_on_sync = EditableEntryCheckbox(name='Mirror on Sync') publish_via_https = ReadOnlyEntry(name='Publish via HTTPS') publish_via_http = EditableEntryCheckbox(name='Publish via HTTP') published_at = ReadOnlyEntry(name='Published At') upload_content = FileInput(name='content[]') upload = Text("//button[contains(., 'Upload')]") http_proxy_policy = EditableEntrySelect(name='HTTP Proxy') proxy_policy = ConditionalSwitchableView(reference='http_proxy_policy') @proxy_policy.register(True, default=True) class NoSpecificHttpProxy(View): pass
class AnsibleCollectionRepository(View): arch_restrict = EditableEntrySelect(name='Restrict to architecture') upstream_url = EditableEntry(name='Upstream URL') requirements = EditableEntry(name='Requirements') verify_ssl = EditableEntryCheckbox(name='Verify SSL') upstream_authorization = AuthorizationEntry(name='Upstream Authorization') mirror_on_sync = EditableEntryCheckbox(name='Mirror on Sync') publish_via_http = EditableEntryCheckbox(name='Publish via HTTP') upload_content = FileInput(name='content[]') upload = Text("//button[contains(., 'Upload')]") http_proxy_policy = EditableEntrySelect(name='HTTP Proxy') proxy_policy = ConditionalSwitchableView(reference='http_proxy_policy') @proxy_policy.register(True, default=True) class NoSpecificHttpProxy(View): pass
class FileRepository(View): upstream_url = TextInput(id='url') verify_ssl = Checkbox(id='verify_ssl_on_sync') upstream_username = TextInput(id='upstream_username') upstream_password = TextInput(id='upstream_password') auth_token = TextInput(id='ansible_collection_auth_token') mirroring_policy = Select(id='mirroring_policy') publish_via_http = Checkbox(id='unprotected') http_proxy_policy = Select(id="http_proxy_policy") proxy_policy = ConditionalSwitchableView(reference='http_proxy_policy') ssl_ca_cert = Select(id='ssl_ca_cert_id') ssl_client_cert = Select(id='ssl_client_cert_id') ssl_client_key = Select(id='ssl_client_key_id') @proxy_policy.register('Use specific HTTP Proxy') class SpecificHttpProxy(View): http_proxy = Select(id="http_proxy")
class AnsibleCollectionRepository(View): arch_restrict = Select(id='architecture_restricted') upstream_url = TextInput(id='url') requirements = TextInput(id='ansible_collection_requirements') requirements_btn = FileInput(id='requirementFile') auth_url = TextInput(id='ansible_collection_auth_url') auth_token = TextInput(id='ansible_collection_auth_token') verify_ssl = Checkbox(id='verify_ssl_on_sync') upstream_username = TextInput(id='upstream_username') upstream_password = TextInput(id='upstream_password') mirror_on_sync = Checkbox(id='mirror_on_sync') http_proxy_policy = Select(id="http_proxy_policy") proxy_policy = ConditionalSwitchableView(reference='http_proxy_policy') @proxy_policy.register('Use specific HTTP Proxy') class SpecificHttpProxy(View): http_proxy = Select(id="http_proxy")
class create_repo(View): """Represent Create Repository page. Depends whether we like create new product or use existing one we use different sets of fields that need to be filled """ product_type = SatSelect( locator="//select[@ng-model='createRepoChoices.newProduct']") product_content = ConditionalSwitchableView(reference='product_type') @product_content.register('Existing Product') class ExistingProductForm(View): product_name = Select( locator= "//select[@ng-model='createRepoChoices.existingProductId']") @product_content.register('New Product') class NewProductForm(View): product_name = TextInput(id='productName') label = TextInput(id='productLabel') gpg_key = Select( locator="//select[contains(@ng-model,'gpg_key_id')]") serve_via_http = Checkbox(id='unprotected') verify_ssl = Checkbox(id='verify_ssl') run_procedure = Text( "//button[contains(., 'Run Repository Creation')]") create_repos_table = Table( locator='//table', column_widgets={ 'Repository Name': TextInput(locator=".//input[@name='repo_name']"), 'Repository Label': TextInput(locator=".//input[@name='repo_label']"), }, ) def wait_repo_created(self): wait_for( lambda: self.create_repos_table.row( create_status__contains='Repository created').is_displayed is True, timeout=300, delay=1, logger=self.logger, )
class ProviderDetailsView(BaseLoggedInPage): """ main Details page """ title = Text('//div[@id="main-content"]//h1') breadcrumb = BreadCrumb(locator='//ol[@class="breadcrumb"]') flash = FlashMessages( './/div[@id="flash_msg_div"]/div[@id="flash_text_div" or ' 'contains(@class, "flash_text_div")]') toolbar = View.nested(ProviderDetailsToolBar) entities = ConditionalSwitchableView(reference='toolbar.view_selector', ignore_bad_reference=True) @entities.register('Summary View', default=True) class ProviderDetailsSummaryView(View): """ represents Details page when it is switched to Summary aka Tables view """ properties = SummaryTable(title="Properties") status = SummaryTable(title="Status") relationships = SummaryTable(title="Relationships") overview = SummaryTable(title="Overview") smart_management = SummaryTable(title="Smart Management") custom_attributes = SummaryTable(title='Custom Attributes') @entities.register('Dashboard View') class ProviderDetailsDashboardView(View): """ represents Details page when it is switched to Dashboard aka Widgets view """ # todo: need to develop this page pass @property def is_displayed(self): if (not self.toolbar.view_selector.is_displayed or self.toolbar.view_selector.selected == 'Summary View'): subtitle = 'Summary' else: subtitle = 'Dashboard' title = '{name} ({subtitle})'.format(name=self.context['object'].name, subtitle=subtitle) return (self.logged_in_as_current_user and self.breadcrumb.is_displayed and self.breadcrumb.active_location == title)
class ProviderDetailsView(BaseLoggedInPage): """ main Details page """ title = Text('//div[@id="main-content"]//h1') breadcrumb = BreadCrumb(locator='//ol[@class="breadcrumb"]') toolbar = View.nested(ProviderDetailsToolBar) entities = ConditionalSwitchableView(reference='toolbar.view_selector', ignore_bad_reference=True) @entities.register('Summary View', default=True) class ProviderDetailsSummaryView(View): """ represents Details page when it is switched to Summary aka Tables view """ summary = ParametrizedSummaryTable() sidebar = View.nested(SummaryAccordionView) @property def is_displayed(self): return self.summary("Properties").is_displayed @entities.register('Dashboard View') class ProviderDetailsDashboardView(View): """ represents Details page when it is switched to Dashboard aka Widgets view """ cards = ParametrizedStatusBox() @property def is_displayed(self): return self.cards("Instances").is_displayed @property def is_displayed(self): subtitle = 'Summary' if self.toolbar.view_selector.is_displayed: subtitle = self.toolbar.view_selector.selected.split(' ')[0] title = '{name} ({subtitle})'.format(name=self.context['object'].name, subtitle=subtitle) return (self.entities.is_displayed and self.logged_in_as_current_user and self.breadcrumb.is_displayed and self.breadcrumb.active_location == title) # BZ 1703744
class PartitionTableEditView(BaseLoggedInView): breadcrumb = BreadCrumb() name = TextInput(locator="//input[@id='ptable_name']") default = Checkbox(id='ptable_default') template = ACEEditor() audit_comment = TextInput(id="ptable_audit_comment") submit = Text('//input[@name="commit"]') snippet = Checkbox(locator="//input[@id='ptable_snippet']") os_family_selection = ConditionalSwitchableView(reference='snippet') @os_family_selection.register(True) class SnippetOption(View): pass @os_family_selection.register(False) class OSFamilyOption(View): os_family = FilteredDropdown(id='s2id_ptable_os_family') @View.nested class locations(SatTab): resources = MultiSelect(id='ms-ptable_location_ids') def fill(self, values): self.resources.fill(values) def read(self): return self.resources.read() @View.nested class organizations(SatTab): resources = MultiSelect(id='ms-ptable_organization_ids') def fill(self, values): self.resources.fill(values) def read(self): return self.resources.read() @property def is_displayed(self): breadcrumb_loaded = self.browser.wait_for_element(self.breadcrumb, exception=False) return (breadcrumb_loaded and self.breadcrumb.locations[0] == 'Ptables' and self.breadcrumb.read().startswith('Edit '))
class template_input(View): ROOT = "//div[contains(@class, 'template_inputs')]" \ "/following-sibling::div[1]" name = TextInput(locator=".//input[contains(@name, '[name]')]") required = Checkbox(locator=".//input[contains(@id, 'required')]") input_type = SatSelect( locator=".//select[contains(@name, '[input_type]')]") input_content = ConditionalSwitchableView(reference='input_type') @input_content.register('User input') class UserInputForm(View): advanced = Checkbox( locator=".//input[contains(@id, 'advanced')]") options = TextInput( locator=".//textarea[contains(@name, '[options]')]") description = TextInput( locator=".//textarea[contains(@name, '[description]')]") @input_content.register('Fact value') class FactValueForm(View): fact_name = TextInput( locator=".//input[contains(@name, '[fact_name]')]") description = TextInput( locator=".//textarea[contains(@name, '[description]')]") @input_content.register('Variable value') class VariableValueForm(View): variable_name = TextInput( locator=".//input[contains(@name, '[variable_name]')]") description = TextInput( locator=".//textarea[contains(@name, '[description]')]") @input_content.register('Puppet parameter') class PuppetParameterForm(View): puppet_class_name = TextInput( locator=".//input[contains(@name, '[puppet_class_name]')]") puppet_parameter_name = TextInput( locator=".//input[contains(" "@name, '[puppet_parameter_name]')]") description = TextInput( locator=".//textarea[contains(@name, '[description]')]") def before_fill(self, values=None): self.parent.add_template_inputs.click()
class operating_system(SatTab): TAB_NAME = 'Operating System' architecture = FilteredDropdown(id='hostgroup_architecture') operating_system = FilteredDropdown(id='hostgroup_operatingsystem') media_type = RadioGroup(locator="//div[label[contains(., 'Media Selection')]]") media_content = ConditionalSwitchableView(reference='media_type') @media_content.register('All Media') class TypeMedium(View): media = FilteredDropdown(id='hostgroup_medium') @media_content.register('Synced Content') class TypeSynced(View): synced_content = FilteredDropdown(id='host_group_kickstart_repository') ptable = FilteredDropdown(id='hostgroup_ptable') root_password = TextInput(id='hostgroup_root_pass')
class schedule(BaseLoggedInView): next_step = Text("//input[contains(@value, 'Next')]") period = FilteredDropdown(id='s2id_policy_period') period_selection = ConditionalSwitchableView(reference='period') @period_selection.register('Weekly') class WeeklyPeriodForm(View): weekday = FilteredDropdown(id='s2id_policy_weekday') @period_selection.register('Monthly') class MonthlyPeriodForm(View): day_of_month = FilteredDropdown(id='s2id_policy_day_of_month') @period_selection.register('Custom') class CustomPeriodForm(View): cron_line = TextInput(id='policy_cron_line') def after_fill(self, was_change): self.next_step.click()
class DockerRepository(View): upstream_url = TextInput(id='url') upstream_repo_name = TextInput(id='docker_upstream_name') verify_ssl = Checkbox(id='verify_ssl_on_sync') upstream_username = TextInput(id='upstream_username') upstream_password = TextInput(id='upstream_password') auth_token = TextInput(id='ansible_collection_auth_token') mirroring_policy = Select(id='mirroring_policy') include_tags = TextInput(id='include_tags') exclude_tags = TextInput(id='exclude_tags') http_proxy_policy = Select(id="http_proxy_policy") proxy_policy = ConditionalSwitchableView(reference='http_proxy_policy') ssl_ca_cert = Select(id='ssl_ca_cert_id') ssl_client_cert = Select(id='ssl_client_cert_id') ssl_client_key = Select(id='ssl_client_key_id') @proxy_policy.register('Use specific HTTP Proxy') class SpecificHttpProxy(View): http_proxy = Select(id="http_proxy")
class TemplateInputItem(GenericRemovableWidgetItem): """Template Input item view""" remove_button = Text(".//a[@class='remove_nested_fields']") name = TextInput(locator=".//input[contains(@name, '[name]')]") required = Checkbox(locator=".//input[contains(@id, 'required')]") input_type = SatSelect( locator=".//select[contains(@name, '[input_type]')]") input_content = ConditionalSwitchableView(reference='input_type') @input_content.register('User input') class UserInputForm(View): advanced = Checkbox( locator=".//input[contains(@id, 'advanced')]") options = TextInput( locator=".//textarea[contains(@name, '[options]')]") description = TextInput( locator=".//textarea[contains(@name, '[description]')]") @input_content.register('Fact value') class FactValueForm(View): fact_name = TextInput( locator=".//input[contains(@name, '[fact_name]')]") description = TextInput( locator=".//textarea[contains(@name, '[description]')]") @input_content.register('Variable') class VariableValueForm(View): variable_name = TextInput( locator=".//input[contains(@name, '[variable_name]')]") description = TextInput( locator=".//textarea[contains(@name, '[description]')]") @input_content.register('Puppet parameter') class PuppetParameterForm(View): puppet_class_name = TextInput( locator=".//input[contains(@name, '[puppet_class_name]')]") puppet_parameter_name = TextInput( locator=".//input[contains(" "@name, '[puppet_parameter_name]')]") description = TextInput( locator=".//textarea[contains(@name, '[description]')]")
class SyncTemplatesView(BaseLoggedInView): breadcrumb = BreadCrumb() title = Text("//h2[contains(., 'Import or Export Templates')]") sync_type = RadioGroup("//div[label[contains(., 'Action type')]]") submit = Text("//button[@type='submit']") template = ConditionalSwitchableView(reference='sync_type') @property def is_displayed(self): breadcrumb_loaded = self.browser.wait_for_element(self.breadcrumb, exception=False) return (breadcrumb_loaded and self.browser.wait_for_element( self.title, exception=False) is not None) def before_fill(self, values): """Wait for Sync Type Radio Button to be displayed""" wait_for(lambda: self.sync_type.is_displayed, timeout=10, delay=1, logger=self.logger) @template.register('Import') class ImportTemplates(View): associate = Select(name='associate') branch = TextInput(name='branch') dirname = TextInput(name='dirname') filter = TextInput(name='filter') force_import = Checkbox(name='force') lock = Checkbox(name='lock') negate = Checkbox(name='negate') prefix = TextInput(name='prefix') repo = TextInput(name='repo') @template.register('Export') class ExportTemplates(View): branch = TextInput(name='branch') dirname = TextInput(name='dirname') filter = TextInput(name='filter') metadata_export_mode = Select(name='metadata_export_mode') negate = Checkbox(name='negate') repo = TextInput(name='repo')
class YumRepository(View): arch_restrict = Select(id='architecture_restricted') upstream_url = TextInput(id='url') verify_ssl = Checkbox(id='verify_ssl_on_sync') upstream_username = TextInput(id='upstream_username') upstream_password = TextInput(id='upstream_password') download_policy = Select(id='download_policy') mirror_on_sync = Checkbox(id='mirror_on_sync') checksum_type = Select(id='checksum_type') publish_via_http = Checkbox(id='unprotected') gpg_key = Select(id='gpg_key_id') ssl_ca_cert = Select(id='ssl_ca_cert_id') ssl_client_cert = Select(id='ssl_client_cert_id') ssl_client_key = Select(id='ssl_client_key_id') http_proxy_policy = Select(id="http_proxy_policy") proxy_policy = ConditionalSwitchableView(reference='http_proxy_policy') @proxy_policy.register('Use specific HTTP Proxy') class SpecificHttpProxy(View): http_proxy = Select(id="http_proxy")
class options(PotentiallyInvisibleTab): # noqa form = ConditionalSwitchableView(reference="type") type = BootstrapSelect('button_type') @form.register('Default') class ButtonFormDefaultView(View): # noqa dialog = BootstrapSelect('dialog_id') @form.register('Ansible Playbook') class ButtonFormAnsibleView(View): # noqa playbook_cat_item = BootstrapSelect('service_template_id') inventory = AutomateRadioGroup( locator=".//input[@name='inventory']/..") hosts = Input(name='hosts') text = Input(name='name') display = Checkbox(name='display') hover = Input(name='description') image = FonticonPicker('button_icon') open_url = Checkbox('open_url')
class options(PotentiallyInvisibleTab): # noqa form = ConditionalSwitchableView(reference="type") type = BootstrapSelect("button_type") @form.register("Default") class ButtonFormDefaultView(View): # noqa dialog = BootstrapSelect("dialog_id") @form.register("Ansible Playbook") class ButtonFormAnsibleView(View): # noqa playbook_cat_item = BootstrapSelect("service_template_id") inventory = AutomateRadioGroup(locator=".//input[@name='inventory']/..") hosts = Input(name="hosts") text = Input(name="name") display = Checkbox(name="display") hover = Input(name="description") image = FonticonPicker("button_icon") icon_color = ColourInput(id="button_color") open_url = Checkbox("open_url") display_for = Select(id="display_for") submit = Select(id="submit_how")
class form(View): # noqa auth_mode = BootstrapSelect(id='authentication_mode') auth_settings = ConditionalSwitchableView(reference='auth_mode') auth_settings.register('Database', default=True, widget=DatabaseAuthenticationView) auth_settings.register('LDAP', widget=LdapAuthenticationView) auth_settings.register('LDAPS', widget=LdapsAuthenticationView) auth_settings.register('Amazon', widget=AmazonAuthenticationView) auth_settings.register('External (httpd)', widget=ExternalAuthenticationView) def before_fill(self, values): """Select the auth mode first""" new_mode = values.pop('auth_mode') if new_mode: # view context's object is a Server, if no AUTH_MODE_MAP match is found use # passed value mapped_mode = AuthenticationSetting.mode_map.get( new_mode.capitalize(), new_mode) self.auth_mode.fill(mapped_mode)
class ProviderDetailsView(BaseLoggedInPage): """ main Details page """ title = Text('//div[@id="main-content"]//h1') breadcrumb = BreadCrumb(locator='//ol[@class="breadcrumb"]') toolbar = View.nested(ProviderDetailsToolBar) entities = ConditionalSwitchableView(reference='toolbar.view_selector', ignore_bad_reference=True) @entities.register('Summary View', default=True) class ProviderDetailsSummaryView(View): """ represents Details page when it is switched to Summary aka Tables view """ summary = ParametrizedSummaryTable() @entities.register('Dashboard View') class ProviderDetailsDashboardView(View): """ represents Details page when it is switched to Dashboard aka Widgets view """ # todo: need to develop this page pass @property def is_displayed(self): if (not self.toolbar.view_selector.is_displayed or self.toolbar.view_selector.selected == 'Summary View'): subtitle = 'Summary' else: subtitle = 'Dashboard' title = '{name} ({subtitle})'.format(name=self.context['object'].name, subtitle=subtitle) return (self.logged_in_as_current_user and self.breadcrumb.is_displayed and self.breadcrumb.active_location == title)
class form(View): # noqa retirement_mode = BootstrapSelect(id='formMode') retirement_date = ConditionalSwitchableView(reference='retirement_mode') @retirement_date.register('Specific Date and Time', default=True) class RetirementDateSelectionView(View): datetime_select = TextInput(id='retirement_date_datepicker') @retirement_date.register('Time Delay from Now') class RetirementOffsetSelectionView(View): # TODO unique widget for these touchspin elements, with singular fill method # will allow for consistent fill of view.form months = TextInput(name='months') weeks = TextInput(name='weeks') days = TextInput(name='days') hours = TextInput(name='hours') retirement_offset_datetime = Text( locator='.//div[@id="retirement_date_result_div"]/input[@id="retirement_date"]') retirement_warning = BootstrapSelect(id='retirementWarning') entities = View.nested(BaseNonInteractiveEntitiesView) save = Button('Save') cancel = Button('Cancel')