def __init__(self, iface, base_config, parent=None): QDialog.__init__(self, parent) self.setupUi(self) self.iface = iface QgsGui.instance().enableAutoGeometryRestore(self) self.buttonBox.accepted.disconnect() self.buttonBox.accepted.connect(self.accepted) self.buttonBox.clear() self.buttonBox.addButton(QDialogButtonBox.Cancel) create_button = self.buttonBox.addButton(self.tr('Create'), QDialogButtonBox.AcceptRole) create_button.setDefault(True) self.ili_file_browse_button.clicked.connect( make_file_selector( self.ili_file_line_edit, title=self.tr('Open Interlis Model'), file_filter=self.tr('Interlis Model File (*.ili)'))) self.buttonBox.addButton(QDialogButtonBox.Help) self.buttonBox.helpRequested.connect(self.help_requested) self.crs = QgsCoordinateReferenceSystem() self.ili2db_options = Ili2dbOptionsDialog() self.ili2db_options_button.clicked.connect(self.ili2db_options.open) self.ili2db_options.finished.connect(self.fill_toml_file_info_label) self.multiple_models_dialog = MultipleModelsDialog(self) self.multiple_models_button.clicked.connect( self.multiple_models_dialog.open) self.multiple_models_dialog.accepted.connect( self.fill_models_line_edit) self.type_combo_box.clear() self.type_combo_box.addItem(self.tr('Interlis (use PostGIS)'), 'ili2pg') self.type_combo_box.addItem(self.tr('Interlis (use GeoPackage)'), 'ili2gpkg') self.type_combo_box.addItem(self.tr('PostGIS'), 'pg') self.type_combo_box.addItem(self.tr('GeoPackage'), 'gpkg') self.type_combo_box.currentIndexChanged.connect(self.type_changed) self.txtStdout.anchorClicked.connect(self.link_activated) self.crsSelector.crsChanged.connect(self.crs_changed) self.base_configuration = base_config self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.txtStdout.setLayout(QGridLayout()) self.txtStdout.layout().setContentsMargins(0, 0, 0, 0) self.txtStdout.layout().addWidget(self.bar, 0, 0, Qt.AlignTop) self.validators = Validators() nonEmptyValidator = NonEmptyStringValidator() fileValidator = FileValidator(pattern='*.ili', allow_empty=True) self.gpkgSaveFileValidator = FileValidator(pattern='*.gpkg', allow_non_existing=True) self.gpkgOpenFileValidator = FileValidator(pattern='*.gpkg') self.gpkg_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.restore_configuration() self.ili_models_line_edit.setValidator(nonEmptyValidator) self.pg_host_line_edit.setValidator(nonEmptyValidator) self.pg_database_line_edit.setValidator(nonEmptyValidator) self.pg_user_line_edit.setValidator(nonEmptyValidator) self.ili_file_line_edit.setValidator(fileValidator) self.pg_host_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_host_line_edit.textChanged.emit(self.pg_host_line_edit.text()) self.pg_database_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_database_line_edit.textChanged.emit( self.pg_database_line_edit.text()) self.pg_user_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_user_line_edit.textChanged.emit(self.pg_user_line_edit.text()) self.pg_use_super_login.setText( self.tr('Generate schema with superuser login from settings ({})'). format(base_config.super_pg_user)) self.ili_models_line_edit.textChanged.connect( self.validators.validate_line_edits) self.ili_models_line_edit.textChanged.emit( self.ili_models_line_edit.text()) self.ili_models_line_edit.textChanged.connect(self.on_model_changed) self.ili_models_line_edit.textChanged.connect( self.complete_models_completer) self.ili_models_line_edit.punched.connect( self.complete_models_completer) self.ilicache = IliCache(self.base_configuration) self.refresh_ili_cache() self.ili_models_line_edit.setPlaceholderText( self.tr('[Search model from repository]')) self.ili_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.ili_file_line_edit.textChanged.connect(self.ili_file_changed) self.ili_file_line_edit.textChanged.emit( self.ili_file_line_edit.text())
class GenerateProjectDialog(QDialog, DIALOG_UI): def __init__(self, iface, base_config, parent=None): QDialog.__init__(self, parent) self.setupUi(self) self.iface = iface QgsGui.instance().enableAutoGeometryRestore(self) self.buttonBox.accepted.disconnect() self.buttonBox.accepted.connect(self.accepted) self.buttonBox.clear() self.buttonBox.addButton(QDialogButtonBox.Cancel) create_button = self.buttonBox.addButton(self.tr('Create'), QDialogButtonBox.AcceptRole) create_button.setDefault(True) self.ili_file_browse_button.clicked.connect( make_file_selector( self.ili_file_line_edit, title=self.tr('Open Interlis Model'), file_filter=self.tr('Interlis Model File (*.ili)'))) self.buttonBox.addButton(QDialogButtonBox.Help) self.buttonBox.helpRequested.connect(self.help_requested) self.crs = QgsCoordinateReferenceSystem() self.ili2db_options = Ili2dbOptionsDialog() self.ili2db_options_button.clicked.connect(self.ili2db_options.open) self.ili2db_options.finished.connect(self.fill_toml_file_info_label) self.multiple_models_dialog = MultipleModelsDialog(self) self.multiple_models_button.clicked.connect( self.multiple_models_dialog.open) self.multiple_models_dialog.accepted.connect( self.fill_models_line_edit) self.type_combo_box.clear() self.type_combo_box.addItem(self.tr('Interlis (use PostGIS)'), 'ili2pg') self.type_combo_box.addItem(self.tr('Interlis (use GeoPackage)'), 'ili2gpkg') self.type_combo_box.addItem(self.tr('PostGIS'), 'pg') self.type_combo_box.addItem(self.tr('GeoPackage'), 'gpkg') self.type_combo_box.currentIndexChanged.connect(self.type_changed) self.txtStdout.anchorClicked.connect(self.link_activated) self.crsSelector.crsChanged.connect(self.crs_changed) self.base_configuration = base_config self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.txtStdout.setLayout(QGridLayout()) self.txtStdout.layout().setContentsMargins(0, 0, 0, 0) self.txtStdout.layout().addWidget(self.bar, 0, 0, Qt.AlignTop) self.validators = Validators() nonEmptyValidator = NonEmptyStringValidator() fileValidator = FileValidator(pattern='*.ili', allow_empty=True) self.gpkgSaveFileValidator = FileValidator(pattern='*.gpkg', allow_non_existing=True) self.gpkgOpenFileValidator = FileValidator(pattern='*.gpkg') self.gpkg_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.restore_configuration() self.ili_models_line_edit.setValidator(nonEmptyValidator) self.pg_host_line_edit.setValidator(nonEmptyValidator) self.pg_database_line_edit.setValidator(nonEmptyValidator) self.pg_user_line_edit.setValidator(nonEmptyValidator) self.ili_file_line_edit.setValidator(fileValidator) self.pg_host_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_host_line_edit.textChanged.emit(self.pg_host_line_edit.text()) self.pg_database_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_database_line_edit.textChanged.emit( self.pg_database_line_edit.text()) self.pg_user_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_user_line_edit.textChanged.emit(self.pg_user_line_edit.text()) self.pg_use_super_login.setText( self.tr('Generate schema with superuser login from settings ({})'). format(base_config.super_pg_user)) self.ili_models_line_edit.textChanged.connect( self.validators.validate_line_edits) self.ili_models_line_edit.textChanged.emit( self.ili_models_line_edit.text()) self.ili_models_line_edit.textChanged.connect(self.on_model_changed) self.ili_models_line_edit.textChanged.connect( self.complete_models_completer) self.ili_models_line_edit.punched.connect( self.complete_models_completer) self.ilicache = IliCache(self.base_configuration) self.refresh_ili_cache() self.ili_models_line_edit.setPlaceholderText( self.tr('[Search model from repository]')) self.ili_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.ili_file_line_edit.textChanged.connect(self.ili_file_changed) self.ili_file_line_edit.textChanged.emit( self.ili_file_line_edit.text()) def accepted(self): configuration = self.updated_configuration() if self.type_combo_box.currentData() in ['ili2pg', 'ili2gpkg']: if not self.ili_file_line_edit.text().strip(): if not self.ili_models_line_edit.text().strip(): self.txtStdout.setText( self. tr('Please set a valid INTERLIS model before creating the project.' )) self.ili_models_line_edit.setFocus() return if self.ili_file_line_edit.text().strip() and \ self.ili_file_line_edit.validator().validate(configuration.ilifile, 0)[0] != QValidator.Acceptable: self.txtStdout.setText( self. tr('Please set a valid INTERLIS file before creating the project.' )) self.ili_file_line_edit.setFocus() return if self.type_combo_box.currentData() in ['ili2pg', 'pg']: if not configuration.dbhost: self.txtStdout.setText( self.tr('Please set a host before creating the project.')) self.pg_host_line_edit.setFocus() return if not configuration.database: self.txtStdout.setText( self.tr( 'Please set a database before creating the project.')) self.pg_database_line_edit.setFocus() return if not configuration.dbusr: self.txtStdout.setText( self. tr('Please set a database user before creating the project.' )) self.pg_user_line_edit.setFocus() return elif self.type_combo_box.currentData() in ['ili2gpkg', 'gpkg']: if not configuration.dbfile or self.gpkg_file_line_edit.validator( ).validate(configuration.dbfile, 0)[0] != QValidator.Acceptable: self.txtStdout.setText( self. tr('Please set a valid database file before creating the project.' )) self.gpkg_file_line_edit.setFocus() return configuration.dbschema = configuration.dbschema or configuration.database self.save_configuration(configuration) # create schema with superuser if self.type_combo_box.currentData() in [ 'ili2pg', 'pg' ] and configuration.db_use_super_login: _db_connector = pg_connector.PGConnector( configuration.super_user_uri, configuration.dbschema) if not _db_connector.db_or_schema_exists(): _db_connector.create_db_or_schema(configuration.dbusr) with OverrideCursor(Qt.WaitCursor): self.progress_bar.show() self.progress_bar.setValue(0) self.disable() self.txtStdout.setTextColor(QColor('#000000')) self.txtStdout.clear() if self.type_combo_box.currentData() in ['ili2pg', 'ili2gpkg']: importer = iliimporter.Importer() importer.tool_name = self.type_combo_box.currentData() importer.configuration = configuration importer.stdout.connect(self.print_info) importer.stderr.connect(self.on_stderr) importer.process_started.connect(self.on_process_started) importer.process_finished.connect(self.on_process_finished) try: if importer.run() != iliimporter.Importer.SUCCESS: self.enable() self.progress_bar.hide() return except JavaNotFoundError: self.txtStdout.setTextColor(QColor('#000000')) self.txtStdout.clear() self.txtStdout.setText( self. tr('Java could not be found. Please <a href="https://java.com/en/download/">install Java</a> and or <a href="#configure">configure a custom java path</a>. We also support the JAVA_HOME environment variable in case you prefer this.' )) self.enable() self.progress_bar.hide() return try: generator = Generator(configuration.tool_name, configuration.uri, configuration.inheritance, configuration.dbschema) self.progress_bar.setValue(50) except OperationalError: self.txtStdout.setText( self. tr('There was an error connecting to the database. Check connection parameters.' )) self.enable() self.progress_bar.hide() return if self.type_combo_box.currentData() in ['pg', 'gpkg']: if not generator.db_or_schema_exists(): self.txtStdout.setText( self. tr('Source {} does not exist. Check connection parameters.' ).format('database' if self.type_combo_box. currentData() == 'gpkg' else 'schema')) self.enable() self.progress_bar.hide() return if self.type_combo_box.currentData() == 'pg': if not generator._postgis_exists(): self.txtStdout.setText( self. tr('The current database does not have PostGIS installed! Please install it by running `CREATE EXTENSION postgis;` on the database before proceeding.' )) self.enable() self.progress_bar.hide() return self.print_info( self.tr('\nObtaining available layers from the database…')) available_layers = generator.layers() if not available_layers: if self.type_combo_box.currentData() == 'gpkg': text = self.tr( 'The GeoPackage has no layers to load into QGIS.') else: text = self.tr( 'The schema has no layers to load into QGIS.') self.txtStdout.setText(text) self.enable() self.progress_bar.hide() return self.progress_bar.setValue(70) self.print_info(self.tr('Obtaining relations from the database…')) relations, bags_of_enum = generator.relations(available_layers) self.progress_bar.setValue(75) self.print_info(self.tr('Arranging layers into groups…')) legend = generator.legend(available_layers) self.progress_bar.setValue(85) project = Project() project.layers = available_layers project.relations = relations project.bags_of_enum = bags_of_enum project.legend = legend self.print_info(self.tr('Configuring forms and widgets…')) project.post_generate() self.progress_bar.setValue(90) qgis_project = QgsProject.instance() self.print_info(self.tr('Generating QGIS project…')) project.create(None, qgis_project) # Set the extent of the mapCanvas from the first layer extent found for layer in project.layers: if layer.extent is not None: self.iface.mapCanvas().setExtent(layer.extent) self.iface.mapCanvas().refresh() break self.buttonBox.clear() self.buttonBox.setEnabled(True) self.buttonBox.addButton(QDialogButtonBox.Close) self.progress_bar.setValue(100) self.print_info(self.tr('\nDone!'), '#004905') def print_info(self, text, text_color='#000000'): self.txtStdout.setTextColor(QColor(text_color)) self.txtStdout.append(text) QCoreApplication.processEvents() def on_stderr(self, text): color_log_text(text, self.txtStdout) self.advance_progress_bar_by_text(text) QCoreApplication.processEvents() def on_process_started(self, command): self.txtStdout.setText(command) self.progress_bar.setValue(10) QCoreApplication.processEvents() def on_process_finished(self, exit_code, result): if exit_code == 0: color = '#004905' message = self.tr( 'Interlis model(s) successfully imported into the database!') else: color = '#aa2222' message = self.tr('Finished with errors!') self.txtStdout.setTextColor(QColor(color)) self.txtStdout.append(message) self.progress_bar.setValue(50) def updated_configuration(self): """ Get the configuration that is updated with the user configuration changes on the dialog. :return: Configuration """ configuration = SchemaImportConfiguration() if self.type_combo_box.currentData() in ['ili2pg', 'pg']: # PostgreSQL specific options configuration.tool_name = 'ili2pg' configuration.dbhost = self.pg_host_line_edit.text().strip() configuration.dbport = self.pg_port_line_edit.text().strip() configuration.dbusr = self.pg_user_line_edit.text().strip() configuration.database = "'{}'".format( self.pg_database_line_edit.text().strip()) configuration.dbschema = self.pg_schema_line_edit.text().strip( ).lower() configuration.dbpwd = self.pg_password_line_edit.text() configuration.db_use_super_login = self.pg_use_super_login.isChecked( ) elif self.type_combo_box.currentData() in ['ili2gpkg', 'gpkg']: configuration.tool_name = 'ili2gpkg' configuration.dbfile = self.gpkg_file_line_edit.text().strip() configuration.epsg = self.epsg configuration.inheritance = self.ili2db_options.inheritance_type() configuration.tomlfile = self.ili2db_options.toml_file() configuration.create_basket_col = self.ili2db_options.create_basket_col( ) configuration.create_import_tid = self.ili2db_options.create_import_tid( ) configuration.stroke_arcs = self.ili2db_options.stroke_arcs() configuration.base_configuration = self.base_configuration if self.ili_file_line_edit.text().strip(): configuration.ilifile = self.ili_file_line_edit.text().strip() if self.ili_models_line_edit.text().strip(): configuration.ilimodels = self.ili_models_line_edit.text().strip() return configuration def save_configuration(self, configuration): settings = QSettings() settings.setValue('QgsProjectGenerator/ili2db/ilifile', configuration.ilifile) settings.setValue('QgsProjectGenerator/ili2db/epsg', self.epsg) settings.setValue('QgsProjectGenerator/importtype', self.type_combo_box.currentData()) if self.type_combo_box.currentData() in ['ili2pg', 'pg']: # PostgreSQL specific options settings.setValue('QgsProjectGenerator/ili2pg/host', configuration.dbhost) settings.setValue('QgsProjectGenerator/ili2pg/port', configuration.dbport) settings.setValue('QgsProjectGenerator/ili2pg/user', configuration.dbusr) settings.setValue('QgsProjectGenerator/ili2pg/database', configuration.database.strip("'")) settings.setValue('QgsProjectGenerator/ili2pg/schema', configuration.dbschema) settings.setValue('QgsProjectGenerator/ili2pg/password', configuration.dbpwd) settings.setValue('QgsProjectGenerator/ili2pg/usesuperlogin', configuration.db_use_super_login) elif self.type_combo_box.currentData() in ['ili2gpkg', 'gpkg']: settings.setValue('QgsProjectGenerator/ili2gpkg/dbfile', configuration.dbfile) def restore_configuration(self): settings = QSettings() self.ili_file_line_edit.setText( settings.value('QgsProjectGenerator/ili2db/ilifile')) self.crs = QgsCoordinateReferenceSystem( settings.value('QgsProjectGenerator/ili2db/epsg', 21781, int)) self.fill_toml_file_info_label() self.update_crs_info() self.pg_host_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/host', 'localhost')) self.pg_port_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/port')) self.pg_user_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/user')) self.pg_database_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/database')) self.pg_schema_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/schema')) self.pg_password_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/password')) self.pg_use_super_login.setChecked( settings.value('QgsProjectGenerator/ili2pg/usesuperlogin', defaultValue=False, type=bool)) self.gpkg_file_line_edit.setText( settings.value('QgsProjectGenerator/ili2gpkg/dbfile')) self.type_combo_box.setCurrentIndex( self.type_combo_box.findData( settings.value('QgsProjectGenerator/importtype', 'pg'))) self.type_changed() self.crs_changed() def disable(self): self.pg_config.setEnabled(False) self.ili_config.setEnabled(False) self.buttonBox.setEnabled(False) def enable(self): self.pg_config.setEnabled(True) self.ili_config.setEnabled(True) self.buttonBox.setEnabled(True) def type_changed(self): self.progress_bar.hide() if self.type_combo_box.currentData() == 'ili2pg': self.ili_config.show() self.pg_config.show() self.gpkg_config.hide() self.pg_schema_line_edit.setPlaceholderText( self.tr("[Leave empty to create a default schema]")) elif self.type_combo_box.currentData() == 'pg': self.ili_config.hide() self.pg_config.show() self.gpkg_config.hide() self.pg_schema_line_edit.setPlaceholderText( self.tr("[Leave empty to load all schemas in the database]")) elif self.type_combo_box.currentData() == 'gpkg': self.ili_config.hide() self.pg_config.hide() self.gpkg_config.show() self.gpkg_file_line_edit.setValidator(self.gpkgOpenFileValidator) self.gpkg_file_line_edit.textChanged.emit( self.gpkg_file_line_edit.text()) try: self.gpkg_file_browse_button.clicked.disconnect() except: pass self.gpkg_file_browse_button.clicked.connect( make_file_selector( self.gpkg_file_line_edit, title=self.tr('Open GeoPackage database file'), file_filter=self.tr('GeoPackage Database (*.gpkg)'))) elif self.type_combo_box.currentData() == 'ili2gpkg': self.ili_config.show() self.pg_config.hide() self.gpkg_config.show() self.gpkg_file_line_edit.setValidator(self.gpkgSaveFileValidator) self.gpkg_file_line_edit.textChanged.emit( self.gpkg_file_line_edit.text()) try: self.gpkg_file_browse_button.clicked.disconnect() except: pass self.gpkg_file_browse_button.clicked.connect( make_save_file_selector( self.gpkg_file_line_edit, title=self.tr('Open GeoPackage database file'), file_filter=self.tr('GeoPackage Database (*.gpkg)'), extension='.gpkg')) def on_model_changed(self, text): if not text: return for pattern, crs in CRS_PATTERNS.items(): if re.search(pattern, text): self.crs = QgsCoordinateReferenceSystem(crs) self.update_crs_info() break self.ili2db_options.set_toml_file_key(text) self.fill_toml_file_info_label() def link_activated(self, link): if link.url() == '#configure': cfg = OptionsDialog(self.base_configuration) if cfg.exec_(): settings = QSettings() settings.beginGroup('QgsProjectGenerator/ili2db') self.base_configuration.save(settings) else: QDesktopServices.openUrl(link) def update_crs_info(self): self.crsSelector.setCrs(self.crs) def crs_changed(self): if self.crsSelector.crs().authid()[:5] != 'EPSG:': self.crs_label.setStyleSheet('color: orange') self.crs_label.setToolTip( self.tr('Please select an EPSG Coordinate Reference System')) self.epsg = 21781 else: self.crs_label.setStyleSheet('') self.crs_label.setToolTip(self.tr('Coordinate Reference System')) authid = self.crsSelector.crs().authid() self.epsg = int(authid[5:]) def ili_file_changed(self): # If ili file is valid, models is optional if self.ili_file_line_edit.text().strip() and \ self.ili_file_line_edit.validator().validate(self.ili_file_line_edit.text().strip(), 0)[0] == QValidator.Acceptable: self.ili_models_line_edit.setValidator(None) self.ili_models_line_edit.textChanged.emit( self.ili_models_line_edit.text()) # Update completer to add models from given ili file self.ilicache = IliCache(None, self.ili_file_line_edit.text().strip()) self.refresh_ili_cache() models = self.ilicache.process_ili_file( self.ili_file_line_edit.text().strip()) self.ili_models_line_edit.setText(models[-1]['name']) self.ili_models_line_edit.setPlaceholderText(models[-1]['name']) else: nonEmptyValidator = NonEmptyStringValidator() self.ili_models_line_edit.setValidator(nonEmptyValidator) self.ili_models_line_edit.textChanged.emit( self.ili_models_line_edit.text()) # Update completer to add models from given ili file self.ilicache = IliCache(self.base_configuration) self.refresh_ili_cache() self.ili_models_line_edit.setPlaceholderText( self.tr('[Search model from repository]')) def refresh_ili_cache(self): self.ilicache.new_message.connect(self.show_message) self.ilicache.refresh() self.update_models_completer() def complete_models_completer(self): if not self.ili_models_line_edit.text(): self.ili_models_line_edit.completer().setCompletionMode( QCompleter.UnfilteredPopupCompletion) self.ili_models_line_edit.completer().complete() else: self.ili_models_line_edit.completer().setCompletionMode( QCompleter.PopupCompletion) def update_models_completer(self): completer = QCompleter(self.ilicache.model, self.ili_models_line_edit) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setFilterMode(Qt.MatchContains) self.delegate = ModelCompleterDelegate() completer.popup().setItemDelegate(self.delegate) self.ili_models_line_edit.setCompleter(completer) self.multiple_models_dialog.models_line_edit.setCompleter(completer) def show_message(self, level, message): if level == Qgis.Warning: self.bar.pushMessage(message, Qgis.Info, 10) elif level == Qgis.Critical: self.bar.pushMessage(message, Qgis.Warning, 10) def fill_models_line_edit(self): self.ili_models_line_edit.setText( self.multiple_models_dialog.get_models_string()) def fill_toml_file_info_label(self): text = None if self.ili2db_options.toml_file(): text = self.tr('Extra Model Information File: {}').format(( '…' + self.ili2db_options.toml_file( )[len(self.ili2db_options.toml_file()) - 40:]) if len(self.ili2db_options.toml_file() ) > 40 else self.ili2db_options.toml_file()) self.toml_file_info_label.setText(text) self.toml_file_info_label.setToolTip(self.ili2db_options.toml_file()) def help_requested(self): os_language = QLocale( QSettings().value('locale/userLocale')).name()[:2] if os_language in ['es', 'de']: webbrowser.open( "https://opengisch.github.io/projectgenerator/docs/{}/user-guide.html#generate-project" .format(os_language)) else: webbrowser.open( "https://opengisch.github.io/projectgenerator/docs/user-guide.html#generate-project" ) def advance_progress_bar_by_text(self, text): if text.strip() == 'Info: compile models…': self.progress_bar.setValue(20) elif text.strip() == 'Info: create table structure…': self.progress_bar.setValue(30)
def __init__(self, base_config, parent=None): QDialog.__init__(self, parent) self.setupUi(self) QgsGui.instance().enableAutoGeometryRestore(self); self.buttonBox.accepted.disconnect() self.buttonBox.accepted.connect(self.accepted) self.buttonBox.clear() self.buttonBox.addButton(QDialogButtonBox.Cancel) self.buttonBox.addButton( self.tr('Import Data'), QDialogButtonBox.AcceptRole) self.buttonBox.addButton(QDialogButtonBox.Help) self.buttonBox.helpRequested.connect(self.help_requested) self.xtf_file_browse_button.clicked.connect( make_file_selector(self.xtf_file_line_edit, title=self.tr('Open Transfer or Catalog File'), file_filter=self.tr('Transfer File (*.xtf *.itf);;Catalogue File(*.xml *.xls *.xlsx)'))) self.gpkg_file_browse_button.clicked.connect( make_save_file_selector(self.gpkg_file_line_edit, title=self.tr('Save in GeoPackage database file'), file_filter=self.tr('GeoPackage Database (*.gpkg)'), extension='.gpkg')) self.type_combo_box.clear() self.type_combo_box.addItem(self.tr('PostGIS'), 'pg') self.type_combo_box.addItem(self.tr('GeoPackage'), 'gpkg') self.type_combo_box.currentIndexChanged.connect(self.type_changed) self.ili2db_options = Ili2dbOptionsDialog() self.ili2db_options_button.clicked.connect(self.ili2db_options.open) self.ili2db_options.finished.connect(self.fill_toml_file_info_label) self.multiple_models_dialog = MultipleModelsDialog(self) self.multiple_models_button.clicked.connect( self.multiple_models_dialog.open) self.multiple_models_dialog.accepted.connect( self.fill_models_line_edit) self.base_configuration = base_config self.restore_configuration() self.validators = Validators() nonEmptyValidator = NonEmptyStringValidator() fileValidator = FileValidator( pattern=['*.xtf', '*.itf', '*.pdf', '*.xml', '*.xls', '*.xlsx']) gpkgFileValidator = FileValidator( pattern='*.gpkg', allow_non_existing=True) self.pg_host_line_edit.setValidator(nonEmptyValidator) self.pg_database_line_edit.setValidator(nonEmptyValidator) self.pg_user_line_edit.setValidator(nonEmptyValidator) self.xtf_file_line_edit.setValidator(fileValidator) self.gpkg_file_line_edit.setValidator(gpkgFileValidator) self.ili_models_line_edit.setPlaceholderText(self.tr('[Search model in repository]')) self.ili_models_line_edit.textChanged.connect(self.complete_models_completer) self.ili_models_line_edit.punched.connect(self.complete_models_completer) self.pg_host_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_host_line_edit.textChanged.emit(self.pg_host_line_edit.text()) self.pg_database_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_database_line_edit.textChanged.emit( self.pg_database_line_edit.text()) self.pg_user_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_user_line_edit.textChanged.emit(self.pg_user_line_edit.text()) self.pg_use_super_login.setText( self.tr('Generate schema with superuser login from settings ({})').format(base_config.super_pg_user)) self.xtf_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.xtf_file_line_edit.textChanged.emit( self.xtf_file_line_edit.text()) self.gpkg_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.gpkg_file_line_edit.textChanged.emit( self.gpkg_file_line_edit.text()) settings = QSettings() ilifile = settings.value('QgsProjectGenerator/ili2db/ilifile') self.ilicache = IliCache(base_config, ilifile or None) self.update_models_completer() self.ilicache.refresh()
class ImportDataDialog(QDialog, DIALOG_UI): def __init__(self, base_config, parent=None): QDialog.__init__(self, parent) self.setupUi(self) QgsGui.instance().enableAutoGeometryRestore(self); self.buttonBox.accepted.disconnect() self.buttonBox.accepted.connect(self.accepted) self.buttonBox.clear() self.buttonBox.addButton(QDialogButtonBox.Cancel) self.buttonBox.addButton( self.tr('Import Data'), QDialogButtonBox.AcceptRole) self.buttonBox.addButton(QDialogButtonBox.Help) self.buttonBox.helpRequested.connect(self.help_requested) self.xtf_file_browse_button.clicked.connect( make_file_selector(self.xtf_file_line_edit, title=self.tr('Open Transfer or Catalog File'), file_filter=self.tr('Transfer File (*.xtf *.itf);;Catalogue File(*.xml *.xls *.xlsx)'))) self.gpkg_file_browse_button.clicked.connect( make_save_file_selector(self.gpkg_file_line_edit, title=self.tr('Save in GeoPackage database file'), file_filter=self.tr('GeoPackage Database (*.gpkg)'), extension='.gpkg')) self.type_combo_box.clear() self.type_combo_box.addItem(self.tr('PostGIS'), 'pg') self.type_combo_box.addItem(self.tr('GeoPackage'), 'gpkg') self.type_combo_box.currentIndexChanged.connect(self.type_changed) self.ili2db_options = Ili2dbOptionsDialog() self.ili2db_options_button.clicked.connect(self.ili2db_options.open) self.ili2db_options.finished.connect(self.fill_toml_file_info_label) self.multiple_models_dialog = MultipleModelsDialog(self) self.multiple_models_button.clicked.connect( self.multiple_models_dialog.open) self.multiple_models_dialog.accepted.connect( self.fill_models_line_edit) self.base_configuration = base_config self.restore_configuration() self.validators = Validators() nonEmptyValidator = NonEmptyStringValidator() fileValidator = FileValidator( pattern=['*.xtf', '*.itf', '*.pdf', '*.xml', '*.xls', '*.xlsx']) gpkgFileValidator = FileValidator( pattern='*.gpkg', allow_non_existing=True) self.pg_host_line_edit.setValidator(nonEmptyValidator) self.pg_database_line_edit.setValidator(nonEmptyValidator) self.pg_user_line_edit.setValidator(nonEmptyValidator) self.xtf_file_line_edit.setValidator(fileValidator) self.gpkg_file_line_edit.setValidator(gpkgFileValidator) self.ili_models_line_edit.setPlaceholderText(self.tr('[Search model in repository]')) self.ili_models_line_edit.textChanged.connect(self.complete_models_completer) self.ili_models_line_edit.punched.connect(self.complete_models_completer) self.pg_host_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_host_line_edit.textChanged.emit(self.pg_host_line_edit.text()) self.pg_database_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_database_line_edit.textChanged.emit( self.pg_database_line_edit.text()) self.pg_user_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_user_line_edit.textChanged.emit(self.pg_user_line_edit.text()) self.pg_use_super_login.setText( self.tr('Generate schema with superuser login from settings ({})').format(base_config.super_pg_user)) self.xtf_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.xtf_file_line_edit.textChanged.emit( self.xtf_file_line_edit.text()) self.gpkg_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.gpkg_file_line_edit.textChanged.emit( self.gpkg_file_line_edit.text()) settings = QSettings() ilifile = settings.value('QgsProjectGenerator/ili2db/ilifile') self.ilicache = IliCache(base_config, ilifile or None) self.update_models_completer() self.ilicache.refresh() def accepted(self): configuration = self.updated_configuration() if not self.xtf_file_line_edit.validator().validate(configuration.xtffile, 0)[0] == QValidator.Acceptable: self.txtStdout.setText( self.tr('Please set a valid INTERLIS transfer or catalogue file before importing data.')) self.xtf_file_line_edit.setFocus() return if self.type_combo_box.currentData() == 'pg': if not configuration.dbhost: self.txtStdout.setText( self.tr('Please set a host before importing data.')) self.pg_host_line_edit.setFocus() return if not configuration.database: self.txtStdout.setText( self.tr('Please set a database before importing data.')) self.pg_database_line_edit.setFocus() return if not configuration.dbusr: self.txtStdout.setText( self.tr('Please set a database user before importing data.')) self.pg_user_line_edit.setFocus() return elif self.type_combo_box.currentData() == 'gpkg': if not configuration.dbfile or self.gpkg_file_line_edit.validator().validate(configuration.dbfile, 0)[0] != QValidator.Acceptable: self.txtStdout.setText( self.tr('Please set a valid database file before creating the project.')) self.gpkg_file_line_edit.setFocus() return # create schema with superuser if self.type_combo_box.currentData() == 'pg' and configuration.db_use_super_login: configuration.tool_name='ili2pg' if self.type_combo_box.currentData() == 'pg' else 'ili2gpkg' _db_connector = pg_connector.PGConnector(configuration.super_user_uri, configuration.dbschema) if not _db_connector.db_or_schema_exists(): _db_connector.create_db_or_schema(configuration.dbusr) with OverrideCursor(Qt.WaitCursor): self.progress_bar.show() self.progress_bar.setValue(0) self.disable() self.txtStdout.setTextColor(QColor('#000000')) self.txtStdout.clear() dataImporter = iliimporter.Importer(dataImport=True) tool_name = 'ili2pg' if self.type_combo_box.currentData() == 'pg' else 'ili2gpkg' dataImporter.tool_name = tool_name dataImporter.configuration = configuration self.save_configuration(configuration) dataImporter.stdout.connect(self.print_info) dataImporter.stderr.connect(self.on_stderr) dataImporter.process_started.connect(self.on_process_started) dataImporter.process_finished.connect(self.on_process_finished) self.progress_bar.setValue(25) try: if dataImporter.run() != iliimporter.Importer.SUCCESS: self.enable() self.progress_bar.hide() return except JavaNotFoundError: self.txtStdout.setTextColor(QColor('#000000')) self.txtStdout.clear() self.txtStdout.setText(self.tr( 'Java could not be found. Please <a href="https://java.com/en/download/">install Java</a> and or <a href="#configure">configure a custom java path</a>. We also support the JAVA_HOME environment variable in case you prefer this.')) self.enable() self.progress_bar.hide() return self.buttonBox.clear() self.buttonBox.setEnabled(True) self.buttonBox.addButton(QDialogButtonBox.Close) self.progress_bar.setValue(100) def print_info(self, text, text_color='#000000'): self.txtStdout.setTextColor(QColor(text_color)) self.txtStdout.append(text) QCoreApplication.processEvents() def on_stderr(self, text): color_log_text(text, self.txtStdout) self.advance_progress_bar_by_text(text) def on_process_started(self, command): self.disable() self.txtStdout.setTextColor(QColor('#000000')) self.txtStdout.clear() self.txtStdout.setText(command) QCoreApplication.processEvents() def on_process_finished(self, exit_code, result): color = '#004905' if exit_code == 0 else '#aa2222' self.txtStdout.setTextColor(QColor(color)) self.txtStdout.append('Finished ({})'.format(exit_code)) if result == iliimporter.Importer.SUCCESS: self.buttonBox.clear() self.buttonBox.setEnabled(True) self.buttonBox.addButton(QDialogButtonBox.Close) else: self.enable() def updated_configuration(self): """ Get the configuration that is updated with the user configuration changes on the dialog. :return: Configuration """ configuration = ili2dbconfig.ImportDataConfiguration() if self.type_combo_box.currentData() == 'pg': # PostgreSQL specific options configuration.dbhost = self.pg_host_line_edit.text().strip() configuration.dbport = self.pg_port_line_edit.text().strip() configuration.dbusr = self.pg_user_line_edit.text().strip() configuration.database = self.pg_database_line_edit.text().strip() configuration.dbschema = self.pg_schema_line_edit.text().strip().lower() configuration.dbpwd = self.pg_password_line_edit.text() configuration.db_use_super_login = self.pg_use_super_login.isChecked() elif self.type_combo_box.currentData() == 'gpkg': configuration.dbfile = self.gpkg_file_line_edit.text().strip() configuration.xtffile = self.xtf_file_line_edit.text().strip() configuration.delete_data = self.chk_delete_data.isChecked() configuration.ilimodels = self.ili_models_line_edit.text().strip() configuration.inheritance = self.ili2db_options.inheritance_type() configuration.create_basket_col = self.ili2db_options.create_basket_col() configuration.create_import_tid = self.ili2db_options.create_import_tid() configuration.stroke_arcs = self.ili2db_options.stroke_arcs() configuration.base_configuration = self.base_configuration return configuration def save_configuration(self, configuration): settings = QSettings() settings.setValue( 'QgsProjectGenerator/ili2pg/xtffile_import', configuration.xtffile) settings.setValue( 'QgsProjectGenerator/ili2pg/deleteData', configuration.delete_data) settings.setValue( 'QgsProjectGenerator/importtype', self.type_combo_box.currentData()) if self.type_combo_box.currentData() in ['ili2pg', 'pg']: # PostgreSQL specific options settings.setValue('QgsProjectGenerator/ili2pg/host', configuration.dbhost) settings.setValue('QgsProjectGenerator/ili2pg/port', configuration.dbport) settings.setValue('QgsProjectGenerator/ili2pg/user', configuration.dbusr) settings.setValue('QgsProjectGenerator/ili2pg/database', configuration.database) settings.setValue('QgsProjectGenerator/ili2pg/schema', configuration.dbschema) settings.setValue('QgsProjectGenerator/ili2pg/password', configuration.dbpwd) settings.setValue('QgsProjectGenerator/ili2pg/usesuperlogin', configuration.db_use_super_login) elif self.type_combo_box.currentData() in ['ili2gpkg', 'gpkg']: settings.setValue('QgsProjectGenerator/ili2gpkg/dbfile', configuration.dbfile) def restore_configuration(self): settings = QSettings() self.fill_toml_file_info_label() self.xtf_file_line_edit.setText(settings.value( 'QgsProjectGenerator/ili2pg/xtffile_import')) self.chk_delete_data.setChecked(settings.value( 'QgsProjectGenerator/ili2pg/deleteData', False, bool)) self.pg_host_line_edit.setText(settings.value( 'QgsProjectGenerator/ili2pg/host', 'localhost')) self.pg_port_line_edit.setText(settings.value( 'QgsProjectGenerator/ili2pg/port')) self.pg_user_line_edit.setText(settings.value( 'QgsProjectGenerator/ili2pg/user')) self.pg_database_line_edit.setText(settings.value( 'QgsProjectGenerator/ili2pg/database')) self.pg_schema_line_edit.setText(settings.value( 'QgsProjectGenerator/ili2pg/schema')) self.pg_password_line_edit.setText(settings.value( 'QgsProjectGenerator/ili2pg/password')) self.pg_use_super_login.setChecked(settings.value( 'QgsProjectGenerator/ili2pg/usesuperlogin', defaultValue=False, type=bool)) self.gpkg_file_line_edit.setText(settings.value( 'QgsProjectGenerator/ili2gpkg/dbfile')) mode = settings.value('QgsProjectGenerator/importtype', 'pg') mode = 'pg' if mode == 'ili2pg' else mode mode = 'gpkg' if mode == 'ili2gpkg' else mode self.type_combo_box.setCurrentIndex(self.type_combo_box.findData(mode)) self.type_changed() def disable(self): self.pg_config.setEnabled(False) self.ili_config.setEnabled(False) self.buttonBox.setEnabled(False) def enable(self): self.pg_config.setEnabled(True) self.ili_config.setEnabled(True) self.buttonBox.setEnabled(True) def type_changed(self): self.progress_bar.hide() if self.type_combo_box.currentData() == 'pg': self.pg_config.show() self.gpkg_config.hide() elif self.type_combo_box.currentData() == 'gpkg': self.pg_config.hide() self.gpkg_config.show() def link_activated(self, link): if link.url() == '#configure': cfg = OptionsDialog(self.base_configuration) if cfg.exec_(): settings = QSettings() settings.beginGroup('QgsProjectGenerator/ili2db') self.base_configuration.save(settings) else: QDesktopServices.openUrl(link) def complete_models_completer(self): if not self.ili_models_line_edit.text(): self.ili_models_line_edit.completer().setCompletionMode(QCompleter.UnfilteredPopupCompletion) self.ili_models_line_edit.completer().complete() else: self.ili_models_line_edit.completer().setCompletionMode(QCompleter.PopupCompletion) def update_models_completer(self): completer = QCompleter(self.ilicache.model, self.ili_models_line_edit) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setFilterMode(Qt.MatchContains) self.delegate = ModelCompleterDelegate() completer.popup().setItemDelegate(self.delegate) self.ili_models_line_edit.setCompleter(completer) self.multiple_models_dialog.models_line_edit.setCompleter(completer) def fill_models_line_edit(self): self.ili_models_line_edit.setText( self.multiple_models_dialog.get_models_string()) def fill_toml_file_info_label(self): text = None if self.ili2db_options.toml_file(): text = self.tr('Extra Model Information File: {}').format(('…'+self.ili2db_options.toml_file()[len(self.ili2db_options.toml_file())-40:]) if len(self.ili2db_options.toml_file()) > 40 else self.ili2db_options.toml_file()) self.toml_file_info_label.setText(text) self.toml_file_info_label.setToolTip(self.ili2db_options.toml_file()) def help_requested(self): os_language = QLocale(QSettings().value( 'locale/userLocale')).name()[:2] if os_language in ['es', 'de']: webbrowser.open( "https://opengisch.github.io/projectgenerator/docs/{}/user-guide.html#import-an-interlis-transfer-file-xtf".format(os_language)) else: webbrowser.open( "https://opengisch.github.io/projectgenerator/docs/user-guide.html#import-an-interlis-transfer-file-xtf") def advance_progress_bar_by_text(self, text): if text.strip() == 'Info: compile models...': self.progress_bar.setValue(50) QCoreApplication.processEvents() elif text.strip() == 'Info: create table structure...': self.progress_bar.setValue(75) QCoreApplication.processEvents()
def __init__(self, base_config, parent=None): QDialog.__init__(self, parent) self.setupUi(self) self.buttonBox.accepted.disconnect() self.buttonBox.accepted.connect(self.accepted) self.buttonBox.clear() self.buttonBox.addButton(QDialogButtonBox.Cancel) self.buttonBox.addButton( self.tr('Export'), QDialogButtonBox.AcceptRole) self.buttonBox.addButton(QDialogButtonBox.Help) self.buttonBox.helpRequested.connect(self.help_requested) self.xtf_file_browse_button.clicked.connect( make_save_file_selector(self.xtf_file_line_edit, title=self.tr('Save in XTF Transfer File'), file_filter=self.tr('XTF Transfer File (*.xtf)'), extension='.xtf')) self.xtf_file_browse_button.clicked.connect( self.xtf_browser_opened_to_true) self.xtf_browser_was_opened = False self.gpkg_file_browse_button.clicked.connect( make_file_selector(self.gpkg_file_line_edit, title=self.tr('Open GeoPackage database file'), file_filter=self.tr('GeoPackage Database (*.gpkg)'))) self.type_combo_box.clear() self.type_combo_box.addItem(self.tr('PostGIS'), 'pg') self.type_combo_box.addItem(self.tr('GeoPackage'), 'gpkg') self.type_combo_box.currentIndexChanged.connect(self.type_changed) self.multiple_models_dialog = MultipleModelsDialog(self) self.multiple_models_button.clicked.connect( self.multiple_models_dialog.open) self.multiple_models_dialog.accepted.connect( self.fill_models_line_edit) self.base_configuration = base_config self.restore_configuration() self.validators = Validators() nonEmptyValidator = NonEmptyStringValidator() fileValidator = FileValidator(pattern='*.xtf', allow_non_existing=True) gpkgFileValidator = FileValidator(pattern='*.gpkg') self.ili_models_line_edit.setValidator(nonEmptyValidator) self.pg_host_line_edit.setValidator(nonEmptyValidator) self.pg_database_line_edit.setValidator(nonEmptyValidator) self.pg_user_line_edit.setValidator(nonEmptyValidator) self.xtf_file_line_edit.setValidator(fileValidator) self.gpkg_file_line_edit.setValidator(gpkgFileValidator) self.ili_models_line_edit.textChanged.connect( self.validators.validate_line_edits) self.ili_models_line_edit.textChanged.emit( self.ili_models_line_edit.text()) self.pg_host_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_host_line_edit.textChanged.emit(self.pg_host_line_edit.text()) self.pg_database_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_database_line_edit.textChanged.emit( self.pg_database_line_edit.text()) self.pg_user_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_user_line_edit.textChanged.emit(self.pg_user_line_edit.text()) self.xtf_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.xtf_file_line_edit.textChanged.connect( self.xtf_browser_opened_to_false) self.xtf_file_line_edit.textChanged.emit( self.xtf_file_line_edit.text()) self.gpkg_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.gpkg_file_line_edit.textChanged.emit( self.gpkg_file_line_edit.text()) settings = QSettings() ilifile = settings.value('QgsProjectGenerator/ili2db/ilifile') self.ilicache = IliCache(base_config, ilifile or None) self.ilicache.models_changed.connect(self.update_models_completer) self.ilicache.refresh()
class ExportDialog(QDialog, DIALOG_UI): def __init__(self, base_config, parent=None): QDialog.__init__(self, parent) self.setupUi(self) self.buttonBox.accepted.disconnect() self.buttonBox.accepted.connect(self.accepted) self.buttonBox.clear() self.buttonBox.addButton(QDialogButtonBox.Cancel) self.buttonBox.addButton( self.tr('Export'), QDialogButtonBox.AcceptRole) self.buttonBox.addButton(QDialogButtonBox.Help) self.buttonBox.helpRequested.connect(self.help_requested) self.xtf_file_browse_button.clicked.connect( make_save_file_selector(self.xtf_file_line_edit, title=self.tr('Save in XTF Transfer File'), file_filter=self.tr('XTF Transfer File (*.xtf)'), extension='.xtf')) self.xtf_file_browse_button.clicked.connect( self.xtf_browser_opened_to_true) self.xtf_browser_was_opened = False self.gpkg_file_browse_button.clicked.connect( make_file_selector(self.gpkg_file_line_edit, title=self.tr('Open GeoPackage database file'), file_filter=self.tr('GeoPackage Database (*.gpkg)'))) self.type_combo_box.clear() self.type_combo_box.addItem(self.tr('PostGIS'), 'pg') self.type_combo_box.addItem(self.tr('GeoPackage'), 'gpkg') self.type_combo_box.currentIndexChanged.connect(self.type_changed) self.multiple_models_dialog = MultipleModelsDialog(self) self.multiple_models_button.clicked.connect( self.multiple_models_dialog.open) self.multiple_models_dialog.accepted.connect( self.fill_models_line_edit) self.base_configuration = base_config self.restore_configuration() self.validators = Validators() nonEmptyValidator = NonEmptyStringValidator() fileValidator = FileValidator(pattern='*.xtf', allow_non_existing=True) gpkgFileValidator = FileValidator(pattern='*.gpkg') self.ili_models_line_edit.setValidator(nonEmptyValidator) self.pg_host_line_edit.setValidator(nonEmptyValidator) self.pg_database_line_edit.setValidator(nonEmptyValidator) self.pg_user_line_edit.setValidator(nonEmptyValidator) self.xtf_file_line_edit.setValidator(fileValidator) self.gpkg_file_line_edit.setValidator(gpkgFileValidator) self.ili_models_line_edit.textChanged.connect( self.validators.validate_line_edits) self.ili_models_line_edit.textChanged.emit( self.ili_models_line_edit.text()) self.pg_host_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_host_line_edit.textChanged.emit(self.pg_host_line_edit.text()) self.pg_database_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_database_line_edit.textChanged.emit( self.pg_database_line_edit.text()) self.pg_user_line_edit.textChanged.connect( self.validators.validate_line_edits) self.pg_user_line_edit.textChanged.emit(self.pg_user_line_edit.text()) self.xtf_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.xtf_file_line_edit.textChanged.connect( self.xtf_browser_opened_to_false) self.xtf_file_line_edit.textChanged.emit( self.xtf_file_line_edit.text()) self.gpkg_file_line_edit.textChanged.connect( self.validators.validate_line_edits) self.gpkg_file_line_edit.textChanged.emit( self.gpkg_file_line_edit.text()) settings = QSettings() ilifile = settings.value('QgsProjectGenerator/ili2db/ilifile') self.ilicache = IliCache(base_config, ilifile or None) self.ilicache.models_changed.connect(self.update_models_completer) self.ilicache.refresh() def accepted(self): configuration = self.updated_configuration() if not self.xtf_file_line_edit.validator().validate(configuration.xtffile, 0)[0] == QValidator.Acceptable: self.txtStdout.setText( self.tr('Please set a valid INTERLIS XTF file before exporting data.')) self.xtf_file_line_edit.setFocus() return if not configuration.ilimodels: self.txtStdout.setText( self.tr('Please set a model before exporting data.')) self.ili_models_line_edit.setFocus() return if self.type_combo_box.currentData() == 'pg': if not configuration.host: self.txtStdout.setText( self.tr('Please set a host before exporting data.')) self.pg_host_line_edit.setFocus() return if not configuration.database: self.txtStdout.setText( self.tr('Please set a database before exporting data.')) self.pg_database_line_edit.setFocus() return if not configuration.user: self.txtStdout.setText( self.tr('Please set a database user before exporting data.')) self.pg_user_line_edit.setFocus() return elif self.type_combo_box.currentData() == 'gpkg': if not configuration.dbfile or self.gpkg_file_line_edit.validator().validate(configuration.dbfile, 0)[0] != QValidator.Acceptable: self.txtStdout.setText( self.tr('Please set an existing database file before creating the project.')) self.gpkg_file_line_edit.setFocus() return # If xtf browser was opened and the file exists, the user already chose # to overwrite the file if os.path.isfile(self.xtf_file_line_edit.text().strip()) and not self.xtf_browser_was_opened: self.msg = QMessageBox() self.msg.setIcon(QMessageBox.Warning) self.msg.setText(os.path.basename(self.xtf_file_line_edit.text().strip( )) + self.tr(" already exists.\nDo you want to replace it?")) self.msg.setWindowTitle(self.tr("Save in XTF Transfer File")) self.msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) msg_box = self.msg.exec_() if msg_box == QMessageBox.No: return with OverrideCursor(Qt.WaitCursor): self.progress_bar.show() self.progress_bar.setValue(0) self.disable() self.txtStdout.setTextColor(QColor('#000000')) self.txtStdout.clear() exporter = iliexporter.Exporter() tool_name = 'ili2pg' if self.type_combo_box.currentData() == 'pg' else 'ili2gpkg' exporter.tool_name = tool_name exporter.configuration = configuration self.save_configuration(configuration) exporter.stdout.connect(self.print_info) exporter.stderr.connect(self.on_stderr) exporter.process_started.connect(self.on_process_started) exporter.process_finished.connect(self.on_process_finished) self.progress_bar.setValue(25) try: if exporter.run() != iliexporter.Exporter.SUCCESS: self.enable() self.progress_bar.hide() return except JavaNotFoundError: self.txtStdout.setTextColor(QColor('#000000')) self.txtStdout.clear() self.txtStdout.setText(self.tr( 'Java could not be found. Please <a href="https://java.com/en/download/">install Java</a> and or <a href="#configure">configure a custom java path</a>. We also support the JAVA_HOME environment variable in case you prefer this.')) self.enable() self.progress_bar.hide() return self.buttonBox.clear() self.buttonBox.setEnabled(True) self.buttonBox.addButton(QDialogButtonBox.Close) self.progress_bar.setValue(100) def print_info(self, text): self.txtStdout.setTextColor(QColor('#000000')) self.txtStdout.append(text) QCoreApplication.processEvents() def on_stderr(self, text): self.txtStdout.setTextColor(QColor('#2a2a2a')) self.txtStdout.append(text) self.advance_progress_bar_by_text(text) QCoreApplication.processEvents() def on_process_started(self, command): self.disable() self.txtStdout.setTextColor(QColor('#000000')) self.txtStdout.clear() self.txtStdout.setText(command) QCoreApplication.processEvents() def on_process_finished(self, exit_code, result): color = '#004905' if exit_code == 0 else '#aa2222' self.txtStdout.setTextColor(QColor(color)) self.txtStdout.append(self.tr('Finished ({})'.format(exit_code))) if result == iliexporter.Exporter.SUCCESS: self.buttonBox.clear() self.buttonBox.setEnabled(True) self.buttonBox.addButton(QDialogButtonBox.Close) else: self.enable() def updated_configuration(self): """ Get the configuration that is updated with the user configuration changes on the dialog. :return: Configuration """ configuration = ili2dbconfig.ExportConfiguration() if self.type_combo_box.currentData() == 'pg': # PostgreSQL specific options configuration.host = self.pg_host_line_edit.text().strip() configuration.port = self.pg_port_line_edit.text().strip() configuration.user = self.pg_user_line_edit.text().strip() configuration.database = self.pg_database_line_edit.text().strip() configuration.schema = self.pg_schema_line_edit.text().strip().lower() configuration.password = self.pg_password_line_edit.text() elif self.type_combo_box.currentData() == 'gpkg': configuration.dbfile = self.gpkg_file_line_edit.text().strip() configuration.xtffile = self.xtf_file_line_edit.text().strip() configuration.ilimodels = self.ili_models_line_edit.text().strip() configuration.base_configuration = self.base_configuration return configuration def save_configuration(self, configuration): settings = QSettings() settings.setValue( 'QgsProjectGenerator/ili2pg/xtffile_export', configuration.xtffile) settings.setValue('QgsProjectGenerator/importtype', self.type_combo_box.currentData()) if self.type_combo_box.currentData() in ['ili2pg', 'pg']: # PostgreSQL specific options settings.setValue( 'QgsProjectGenerator/ili2pg/host', configuration.host) settings.setValue( 'QgsProjectGenerator/ili2pg/port', configuration.port) settings.setValue( 'QgsProjectGenerator/ili2pg/user', configuration.user) settings.setValue( 'QgsProjectGenerator/ili2pg/database', configuration.database) settings.setValue( 'QgsProjectGenerator/ili2pg/schema', configuration.schema) settings.setValue( 'QgsProjectGenerator/ili2pg/password', configuration.password) elif self.type_combo_box.currentData() in ['ili2gpkg', 'gpkg']: settings.setValue( 'QgsProjectGenerator/ili2gpkg/dbfile', configuration.dbfile) def restore_configuration(self): settings = QSettings() self.xtf_file_line_edit.setText(settings.value( 'QgsProjectGenerator/ili2pg/xtffile_export')) self.pg_host_line_edit.setText(settings.value( 'QgsProjectGenerator/ili2pg/host', 'localhost')) self.pg_port_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/port')) self.pg_user_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/user')) self.pg_database_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/database')) self.pg_schema_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/schema')) self.pg_password_line_edit.setText( settings.value('QgsProjectGenerator/ili2pg/password')) self.gpkg_file_line_edit.setText( settings.value('QgsProjectGenerator/ili2gpkg/dbfile')) mode = settings.value('QgsProjectGenerator/importtype', 'pg') mode = 'pg' if mode == 'ili2pg' else mode mode = 'gpkg' if mode == 'ili2gpkg' else mode self.type_combo_box.setCurrentIndex(self.type_combo_box.findData(mode)) self.type_changed() def disable(self): self.pg_config.setEnabled(False) self.ili_config.setEnabled(False) self.buttonBox.setEnabled(False) def enable(self): self.pg_config.setEnabled(True) self.ili_config.setEnabled(True) self.buttonBox.setEnabled(True) def type_changed(self): self.progress_bar.hide() if self.type_combo_box.currentData() == 'pg': self.pg_config.show() self.gpkg_config.hide() elif self.type_combo_box.currentData() == 'gpkg': self.pg_config.hide() self.gpkg_config.show() def link_activated(self, link): if link.url() == '#configure': cfg = OptionsDialog(self.base_configuration) if cfg.exec_(): settings = QSettings() settings.beginGroup('QgsProjectGenerator/ili2db') self.base_configuration.save(settings) else: QDesktopServices.openUrl(link) def update_models_completer(self): completer = QCompleter(self.ilicache.model_names) completer.setCaseSensitivity(Qt.CaseInsensitive) self.ili_models_line_edit.setCompleter(completer) self.multiple_models_dialog.models_line_edit.setCompleter(completer) def fill_models_line_edit(self): self.ili_models_line_edit.setText( self.multiple_models_dialog.get_models_string()) def help_requested(self): os_language = QLocale(QSettings().value( 'locale/userLocale')).name()[:2] if os_language in ['es', 'de']: webbrowser.open( "https://opengisch.github.io/projectgenerator/docs/{}/user-guide.html#export-an-interlis-transfer-file-xtf".format(os_language)) else: webbrowser.open( "https://opengisch.github.io/projectgenerator/docs/user-guide.html#export-an-interlis-transfer-file-xtf") def xtf_browser_opened_to_true(self): """ Slot. Sets a flag to true to eventually avoid asking a user whether to overwrite a file. """ self.xtf_browser_was_opened = True def xtf_browser_opened_to_false(self): """ Slot. Sets a flag to false to eventually ask a user whether to overwrite a file. """ self.xtf_browser_was_opened = False def advance_progress_bar_by_text(self, text): if text.strip() == 'Info: compile models...': self.progress_bar.setValue(50) elif text.strip() == 'Info: create table structure...': self.progress_bar.setValue(75)