def __init__(self): mforms.AppView.__init__(self, False, 'db_copy', True) self.background = None if platform.system() == 'Windows': self.set_back_color(mforms.App.get().get_system_color( mforms.SystemColorDisabled).to_html()) header_back = mforms.newPanel(mforms.FilledPanel) else: header_back = mforms.newPanel(mforms.StyledHeaderPanel) header_back.set_back_color("#ffffff") header_back.set_padding(8) self.header = mforms.newLabel("") self.header.set_style(mforms.WizardHeadingStyle) header_back.add(self.header) self.add(header_back, False, True) self.set_back_image( mforms.App.get().get_resource_path("migration_background.png"), mforms.TopRight) self._ui_created = False self._page_list = [] self._page_trail = [] self._current_page = 0 # Load current user numeric locale: locale.setlocale(locale.LC_NUMERIC, '') self.plan = migration.MigrationPlan() self.create_ui()
def __init__(self): mforms.AppView.__init__(self, False, 'db_copy', True) self.background = None self.content = mforms.newBox(False) if platform.system() == 'Windows': self.set_back_color(mforms.App.get().get_system_color(mforms.SystemColorContainer).to_html()) content_panel = mforms.newPanel(mforms.FilledPanel) self.content.set_back_image("migration_background.png", mforms.TopRight) else: content_panel = mforms.newPanel(mforms.StyledHeaderPanel) content_panel.set_back_image("migration_background.png", mforms.TopRight) content_panel.set_back_color("#FFFFFF") content_panel.set_padding(8) self.header = mforms.newLabel("") self.header.set_style(mforms.WizardHeadingStyle) self.content.add(self.header, False) self.tabview = mforms.newTabView(mforms.TabViewTabless) self.content.add(self.tabview, True, True) content_panel.add(self.content) self.add(content_panel, True, True) self._ui_created = False self._page_list = [] self._page_trail = [] self._current_page = 0 # Load current user numeric locale: locale.setlocale(locale.LC_NUMERIC, '') self.plan = migration.MigrationPlan() self.create_ui()
def create_ui(self): self.content.set_padding(20) self.content.add(mforms.newLabel('''Select the connection for the source MySQL server where databases will be copied from and the destination server where they should be copied to.'''), False, True) source_panel = mforms.newPanel(mforms.TitledBoxPanel) source_panel.set_title('Source MySQL Server') box = mforms.newBox(False) box.set_spacing(12) box.set_padding(8) box.add(mforms.newLabel('Select the connection for the source MySQL server instance'), False, True) source_hbox = mforms.newBox(True) source_hbox.set_spacing(8) source_hbox.add(mforms.newLabel('Source Connection:'), False, True) self.source_selector = mforms.newSelector() source_hbox.add(self.source_selector, True, True) box.add(source_hbox, False, True) self.source_connection_status = mforms.newLabel('') self.source_connection_status.set_color('#aa3333') box.add(self.source_connection_status, True, True) self.source_selector.add_changed_callback(functools.partial(self.selector_changed, label=self.source_connection_status, selector=self.source_selector)) source_panel.add(box) self.content.add(source_panel, False, True) target_panel = mforms.newPanel(mforms.TitledBoxPanel) target_panel.set_title('Destination MySQL Server') tbox = mforms.newBox(False) tbox.set_spacing(12) tbox.set_padding(8) tbox.add(mforms.newLabel('Select the connection object for the destination MySQL server instance'), False, True) target_hbox = mforms.newBox(True) target_hbox.set_spacing(8) target_hbox.add(mforms.newLabel('Target Connection:'), False, True) self.target_selector = mforms.newSelector() target_hbox.add(self.target_selector, True, True) tbox.add(target_hbox, False, True) self.target_connection_status = mforms.newLabel('') self.target_connection_status.set_color('#aa3333') tbox.add(self.target_connection_status, True, True) self.target_selector.add_changed_callback(functools.partial(self.selector_changed, label=self.target_connection_status, selector=self.target_selector)) target_panel.add(tbox) self.content.add(target_panel, False, True) self.advanced_button.set_text('Test Connections') self.back_button.set_enabled(False) self.load_connections()
def __init__(self, main): WizardPage.__init__(self, main, "Target Creation Options") self.main.add_wizard_page(self, "ObjectMigration", "Target Creation Options") label = mforms.newLabel("Select options for the creation of the migrated schema in the target\nMySQL server and click [Next >] to execute.") self.content.add(label, False, True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Schema Creation") self.content.add(panel, False, True) box = mforms.newBox(False) panel.add(box) box.set_padding(12) self._create_db = mforms.newCheckBox() self._create_db.set_text("Create schema in target RDBMS") box.add(self._create_db, False, True) # spacer box.add(mforms.newLabel(""), False, True) self._create_script = mforms.newCheckBox() self._create_script.set_text("Create a SQL script file") self._create_script.add_clicked_callback(self._toggle_sql_script) box.add(self._create_script, False, True) self._file_hbox = mforms.newBox(True) self._file_hbox.set_spacing(4) self._file_hbox.add(mforms.newLabel("Script File:"), False, True) self._create_script_file = mforms.newTextEntry() self._create_script_file.set_value(os.path.join(os.path.expanduser('~'), 'migration_script.sql')) self._file_hbox.add(self._create_script_file, True, True) button = mforms.newButton() button.set_text("Browse...") button.add_clicked_callback(self._browse_files) self._file_hbox.add(button, False, True) box.add(self._file_hbox, False, True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Options") self.content.add(panel, False, True) box = mforms.newBox(False) panel.add(box) box.set_padding(12) box.set_spacing(8) self._keep_schema = mforms.newCheckBox() self._keep_schema.set_text("Keep schemas if they already exist. Objects that already exist will not be recreated or updated.") box.add(self._keep_schema, False, True) self._create_db.set_active(True) self._toggle_sql_script() self._check_file_duplicate = True
def __init__(self, main): WizardPage.__init__(self, main, "Target Creation Options") self.main.add_wizard_page(self, "OBJECT MIGRATION", "Target Creation Options") label = mforms.newLabel("Select options for the creation of the migrated schema in the target\nMySQL server and click [Next >] to execute.") self.content.add(label, False, True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Schema Creation") self.content.add(panel, False, True) box = mforms.newBox(False) panel.add(box) box.set_padding(12) self._create_db = mforms.newCheckBox() self._create_db.set_text("Create schema in target RDBMS") box.add(self._create_db, False, True) # spacer box.add(mforms.newLabel(""), False, True) self._create_script = mforms.newCheckBox() self._create_script.set_text("Create a SQL script file") self._create_script.add_clicked_callback(self._toggle_sql_script) box.add(self._create_script, False, True) self._file_hbox = mforms.newBox(True) self._file_hbox.set_spacing(4) self._file_hbox.add(mforms.newLabel("Script File:"), False, True) self._create_script_file = mforms.newTextEntry() self._create_script_file.set_value(os.path.join(os.path.expanduser('~'), 'migration_script.sql')) self._file_hbox.add(self._create_script_file, True, True) button = mforms.newButton() button.set_text("Browse...") button.add_clicked_callback(self._browse_files) self._file_hbox.add(button, False, True) box.add(self._file_hbox, False, True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Options") self.content.add(panel, False, True) box = mforms.newBox(False) panel.add(box) box.set_padding(12) box.set_spacing(8) self._keep_schema = mforms.newCheckBox() self._keep_schema.set_text("Keep schemata if they already exist. Objects that already exist will not be recreated or updated.") box.add(self._keep_schema, False, True) self._create_db.set_active(True) self._toggle_sql_script() self._check_file_duplicate = True
def create_search_panel(self): search_label = newLabel("Locate option:") self.option_lookup_entry = newTextEntry() self.option_lookup_entry.set_size(200,-1) search_btn = newButton() search_btn.set_text("Find") search_btn.set_size(70, -1) search_box = newBox(True) search_box.set_padding(2) search_box.set_spacing(4) #search_box.set_size(300, -1) search_box.add(search_label, False, False) search_box.add(self.option_lookup_entry, False, True) search_box.add(search_btn, False, False) search_panel = newPanel(mforms.FilledPanel) search_panel.add(search_box) self.main_view.ui_profile.apply_style(search_panel, 'option-search-panel') def lookup_option_wrapper(): self.locate_option(self.option_lookup_entry.get_string_value()) search_btn.add_clicked_callback(lookup_option_wrapper) return search_panel
def create_tasks_side(self): side_cont = mforms.newPanel(mforms.StyledHeaderPanel) side_cont.set_title("Migration Task List") self.tasks_side = mforms.newTaskSidebar("Simple") side_cont.add(self.tasks_side) return side_cont
def showMultiplicityOptions(self): self.multRelOpt=mforms.newPanel(mforms.TitledGroupPanel); self.multRelOpt.set_title('Relacion Multiple'); cBox=mforms.newBox(False) self.multRelOpt.add(cBox) cBox.set_padding(3) cBox.set_spacing(3) self.multRelObj=UIHelper(cBox) custom=self.modelData.customData; l=[] for k in self.modelData.foreignKeys: for h in k.columns: l.append(h.name) m = custom['MULTIPLE_RELATIONSHIP'] if m==None: m={} custom['MULTIPLE_RELATIONSHIP']=m if m.has_key('FIELDS'): del(m['FIELDS']) if m.has_key('FIELDS'): v=m['FIELDS'] else: v=l self.multRelObj.addCustomMultipleSelector('Definida por:', l, v, m, 'FIELDS') self.multRelObj.addCheckbox('Unicas',m,'UNIQUE_RELATIONS'); self.container.add(self.multRelOpt,True,True)
def __init__(self, ctrl_be, title, descr, stop_callback=None, close_callback=None, progress_parser_callback=None): mforms.Form.__init__(self, mforms.Form.main_form(), mforms.FormDialogFrame) self.ctrl_be = ctrl_be self._done = False self._update_tm = None self.finished_callback = None self.stop_callback = stop_callback self.close_callback = close_callback self.progress_parser_callback = progress_parser_callback self.show(False) self.box = mforms.newBox(False) self.set_content(self.box) self.box.set_padding(12) self.box.set_spacing(20) self.set_title(title) self.label = mforms.newLabel(descr) self.box.add(self.label, False, True) hb = mforms.newBox(True) self.progress = mforms.newProgressBar() self.progress_label = mforms.newLabel("") self.progress_label.set_size(100, -1) hb.add(self.progress_label, False, True) hb.add(self.progress, True, True) self.box.add(hb, False, True) self.logbox = mforms.newTextBox(mforms.VerticalScrollBar) self.logbox.set_read_only(True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Command Output") self.logbox.set_padding(8) panel.add(self.logbox) self.box.add(panel, True, True) bbox = mforms.newBox(True) self.box.add_end(bbox, False, True) self.stop = mforms.newButton() if stop_callback: self.stop.set_text("Stop") else: self.stop.set_text("Close") self.stop.add_clicked_callback(self.do_stop) bbox.add_end(self.stop, False, True) self.set_size(700, 500) self.center()
def create_search_panel(self): search_label = newLabel("Locate option:") self.option_lookup_entry = newTextEntry() self.option_lookup_entry.set_size(200, -1) search_btn = newButton() search_btn.set_text("Find") search_btn.set_size(70, -1) search_box = newBox(True) search_box.set_padding(2) search_box.set_spacing(4) #search_box.set_size(300, -1) search_box.add(search_label, False, False) search_box.add(self.option_lookup_entry, False, True) search_box.add(search_btn, False, False) search_panel = newPanel(mforms.FilledPanel) search_panel.add(search_box) self.main_view.ui_profile.apply_style(search_panel, 'option-search-panel') def lookup_option_wrapper(): self.locate_option(self.option_lookup_entry.get_string_value()) search_btn.add_clicked_callback(lookup_option_wrapper) return search_panel
def __init__(self,container,modelName,modelData): self.manager=ModelManager(modelName,modelData) self.panel=mforms.newPanel(mforms.TitledGroupPanel); container.add(self.panel,True,True); self.origContainer=container self.panel.set_title("Edicion de Modelo "+modelName); subcontainer=mforms.newBox(False) self.panel.add(subcontainer); UIHelper.__init__(self,subcontainer) self.modelName=modelName self.modelData=modelData self.addTextInput('Label',modelData.customData,'LABEL'); self.addTextInput('Label corta',modelData.customData,'SHORTLABEL'); self.addMultipleColumnSelector('Campo Indice',modelData,modelData.customData,'INDEXFIELDS') self.addTableSelector('Extiende',modelData.customData,'EXTENDS',None); self.addTableSelector('Modulo',modelData.customData,'MODULE',self.onChangeModule) self.addTextInput('Tabla',modelData.customData,'TABLE'); self.addTextInput('Cardinalidad',modelData.customData,'CARDINALITY'); self.addSelectInput("Tipo de Cardinalidad",["","FIXED","VARIABLE"],modelData.customData,'CARDINALITY_TYPE',None) self.addColumnSelector('Campo Tipo',modelData,modelData.customData,'TYPEFIELD') self.addColumnSelector('Propietario',modelData,modelData.customData,'OWNERSHIP') self.multBox=mforms.newBox(False) self.multBox.set_padding(3) self.multBox.set_spacing(3) self.container.add(self.multBox,False,True) self.multiplicityOptions=MultiplicityOptions(self.multBox,modelName,modelData,self.container)
def parse(self,definition,value): for v in definition.keys() : if definition[v].has_key('TYPE'): type=definition[v]['TYPE'] else: type='TextField' Help=None; if definition[v].has_key('Help')==True: Help=definition[v]['Help'] if type=='TextField': self.curUI.addTextInput(definition[v]['l'],value,v,Help) if type=='Checkbox': self.curUI.addCheckbox(definition[v]['l'],value, v) if type=='StringArray': self.curUI.addStringArray(definition[v]['l'],value,v,Help) if type=='Container': curPanel=mforms.newPanel(mforms.TitledGroupPanel); curPanel.set_title(definition[v]['l']) subContainer=mforms.newBox(False) # se guarda el UI actual, y se crea uno nuevo, para pintar el contenido. lastUI=self.curUI self.curUI=UIHelper(subContainer) if value.has_key(v)==False: value[v]={} self.parse(definition[v]['CONTENTS'],value[v]) curPanel.add(subContainer) lastUI.container.add(curPanel,False,True) self.curUI=lastUI
def __init__(self, main): WizardPage.__init__(self, main, 'Schemata Selection') self._ui_created = False self.main.add_wizard_page(self, 'SourceTarget', 'Schemata Selection') optionspanel = mforms.newPanel(mforms.TitledBoxPanel) optionspanel.set_title('Schema Name Mapping Method') optionsbox = mforms.newBox(False) optionsbox.set_padding(8) optionsbox.set_spacing(8) optionsbox.add(mforms.newLabel('Choose how the reverse engineered schemata and objects should be mapped.\n'), False) options = [ 'Keep schemata as they are: Catalog.Schema.Table -> Schema.Table', 'Only one schema: Catalog.Schema.Table -> Catalog.Table', 'Only one schema, keep current schema names as a prefix: Catalog.Schema.Table -> Catalog.Schema_Table', ] rid = mforms.RadioButton.new_id() self.options = [] for opt in options: radio_button = mforms.newRadioButton(rid) radio_button.set_text(opt) optionsbox.add(radio_button, False) self.options.append(radio_button) self.options[1].set_active(True) optionspanel.add(optionsbox) self._optionspanel = optionspanel #self._advanced_shown = False #self._optionspanel.show(False) self.content.add_end(optionspanel, False)
def create_ui(self): self.suspend_layout() self.set_spacing(16) label = mforms.newLabel("Table Data Export allows you to easily export data into CSV, JSON datafiles.\n") label.set_style(mforms.BoldInfoCaptionStyle) self.content.add(label, False, False) entry_box = mforms.newBox(True) entry_box.set_spacing(5) entry_box.add(mforms.newLabel("File Path:"), False, True) self.exportfile_path = mforms.newTextEntry() self.exportfile_path.add_changed_callback(lambda entry=self.exportfile_path: self.entry_changed(entry)) entry_box.add(self.exportfile_path, True, True) if last_location != None: self.exportfile_path.set_value(last_location) self.confirm_file_overwrite = True self.get_module(True) browse_btn = mforms.newButton() browse_btn.set_text("Browse...") browse_btn.set_name("Browse") browse_btn.add_clicked_callback(self.browse) entry_box.add(browse_btn, False, False) self.content.add(entry_box, False, True) radio_box = mforms.newBox(True) radio_box.set_spacing(8) for format in self.main.formats: fradio = mforms.newRadioButton(1) fradio.set_text(format.title) fradio.set_active(bool(self.active_module and self.active_module.name == format.name)) fradio.add_clicked_callback(lambda f = format: self.output_type_changed(f)) radio_box.add(fradio, False, True) self.radio_opts.append({'radio':fradio, 'name': format.name}) self.content.add(radio_box, False, True) self.optpanel = mforms.newPanel(mforms.TitledBoxPanel) self.optpanel.set_title("Options:") self.content.add(self.optpanel, False, True) self.optpanel.show(False) self.export_local_box = mforms.newBox(False) self.export_local_cb = mforms.newCheckBox() self.export_local_cb.set_text("Export to local machine") self.export_local_cb.set_active(True) self.export_local_box.add(self.export_local_cb, False, True) l = mforms.newLabel("""If checked, rows will be exported on the location that started Workbench.\nIf not checked, rows will be exported on the server.\nIf server and computer that started Workbench are different machines, import of that file can be done manual way only.""") l.set_style(mforms.SmallHelpTextStyle) self.export_local_box.add(l, False, True) self.content.add(self.export_local_box, False, True) self.resume_layout() self.load_module_options()
def __init__(self, main, header_label, description=None, use_private_message_handling=False): wizard_page_widget.WizardPage.__init__(self, main, header_label) self._use_private_message_handling = use_private_message_handling self._description = mforms.newLabel( description or "The following tasks will now be performed. Please monitor the execution." ) self._description.set_name('Page Description') self.content.add(self._description, False, True) self._tasks_box = mforms.newBox(False) self._tasks_box.set_padding(24) self._tasks_box.set_spacing(8) self.content.add(self._tasks_box, False, True) self._status_label = mforms.newLabel("Click [Next >] to execute.") self._status_label.set_name("Next Information") self.content.add(self._status_label, False, True) self._progress = mforms.newProgressBar() self.content.add(self._progress, False, True) self._progress.show(False) self._detail_label = mforms.newLabel("") self._detail_label.set_name('Details') self.content.add(self._detail_label, False, True) self._timer = None self._tasks = [] self._currently_running_task_index = None self._progress_indeterminate = False self._tasks_finished = False self._log_box = mforms.newPanel(mforms.TitledBoxPanel) self._log_box.set_title("Message Log") self._log_box.set_name("Message Log") self._log_text = mforms.newTextBox(mforms.VerticalScrollBar) self._log_text.set_name('Wizard Progress Log Text') self._log_text.set_read_only(True) self._log_text.set_padding(16) self._log_box.add(self._log_text) self._log_box.show(False) self.content.add_end(self._log_box, True, True) self._log_queue = deque() self._showing_logs = False self._cancel_requested = False self._tasks_held = False self.advanced_button.set_text("Show Logs") self._log_progress_text = True self._autostart = False
def create_ui(self): self.suspend_layout() self.set_spacing(16) label = mforms.newLabel("Table Data Export allows you to easily export data into csv, json datafiles.\n") label.set_style(mforms.BoldInfoCaptionStyle) self.content.add(label, False, False) entry_box = mforms.newBox(True) entry_box.set_spacing(5) entry_box.add(mforms.newLabel("File Path:"), False, True) self.exportfile_path = mforms.newTextEntry() self.exportfile_path.add_changed_callback(lambda entry=self.exportfile_path: self.entry_changed(entry)) entry_box.add(self.exportfile_path, True, True) if last_location != None: self.exportfile_path.set_value(last_location) self.confirm_file_overwrite = True self.get_module(True) browse_btn = mforms.newButton() browse_btn.set_text("Browse...") browse_btn.add_clicked_callback(self.browse) entry_box.add(browse_btn, False, False) self.content.add(entry_box, False, True) radio_box = mforms.newBox(True) radio_box.set_spacing(8) for format in self.main.formats: fradio = mforms.newRadioButton(1) fradio.set_text(format.title) fradio.set_active(bool(self.active_module and self.active_module.name == format.name)) fradio.add_clicked_callback(lambda f = format: self.output_type_changed(f)) radio_box.add(fradio, False, False) self.radio_opts.append({'radio':fradio, 'name': format.name}) self.content.add(radio_box, False, False) self.optpanel = mforms.newPanel(mforms.TitledBoxPanel) self.optpanel.set_title("Options:") self.content.add(self.optpanel, False, True) self.optpanel.show(False) self.export_local_box = mforms.newBox(False) self.export_local_cb = mforms.newCheckBox() self.export_local_cb.set_text("Export to local machine") self.export_local_cb.set_active(True) self.export_local_box.add(self.export_local_cb, False, True) l = mforms.newLabel("""If checked rows will be exported on the location that started Workbench.\nIf not checked, rows will be exported on the server.\nIf server and computer that started Workbench are different machines, import of that file can be done manual way only.""") l.set_style(mforms.SmallHelpTextStyle) self.export_local_box.add(l, False, True) self.content.add(self.export_local_box, False, True) self.resume_layout() self.load_module_options()
def newHeaderLabel(text): widget = mforms.newPanel(mforms.StyledHeaderPanel) label = mforms.newLabel(text) widget.add(label) widget.set_text = new.instancemethod(mforms.Label.set_text, label, mforms.Label) widget.set_color = new.instancemethod(mforms.Label.set_color, label, mforms.Label) widget.set_style = new.instancemethod(mforms.Label.set_style, label, mforms.Label) widget.set_text_align = new.instancemethod(mforms.Label.set_text_align, label, mforms.Label) return widget
def __init__(self): mforms.AppView.__init__(self, True, "migration", True) self.plan = migration.MigrationPlan() self.toolbars_mgr = migration_toolbars.ToolBarManager() self.active_tab = None self.old_active_tab = None self.set_spacing(6) self.ui_profile = migration_ui_style.UIProfile() self.left_side_cont = self.create_tasks_side() self.add(self.left_side_cont, False, False) self.tasks_side.add_section("Overview", "OVERVIEW", 0) self.tasks_side.add_section("SourceTarget", "SOURCE & TARGET", 0) self.tasks_side.add_section("ObjectMigration", "OBJECT MIGRATION", 0) self.tasks_side.add_section("DataMigration", "DATA MIGRATION", 0) self.tasks_side.add_section("Report", "REPORT", 0) self.tasks_side.add_on_section_command_callback(self.section_clicked) self.left_side_cont.set_size(220, -1) self.background = mforms.newPanel(mforms.StyledHeaderPanel) self.background.set_title("TITLE") self._page_trail = [] self.tabs = [] self._name2page = {} if platform.system() == 'Windows': self.content_box = mforms.newBox(False) self.content_box.set_back_image("migration_background.png", mforms.TopRight) self.background.add(self.content_box) self.background.set_back_color("#ffffff") else: self.tabview = mforms.newTabView(True) self.background.add(self.tabview) self.background.set_back_image("migration_background.png", mforms.TopRight) self.add(self.background, True, True) self._advancing = True self.content = {} self.add_content() self._selecting_entry = False # Load current user numeric locale: locale.setlocale(locale.LC_NUMERIC, '') self.tasks_side.select_entry(self._overview_page.identifier()) self.section_clicked(self._overview_page.identifier())
def __init__(self): mforms.AppView.__init__(self, True, "migration", True) self.plan = migration.MigrationPlan() self.toolbars_mgr = migration_toolbars.ToolBarManager() self.active_tab = None self.old_active_tab = None self.set_spacing(6) self.ui_profile = migration_ui_style.UIProfile() self.left_side_cont = self.create_tasks_side() self.add(self.left_side_cont, False, False) self.tasks_side.add_section("Overview", "OVERVIEW", 0) self.tasks_side.add_section("SourceTarget", "SOURCE & TARGET", 0) self.tasks_side.add_section("ObjectMigration", "OBJECT MIGRATION", 0) self.tasks_side.add_section("DataMigration", "DATA MIGRATION", 0) self.tasks_side.add_section("Report", "REPORT", 0) self.tasks_side.add_on_section_command_callback(self.section_clicked) self.left_side_cont.set_size(220, -1) self.background = mforms.newPanel(mforms.StyledHeaderPanel) self.background.set_title("TITLE") self._page_trail = [] self.tabs = [] self._name2page = {} if platform.system() == "Windows": self.content_box = mforms.newBox(False) self.content_box.set_back_image("migration_background.png", mforms.TopRight) self.background.add(self.content_box) self.background.set_back_color("#ffffff") else: self.tabview = mforms.newTabView(True) self.background.add(self.tabview) self.background.set_back_image("migration_background.png", mforms.TopRight) self.add(self.background, True, True) self._advancing = True self.content = {} self.add_content() self._selecting_entry = False # Load current user numeric locale: locale.setlocale(locale.LC_NUMERIC, "") self.tasks_side.select_entry(self._overview_page.identifier()) self.section_clicked(self._overview_page.identifier())
def __init__(self, ctrl_be, title, descr, stop_callback = None, close_callback=None, progress_parser_callback=None): mforms.Form.__init__(self, mforms.Form.main_form(), mforms.FormDialogFrame) self.ctrl_be = ctrl_be self._done = False self._update_tm = None self.finished_callback = None self.stop_callback = stop_callback self.close_callback = close_callback self.progress_parser_callback = progress_parser_callback self.show(False) self.box = mforms.newBox(False) self.set_content(self.box) self.box.set_padding(12) self.box.set_spacing(20) self.set_title(title) self.label = mforms.newLabel(descr) self.box.add(self.label, False, True) hb = mforms.newBox(True) self.progress = mforms.newProgressBar() self.progress_label = mforms.newLabel("") self.progress_label.set_size(100, -1) hb.add(self.progress_label, False, True) hb.add(self.progress, True, True) self.box.add(hb, False, True) self.logbox = mforms.newTextBox(mforms.VerticalScrollBar) self.logbox.set_read_only(True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Command Output") self.logbox.set_padding(8) panel.add(self.logbox) self.box.add(panel, True, True) bbox = mforms.newBox(True) self.box.add_end(bbox, False, True) self.stop = mforms.newButton() if stop_callback: self.stop.set_text("Stop") else: self.stop.set_text("Close") self.stop.add_clicked_callback(self.do_stop) bbox.add_end(self.stop, False, True) self.set_size(700, 500) self.center()
def create_tasks_side(self): side_cont = mforms.newPanel(mforms.StyledHeaderPanel) side_cont.set_title("Migration Task List") #toolbar = self.toolbars_mgr.get_toolbar("tasks-side-toolbar") #side_cont.add(toolbar, False, False) self.tasks_side = mforms.newTaskSidebar() #self.tasks_side.set_selection_color(mforms.SystemHighlight) side_cont.add(self.tasks_side) return side_cont
def __init__(self): mforms.AppView.__init__(self, False, 'db_copy', True) self.background = None self.content = mforms.newBox(False) if platform.system() == 'Windows': self.set_back_color("#FFFFFF") content_panel = mforms.newPanel(mforms.FilledPanel) #self.content.set_back_image("migration_background.png", mforms.TopRight) content_panel.set_back_color("#FFFFFF") else: content_panel = mforms.newPanel(mforms.StyledHeaderPanel) content_panel.set_back_image("migration_background.png", mforms.TopRight) content_panel.set_padding(8) self.header = mforms.newLabel("") self.header.set_style(mforms.WizardHeadingStyle) self.content.add(self.header, False) # On Windows doesn't use TabView as it is not transparent if platform.system() != 'Windows': self.tabview = mforms.newTabView(mforms.TabViewTabless) self.content.add(self.tabview, True, True) content_panel.add(self.content) self.add(content_panel, True, True) self._ui_created = False self._page_list = [] self._page_trail = [] self._current_page = 0 # Load current user numeric locale: locale.setlocale(locale.LC_NUMERIC, '') self.plan = migration.MigrationPlan() self.create_ui()
def __init__(self, main, header_label, description = None, use_private_message_handling=False): wizard_page_widget.WizardPage.__init__(self, main, header_label) self._use_private_message_handling = use_private_message_handling self._description = mforms.newLabel(description or "The following tasks will now be performed. Please monitor the execution.") self.content.add(self._description, False, True) self._tasks_box = mforms.newBox(False) self._tasks_box.set_padding(24) self._tasks_box.set_spacing(8) self.content.add(self._tasks_box, False, True) self._status_label = mforms.newLabel("Click [Next >] to execute.") self.content.add(self._status_label, False, True) self._progress = mforms.newProgressBar() self.content.add(self._progress, False, True) self._progress.show(False) self._detail_label = mforms.newLabel("") self.content.add(self._detail_label, False, True) self._timer = None self._tasks = [] self._currently_running_task_index = None self._progress_indeterminate = False self._tasks_finished = False self._log_box = mforms.newPanel(mforms.TitledBoxPanel) self._log_box.set_title("Message Log") self._log_box.set_padding(12) self._log_text = mforms.newTextBox(mforms.VerticalScrollBar) self._log_text.set_name('WizardProgressLogText') self._log_text.set_read_only(True) self._log_box.add(self._log_text) self._log_box.show(False) self.content.add_end(self._log_box, True, True) self._log_queue = deque() self._showing_logs = False self._cancel_requested = False self._tasks_held = False self.advanced_button.set_text("Show Logs") self._log_progress_text = True self._autostart = False
def __init__(self, main): WizardPage.__init__(self, main, "Migration Options") self.main.add_wizard_page(self, "ObjectMigration", "Migration Options") label = mforms.newLabel("Select options for the migration of the source schema/schemas to MySQL.") self.content.add(label, False, True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("DBMS Specific Options") self.content.add(panel, False, True) self._db_options_box = mforms.newBox(False) panel.add(self._db_options_box) self._db_options_box.set_padding(12) self._db_options_box.set_spacing(8) self._db_options = []
def __init__(self, main): WizardPage.__init__(self, main, "Migration Options") self.main.add_wizard_page(self, "ObjectMigration", "Migration Options") label = mforms.newLabel("Select options for the migration of the source schema/schemata to MySQL.") self.content.add(label, False, True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("DBMS Specific Options") self.content.add(panel, False, True) self._db_options_box = mforms.newBox(False) panel.add(self._db_options_box) self._db_options_box.set_padding(12) self._db_options_box.set_spacing(8) self._db_options = []
def __init__(self, owner): WizardPage.__init__(self, owner, "Generate certificates and self-signed keys") self.ca_cert = os.path.join(self.main.results_path, "ca-cert.pem").replace('\\', '/') self.server_cert = os.path.join(self.main.results_path, "server-cert.pem").replace('\\', '/') self.server_key = os.path.join(self.main.results_path, "server-key.pem").replace('\\', '/') self.client_cert = os.path.join(self.main.results_path, "client-cert.pem").replace('\\', '/') self.client_key = os.path.join(self.main.results_path, "client-key.pem").replace('\\', '/') self.table = mforms.newTable() self.table.set_padding(12) self.table.set_column_count(3) self.table.set_row_count(7) self.table.set_row_spacing(8) self.table.set_column_spacing(4) row, self.country_code = self.add_label_row(0, "Country:", "2 letter country code (eg, US)") row, self.state_name = self.add_label_row(row, "State or Province:", "Full state or province name") row, self.locality_name = self.add_label_row(row, "Locality:", "eg, city") row, self.org_name = self.add_label_row(row, "Organization:", "eg, company") row, self.org_unit = self.add_label_row(row, "Org. Unit:", "eg, section, department") row, self.email_address = self.add_label_row(row, "Email Address:", "") row, self.common_name = self.add_label_row(row, "Common:", "eg, put the FQDN of the server\nto allow server address validation") message = "Now you must specify the parameters to use in the certificates and self-signed key generation.\n" message += "This may include some data refering to youself and/or the company you work for. All fields are optional." self.parameters_box = mforms.newBox(False) self.parameters_box.set_padding(20) self.parameters_box.set_spacing(20) self.parameters_label = mforms.newLabel(message) self.parameters_panel = mforms.newPanel(mforms.TitledBoxPanel) self.parameters_panel.set_title("Optional Parameters") self.parameters_panel.add(self.table) self.parameters_box.add(self.parameters_label, False, False) self.parameters_box.add(self.parameters_panel, False, False) self.default_label = mforms.newLabel("The wizard is ready to generate the files for you. Click 'Next >' to generate \nthe certificates and self-signed key files...")
def __init__(self, owner): WizardPage.__init__(self, owner, "Generate certificates and self-signed keys") self.ca_cert = os.path.join(self.main.results_path, "ca-cert.pem") self.server_cert = os.path.join(self.main.results_path, "server-cert.pem") self.server_key = os.path.join(self.main.results_path, "server-key.pem") self.client_cert = os.path.join(self.main.results_path, "client-cert.pem") self.client_key = os.path.join(self.main.results_path, "client-key.pem") self.table = mforms.newTable() self.table.set_padding(12) self.table.set_column_count(3) self.table.set_row_count(7) self.table.set_row_spacing(8) self.table.set_column_spacing(4) row, self.country_code = self.add_label_row(0, "Country:", "2 letter country code (eg, US)") row, self.state_name = self.add_label_row(row, "State or Province:", "Full state or province name") row, self.locality_name = self.add_label_row(row, "Locality:", "eg, city") row, self.org_name = self.add_label_row(row, "Organization:", "eg, company") row, self.org_unit = self.add_label_row(row, "Org. Unit:", "eg, section, department") row, self.email_address = self.add_label_row(row, "Email Address:", "") row, self.common_name = self.add_label_row(row, "Common:", "eg, put the FQDN of the server\nto allow server address validation") message = "Now you must specify the parameters to use in the certificates and self-signed key generation.\n" message += "This may include some data refering youself and/or the company you work for. All fields are optional." self.parameters_box = mforms.newBox(False) self.parameters_box.set_padding(20) self.parameters_box.set_spacing(20) self.parameters_label = mforms.newLabel(message) self.parameters_panel = mforms.newPanel(mforms.TitledBoxPanel) self.parameters_panel.set_title("Optional Parameters") self.parameters_panel.add(self.table) self.parameters_box.add(self.parameters_label, False, False) self.parameters_box.add(self.parameters_panel, False, False) self.default_label = mforms.newLabel("The wizard is ready to generate the files for you. Click 'Next >' to generate \nthe certificates and self-signed key files...")
def __init__(self,qForm,container,rootObj,rootKey): self.qForm=qForm self.subContainer=mforms.newBox(False) UIHelper.__init__(self,self.subContainer) self.rootObj=rootObj self.rootKey=rootKey # Se mete un container para el nombre, y para el delete. curBox=mforms.newBox(True) curBox.set_padding(3) curBox.set_spacing(3) label=mforms.newLabel(rootKey) label.set_size(140,20) curBox.add(label,False,False) delbutton=mforms.newButton() delbutton.set_text('Delete') curBox.add(delbutton,False,True) delbutton.add_clicked_callback(lambda:self.onDelete()) self.subContainer.add(curBox,False,True) # Se aniaden los siguientes campos. # Primero, la lista de tablas output. self.addMultipleTableSelector('Tablas',rootObj[rootKey],'TABLES') self.parampanel=mforms.newPanel(mforms.TitledGroupPanel); self.parampanel.set_title("Parametros"); self.paramcontainer=mforms.newBox(True) self.paramcontainer.set_padding(10) self.paramcontainer.set_spacing(10) self.parampanel.add(self.paramcontainer); addParamButton=mforms.newButton() addParamButton.set_text('Nuevo Parametro') addParamButton.add_clicked_callback(self.addParam) self.paramcontainer.add(addParamButton,False,False) addParamButton.set_size(100,30) self.subContainer.add(self.parampanel,False,False); container.add(self.subContainer,False,False) self.parentContainer=container
def drawField(self,fName): if type(fName) is unicode: fName=fName.encode('ascii','ignore') self.currentField=fName; if self.curPanel != None: self.container.remove(self.curPanel) self.curPanel=mforms.newPanel(mforms.TitledGroupPanel); subContainer=mforms.newBox(False) self.curUI=UIHelper(subContainer) l=self.definition.keys()+['Relationship'] l.sort() if self.modelData.customData['FIELDS'].has_key(fName) == False: self.modelData.customData['FIELDS'][fName]={} self.curUI.addSelectInput('Tipo',l, self.modelData.customData['FIELDS'][fName], 'TYPE', self.onChangedType) self.curUI.addTextInput('Label',self.modelData.customData['FIELDS'][fName],'LABEL'); self.curUI.addTextInput('Label corta',self.modelData.customData['FIELDS'][fName],'SHORTLABEL'); self.curUI.addCheckbox('Requerido',self.modelData.customData['FIELDS'][fName],'REQUIRED'); self.curUI.addCheckbox('Campo label',self.modelData.customData['FIELDS'][fName],'ISLABEL'); self.curUI.addCheckbox('Campo descriptivo',self.modelData.customData['FIELDS'][fName],'DESCRIPTIVE'); if self.modelData.customData['FIELDS'][fName].has_key('TYPE') != False: if self.modelData.customData['FIELDS'][fName]['TYPE'] != 'Relationship': self.parse(self.definition[self.modelData.customData['FIELDS'][fName]['TYPE']],self.fieldData[fName]) else: rUI=RelationFieldEditor(subContainer,self.modelData, fName) self.curPanel.add(subContainer) self.container.add(self.curPanel,True,True)
def create_ui(self): if self.main.plan.migrationSource and self.main.plan.migrationSource.catalog and self.main.plan.migrationSource.catalog.schemata: optionspanel = mforms.newPanel(mforms.TitledBoxPanel) optionspanel.set_title('Choose how your schemata will be mapped') optionsbox = mforms.newBox(False) optionsbox.set_padding(8) optionsbox.set_spacing(6) options = [ 'Keep schemata as they are: Catalog.Schema.Table -> Schema.Table', 'Only one schema: Catalog.Schema.Table -> Catalog.Table', 'Only one schema, keep current schema names as a prefix: Catalog.Schema.Table -> Catalog.Schema__Table', ] self.options = [] for opt in options: radio_button = mforms.newRadioButton(self.rid) radio_button.set_text(opt) optionsbox.add(radio_button, False) self.options.append(radio_button) optionspanel.add(optionsbox) self.content.add(optionspanel, False) else: self.go_next()
def create_ui(self): if self.main.plan.migrationSource and self.main.plan.migrationSource.catalog and self.main.plan.migrationSource.catalog.schemata: optionspanel = mforms.newPanel(mforms.TitledBoxPanel) optionspanel.set_title('Choose how your schemas will be mapped') optionsbox = mforms.newBox(False) optionsbox.set_padding(8) optionsbox.set_spacing(6) options = [ 'Keep schemas as they are: Catalog.Schema.Table -> Schema.Table', 'Only one schema: Catalog.Schema.Table -> Catalog.Table', 'Only one schema, keep current schema names as a prefix: Catalog.Schema.Table -> Catalog.Schema__Table', ] self.options = [] for opt in options: radio_button = mforms.newRadioButton(self.rid) radio_button.set_text(opt) optionsbox.add(radio_button, False) self.options.append(radio_button) optionspanel.add(optionsbox) self.content.add(optionspanel, False) else: self.go_next()
def __init__(self, main): WizardPage.__init__(self, main, "Data Transfer Setup") self.main.add_wizard_page(self, "DataMigration", "Data Transfer Setup") label = mforms.newLabel( "Select options for the copy of the migrated schema tables in the target\nMySQL server and click [Next >] to execute." ) self.content.add(label, False, True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Data Copy") self.content.add(panel, False, True) box = mforms.newBox(False) panel.add(box) box.set_padding(12) self._copy_db = mforms.newCheckBox() self._copy_db.set_text("Online copy of table data to target RDBMS") box.add(self._copy_db, False, True) # XXX TODO #box.add(mforms.newLabel(""), False, True) #self._add_script_checkbox_option(box, "dump_to_file", "Create a dump file with the data", "Dump File:", "Save As") box.add(mforms.newLabel(""), False, True) if sys.platform == "win32": self._add_script_checkbox_option( box, "copy_script", "Create a batch file to copy the data at another time", "Batch File:", "Save As") else: self._add_script_checkbox_option( box, "copy_script", "Create a shell script to copy the data from outside Workbench", "Shell Script File:", "Save As") panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Options") self.content.add(panel, False, True) self.options_box = mforms.newBox(False) self.options_box.set_padding(12) self.options_box.set_spacing(8) panel.add(self.options_box) self._truncate_db = mforms.newCheckBox() self._truncate_db.set_text( "Truncate target tables (ie. delete contents) before copying data") self.options_box.add(self._truncate_db, False, True) hbox = mforms.newBox(True) hbox.set_spacing(8) hbox.add(mforms.newLabel("Worker tasks"), False, True) self._worker_count = mforms.newTextEntry() self._worker_count.set_value("2") self._worker_count.set_size(50, -1) hbox.add(self._worker_count, False, True) l = mforms.newLabel( "Number of tasks to use for data transfer. Each task will open a\n" + "connection to both source and target RDBMSs to copy table rows.\nDefault value 2." ) l.set_style(mforms.SmallHelpTextStyle) hbox.add(l, True, True) self.options_box.add(hbox, False, True) self._debug_copy = mforms.newCheckBox() self._debug_copy.set_text("Enable debug output for table copy") self.options_box.add(self._debug_copy, False, True) ### self._advanced_panel = mforms.newPanel(mforms.TitledBoxPanel) self._advanced_panel.set_title("Tables to Copy") self.content.add(self._advanced_panel, True, True) box = mforms.newBox(False) box.set_padding(12) box.set_spacing(8) l = mforms.newLabel( """You can limit the number of rows to be copied for certain tables. Tables that are referenced by foreign keys from other tables cannot be limited, unless data copy from the referencing tables is also disabled. All tables are copied by default.""") l.set_style(mforms.SmallHelpTextStyle) box.add(l, False, True) self._tree = mforms.newTreeNodeView(mforms.TreeDefault) self._tree.add_column(mforms.IconStringColumnType, "Table", 200, False) self._tree.add_column(mforms.StringColumnType, "Limit Copy", 100, True) self._tree.add_column(mforms.StringColumnType, "Referencing Tables", 500, False) self._tree.end_columns() box.add(self._tree, True, True) self._advanced_panel.add(box) self._tree.set_cell_edited_callback(self._cell_edited) self._advbox_shown = False self._advanced_panel.show(False)
def __init__(self, server_profile, ctrl_be, monitor): mforms.Box.__init__(self, True) # True - vertical layout self.tasks_side = newTaskSidebar() self.content_box = newBox(False) self.tasks_side.set_selection_color(mforms.SystemHighlight) self.tabs = [] self.name2page = {} self.config_ui = None self.closing = False self.tabview = newTabView(True) self.ctrl_be = ctrl_be self.old_active_tab = None self.server_profile = server_profile self.refresh_tasks_sleep_time = 2 self.ui_profile = UIProfile(server_profile) # Setup self self.set_managed() self.ui_profile.apply_style(self, "main") if server_profile.host_os == wbaOS.windows: side_panel = newPanel(mforms.StyledHeaderPanel) side_panel.set_title(" Task and Object Browser") side_panel.add(self.tasks_side) self.add(side_panel, False, True) self.content_panel = newPanel(mforms.StyledHeaderPanel) self.content_panel.set_title(" Task and Object Browser") self.content_panel.add(self.content_box) self.add(self.content_panel, True, True) else: vbox = newBox(False) vbox.add(self.tasks_side, True, True) self.add(vbox, False, False) vbox = newBox(False) self.content_label = newHeaderLabel("") self.ui_profile.apply_style(self.content_label, 'content-label') vbox.add(self.content_label, False, False) vbox.add(self.content_box, True, True) self.add(vbox, True, True) self.ctrl_be.add_me_for_event("server_started", self) self.ctrl_be.add_me_for_event("server_stopped", self) # Setup tasks sidebar self.fill_task_sidebar() self.tasks_side.add_on_section_command_callback(self.section_clicked) self.tasks_side.show() self.tasks_side.set_size(220, -1) # Setup content box self.content_box.add(self.tabview, True, True) # Create content pages self.server_status_page = ServerStatusPage(server_profile, ctrl_be, self) self.config_ui = WbAdminConfigFileUI(server_profile = server_profile, ctrl_be = ctrl_be, main_view = self) self.startup = WbAdminConfigurationStartup(ctrl_be, server_profile, self) self.security = WbAdminSecurity(self.ctrl_be, server_profile, self) self.variables = WbAdminVariables(self.ctrl_be, server_profile, self) self.logs = WbAdminLogs(self.ctrl_be, server_profile, self) self.dump = WbAdminExport(server_profile, self.ctrl_be, self) Utilities.add_timeout(0.5, weakcb(self, "timeout")) self.timeout_thread = threading.Thread(target = self.refresh_tasks_thread) self.timeout_thread.setDaemon(True) self.timeout_thread.start() self.tabview.add_tab_changed_callback(self.tab_changed) self.timeout() # will call self.connect_mysql() and check if mysql is running self.ctrl_be.continue_events() # Process events which are queue during init dprint_ex(1, "WBA init complete") self.tasks_side.select_entry("MANAGEMENT", "Server Status") self.server_status_page.page_activated()
def __init__(self, main): WizardPage.__init__(self, main, "Create Target Results", wide=True) self.main.add_wizard_page(self, "ObjectMigration", "Create Target Results") text = """Scripts to create the target schema were executed. No data has been migrated yet. Review the creation report below for errors or warnings. If there are any errors, you can manually fix the scripts and click [Recreate Objects] to retry the schema creation or return to the Manual Editing page to correct them there and retry the target creation.""" description = mforms.newLabel(text) description.set_name("Page Description") self.content.add(description, False, True) hbox = mforms.newBox(True) hbox.set_spacing(12) hbox.set_homogeneous(True) self._tree = mforms.newTreeView(mforms.TreeFlatList) self._tree.set_name("Script Results") self._tree.add_column(mforms.IconStringColumnType, "Object", 200, False) self._tree.add_column(mforms.IconStringColumnType, "Result", 600, False) self._tree.end_columns() self._tree.add_changed_callback(self._selection_changed) hbox.add(self._tree, True, True) #self.content.add(self._tree, True, True) self._advbox = mforms.newPanel(mforms.TitledBoxPanel) self._advbox.set_title("SQL CREATE Script for Selected Object") self._advbox.set_name("SQL IDE") box = mforms.newBox(False) self._code = mforms.newCodeEditor() self._code.set_language(mforms.LanguageMySQL) self._code.add_changed_callback(self._code_changed) box.add(self._code, True, True) vbox = mforms.newBox(True) vbox.set_padding(12) vbox.set_spacing(8) self._comment_check = mforms.newCheckBox() self._comment_check.set_text("Comment out") self._comment_check.set_name("Comment Out") self._comment_check.add_clicked_callback(self._comment_clicked) vbox.add(self._comment_check, False, True) self._revert_btn = mforms.newButton() self._revert_btn.set_text("Discard") vbox.add_end(self._revert_btn, False, True) self._revert_btn.add_clicked_callback(self._discard_clicked) self._apply_btn = mforms.newButton() self._apply_btn.set_text("Apply") vbox.add_end(self._apply_btn, False, True) self._apply_btn.add_clicked_callback(self._apply_clicked) box.add(vbox, False, True) self._advbox.add(box) #self._advbox.set_size(-1, 200) #self._advbox_shown = True #self.go_advanced() # toggle to hide self.advanced_button.set_text("Recreate Objects") #self.content.add(self._advbox, False, True) hbox.add(self._advbox, True, True) self.content.add(hbox, True, True) self._msgbox = mforms.newPanel(mforms.TitledBoxPanel) self._msgbox.set_title("Output Messages") self._msgbox.set_name("Output Messages") box = mforms.newBox(False) box.set_padding(8) self._msgs = mforms.newTextBox(mforms.VerticalScrollBar) box.add(self._msgs, True, True) self._msgbox.add(box) self.content.add(self._msgbox, False, True) self._msgbox.set_size(-1, 200) self._error_tables = []
def __init__(self, owner): mforms.Box.__init__(self, True) self.set_managed() self.owner = owner self._selected_user = None self._selected_user_original = None self.suspend_layout() self.set_spacing(8) self.set_padding(8) schema_list_box = newBox(False) schema_list_box.set_spacing(8) schema_list_box.set_size(150, -1) self.add(schema_list_box, False, True) #searchbox = TextEntry(SearchEntry) #schema_list_box.add(searchbox, False, True) self.user_list = newTreeView(mforms.TreeDefault) self.user_list.add_column(mforms.StringColumnType, "Users", 140, False) self.user_list.end_columns() self.user_list.add_changed_callback(self.user_selected) self.user_list.set_allow_sorting(True) schema_list_box.add(self.user_list, True, True) self.schema_rights_checks = {} self.content_box = priv_vbox = newBox(False) priv_vbox.set_spacing(8) self.add(priv_vbox, True, True) priv_vbox.add( newLabel( "Select a user and pick the privileges it has for a given Schema and Host combination." ), False, True) self.privs_list = newTreeView(mforms.TreeDefault) self.privs_list.add_column(mforms.StringColumnType, "Host", 100, True) self.privs_list.add_column(mforms.StringColumnType, "Schema", 100, True) self.privs_list.add_column(mforms.StringColumnType, "Privileges", 800, False) self.privs_list.end_columns() self.privs_list.add_changed_callback(self.schema_priv_selected) priv_vbox.add(self.privs_list, True, True) bbox = newBox(True) bbox.set_spacing(8) bbox.add( dLabel( "Schema and Host fields may use % and _ wildcards. The server will match specific entries before wildcarded ones." ), False, True) self.add_entry_button = newButton() self.add_entry_button.set_text("Add Entry...") bbox.add_end(self.add_entry_button, False, True) self.add_entry_button.add_clicked_callback(self.add_entry) self.del_entry_button = newButton() self.del_entry_button.set_text("Delete Entry") bbox.add_end(self.del_entry_button, False, True) self.del_entry_button.add_clicked_callback(self.del_entry) priv_vbox.add(bbox, False, True) self.schema_priv_label = newLabel("") priv_vbox.add(self.schema_priv_label, False, True) hbox = newBox(True) hbox.set_homogeneous(True) hbox.set_spacing(8) priv_vbox.add(hbox, False, True) self.schema_object_privs_panel = panel = newPanel( mforms.TitledBoxPanel) panel.set_title("Object Rights") box = newBox(False) box.set_padding(8) for name in SCHEMA_OBJECT_RIGHTS: cb = newCheckBox() label, desc = PrivilegeInfo.get(name, ("", None)) cb.set_text(label) if desc: cb.set_tooltip(desc) cb.add_clicked_callback(self.schema_priv_checked) box.add(cb, False, False) self.schema_rights_checks[name] = cb panel.add(box) hbox.add(panel, False, True) self.schema_ddl_privs_panel = panel = newPanel(mforms.TitledBoxPanel) panel.set_title("DDL Rights") box = newBox(False) box.set_padding(8) for name in SCHEMA_DDL_RIGHTS: cb = newCheckBox() label, desc = PrivilegeInfo.get(name, ("", None)) cb.set_text(label) if desc: cb.set_tooltip(desc) cb.add_clicked_callback(self.schema_priv_checked) box.add(cb, False, False) self.schema_rights_checks[name] = cb panel.add(box) hbox.add(panel, False, True) self.schema_other_privs_panel = panel = newPanel(mforms.TitledBoxPanel) panel.set_title("Other Rights") box = newBox(False) box.set_padding(8) for name in SCHEMA_OTHER_RIGHTS: cb = newCheckBox() label, desc = PrivilegeInfo.get(name, ("", None)) cb.set_text(label) if desc: cb.set_tooltip(desc) cb.add_clicked_callback(self.schema_priv_checked) box.add(cb, False, False) self.schema_rights_checks[name] = cb panel.add(box) hbox.add(panel, False, True) bottom_box = newBox(True) bottom_box.set_spacing(8) if 0: img = newImageBox() if App.get().get_resource_path("task_warning_mac.png"): img.set_image("task_warning_mac.png") else: img.set_image("task_warning.png") bottom_box.add(img, False, True) bottom_box.add( dLabel( "There are %i schema privilege entries for accounts that don't exist" ), False, True) purge = newButton() purge.set_text("Purge") bottom_box.add(purge, False, True) self.grant_all = newButton() self.grant_all.set_text('Select "ALL"') bottom_box.add(self.grant_all, False, True) self.grant_all.add_clicked_callback(self.grant_all_schema_privs) self.revoke_all = newButton() self.revoke_all.set_text("Unselect All") bottom_box.add(self.revoke_all, False, True) self.revoke_all.add_clicked_callback(self.revoke_all_schema_privs) self.save_button = newButton() self.save_button.set_text("Save Changes") bottom_box.add_end(self.save_button, False, True) self.save_button.add_clicked_callback(self.commit) self.revert_button = newButton() self.revert_button.set_text("Revert") bottom_box.add_end(self.revert_button, False, True) self.revert_button.add_clicked_callback(self.revert) priv_vbox.add(bottom_box, False, True) self.resume_layout()
def create_page(self, page_number): self.loading = True if page_number < 0 or page_number == 0: self.loading = False return if page_number not in self.pages: print "Unknown page number ", page_number self.loading = False return # page is a stored page data stored in self.pages in create_ui page = self.pages[page_number] if page.created == True: self.loading = False return page_content = page.page_content box = newBox(False) box.set_spacing(8) box.suspend_layout() # Actual option values from config file parsed by cfg_be, in form of list of tuples (<name>, <value>) options = self.cfg_be.get_options(self.section_ctrl.get_string_value()) opts_map = dict(options) for group in page_content['groups']: controls = group['controls'] number_of_controls = len(controls) if number_of_controls == 0: continue table = newTable() table.set_row_spacing(10) table.set_column_spacing(20) table.set_padding(5) table.suspend_layout() table.set_homogeneous(False) panel = newPanel(TitledBoxPanel) panel.add(table) panel.set_title(group['caption']) box.add(panel, False, True) table.set_row_count(number_of_controls) table.set_column_count(3) table_row = -1 # Counter to address table rows, as we may skip some control_idx. for control_idx in range(0, number_of_controls): ctrl_def = controls[control_idx] table_row += 1 name = ctrl_def['name'] # Handle aliases like server_id == server-id. We have only one form in # opts.opts, and that form comes from documentaion team's xml file. # However if user config file contains alias, we substitute the alias # instead of official option name to use for this WBA session. From now # on all operation with the option are done through alias. names = self.cfg_be.option_alt_names( name ) #(name, name.replace("-","_"), name.replace("_","-")) right_name = filter(lambda x: x in opts_map, names) if len(right_name) > 0: right_name = right_name[0] caption = ctrl_def.get('caption') if caption and name in caption: ctrl_def['caption'] = caption.replace(name, right_name) name = right_name ctrl_def['name'] = name ctrl_tupple = self.place_control(ctrl_def, table, table_row) label = newLabel(ctrl_def['description']) label.set_size(500, -1) label.set_wrap_text(True) label.set_style(SmallHelpTextStyle) table.add(label, 2, 3, table_row, table_row + 1, HFillFlag | VFillFlag) ctrl = ctrl_tupple[1] ctrl_def = ctrl_tupple[2] #load default value into control if ctrl is not None and ctrl_def is not None: ctrl[0].set_active(False) self.enabled_checkbox_click(name, False) if ctrl_def.has_key('default'): default = ctrl_def['default'] if default is not None: self.set_string_value_to_control( ctrl_tupple, str(default)) else: self.set_string_value_to_control(ctrl_tupple, "") #load control with values from config if name in opts_map: value = opts_map[name] self.enabled_checkbox_click(name, True) self.set_string_value_to_control(ctrl_tupple, value) # Remove empty rows table.set_row_count( table_row + 1) #number_of_controls - (number_of_controls - table_row)) table.resume_layout() page.panel.add(box) page.created = True box.resume_layout() self.loading = False
def __init__(self): mforms.Form.__init__(self, None, mforms.FormDialogFrame|mforms.FormResizable|mforms.FormMinimizable) self.set_title("Data Type Mapping for Generic Migration") content = mforms.newBox(False) self.set_content(content) content.set_padding(12) content.set_spacing(12) hbox = mforms.newBox(True) content.add(hbox, True, True) hbox.set_spacing(12) self._type_list = mforms.newTreeNodeView(mforms.TreeFlatList)#|mforms.TreeAllowReorderRows) self._type_list.set_size(200, -1) self._type_list.add_column(mforms.StringColumnType, "Type", 100, False) self._type_list.add_column(mforms.StringColumnType, "Target Type", 100, False) self._type_list.end_columns() self._type_list.add_changed_callback(self.selection_changed) hbox.add(self._type_list, False, True) detail_box = mforms.newBox(False) self.detail_box = detail_box hbox.add(detail_box, True, True) detail_box.set_spacing(12) ## spanel = mforms.newPanel(mforms.TitledBoxPanel) spanel.set_title("Source Data Type") stable = mforms.newTable() stable.set_padding(12) spanel.add(stable) stable.set_row_count(5) stable.set_column_count(2) stable.set_row_spacing(8) stable.set_column_spacing(4) stable.add(mforms.newLabel("Type Name:", True), 0, 1, 0, 1, mforms.HFillFlag) self._stype_entry = mforms.newTextEntry() self._stype_entry.add_changed_callback(self.save_changes) stable.add(self._stype_entry, 1, 2, 0, 1, mforms.HFillFlag|mforms.HExpandFlag) #self._stype_user_check = mforms.newCheckBox() #self._stype_user_check.set_text("Is user datatype") #stable.add(self._stype_user_check, 1, 2, 1, 2, mforms.HFillFlag|mforms.HExpandFlag) stable.add(mforms.newLabel("Type Category:", True), 0, 1, 2, 3, mforms.HFillFlag) self._sgroup_selector = mforms.newSelector() stable.add(self._sgroup_selector, 1, 2, 2, 3, mforms.HFillFlag|mforms.HExpandFlag) self._sgroup_selector.add_changed_callback(self.source_group_selected) stable.add(mforms.newLabel("Min. Length:", True), 0, 1, 3, 4, mforms.HFillFlag) self._sminlen_entry = mforms.newTextEntry() self._sminlen_entry.add_changed_callback(self.save_changes) stable.add(self._sminlen_entry, 1, 2, 3, 4, mforms.HFillFlag|mforms.HExpandFlag) stable.add(mforms.newLabel("Max. Length:", True), 0, 1, 4, 5, mforms.HFillFlag) self._smaxlen_entry = mforms.newTextEntry() self._smaxlen_entry.add_changed_callback(self.save_changes) stable.add(self._smaxlen_entry, 1, 2, 4, 5, mforms.HFillFlag|mforms.HExpandFlag) detail_box.add(spanel, False, True) ## tpanel = mforms.newPanel(mforms.TitledBoxPanel) tpanel.set_title("Target MySQL Data Type") ttable = mforms.newTable() ttable.set_padding(12) tpanel.add(ttable) ttable.set_row_count(4) ttable.set_column_count(2) ttable.set_row_spacing(8) ttable.set_column_spacing(4) ttable.add(mforms.newLabel("Target Type:", True), 0, 1, 0, 1, mforms.HFillFlag) self._ttype_selector = mforms.newSelector() self._ttype_selector.add_changed_callback(self.save_changes) ttable.add(self._ttype_selector, 1, 2, 0, 1, mforms.HFillFlag|mforms.HExpandFlag) def add_check_entry_row(table, row, label, name): check = mforms.newCheckBox() check.set_text(label) table.add(check, 0, 1, row, row+1, mforms.HFillFlag) entry = mforms.newTextEntry() entry.add_changed_callback(self.save_changes) table.add(entry, 1, 2, row, row+1, mforms.HFillFlag|mforms.HExpandFlag) setattr(self, name+"_check", check) setattr(self, name+"_entry", entry) entry.set_enabled(False) def callback(entry, check): if not check.get_active(): entry.set_value("-2") entry.set_enabled(check.get_active()) self.save_changes() check.add_clicked_callback(lambda: callback(entry, check)) add_check_entry_row(ttable, 1, "Override Length:", "_target_length") add_check_entry_row(ttable, 2, "Override Precision:", "_target_precision") add_check_entry_row(ttable, 3, "Override Scale:", "_target_scale") detail_box.add(tpanel, False, True) ## bbox = mforms.newBox(True) self._add_button = mforms.newButton() self._add_button.set_text("Add") bbox.add(self._add_button, False, True) self._add_button.add_clicked_callback(self.add_clicked) self._del_button = mforms.newButton() self._del_button.set_text("Delete") self._del_button.add_clicked_callback(self.del_clicked) bbox.add(self._del_button, False, True) self._ok_button = mforms.newButton() self._ok_button.set_text("OK") self._ok_button.add_clicked_callback(self.ok_clicked) self._cancel_button = mforms.newButton() self._cancel_button.set_text("Cancel") self._ok_button.add_clicked_callback(self.cancel_clicked) mforms.Utilities.add_end_ok_cancel_buttons(bbox, self._ok_button, self._cancel_button) content.add_end(bbox, False, True) bbox.set_spacing(12) self._del_button.set_enabled(False) self.set_size(700, 500)
def __init__(self, secman, user=""): mforms.Form.__init__(self, None, mforms.FormResizable | mforms.FormMinimizable) self.set_title("New Schema Privilege Definition") self.secman = secman box = newBox(False) box.set_padding(12) box.set_spacing(8) self.set_content(box) label = newLabel() label.set_text( "Select the Host and the Schema for which the user '%s'\nwill have the privileges you want to define." % user) box.add(label, False, True) panel = newPanel(mforms.TitledBoxPanel) panel.set_title("Host") box.add(panel, False, True) table = newTable() panel.add(table) table.set_padding(8) table.set_row_count(3) table.set_column_count(3) table.set_row_spacing(8) self.host1 = newRadioButton(mforms.RadioButton.new_id()) self.host1.set_active(True) self.host1.add_clicked_callback(self.host_radio_changed) self.host1.set_text("Any Host (%)") table.add(self.host1, 0, 1, 0, 1, mforms.HFillFlag) self.host2 = newRadioButton(self.host1.group_id()) self.host2.set_text("Hosts matching pattern or name:") self.host2.add_clicked_callback(self.host_radio_changed) table.add(self.host2, 0, 1, 1, 2, mforms.HFillFlag) self.host2entry = newTextEntry() table.add(self.host2entry, 1, 2, 1, 2, mforms.HFillFlag | mforms.HExpandFlag) self.host3 = newRadioButton(self.host1.group_id()) self.host3.set_text("Selected host:") self.host3.add_clicked_callback(self.host_radio_changed) table.add(self.host3, 0, 1, 2, 3, mforms.HFillFlag) self.host3sel = newSelector() table.add(self.host3sel, 1, 2, 2, 3, mforms.HFillFlag | mforms.HExpandFlag) hosts = [h for u, h in secman.account_names if u == user] self.host3sel.add_items(hosts) panel = newPanel(mforms.TitledBoxPanel) panel.set_title("Schema") box.add(panel, True, True) table = newTable() panel.add(table) table.set_padding(8) table.set_row_count(3) table.set_column_count(3) table.set_row_spacing(8) self.schema1 = newRadioButton(mforms.RadioButton.new_id()) self.schema1.set_active(True) self.schema1.add_clicked_callback(self.schema_radio_changed) self.schema1.set_text("Any Schema (%)") table.add(self.schema1, 0, 1, 0, 1, mforms.HFillFlag) self.schema2 = newRadioButton(self.schema1.group_id()) self.schema2.add_clicked_callback(self.schema_radio_changed) self.schema2.set_text("Schemas matching pattern or name:") table.add(self.schema2, 0, 1, 1, 2, mforms.HFillFlag) self.schema2entry = newTextEntry() table.add(self.schema2entry, 1, 2, 1, 2, mforms.HFillFlag | mforms.HExpandFlag) self.schema3 = newRadioButton(self.schema1.group_id()) self.schema3.add_clicked_callback(self.schema_radio_changed) self.schema3.set_text("Selected schema:") table.add(self.schema3, 0, 1, 2, 3, mforms.HFillFlag) self.schema3sel = newListBox(False) table.add( self.schema3sel, 1, 2, 2, 3, mforms.HFillFlag | mforms.HExpandFlag | mforms.VFillFlag | mforms.VExpandFlag) self.schema3sel.add_items(self.secman.schema_names) bbox = newBox(True) box.add(bbox, False, True) bbox.set_spacing(8) self.ok = newButton() self.ok.set_text("OK") bbox.add_end(self.ok, False, True) self.cancel = newButton() self.cancel.set_text("Cancel") bbox.add_end(self.cancel, False, True) self.set_size(450, 500) self.host_radio_changed() self.schema_radio_changed() self.center()
def create_ui(self): self.content.set_spacing(4) self.content.add(mforms.newLabel("Review and edit migrated objects. You can manually edit the generated SQL before applying them to the target database."), False, True) hbox = mforms.newBox(True) self.tree_head_label = mforms.newLabel("Migrated Objects") hbox.add(self.tree_head_label, False, False) self._filter = mforms.newSelector() self._filter.add_items(["Migration Problems", "All Objects", "Column Mappings"]) self._filter.add_changed_callback(self._filter_changed) hbox.add_end(self._filter, False, True) hbox.add_end(mforms.newLabel("View:"), False, False) self.content.add(hbox, False, True) self._no_errors_text = "No migration problems found. %d warning(s).\nUse the View pulldown menu to review all objects." self._no_errors = mforms.newLabel('') # Label text will be set later when the warning count is calculated self._no_errors.set_style(mforms.BigStyle) self._no_errors.set_text_align(mforms.MiddleLeft) self.content.add(self._no_errors, True, True) self._tree = mforms.newTreeView(mforms.TreeDefault) self._tree.add_column(mforms.IconStringColumnType, "Source Object", 200, False) self._tree.add_column(mforms.IconStringColumnType, "Target Object", 200, True) self._tree.add_column(mforms.IconStringColumnType, "Migration Message", 300, False) self._tree.end_columns() self._tree.add_changed_callback(self._selection_changed) self.content.add(self._tree, True, True) self._tree.set_cell_edited_callback(self._cell_edited) self._all_menu = mforms.newContextMenu() self._all_menu.add_will_show_callback(self.all_menu_will_show) self._all_menu.add_check_item_with_title("Skip Object", self.skip_object, "skip_object") self._tree.set_context_menu(self._all_menu) self._columns = mforms.newTreeView(mforms.TreeShowColumnLines|mforms.TreeShowRowLines|mforms.TreeFlatList) self.COL_SOURCE_SCHEMA = self._columns.add_column(mforms.StringColumnType, "Source Schema", 100, False) self.COL_SOURCE_TABLE = self._columns.add_column(mforms.IconStringColumnType, "Source Table", 100, False) self.COL_SOURCE_COLUMN = self._columns.add_column(mforms.IconStringColumnType, "Source Column", 100, False) self.COL_SOURCE_TYPE = self._columns.add_column(mforms.StringColumnType, "Source Type", 100, False) self.COL_SOURCE_FLAGS = self._columns.add_column(mforms.StringColumnType, "Source Flags", 100, False) self.COL_SOURCE_NOTNULL = self._columns.add_column(mforms.CheckColumnType, "NN", 25, False) self.COL_SOURCE_DEFAULT = self._columns.add_column(mforms.StringColumnType, "Source Default Value", 100, False) self.COL_SOURCE_COLLATION = self._columns.add_column(mforms.StringColumnType, "Source Collation", 100, False) self.COL_TARGET_SCHEMA = self._columns.add_column(mforms.StringColumnType, "Target Schema", 100, False) self.COL_TARGET_TABLE = self._columns.add_column(mforms.IconStringColumnType, "Target Table", 100, False) self.COL_TARGET_COLUMN = self._columns.add_column(mforms.IconStringColumnType, "Target Column", 100, True) self.COL_TARGET_TYPE = self._columns.add_column(mforms.StringColumnType, "Target Type", 100, True) self.COL_TARGET_FLAGS = self._columns.add_column(mforms.StringColumnType, "Target Flags", 100, True) self.COL_TARGET_AI = self._columns.add_column(mforms.CheckColumnType, "AI", 25, True) self.COL_TARGET_NOTNULL = self._columns.add_column(mforms.CheckColumnType, "NN", 25, True) self.COL_TARGET_DEFAULT = self._columns.add_column(mforms.StringColumnType, "Target Default Value", 100, True) self.COL_TARGET_COLLATION = self._columns.add_column(mforms.StringColumnType, "Target Collation", 100, True) self.COL_MESSAGE = self._columns.add_column(mforms.IconStringColumnType, "Migration Message", 300, False) self._columns.end_columns() self._columns.set_allow_sorting(True) self._columns.set_selection_mode(mforms.TreeSelectMultiple) self._columns.add_changed_callback(self._selection_changed) self.content.add(self._columns, True, True) self._columns.set_cell_edited_callback(self._columns_cell_edited) self._columns.show(False) self._menu = mforms.newContextMenu() self._menu.add_will_show_callback(self.menu_will_show) self._menu.add_item_with_title("Set Target Type of Selected Columns...", self.set_target_type, "set_target_type") self._menu.add_item_with_title("Find and Replace Target Type...", self.replace_target_type, "replace_target_type") self._menu.add_item_with_title("Find and Replace Target Flags...", self.replace_target_flags, "replace_target_flags") self._menu.add_item_with_title("Find and Replace Target Default Value...", self.replace_target_default_value, "replace_target_default_value") self._menu.add_item_with_title("Find and Replace Target Collation...", self.replace_target_collation, "replace_target_collation") self._columns.set_context_menu(self._menu) self.help_label = mforms.newLabel("You can rename target schemas and tables, and change column definitions by clicking them once selected.") self.help_label.set_style(mforms.SmallStyle) self.content.add(self.help_label, False, True) self._advbox = mforms.newPanel(mforms.TitledBoxPanel) self._advbox.set_title("SQL CREATE Script for Selected Object") box = mforms.newBox(True) self._code = mforms.newCodeEditor() self._code.set_language(mforms.LanguageMySQL) self._code.add_changed_callback(self._code_changed) box.add(self._code, True, True) vbox = mforms.newBox(False) vbox.set_padding(12) vbox.set_spacing(8) self._lock_check = mforms.newCheckBox() self._lock_check.set_text("Lock edited SQL") self._lock_check.set_tooltip("Lock the SQL code to the edited one, preventing automatic regenerations from discarding changes made directly to the SQL script.") self._lock_check.add_clicked_callback(self._lock_clicked) vbox.add(self._lock_check, False, True) self._comment_check = mforms.newCheckBox() self._comment_check.set_text("Comment out") self._comment_check.set_tooltip("Mark the object to be commented out on the generated script, making it not get created in the target server.") self._comment_check.add_clicked_callback(self._comment_clicked) vbox.add(self._comment_check, False, True) self._sql_outdated_label = mforms.newLabel("Code is outdated") self._sql_outdated_label.show(False) self._sql_outdated_label.set_tooltip("The locked SQL code seems to be outdated compared to a newer, automatically generated one. Unlocking the object will update it, but your changes will be lost.") vbox.add(self._sql_outdated_label, False, True) self._revert_btn = mforms.newButton() self._revert_btn.set_text("Discard Changes") vbox.add_end(self._revert_btn, False, True) self._revert_btn.add_clicked_callback(self._discard_clicked) self._apply_btn = mforms.newButton() self._apply_btn.set_text("Apply Changes") vbox.add_end(self._apply_btn, False, True) self._apply_btn.add_clicked_callback(self._apply_clicked) box.add(vbox, False, True) self._advbox.add(box) self._advbox.set_size(-1, 200) self._advbox_shown = True self.go_advanced() # toggle to hide self.content.add(self._advbox, False, True) self._filter_errors = False self._filter_changed()
def __init__(self, server_profile, ctrl_be, monitor): mforms.Box.__init__(self, True) # True - vertical layout self.tasks_side = newTaskSidebar() self.content_box = newBox(False) self.tasks_side.set_selection_color(mforms.SystemColorHighlight) self.tabs = [] self.name2page = {} self.config_ui = None self.closing = False self.tabview = newTabView(True) self.ctrl_be = ctrl_be self.old_active_tab = None self.server_profile = server_profile self.refresh_tasks_sleep_time = 2 self.ui_profile = UIProfile(server_profile) # Setup self self.set_managed() self.set_release_on_add() self.ui_profile.apply_style(self, "main") if server_profile.host_os == wbaOS.windows: side_panel = newPanel(mforms.StyledHeaderPanel) side_panel.set_title(" Task and Object Browser") side_panel.add(self.tasks_side) self.add(side_panel, False, True) self.content_panel = newPanel(mforms.StyledHeaderPanel) self.content_panel.set_title(" Task and Object Browser") self.content_panel.add(self.content_box) self.add(self.content_panel, True, True) else: vbox = newBox(False) vbox.add(self.tasks_side, True, True) self.add(vbox, False, False) vbox = newBox(False) self.content_label = newHeaderLabel("") self.ui_profile.apply_style(self.content_label, 'content-label') vbox.add(self.content_label, False, False) vbox.add(self.content_box, True, True) self.add(vbox, True, True) self.ctrl_be.add_me_for_event("server_started", self) self.ctrl_be.add_me_for_event("server_stopped", self) # Setup tasks sidebar self.fill_task_sidebar() self.tasks_side.add_on_section_command_callback(self.section_clicked) self.tasks_side.show() self.tasks_side.set_size(220, -1) # Setup content box self.content_box.add(self.tabview, True, True) # Retrieve from server the log file paths if exist status = self.ctrl_be.is_server_running(verbose=0) if status in ['stopped', 'unknown'] and not all([ self.server_profile. general_log_file_path, # only proceed to parse the config file if self.server_profile. slow_log_file_path, # any of these is missing self.server_profile.error_log_file_path, self.server_profile.log_output ]): cfg_be = wb_admin_config_file_be.WbAdminConfigFileBE( self.server_profile, self.ctrl_be) cfg_be.open_configuration_file( self.server_profile.config_file_path) options = dict( cfg_be.get_options(self.server_profile.config_file_section)) if not self.server_profile.log_output and options.has_key( 'log-output'): self.server_profile.log_ouput = options['log-output'] if not self.server_profile.general_log_file_path: path = options['general_log_file'] if options.has_key( 'general_log_file') else ( options['log'] if options.has_key('log') else '' ) # the 'log' option is deprecated but still allowed if path: self.server_profile.general_log_file_path = path.strip('"') if not self.server_profile.slow_log_file_path: path = options['slow_query_log_file'] if options.has_key( 'slow_query_log_file' ) else ( options['log-slow-queries'] if options.has_key('log-slow-queries') else '' ) # the 'log-slow-queries' option is deprecated but still allowed if path: self.server_profile.slow_log_file_path = path.strip('"') if not self.server_profile.error_log_file_path and options.has_key( 'log-error'): self.server_profile.error_log_file_path = options[ 'log-error'].strip('"') # Create content pages self.server_status_page = ServerStatusPage(server_profile, ctrl_be, self) self.config_ui = WbAdminConfigFileUI(server_profile=server_profile, ctrl_be=ctrl_be, main_view=self) self.startup = WbAdminConfigurationStartup(ctrl_be, server_profile, self) self.security = WbAdminSecurity(self.ctrl_be, server_profile, self) self.variables = WbAdminVariables(self.ctrl_be, server_profile, self) self.logs = WbAdminLogs(self.ctrl_be, server_profile, self) self.dump = WbAdminExport(server_profile, self.ctrl_be, self) self.restore = WbAdminImport(server_profile, self.ctrl_be, self) self.init_extensions(server_profile, self.ctrl_be) Utilities.add_timeout(0.5, weakcb(self, "timeout")) self.timeout_thread = threading.Thread( target=self.refresh_tasks_thread) self.timeout_thread.setDaemon(True) self.timeout_thread.start() self.tabview.add_tab_changed_callback(self.tab_changed) self.timeout( ) # will call self.connect_mysql() and check if mysql is running self.ctrl_be.continue_events( ) # Process events which are queue during init dprint_ex(1, "WBA init complete") self.tasks_side.select_entry("MANAGEMENT", "Server Status") self.server_status_page.page_activated()
def __init__(self): mforms.Form.__init__( self, None, mforms.FormDialogFrame | mforms.FormResizable | mforms.FormMinimizable) self.set_title("Data Type Mapping for Generic Migration") content = mforms.newBox(False) self.set_content(content) content.set_padding(12) content.set_spacing(12) hbox = mforms.newBox(True) content.add(hbox, True, True) hbox.set_spacing(12) self._type_list = mforms.newTreeView( mforms.TreeFlatList) #|mforms.TreeAllowReorderRows) self._type_list.set_size(200, -1) self._type_list.add_column(mforms.StringColumnType, "Type", 100, False) self._type_list.add_column(mforms.StringColumnType, "Target Type", 100, False) self._type_list.end_columns() self._type_list.add_changed_callback(self.selection_changed) hbox.add(self._type_list, False, True) detail_box = mforms.newBox(False) self.detail_box = detail_box hbox.add(detail_box, True, True) detail_box.set_spacing(12) ## spanel = mforms.newPanel(mforms.TitledBoxPanel) spanel.set_title("Source Data Type") stable = mforms.newTable() stable.set_padding(12) spanel.add(stable) stable.set_row_count(5) stable.set_column_count(2) stable.set_row_spacing(8) stable.set_column_spacing(4) stable.add(mforms.newLabel("Type Name:", True), 0, 1, 0, 1, mforms.HFillFlag) self._stype_entry = mforms.newTextEntry() self._stype_entry.add_changed_callback(self.save_changes) stable.add(self._stype_entry, 1, 2, 0, 1, mforms.HFillFlag | mforms.HExpandFlag) #self._stype_user_check = mforms.newCheckBox() #self._stype_user_check.set_text("Is user datatype") #stable.add(self._stype_user_check, 1, 2, 1, 2, mforms.HFillFlag|mforms.HExpandFlag) stable.add(mforms.newLabel("Type Category:", True), 0, 1, 2, 3, mforms.HFillFlag) self._sgroup_selector = mforms.newSelector() stable.add(self._sgroup_selector, 1, 2, 2, 3, mforms.HFillFlag | mforms.HExpandFlag) self._sgroup_selector.add_changed_callback(self.source_group_selected) stable.add(mforms.newLabel("Min. Length:", True), 0, 1, 3, 4, mforms.HFillFlag) self._sminlen_entry = mforms.newTextEntry() self._sminlen_entry.add_changed_callback(self.save_changes) stable.add(self._sminlen_entry, 1, 2, 3, 4, mforms.HFillFlag | mforms.HExpandFlag) stable.add(mforms.newLabel("Max. Length:", True), 0, 1, 4, 5, mforms.HFillFlag) self._smaxlen_entry = mforms.newTextEntry() self._smaxlen_entry.add_changed_callback(self.save_changes) stable.add(self._smaxlen_entry, 1, 2, 4, 5, mforms.HFillFlag | mforms.HExpandFlag) detail_box.add(spanel, False, True) ## tpanel = mforms.newPanel(mforms.TitledBoxPanel) tpanel.set_title("Target MySQL Data Type") ttable = mforms.newTable() ttable.set_padding(12) tpanel.add(ttable) ttable.set_row_count(4) ttable.set_column_count(2) ttable.set_row_spacing(8) ttable.set_column_spacing(4) ttable.add(mforms.newLabel("Target Type:", True), 0, 1, 0, 1, mforms.HFillFlag) self._ttype_selector = mforms.newSelector() self._ttype_selector.add_changed_callback(self.save_changes) ttable.add(self._ttype_selector, 1, 2, 0, 1, mforms.HFillFlag | mforms.HExpandFlag) def add_check_entry_row(table, row, label, name): check = mforms.newCheckBox() check.set_text(label) table.add(check, 0, 1, row, row + 1, mforms.HFillFlag) entry = mforms.newTextEntry() entry.add_changed_callback(self.save_changes) table.add(entry, 1, 2, row, row + 1, mforms.HFillFlag | mforms.HExpandFlag) setattr(self, name + "_check", check) setattr(self, name + "_entry", entry) entry.set_enabled(False) def callback(entry, check): if not check.get_active(): entry.set_value("-2") entry.set_enabled(check.get_active()) self.save_changes() check.add_clicked_callback(lambda: callback(entry, check)) add_check_entry_row(ttable, 1, "Override Length:", "_target_length") add_check_entry_row(ttable, 2, "Override Precision:", "_target_precision") add_check_entry_row(ttable, 3, "Override Scale:", "_target_scale") detail_box.add(tpanel, False, True) ## bbox = mforms.newBox(True) self._add_button = mforms.newButton() self._add_button.set_text("Add") bbox.add(self._add_button, False, True) self._add_button.add_clicked_callback(self.add_clicked) self._del_button = mforms.newButton() self._del_button.set_text("Delete") self._del_button.add_clicked_callback(self.del_clicked) bbox.add(self._del_button, False, True) self._ok_button = mforms.newButton() self._ok_button.set_text("OK") self._ok_button.add_clicked_callback(self.ok_clicked) self._cancel_button = mforms.newButton() self._cancel_button.set_text("Cancel") self._ok_button.add_clicked_callback(self.cancel_clicked) mforms.Utilities.add_end_ok_cancel_buttons(bbox, self._ok_button, self._cancel_button) content.add_end(bbox, False, True) bbox.set_spacing(12) self._del_button.set_enabled(False) self.set_size(700, 500)
def __init__(self, main): WizardPage.__init__(self, main, "Data Transfer Setup") self.main.add_wizard_page(self, "DataMigration", "Data Transfer Setup") label = mforms.newLabel( "Select options for the copy of the migrated schema tables in the target MySQL server and click [Next >] to execute." ) self.content.add(label, False, True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Data Copy") self.content.add(panel, False, True) box = mforms.newBox(False) panel.add(box) box.set_padding(16) box.set_spacing(16) rid = mforms.RadioButton.new_id() self._copy_db = mforms.newRadioButton(rid) self._copy_db.set_text("Online copy of table data to target RDBMS") self._copy_db.add_clicked_callback(self._script_radio_option_callback) box.add(self._copy_db, False, True) # XXX TODO # box.add(mforms.newLabel(""), False, True) # self._add_script_checkbox_option(box, "dump_to_file", "Create a dump file with the data", "Dump File:", "Save As") if sys.platform == "win32": self._add_script_radiobutton_option( box, "copy_script", "Create a batch file to copy the data at another time", "Batch File:", "Save As", "You should edit this file to add the source and target server passwords before running it.", rid, ) else: self._add_script_radiobutton_option( box, "copy_script", "Create a shell script to copy the data from outside Workbench", "Shell Script File:", "Save As", "You should edit this file to add the source and target server passwords before running it.", rid, ) self._add_script_radiobutton_option( box, "bulk_copy_script", "Create a shell script to use native server dump and load abilities for fast migration", "Bulk Data Copy Script:", "Save As", "Edit the generated file and change passwords at the top of the generated script.\nRun it on the source server to create a zip package containing a data dump as well as a load script.\nCopy this to the target server, extract it, and run the import script. See the script output for further details.", rid, ) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Options") self.content.add(panel, False, True) self.options_box = mforms.newBox(False) self.options_box.set_padding(12) self.options_box.set_spacing(8) panel.add(self.options_box) self._truncate_db = mforms.newCheckBox() self._truncate_db.set_text("Truncate target tables (i.e. delete contents) before copying data") self.options_box.add(self._truncate_db, False, True) hbox = mforms.newBox(True) hbox.set_spacing(16) hbox.add(mforms.newLabel("Worker tasks"), False, True) self._worker_count = mforms.newTextEntry() self._worker_count.set_value("2") self._worker_count.set_size(30, -1) hbox.add(self._worker_count, False, True) l = mforms.newImageBox() l.set_image(mforms.App.get().get_resource_path("mini_notice.png")) l.set_tooltip( "Number of tasks to use for data transfer. Each task will open a " + "connection to both source and target RDBMSes to copy table rows.\nDefault value 2." ) hbox.add(l, False, True) self.options_box.add(hbox, False, True) self._debug_copy = mforms.newCheckBox() self._debug_copy.set_text("Enable debug output for table copy") self.options_box.add(self._debug_copy, False, True) ### self._advanced_panel = mforms.newPanel(mforms.TitledBoxPanel) self._advanced_panel.set_title("Tables to Copy") self.content.add(self._advanced_panel, True, True) box = mforms.newBox(False) box.set_padding(12) box.set_spacing(8) l = mforms.newLabel( """You can limit the number of rows to be copied for certain tables. Tables that are referenced by foreign keys from other tables cannot be limited, unless data copy from the referencing tables is also disabled. All tables are copied by default.""" ) l.set_style(mforms.SmallHelpTextStyle) box.add(l, False, True) self._tree = mforms.newTreeNodeView(mforms.TreeDefault) self._tree.add_column(mforms.IconStringColumnType, "Table", 200, False) self._tree.add_column(mforms.StringColumnType, "Limit Copy", 100, True) self._tree.add_column(mforms.StringColumnType, "Referencing Tables", 500, False) self._tree.end_columns() box.add(self._tree, True, True) self._advanced_panel.add(box) self._tree.set_cell_edited_callback(self._cell_edited) self._advbox_shown = False self._advanced_panel.show(False)
def __init__(self, server_profile, ctrl_be, monitor): mforms.Box.__init__(self, True) # True - vertical layout self.tasks_side = newTaskSidebar() self.content_box = newBox(False) self.tasks_side.set_selection_color(mforms.SystemHighlight) self.tabs = [] self.name2page = {} self.config_ui = None self.closing = False self.tabview = newTabView(True) self.ctrl_be = ctrl_be self.old_active_tab = None self.server_profile = server_profile self.refresh_tasks_sleep_time = 2 self.ui_profile = UIProfile(server_profile) # Setup self self.set_managed() self.ui_profile.apply_style(self, "main") if server_profile.host_os == wbaOS.windows: side_panel = newPanel(mforms.StyledHeaderPanel) side_panel.set_title(" Task and Object Browser") side_panel.add(self.tasks_side) self.add(side_panel, False, True) self.content_panel = newPanel(mforms.StyledHeaderPanel) self.content_panel.set_title(" Task and Object Browser") self.content_panel.add(self.content_box) self.add(self.content_panel, True, True) else: vbox = newBox(False) vbox.add(self.tasks_side, True, True) self.add(vbox, False, False) vbox = newBox(False) self.content_label = newHeaderLabel("") self.ui_profile.apply_style(self.content_label, 'content-label') vbox.add(self.content_label, False, False) vbox.add(self.content_box, True, True) self.add(vbox, True, True) self.ctrl_be.add_me_for_event("server_started", self) self.ctrl_be.add_me_for_event("server_stopped", self) # Setup tasks sidebar self.fill_task_sidebar() self.tasks_side.add_on_section_command_callback(self.section_clicked) self.tasks_side.show() self.tasks_side.set_size(220, -1) # Setup content box self.content_box.add(self.tabview, True, True) # Create content pages self.server_status_page = ServerStatusPage(server_profile, ctrl_be, self) self.config_ui = WbAdminConfigFileUI(server_profile=server_profile, ctrl_be=ctrl_be, main_view=self) self.startup = WbAdminConfigurationStartup(ctrl_be, server_profile, self) self.security = WbAdminSecurity(self.ctrl_be, server_profile, self) self.variables = WbAdminVariables(self.ctrl_be, server_profile, self) self.logs = WbAdminLogs(self.ctrl_be, server_profile, self) self.dump = WbAdminExport(server_profile, self.ctrl_be, self) Utilities.add_timeout(0.5, weakcb(self, "timeout")) self.timeout_thread = threading.Thread( target=self.refresh_tasks_thread) self.timeout_thread.setDaemon(True) self.timeout_thread.start() self.tabview.add_tab_changed_callback(self.tab_changed) self.timeout( ) # will call self.connect_mysql() and check if mysql is running self.ctrl_be.continue_events( ) # Process events which are queue during init dprint_ex(1, "WBA init complete") self.tasks_side.select_entry("MANAGEMENT", "Server Status") self.server_status_page.page_activated()
def create_ui(self): self.set_spacing(16) format_box = mforms.newBox(True) format_box.set_spacing(8) format_box.add(mforms.newLabel("Detected file format: %s" % self.input_file_type), False, True) if len(self.active_module.options) != 0: advanced_opts_btn = mforms.newButton(mforms.ToolButton) advanced_opts_btn.set_icon(mforms.App.get().get_resource_path("admin_option_file.png")) advanced_opts_btn.add_clicked_callback(lambda: self.optpanel.show(False) if self.optpanel.is_shown() else self.optpanel.show(True) ) format_box.add(advanced_opts_btn, False, True) self.content.add(format_box, False, True) if len(self.active_module.options) != 0: self.optpanel = mforms.newPanel(mforms.TitledBoxPanel) self.optpanel.set_title("Options:") def set_text_entry(field, output): txt = field.get_string_value().encode('utf-8').strip() if len(txt) == 0: operator.setitem(output, 'value', None) mforms.Utilities.add_timeout(0.1, self.call_create_preview_table) elif len(txt) == 1: operator.setitem(output, 'value', txt) mforms.Utilities.add_timeout(0.1, self.call_create_preview_table) else: field.set_value("") mforms.Utilities.show_error("Import Wizard", "Due to the nature of this wizard, you can't use unicode characters in this place, as only one character is allowed.","Ok","","") def set_selector_entry(selector, output): operator.setitem(output, 'value', output['opts'][str(selector.get_string_value())]) mforms.Utilities.add_timeout(0.1, self.call_create_preview_table) box = mforms.newBox(False) box.set_spacing(8) box.set_padding(8) for name, opts in self.active_module.options.iteritems(): label_box = mforms.newBox(True) label_box.set_spacing(8) label_box.add(mforms.newLabel(opts['description']), False, True) if opts['type'] == 'text': opt_val = mforms.newTextEntry() opt_val.set_size(35, -1) opt_val.set_value(opts['value']) opt_val.add_changed_callback(lambda field = opt_val, output = opts: set_text_entry(field, output)) label_box.add_end(opt_val, False, True) self.opts_mapping[name] = lambda val: opt_val.set_value(val) if opts['type'] == 'select': opt_val = mforms.newSelector() opt_val.set_size(75, -1) opt_val.add_items([v for v in opts['opts']]) opt_val.set_selected(opts['opts'].values().index(opts['value'])) opt_val.add_changed_callback(lambda selector = opt_val, output = opts: set_selector_entry(selector, output)) self.opts_mapping[name] = lambda input, values = opts['opts'].values(): opt_val.set_selected(values.index(input) if input in values else 0) label_box.add_end(opt_val, False, True) box.add(label_box, False, True) self.optpanel.add(box) self.content.add(self.optpanel, False, True) self.optpanel.show(False) if self.input_file_type == 'csv': # We show encoding box only for csv as json can be only utf-8, utf-16 according to rfc self.encoding_box = mforms.newBox(True) self.encoding_box.set_spacing(16) self.encoding_box.add(mforms.newLabel("Encoding: "), False, True) self.encoding_sel = mforms.newSelector() self.encoding_sel.set_size(250, -1) self.encoding_box.add(self.encoding_sel, False, True) for i,e in enumerate(self.encoding_list): self.encoding_sel.add_item(e) if self.encoding_list[e] == 'utf-8': self.encoding_sel.set_selected(i) self.encoding_sel.add_changed_callback(self.encoding_changed) self.content.add(self.encoding_box, False, True) self.table_preview_box = mforms.newBox(False) self.table_preview_box.set_spacing(16) self.preview_table = None self.content.add(self.table_preview_box, True, True) self.column_caption = mforms.newPanel(mforms.BorderedPanel) self.column_caption.set_title("Columns:") self.column_caption.set_size(-1, 100) self.column_scroll = mforms.newScrollPanel(0) self.column_caption.add(self.column_scroll) self.table_preview_box.add(self.column_caption, True, True) extra_opts = mforms.newBox(False) extra_opts.set_spacing(16) self.ds_box = mforms.newBox(True) self.ds_box.set_spacing(8) extra_opts.add(self.ds_box, False, True) self.df_box = mforms.newBox(True) self.df_box.set_spacing(8) extra_opts.add_end(self.df_box, False, True) self.ds_box.add(mforms.newLabel("Decimal Separator:"), False, True) self.ds_entry = mforms.newTextEntry() self.ds_entry.set_value('.') self.ds_entry.set_size(30, -1) self.ds_box.add(self.ds_entry, False, True) self.ds_box.show(False) self.df_box.add(self.make_label_with_tooltip("Date format: ", "Expects string pattern with the date format.\n" "Default format is: %Y-%m-%d %H:%M:%S\n" "\nCommon used options:\n" "\t%d is the day number\n" "\t%m is the month number\n" "\t%y is the four digits year number\n" "\t%H is the hour number\n" "\t%M is the minute number\n" "\t%S is the second number\n\n" "More formats can be found under the following location:\n" "https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior"), False, True) self.df_entry = mforms.newTextEntry() self.df_entry.set_value("%Y-%m-%d %H:%M:%S") self.df_entry.set_size(200, -1) self.df_box.add(self.df_entry, False, True) self.df_box.show(False) self.content.add_end(extra_opts, False, True)
def __init__(self, main): WizardPage.__init__(self, main, "Data Transfer Setup") self.main.add_wizard_page(self, "DataMigration", "Data Transfer Setup") label = mforms.newLabel( "Select options for the copy of the migrated schema tables in the target MySQL server and click [Next >] to execute." ) self.content.add(label, False, True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Data Copy") self.content.add(panel, False, True) box = mforms.newBox(False) panel.add(box) box.set_padding(16) box.set_spacing(16) rid = mforms.RadioButton.new_id() self._copy_db = mforms.newRadioButton(rid) self._copy_db.set_text("Online copy of table data to target RDBMS") self._copy_db.add_clicked_callback(self._script_radio_option_callback) box.add(self._copy_db, False, True) # XXX TODO #box.add(mforms.newLabel(""), False, True) #self._add_script_checkbox_option(box, "dump_to_file", "Create a dump file with the data", "Dump File:", "Save As") if sys.platform == "win32": self._add_script_radiobutton_option( box, "copy_script", "Create a batch file to copy the data at another time", "Batch File:", "Save As", "You should edit this file to add the source and target server passwords before running it.", rid) else: self._add_script_radiobutton_option( box, "copy_script", "Create a shell script to copy the data from outside Workbench", "Shell Script File:", "Save As", "You should edit this file to add the source and target server passwords before running it.", rid) self._add_script_radiobutton_option( box, "bulk_copy_script", "Create a shell script to use native server dump and load abilities for fast migration", "Bulk Data Copy Script:", "Save As", "Edit the generated file and change passwords at the top of the generated script.\nRun it on the source server to create a zip package containing a data dump as well as a load script.\nCopy this to the target server, extract it, and run the import script. See the script output for further details.", rid) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Options") self.content.add(panel, False, True) self.options_box = mforms.newBox(False) self.options_box.set_padding(12) self.options_box.set_spacing(8) panel.add(self.options_box) self._truncate_db = mforms.newCheckBox() self._truncate_db.set_text( "Truncate target tables (i.e. delete contents) before copying data" ) self.options_box.add(self._truncate_db, False, True) hbox = mforms.newBox(True) hbox.set_spacing(16) hbox.add(mforms.newLabel("Worker tasks"), False, True) self._worker_count = mforms.newTextEntry() self._worker_count.set_value("2") self._worker_count.set_size(30, -1) hbox.add(self._worker_count, False, True) l = mforms.newImageBox() l.set_image(mforms.App.get().get_resource_path("mini_notice.png")) l.set_tooltip( "Number of tasks to use for data transfer. Each task will open a " + "connection to both source and target RDBMSes to copy table rows.\nDefault value 2." ) hbox.add(l, False, True) self.options_box.add(hbox, False, True) self._debug_copy = mforms.newCheckBox() self._debug_copy.set_text("Enable debug output for table copy") self.options_box.add(self._debug_copy, False, True) self._driver_sends_utf8 = mforms.newCheckBox() self._driver_sends_utf8.set_text( "Driver sends data already encoded as UTF-8.") self.options_box.add(self._driver_sends_utf8, False, True) ### self._advanced_panel = mforms.newPanel(mforms.TitledBoxPanel) self._advanced_panel.set_title("Tables to Copy") self.content.add(self._advanced_panel, True, True) box = mforms.newBox(False) box.set_padding(12) box.set_spacing(8) l = mforms.newLabel( """You can limit the number of rows to be copied for certain tables. Tables that are referenced by foreign keys from other tables cannot be limited, unless data copy from the referencing tables is also disabled. All tables are copied by default.""") l.set_style(mforms.SmallHelpTextStyle) box.add(l, False, True) self._tree = mforms.newTreeNodeView(mforms.TreeDefault) self._tree.add_column(mforms.IconStringColumnType, "Table", 200, False) self._tree.add_column(mforms.StringColumnType, "Limit Copy", 100, True) self._tree.add_column(mforms.StringColumnType, "Referencing Tables", 500, False) self._tree.end_columns() box.add(self._tree, True, True) self._advanced_panel.add(box) self._tree.set_cell_edited_callback(self._cell_edited) self._advbox_shown = False self._advanced_panel.show(False)
def create_page(self, page_number): self.loading = True if page_number < 0 or page_number == 0: self.loading = False return if page_number not in self.pages: print "Unknown page number ", page_number self.loading = False return # page is a stored page data stored in self.pages in create_ui page = self.pages[page_number] if page.created == True: self.loading = False return page_content = page.page_content box = newBox(False) box.set_spacing(8) box.suspend_layout() # Actual option values from config file parsed by cfg_be, in form of list of tuples (<name>, <value>) options = self.cfg_be.get_options(self.section_ctrl.get_string_value()) opts_map = dict(options) for group in page_content['groups']: controls = group['controls'] number_of_controls = len(controls) if number_of_controls == 0: continue table = newTable() table.set_row_spacing(10) table.set_column_spacing(20) table.set_padding(5) table.suspend_layout() table.set_homogeneous(False) panel = newPanel(TitledBoxPanel) panel.add(table) panel.set_title(group['caption']) box.add(panel, False, True) table.set_row_count(number_of_controls) table.set_column_count(3) table_row = -1 # Counter to address table rows, as we may skip some control_idx. for control_idx in range(0, number_of_controls): ctrl_def = controls[control_idx] table_row += 1 name = ctrl_def['name'] # Handle aliases like server_id == server-id. We have only one form in # opts.opts, and that form comes from documentaion team's xml file. # However if user config file contains alias, we substitute the alias # instead of official option name to use for this WBA session. From now # on all operation with the option are done through alias. names = self.cfg_be.option_alt_names(name) #(name, name.replace("-","_"), name.replace("_","-")) right_name = filter(lambda x: x in opts_map, names) if len(right_name) > 0: right_name = right_name[0] caption = ctrl_def.get('caption') if caption and name in caption: ctrl_def['caption'] = caption.replace(name, right_name) name = right_name ctrl_def['name'] = name ctrl_tupple = self.place_control(ctrl_def, table, table_row) label = newLabel(ctrl_def['description']) label.set_size(500, -1) label.set_wrap_text(True) label.set_style(SmallHelpTextStyle) table.add(label, 2, 3, table_row, table_row + 1, HFillFlag | VFillFlag) ctrl = ctrl_tupple[1] ctrl_def = ctrl_tupple[2] #load default value into control if ctrl is not None and ctrl_def is not None: ctrl[0].set_active(False) self.enabled_checkbox_click(name, False) if ctrl_def.has_key('default'): default = ctrl_def['default'] if default is not None: self.set_string_value_to_control(ctrl_tupple, str(default)) else: self.set_string_value_to_control(ctrl_tupple, "") #load control with values from config if name in opts_map: value = opts_map[name] self.enabled_checkbox_click(name, True) self.set_string_value_to_control(ctrl_tupple, value) # Remove empty rows table.set_row_count(table_row+1)#number_of_controls - (number_of_controls - table_row)) table.resume_layout() page.panel.add(box) page.created = True box.resume_layout() self.loading = False
def __init__(self, main): WizardPage.__init__(self, main, "Create Target Results", wide=True) self.main.add_wizard_page(self, "ObjectMigration", "Create Target Results") text = """Scripts to create the target schema were executed. No data has been migrated yet. Review the creation report below for errors or warnings. If there are any errors, you can manually fix the scripts and click [Recreate Objects] to retry the schema creation or return to the Manual Editing page to correct them there and retry the target creation.""" self.content.add(mforms.newLabel(text), False, True) hbox = mforms.newBox(True) hbox.set_spacing(12) hbox.set_homogeneous(True) self._tree = mforms.newTreeNodeView(mforms.TreeFlatList) self._tree.add_column(mforms.IconStringColumnType, "Object", 200, False) self._tree.add_column(mforms.IconStringColumnType, "Result", 600, False) self._tree.end_columns() self._tree.add_changed_callback(self._selection_changed) hbox.add(self._tree, True, True) #self.content.add(self._tree, True, True) self._advbox = mforms.newPanel(mforms.TitledBoxPanel) self._advbox.set_title("SQL CREATE Script for Selected Object") box = mforms.newBox(False) self._code = mforms.newCodeEditor() self._code.set_language(mforms.LanguageMySQL) self._code.add_changed_callback(self._code_changed) box.add(self._code, True, True) vbox = mforms.newBox(True) vbox.set_padding(12) vbox.set_spacing(8) self._comment_check = mforms.newCheckBox() self._comment_check.set_text("Comment out") self._comment_check.add_clicked_callback(self._comment_clicked) vbox.add(self._comment_check, False, True) self._revert_btn = mforms.newButton() self._revert_btn.set_text("Discard") vbox.add_end(self._revert_btn, False, True) self._revert_btn.add_clicked_callback(self._discard_clicked) self._apply_btn = mforms.newButton() self._apply_btn.set_text("Apply") vbox.add_end(self._apply_btn, False, True) self._apply_btn.add_clicked_callback(self._apply_clicked) box.add(vbox, False, True) self._advbox.add(box) #self._advbox.set_size(-1, 200) #self._advbox_shown = True #self.go_advanced() # toggle to hide self.advanced_button.set_text("Recreate Objects") #self.content.add(self._advbox, False, True) hbox.add(self._advbox, True, True) self.content.add(hbox, True, True) self._msgbox = mforms.newPanel(mforms.TitledBoxPanel) self._msgbox.set_title("Output Messages") box = mforms.newBox(False) box.set_padding(8) self._msgs = mforms.newTextBox(mforms.VerticalScrollBar) box.add(self._msgs, True, True) self._msgbox.add(box) self.content.add(self._msgbox, False, True) self._msgbox.set_size(-1, 200) self._error_tables = []
def create_ui(self): self.set_spacing(16) layer_box = mforms.newBox(True) layer_box.set_spacing(8) layer_heading = mforms.newLabel("Layer name:") layer_box.add(layer_heading, False, False) self.layer_name_lbl = mforms.newLabel("") layer_box.add(self.layer_name_lbl, False, False) self.content.add(layer_box, False, False) epsg_box = mforms.newBox(True) epsg_box.set_spacing(8) epsg_box_heading = mforms.newLabel("EPSG:") epsg_box.add(epsg_box_heading, False, False) self.epsg_lbl = mforms.newLabel("") epsg_box.add(self.epsg_lbl, False, False) self.content.add(epsg_box, False, False) entry_box = mforms.newBox(True) entry_box.set_spacing(12) entry_box.add(mforms.newLabel("Destination table:"), False, True) self.table_name = mforms.newTextEntry() entry_box.add(self.table_name, True, True) self.content.add(entry_box, False, True) entry_box.show(True) cbox = mforms.newBox(False) self.column_list = newTreeView(mforms.TreeFlatList) self.column_list.add_column(mforms.CheckColumnType, "", 40, True) self.column_list.add_column(mforms.StringColumnType, "Column name", 300, False) self.column_list.end_columns() self.column_list.set_size(-1, 150) cbox.add(small_label("Please select the columns you want to import:"), False, True) cbox.add(self.column_list, False, True) self.content.add(cbox, False, True) cbox.show(True) options_layer = mforms.newPanel(mforms.TitledBoxPanel) options_layer.set_title("Additional options") options_box = mforms.newBox(False) options_box.set_spacing(12) options_box.set_padding(12) boxfailures = mforms.newBox(False) self.skipfailures_chb = newCheckBox() self.skipfailures_chb.set_text("Skip failures") self.skipfailures_chb.set_active(False) boxfailures.add(self.skipfailures_chb, False, False) boxfailures.add( small_label( "If an error occurs ignore it and continue processing data."), False, False) options_box.add(boxfailures, False, False) boxappend = mforms.newBox(False) self.append_chb = newCheckBox() self.append_chb.set_text("Append to existing data") self.append_chb.set_active(False) boxappend.add(self.append_chb, False, False) boxappend.add( small_label( "Append to existing table instead of creating a new one."), False, False) options_box.add(boxappend, False, False) boxoverwrite = mforms.newBox(False) self.overwrite_chb = newCheckBox() self.overwrite_chb.set_text("Overwrite existing data") self.overwrite_chb.set_active(False) self.append_chb.add_clicked_callback( lambda checkbox1=self.append_chb, checkbox2=self.overwrite_chb: self.one_check_only(checkbox1, checkbox2)) self.overwrite_chb.add_clicked_callback( lambda checkbox2=self.append_chb, checkbox1=self.overwrite_chb: self.one_check_only(checkbox1, checkbox2)) boxoverwrite.add(self.overwrite_chb, False, False) boxoverwrite.add( small_label("Drop the selected table and recreate it."), False, False) options_box.add(boxoverwrite, False, False) if self.support_spatial_index: boxspatial = mforms.newBox(False) self.spatial_index_chb = newCheckBox() self.spatial_index_chb.set_text("Create spatial index") self.spatial_index_chb.set_active(False) boxspatial.add(self.spatial_index_chb, False, False) boxspatial.add( small_label( "import will make spatial index around geometry column"), False, False) options_box.add(boxspatial, False, False) options_layer.add(options_box) options_layer.show(True) self.content.add(options_layer, False, False) boxconvert = mforms.newBox(False) entry_box = mforms.newBox(True) entry_box.set_spacing(8) entry_box.add(mforms.newLabel("Convert data to the following EPSG:"), False, True) self.convert_to_epsg = mforms.newTextEntry() entry_box.add(self.convert_to_epsg, False, False) boxconvert.add(entry_box, True, True) boxconvert.add( small_label("leave empty to import the data with no conversion"), False, False) self.content.add(boxconvert, False, True) self.get_info()
def create_ui(self): self.set_spacing(16) self.content.set_padding(16) layer_box = mforms.newBox(True) layer_box.set_spacing(16) layer_heading = mforms.newLabel("Layer name:") layer_box.add(layer_heading, False, False) self.layer_name_lbl = mforms.newLabel("") layer_box.add(self.layer_name_lbl, False, False) self.content.add(layer_box, False, False) entry_box = mforms.newBox(True) entry_box.set_spacing(12) entry_box.add(mforms.newLabel("Destination table:"), False, True) self.table_name = mforms.newTextEntry() entry_box.add(self.table_name, True, True) self.content.add(entry_box, False, True) entry_box.show(True) cbox = mforms.newBox(False) self.column_list = newTreeNodeView(mforms.TreeFlatList) self.column_list.add_column(mforms.CheckColumnType, "", 40, True) self.column_list.add_column(mforms.StringColumnType, "Column name", 300, False) self.column_list.end_columns() self.column_list.set_size(-1, 100) cbox.add(self.column_list, False, True) cbox.add(small_label("Please select columns you'd like to import"), False, True) self.content.add(cbox, False, True) cbox.show(True) options_layer = mforms.newPanel(mforms.TitledBoxPanel) options_layer.set_title("Additional options") options_box = mforms.newBox(False) options_box.set_spacing(12) options_box.set_padding(12) boxfailures = mforms.newBox(False) self.skipfailures_chb = newCheckBox() self.skipfailures_chb.set_text("Skip failures") self.skipfailures_chb.set_active(False) boxfailures.add(self.skipfailures_chb, False, False) boxfailures.add( small_label( "if error occurs, skip it and continue processing the data"), False, False) options_box.add(boxfailures, False, False) boxappend = mforms.newBox(False) self.append_chb = newCheckBox() self.append_chb.set_text("Append to existing data") self.append_chb.set_active(False) boxappend.add(self.append_chb, False, False) boxappend.add( small_label( "append to existing table instead of creating new one"), False, False) options_box.add(boxappend, False, False) boxoverwrite = mforms.newBox(False) self.overwrite_chb = newCheckBox() self.overwrite_chb.set_text("Overwrite existing data") self.overwrite_chb.set_active(False) boxoverwrite.add(self.overwrite_chb, False, False) boxoverwrite.add( small_label("delete current table and recreate it empty"), False, False) options_box.add(boxoverwrite, False, False) options_layer.add(options_box) options_layer.show(True) self.content.add(options_layer, False, False) boxconvert = mforms.newBox(False) self.cartesian_convert_chb = newCheckBox() self.cartesian_convert_chb.set_text( "Convert data to cartesian coordinate system") self.cartesian_convert_chb.set_active(True) boxconvert.add(self.cartesian_convert_chb, False, True) boxconvert.add( small_label( "MySQL support only Cartesian format, leaving this checkbox in it's initial state will convert the data which may lead to data loss" ), False, False) self.content.add(boxconvert, False, True) self.get_info()
def create_ui(self): self.set_spacing(16) self.content.set_padding(16) layer_box = mforms.newBox(True) layer_box.set_spacing(16) layer_heading = mforms.newLabel("Layer name:") layer_box.add(layer_heading, False, False) self.layer_name_lbl = mforms.newLabel("") layer_box.add(self.layer_name_lbl, False, False) self.content.add(layer_box, False, False) entry_box = mforms.newBox(True) entry_box.set_spacing(12) entry_box.add(mforms.newLabel("Destination table:"), False, True) self.table_name = mforms.newTextEntry() entry_box.add(self.table_name, True, True) self.content.add(entry_box, False, True) entry_box.show(True) cbox = mforms.newBox(False) self.column_list = newTreeNodeView(mforms.TreeFlatList) self.column_list.add_column(mforms.CheckColumnType, "", 40, True) self.column_list.add_column(mforms.StringColumnType, "Column name", 300, False) self.column_list.end_columns() self.column_list.set_size(-1, 100) cbox.add(self.column_list, False, True) cbox.add(small_label("Please select columns you'd like to import"), False, True) self.content.add(cbox, False, True) cbox.show(True) options_layer = mforms.newPanel(mforms.TitledBoxPanel) options_layer.set_title("Additional options") options_box = mforms.newBox(False) options_box.set_spacing(12) options_box.set_padding(12) boxfailures = mforms.newBox(False) self.skipfailures_chb = newCheckBox() self.skipfailures_chb.set_text("Skip failures"); self.skipfailures_chb.set_active(False) boxfailures.add(self.skipfailures_chb, False, False) boxfailures.add(small_label("if error occurs, skip it and continue processing the data"), False, False) options_box.add(boxfailures, False, False) boxappend = mforms.newBox(False) self.append_chb = newCheckBox() self.append_chb.set_text("Append to existing data"); self.append_chb.set_active(False) boxappend.add(self.append_chb, False, False) boxappend.add(small_label("append to existing table instead of creating new one"), False, False) options_box.add(boxappend, False, False) boxoverwrite = mforms.newBox(False) self.overwrite_chb = newCheckBox() self.overwrite_chb.set_text("Overwrite existing data"); self.overwrite_chb.set_active(False) boxoverwrite.add(self.overwrite_chb, False, False) boxoverwrite.add(small_label("delete current table and recreate it empty"), False, False) options_box.add(boxoverwrite, False, False) options_layer.add(options_box) options_layer.show(True) self.content.add(options_layer, False, False) boxconvert = mforms.newBox(False) self.cartesian_convert_chb = newCheckBox() self.cartesian_convert_chb.set_text("Convert data to cartesian coordinate system"); self.cartesian_convert_chb.set_active(True) boxconvert.add(self.cartesian_convert_chb, False, True) boxconvert.add(small_label("MySQL supports only Cartesian format. Leaving this checkbox in its initial state will convert the data which may lead to data loss"), False, False) self.content.add(boxconvert, False, True) self.get_info()
def create_ui(self): self.set_spacing(16) layer_box = mforms.newBox(True) layer_box.set_spacing(8) layer_heading = mforms.newLabel("Layer name:") layer_box.add(layer_heading, False, False) self.layer_name_lbl = mforms.newLabel("") layer_box.add(self.layer_name_lbl, False, False) self.content.add(layer_box, False, False) epsg_box = mforms.newBox(True) epsg_box.set_spacing(8) epsg_box_heading = mforms.newLabel("EPSG:") epsg_box.add(epsg_box_heading, False, False) self.epsg_lbl = mforms.newLabel("") epsg_box.add(self.epsg_lbl, False, False) self.content.add(epsg_box, False, False) entry_box = mforms.newBox(True) entry_box.set_spacing(12) entry_box.add(mforms.newLabel("Destination table:"), False, True) self.table_name = mforms.newTextEntry() entry_box.add(self.table_name, True, True) self.content.add(entry_box, False, True) entry_box.show(True) cbox = mforms.newBox(False) self.column_list = newTreeView(mforms.TreeFlatList) self.column_list.add_column(mforms.CheckColumnType, "", 40, True) self.column_list.add_column(mforms.StringColumnType, "Column name", 300, False) self.column_list.end_columns() self.column_list.set_size(-1, 150) cbox.add(small_label("Please select the columns you want to import:"), False, True) cbox.add(self.column_list, False, True) self.content.add(cbox, False, True) cbox.show(True) options_layer = mforms.newPanel(mforms.TitledBoxPanel) options_layer.set_title("Additional options") options_box = mforms.newBox(False) options_box.set_spacing(12) options_box.set_padding(12) boxfailures = mforms.newBox(False) self.skipfailures_chb = newCheckBox() self.skipfailures_chb.set_text("Skip failures"); self.skipfailures_chb.set_active(False) boxfailures.add(self.skipfailures_chb, False, False) boxfailures.add(small_label("If an error occurs ignore it and continue processing data."), False, False) options_box.add(boxfailures, False, False) boxappend = mforms.newBox(False) self.append_chb = newCheckBox() self.append_chb.set_text("Append to existing data"); self.append_chb.set_active(False) boxappend.add(self.append_chb, False, False) boxappend.add(small_label("Append to existing table instead of creating a new one."), False, False) options_box.add(boxappend, False, False) boxoverwrite = mforms.newBox(False) self.overwrite_chb = newCheckBox() self.overwrite_chb.set_text("Overwrite existing data"); self.overwrite_chb.set_active(False) self.append_chb.add_clicked_callback(lambda checkbox1 = self.append_chb, checkbox2 = self.overwrite_chb: self.one_check_only(checkbox1, checkbox2)) self.overwrite_chb.add_clicked_callback(lambda checkbox2 = self.append_chb, checkbox1 = self.overwrite_chb: self.one_check_only(checkbox1, checkbox2)) boxoverwrite.add(self.overwrite_chb, False, False) boxoverwrite.add(small_label("Drop the selected table and recreate it."), False, False) options_box.add(boxoverwrite, False, False) if self.support_spatial_index: boxspatial = mforms.newBox(False) self.spatial_index_chb = newCheckBox() self.spatial_index_chb.set_text("Create spatial index") self.spatial_index_chb.set_active(False) boxspatial.add(self.spatial_index_chb, False, False) boxspatial.add(small_label("import will make spatial index around geometry column"), False, False) options_box.add(boxspatial, False, False) options_layer.add(options_box) options_layer.show(True) self.content.add(options_layer, False, False) boxconvert = mforms.newBox(False) entry_box = mforms.newBox(True) entry_box.set_spacing(8) entry_box.add(mforms.newLabel("Convert data to the following EPSG:"), False, True) self.convert_to_epsg = mforms.newTextEntry() entry_box.add(self.convert_to_epsg, False, False) boxconvert.add(entry_box, True, True) boxconvert.add(small_label("leave empty to import the data with no conversion"), False, False) self.content.add(boxconvert, False, True) self.get_info()
def create_ui(self): self.content.set_spacing(4) self.content.add( mforms.newLabel( "Review and edit migrated objects. You can manually edit the generated SQL before applying them to the target database." ), False, True) hbox = mforms.newBox(True) self.tree_head_label = mforms.newLabel("Migrated Objects") hbox.add(self.tree_head_label, False, False) self._filter = mforms.newSelector() self._filter.add_items( ["Migration Problems", "All Objects", "Column Mappings"]) self._filter.add_changed_callback(self._filter_changed) hbox.add_end(self._filter, False, True) hbox.add_end(mforms.newLabel("View:"), False, False) self.content.add(hbox, False, True) self._no_errors_text = "No migration problems found. %d warning(s).\nUse the View pulldown menu to review all objects." self._no_errors = mforms.newLabel( '' ) # Label text will be set later when the warning count is calculated self._no_errors.set_style(mforms.BigStyle) self._no_errors.set_text_align(mforms.MiddleLeft) self.content.add(self._no_errors, True, True) self._tree = mforms.newTreeNodeView(mforms.TreeDefault) self._tree.add_column(mforms.IconStringColumnType, "Source Object", 200, False) self._tree.add_column(mforms.IconStringColumnType, "Target Object", 200, True) self._tree.add_column(mforms.IconStringColumnType, "Migration Message", 300, False) self._tree.end_columns() self._tree.add_changed_callback(self._selection_changed) self.content.add(self._tree, True, True) self._tree.set_cell_edited_callback(self._cell_edited) self._all_menu = mforms.newContextMenu() self._all_menu.add_will_show_callback(self.all_menu_will_show) self._all_menu.add_check_item_with_title("Skip Object", self.skip_object, "skip_object") self._tree.set_context_menu(self._all_menu) self._columns = mforms.newTreeNodeView(mforms.TreeShowColumnLines | mforms.TreeShowRowLines | mforms.TreeFlatList) self.COL_SOURCE_SCHEMA = self._columns.add_column( mforms.StringColumnType, "Source Schema", 100, False) self.COL_SOURCE_TABLE = self._columns.add_column( mforms.IconStringColumnType, "Source Table", 100, False) self.COL_SOURCE_COLUMN = self._columns.add_column( mforms.IconStringColumnType, "Source Column", 100, False) self.COL_SOURCE_TYPE = self._columns.add_column( mforms.StringColumnType, "Source Type", 100, False) self.COL_SOURCE_FLAGS = self._columns.add_column( mforms.StringColumnType, "Source Flags", 100, False) self.COL_SOURCE_NOTNULL = self._columns.add_column( mforms.CheckColumnType, "NN", 25, False) self.COL_SOURCE_DEFAULT = self._columns.add_column( mforms.StringColumnType, "Source Default Value", 100, False) self.COL_SOURCE_COLLATION = self._columns.add_column( mforms.StringColumnType, "Source Collation", 100, False) self.COL_TARGET_SCHEMA = self._columns.add_column( mforms.StringColumnType, "Target Schema", 100, False) self.COL_TARGET_TABLE = self._columns.add_column( mforms.IconStringColumnType, "Target Table", 100, False) self.COL_TARGET_COLUMN = self._columns.add_column( mforms.IconStringColumnType, "Target Column", 100, True) self.COL_TARGET_TYPE = self._columns.add_column( mforms.StringColumnType, "Target Type", 100, True) self.COL_TARGET_FLAGS = self._columns.add_column( mforms.StringColumnType, "Target Flags", 100, True) self.COL_TARGET_AI = self._columns.add_column(mforms.CheckColumnType, "AI", 25, True) self.COL_TARGET_NOTNULL = self._columns.add_column( mforms.CheckColumnType, "NN", 25, True) self.COL_TARGET_DEFAULT = self._columns.add_column( mforms.StringColumnType, "Target Default Value", 100, True) self.COL_TARGET_COLLATION = self._columns.add_column( mforms.StringColumnType, "Target Collation", 100, True) self.COL_MESSAGE = self._columns.add_column( mforms.IconStringColumnType, "Migration Message", 300, False) self._columns.end_columns() self._columns.set_allow_sorting(True) self._columns.set_selection_mode(mforms.TreeSelectMultiple) self._columns.add_changed_callback(self._selection_changed) self.content.add(self._columns, True, True) self._columns.set_cell_edited_callback(self._columns_cell_edited) self._columns.show(False) self._menu = mforms.newContextMenu() self._menu.add_will_show_callback(self.menu_will_show) self._menu.add_item_with_title( "Set Target Type of Selected Columns...", self.set_target_type, "set_target_type") self._menu.add_item_with_title("Find and Replace Target Type...", self.replace_target_type, "replace_target_type") self._menu.add_item_with_title("Find and Replace Target Flags...", self.replace_target_flags, "replace_target_flags") self._menu.add_item_with_title( "Find and Replace Target Default Value...", self.replace_target_default_value, "replace_target_default_value") self._menu.add_item_with_title("Find and Replace Target Collation...", self.replace_target_collation, "replace_target_collation") self._columns.set_context_menu(self._menu) self.help_label = mforms.newLabel( "You can rename target schemas and tables, and change column definitions by clicking them once selected." ) self.help_label.set_style(mforms.SmallStyle) self.content.add(self.help_label, False, True) self._advbox = mforms.newPanel(mforms.TitledBoxPanel) self._advbox.set_title("SQL CREATE Script for Selected Object") box = mforms.newBox(True) self._code = mforms.newCodeEditor() self._code.set_language(mforms.LanguageMySQL) self._code.add_changed_callback(self._code_changed) box.add(self._code, True, True) vbox = mforms.newBox(False) vbox.set_padding(12) vbox.set_spacing(8) self._lock_check = mforms.newCheckBox() self._lock_check.set_text("Lock edited SQL") self._lock_check.set_tooltip( "Lock the SQL code to the edited one, preventing automatic regenerations from discarding changes made directly to the SQL script." ) self._lock_check.add_clicked_callback(self._lock_clicked) vbox.add(self._lock_check, False, True) self._comment_check = mforms.newCheckBox() self._comment_check.set_text("Comment out") self._comment_check.set_tooltip( "Mark the object to be commented out on the generated script, making it not get created in the target server." ) self._comment_check.add_clicked_callback(self._comment_clicked) vbox.add(self._comment_check, False, True) self._sql_outdated_label = mforms.newLabel("Code is outdated") self._sql_outdated_label.show(False) self._sql_outdated_label.set_tooltip( "The locked SQL code seems to be outdated compared to a newer, automatically generated one. Unlocking the object will update it, but your changes will be lost." ) vbox.add(self._sql_outdated_label, False, True) self._revert_btn = mforms.newButton() self._revert_btn.set_text("Discard Changes") vbox.add_end(self._revert_btn, False, True) self._revert_btn.add_clicked_callback(self._discard_clicked) self._apply_btn = mforms.newButton() self._apply_btn.set_text("Apply Changes") vbox.add_end(self._apply_btn, False, True) self._apply_btn.add_clicked_callback(self._apply_clicked) box.add(vbox, False, True) self._advbox.add(box) self._advbox.set_size(-1, 200) self._advbox_shown = True self.go_advanced() # toggle to hide self.content.add(self._advbox, False, True) self._filter_errors = False self._filter_changed()
def __init__(self, types_to_display, database_objects, ui_settings={}): super(DatabaseObjectSelector, self).__init__(False) self.database_objects = database_objects self.supported_object_types = types_to_display self.ui_settings = { 'tables': { 'icon': 'db.Table.many.32x32.png', 'small_icon': 'db.Table.16x16.png', 'group_label': 'Migrate Table objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'views': { 'icon': 'db.View.many.32x32.png', 'small_icon': 'db.View.16x16.png', 'group_label': 'Migrate View objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'routines': { 'icon': 'db.Routine.many.32x32.png', 'small_icon': 'db.Routine.16x16.png', 'group_label': 'Migrate Routine objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'routineGroups': { 'icon': 'db.RoutineGroup.48x48.png', 'small_icon': 'db.RoutineGroup.16x16.png', 'group_label': 'Migrate Routine Group/Package objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'synonyms': { 'icon': 'grt_object.png', 'small_icon': 'grt_object.png', 'group_label': 'Migrate Synonym objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'structuredTypes': { 'icon': 'grt_object.png', 'small_icon': 'grt_object.png', 'group_label': 'Migrate Structured Type objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'sequences': { 'icon': 'grt_object.png', 'small_icon': 'grt_object.png', 'group_label': 'Migrate Sequence objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, } # Update the ui settings dict with the custom settings supplied by the user (if any): if isinstance(ui_settings, dict): for key, value in list(ui_settings.items()): if key not in self.ui_settings or not isinstance(value, dict): continue self.ui_settings[key].update(value) # Create UI: self.set_padding(8) self.set_spacing(8) self.ui = {} for group in self.supported_object_types: if group not in self.database_objects or group not in self.ui_settings: continue self.ui[group] = {} group_objects = self.database_objects[group] group_panel = mforms.newPanel(mforms.BorderedPanel) group_box = mforms.newBox(False) group_box.set_padding(8) group_box.set_spacing(8) header_box = mforms.Box(True) header_box.set_spacing(8) icon = mforms.newImageBox() icon.set_image(self.ui_settings[group]['icon']) header_box.add(icon, False, True) text_box = mforms.Box(False) group_selector = mforms.newCheckBox() group_selector.set_text(self.ui_settings[group]['group_label']) group_selector.set_active( bool(self.ui_settings[group]['group_selected'])) group_selector.add_clicked_callback( functools.partial(self.group_checkbox_clicked, group=group)) text_box.add(group_selector, False, True) info_label = mforms.newLabel( self.ui_settings[group]['status_text'] % { 'total': len(group_objects), 'selected': len(group_objects) if self.ui_settings[group]['group_selected'] else 0 }) info_label.set_style(mforms.SmallHelpTextStyle) text_box.add(info_label, False, True) header_box.add(text_box, False, True) show_details = self.ui_settings[group]['show_details'] self.ui_settings[group]['_showing_details'] = show_details filter_button = mforms.newButton() filter_button.set_text( 'Hide Selection' if show_details else 'Show Selection') filter_button.set_enabled( bool(self.ui_settings[group]['group_selected'])) filter_button.add_clicked_callback( functools.partial(self.filter_button_clicked, group=group)) header_box.add_end(filter_button, False, True) group_box.add(header_box, False, True) # The invisible stuff: if len(group_objects) > 0: box = mforms.newBox(True) search_entry = mforms.newTextEntry(mforms.SearchEntry) search_entry.set_name("Search Entry") search_entry.set_placeholder_text( "Filter objects (wildcards chars * and ? are allowed)") search_entry.add_changed_callback( functools.partial(self.search_entry_changed, group=group)) box.add(search_entry, False, True) group_box.add(box, True, True) search_entry.set_size(350, -1) filter_container = mforms.newBox(True) filter_container.set_spacing(8) available_list = mforms.newTreeView(mforms.TreeFlatList) available_list.set_name("Available List") available_list.add_column(mforms.IconColumnType, 'Available Objects', 300, False) available_list.end_columns() available_list.set_selection_mode(mforms.TreeSelectMultiple) available_list.set_allow_sorting(False) filter_container.add(available_list, True, True) control_box = mforms.newBox(False) control_box.set_padding(0, 30, 0, 30) control_box.set_spacing(4) add_button = mforms.newButton() add_button.set_text('>') add_button.enable_internal_padding(False) add_button.add_clicked_callback( functools.partial(self.move_button_clicked, group=group, operation='add')) add_button.set_size(90, 30) control_box.add(add_button, False) remove_button = mforms.newButton() remove_button.set_text('<') remove_button.enable_internal_padding(False) remove_button.add_clicked_callback( functools.partial(self.move_button_clicked, group=group, operation='remove')) remove_button.set_size(90, 30) control_box.add(remove_button, False, True) add_all_button = mforms.newButton() add_all_button.set_text('>>') add_all_button.enable_internal_padding(False) add_all_button.add_clicked_callback( functools.partial(self.move_button_clicked, group=group, operation='add_all')) add_all_button.set_size(90, 30) control_box.add(add_all_button, False, True) remove_all_button = mforms.newButton() remove_all_button.set_text('<<') remove_all_button.enable_internal_padding(False) remove_all_button.add_clicked_callback( functools.partial(self.move_button_clicked, group=group, operation='remove_all')) remove_all_button.set_size(90, 30) control_box.add(remove_all_button, False) filter_container.add(control_box, False, True) selected_list = mforms.newTreeView(mforms.TreeFlatList) selected_list.set_name("Selected List") selected_list.add_column(mforms.IconColumnType, 'Objects to Migrate', 300, False) selected_list.end_columns() selected_list.set_selection_mode(mforms.TreeSelectMultiple) selected_list.set_allow_sorting(False) for item in sorted(group_objects): node = selected_list.add_node() node.set_icon_path(0, self.ui_settings[group]['small_icon']) node.set_string(0, item) filter_container.add(selected_list, True, True) group_box.add(filter_container, True, True) filter_container.show(bool(show_details)) self.ui[group].update({ 'filter_container': filter_container, 'available_list': available_list, 'selected_list': selected_list, 'search_entry': search_entry, }) else: # Empty object list filter_button.set_enabled(False) self.ui[group].update({ 'icon': icon, 'group_selector': group_selector, 'group_panel': group_panel, 'info_label': info_label, 'filter_button': filter_button, 'all_objects': set(group_objects), 'has_elements': bool(len(group_objects)), 'available': set(), 'selected': set(group_objects), 'objects_passing_filter': set(group_objects), }) group_panel.add(group_box) self.add(group_panel, False, True)
def __init__(self, main): WizardPage.__init__(self, main, "Data Transfer Setup") self.main.add_wizard_page(self, "DataMigration", "Data Transfer Setup") label = mforms.newLabel("Select options for the copy of the migrated schema tables in the target\nMySQL server and click [Next >] to execute.") self.content.add(label, False, True) panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Data Copy") self.content.add(panel, False, True) box = mforms.newBox(False) panel.add(box) box.set_padding(12) self._copy_db = mforms.newCheckBox() self._copy_db.set_text("Online copy of table data to target RDBMS") box.add(self._copy_db, False, True) # XXX TODO #box.add(mforms.newLabel(""), False, True) #self._add_script_checkbox_option(box, "dump_to_file", "Create a dump file with the data", "Dump File:", "Save As") box.add(mforms.newLabel(""), False, True) if sys.platform == "win32": self._add_script_checkbox_option(box, "copy_script", "Create a batch file to copy the data at another time", "Batch File:", "Save As") else: self._add_script_checkbox_option(box, "copy_script", "Create a shell script to copy the data from outside Workbench", "Shell Script File:", "Save As") panel = mforms.newPanel(mforms.TitledBoxPanel) panel.set_title("Options") self.content.add(panel, False, True) self.options_box = mforms.newBox(False) self.options_box.set_padding(12) self.options_box.set_spacing(8) panel.add(self.options_box) self._truncate_db = mforms.newCheckBox() self._truncate_db.set_text("Truncate target tables (ie. delete contents) before copying data") self.options_box.add(self._truncate_db, False, True) hbox = mforms.newBox(True) hbox.set_spacing(8) hbox.add(mforms.newLabel("Worker tasks"), False, True) self._worker_count = mforms.newTextEntry() self._worker_count.set_value("2") self._worker_count.set_size(50, -1) hbox.add(self._worker_count, False, True) l = mforms.newLabel("Number of tasks to use for data transfer. Each task will open a\n"+ "connection to both source and target RDBMSs to copy table rows.\nDefault value 2.") l.set_style(mforms.SmallHelpTextStyle) hbox.add(l, True, True) self.options_box.add(hbox, False, True) self._debug_copy = mforms.newCheckBox() self._debug_copy.set_text("Enable debug output for table copy") self.options_box.add(self._debug_copy, False, True) ### self._advanced_panel = mforms.newPanel(mforms.TitledBoxPanel) self._advanced_panel.set_title("Tables to Copy") self.content.add(self._advanced_panel, True, True) box = mforms.newBox(False) box.set_padding(12) box.set_spacing(8) l = mforms.newLabel("""You can limit the number of rows to be copied for certain tables. Tables that are referenced by foreign keys from other tables cannot be limited, unless data copy from the referencing tables is also disabled. All tables are copied by default.""") l.set_style(mforms.SmallHelpTextStyle) box.add(l, False, True) self._tree = mforms.newTreeNodeView(mforms.TreeDefault) self._tree.add_column(mforms.IconStringColumnType, "Table", 200, False) self._tree.add_column(mforms.StringColumnType, "Limit Copy", 100, True) self._tree.add_column(mforms.StringColumnType, "Referencing Tables", 500, False) self._tree.end_columns() box.add(self._tree, True, True) self._advanced_panel.add(box) self._tree.set_cell_edited_callback(self._cell_edited) self._advbox_shown = False self._advanced_panel.show(False)
def __init__(self, types_to_display, database_objects, ui_settings={}): super(DatabaseObjectSelector, self).__init__(False) self.database_objects = database_objects self.supported_object_types = types_to_display self.ui_settings = { 'tables' : { 'icon': 'db.Table.many.32x32.png', 'small_icon': 'db.Table.16x16.png', 'group_label': 'Migrate Table objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'views' : { 'icon': 'db.View.many.32x32.png', 'small_icon': 'db.View.16x16.png', 'group_label': 'Migrate View objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'routines':{ 'icon': 'db.Routine.many.32x32.png', 'small_icon': 'db.Routine.16x16.png', 'group_label': 'Migrate Routine objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'routineGroups':{ 'icon': 'db.RoutineGroup.48x48.png', 'small_icon': 'db.RoutineGroup.16x16.png', 'group_label': 'Migrate Routine Group/Package objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'synonyms':{ 'icon': 'grt_object.png', 'small_icon': 'grt_object.png', 'group_label': 'Migrate Synonym objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'structuredTypes':{ 'icon': 'grt_object.png', 'small_icon': 'grt_object.png', 'group_label': 'Migrate Structured Type objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, 'sequences':{ 'icon': 'grt_object.png', 'small_icon': 'grt_object.png', 'group_label': 'Migrate Sequence objects', 'group_selected': True, 'status_text': '%(total)d total, %(selected)d selected', 'show_details': False, }, } # Update the ui settings dict with the custom settings supplied by the user (if any): if isinstance(ui_settings, dict): for key, value in ui_settings.iteritems(): if key not in self.ui_settings or not isinstance(value, dict): continue self.ui_settings[key].update(value) # Create UI: self.set_padding(8) self.set_spacing(8) self.ui = {} for group in self.supported_object_types: if group not in self.database_objects or group not in self.ui_settings: continue self.ui[group] = {} group_objects = self.database_objects[group] group_panel = mforms.newPanel(mforms.BorderedPanel) group_box = mforms.newBox(False) group_box.set_padding(8) group_box.set_spacing(8) header_box = mforms.Box(True) header_box.set_spacing(8) icon = mforms.newImageBox() icon.set_image(self.ui_settings[group]['icon']) header_box.add(icon, False) text_box = mforms.Box(False) group_selector = mforms.newCheckBox() group_selector.set_text(self.ui_settings[group]['group_label']) group_selector.set_active(bool(self.ui_settings[group]['group_selected'])) group_selector.add_clicked_callback(functools.partial(self.group_checkbox_clicked, group=group)) text_box.add(group_selector, False) info_label = mforms.newLabel(self.ui_settings[group]['status_text'] % {'total': len(group_objects), 'selected': len(group_objects) if self.ui_settings[group]['group_selected'] else 0 }) info_label.set_style(mforms.SmallHelpTextStyle) text_box.add(info_label, False) header_box.add(text_box, False) show_details = self.ui_settings[group]['show_details'] self.ui_settings[group]['_showing_details'] = show_details filter_button = mforms.newButton() filter_button.set_text('Hide Selection' if show_details else 'Show Selection') filter_button.set_enabled(bool(self.ui_settings[group]['group_selected'])) filter_button.add_clicked_callback(functools.partial(self.filter_button_clicked, group=group)) header_box.add_end(filter_button, False, True) group_box.add(header_box, False) # The invisible stuff: if len(group_objects) > 0: box = mforms.newBox(True) search_entry = mforms.newTextEntry(mforms.SearchEntry) search_entry.set_placeholder_text("Filter objects (wildcards chars * and ? are allowed)") search_entry.add_changed_callback(functools.partial(self.search_entry_changed, group=group)) box.add(search_entry, False, True) group_box.add(box, False, True) search_entry.set_size(350, -1) filter_container = mforms.newBox(True) filter_container.set_spacing(8) available_list = mforms.newTreeNodeView(mforms.TreeFlatList) available_list.add_column(mforms.IconColumnType, 'Available Objects', 300, False) available_list.end_columns() available_list.set_selection_mode(mforms.TreeSelectMultiple) available_list.set_allow_sorting(False) filter_container.add(available_list, True, True) control_box = mforms.newBox(False) control_box.set_padding(0, 30, 0, 30) control_box.set_spacing(4) add_button = mforms.newButton() add_button.set_text('>') add_button.enable_internal_padding(False) add_button.add_clicked_callback(functools.partial(self.move_button_clicked, group=group, operation='add')) control_box.add(add_button, False) remove_button = mforms.newButton() remove_button.set_text('<') remove_button.enable_internal_padding(False) remove_button.add_clicked_callback(functools.partial(self.move_button_clicked, group=group, operation='remove')) control_box.add(remove_button, False) add_all_button = mforms.newButton() add_all_button.set_text('>>') add_all_button.enable_internal_padding(False) add_all_button.add_clicked_callback(functools.partial(self.move_button_clicked, group=group, operation='add_all')) control_box.add(add_all_button, False) remove_all_button = mforms.newButton() remove_all_button.set_text('<<') remove_all_button.enable_internal_padding(False) remove_all_button.add_clicked_callback(functools.partial(self.move_button_clicked, group=group, operation='remove_all')) control_box.add(remove_all_button, False) filter_container.add(control_box, False, False) selected_list = mforms.newTreeNodeView(mforms.TreeFlatList) selected_list.add_column(mforms.IconColumnType, 'Objects to Migrate', 300, False) selected_list.end_columns() selected_list.set_selection_mode(mforms.TreeSelectMultiple) selected_list.set_allow_sorting(False) for item in sorted(group_objects): node = selected_list.add_node() node.set_icon_path(0, self.ui_settings[group]['small_icon']) node.set_string(0, item) filter_container.add(selected_list, True, True) group_box.add(filter_container, True, True) filter_container.show(bool(show_details)) self.ui[group].update( { 'filter_container': filter_container, 'available_list': available_list, 'selected_list': selected_list, 'search_entry': search_entry, } ) else: # Empty object list filter_button.set_enabled(False) self.ui[group].update ( { 'icon': icon, 'group_selector': group_selector, 'group_panel': group_panel, 'info_label': info_label, 'filter_button': filter_button, 'all_objects': set(group_objects), 'has_elements': bool(len(group_objects)), 'available': set(), 'selected': set(group_objects), 'objects_passing_filter': set(group_objects), } ) group_panel.add(group_box) self.add(group_panel, False, True)