def run(self, edited_command=None): proc = QProcess() proc.readyReadStandardError.connect( functools.partial(self.stderr_ready, proc=proc) ) proc.readyReadStandardOutput.connect( functools.partial(self.stdout_ready, proc=proc) ) if not edited_command: ili2db_jar_arg = self._ili2db_jar_arg() if ili2db_jar_arg == self.ILI2DB_NOT_FOUND: return self.ILI2DB_NOT_FOUND args = self._args(False) java_path = get_java_path(self.configuration.base_configuration) proc.start(java_path, ili2db_jar_arg + args) else: proc.start(self.command_with_password(edited_command)) if not proc.waitForStarted(): proc = None if not proc: raise JavaNotFoundError() self.process_started.emit(self.command_without_password(edited_command)) self.__result = self.ERROR loop = QEventLoop() proc.finished.connect(loop.exit) loop.exec() self.process_finished.emit(proc.exitCode(), self.__result) return self.__result
def __init__(self, name, project, **kwargs): super(BatchFileSync, self).__init__(name, project) self.cmd = kwargs['cmd'] if self.project: self.rootfolder = os.path.abspath(self.project.folder) else: self.rootfolder = kwargs['rootfolder'] self.project = project self.closeproject = kwargs.get("close_project", False) self.process = QProcess() self.parser = kwargs.get("parser", None) self.parsermodule = None variables = kwargs.get("variables", {}) variables["ROAM_PROJECT_ROOT"] = project.folder variables["ROAM_PROJECT_DATA"] = project.datafolder() variables['ROAM_PROJECTS_HOME'] = os.path.abspath( os.path.join(project.folder, "..")) variables['ROAM_MASTER_DATA_FOLDER'] = os.path.abspath( os.path.join(project.folder, "..", "_data")) env = QProcessEnvironment.systemEnvironment() for varname, value in variables.items(): env.insert(varname, str(value)) self.process.setProcessEnvironment(env) self.process.setWorkingDirectory( os.path.dirname(os.path.realpath(self.cmd))) self.process.finished.connect(self.complete) self.process.started.connect(self.syncStarted) self.process.readyReadStandardError.connect(self.error) self.process.readyReadStandardOutput.connect(self.readOutput) self._output = "" self.haserror = False
def __init__(self, parent, iface, pluginBase, pluginName, pluginCommand): QDialog.__init__(self, parent) self.setAttribute(Qt.WA_DeleteOnClose) self.iface = iface self.process = QProcess(self) Utils.setProcessEnvironment(self.process) self.process.error.connect(self.processError) self.process.finished.connect(self.processFinished) self.setupUi(self) self.arguments = [] self.editCmdBtn.setIcon(QIcon(":/icons/edit.png")) self.editCmdBtn.toggled.connect(self.editCommand) self.resetCmdBtn.setIcon(QIcon(":/icons/reset.png")) self.resetCmdBtn.clicked.connect(self.resetCommand) self.editCommand(False) self.buttonBox.rejected.connect(self.reject) self.buttonBox.accepted.connect(self.accept) self.buttonBox.helpRequested.connect(self.help) self.buttonBox.button(QDialogButtonBox.Ok).setDefault(True) self.plugin = pluginBase self.valuesChanged.connect(self.handleRefreshArgs) self.pluginLayout.addWidget(self.plugin) self.plugin.setFocus() self.setWindowTitle(pluginName) self.setPluginCommand(pluginCommand)
def runProcess(self, runStr, progress): process = QProcess(iface) process.start(runStr) process.waitForFinished() returnedstring = str(process.readAllStandardOutput()) # print returnedstring progress.pushInfo(returnedstring) process.kill()
def run(self): ili2db_bin = get_ili2db_bin(self.tool_name, self.stdout, self.stderr, ili2db_tools) if not ili2db_bin: return ili2db_jar_arg = ["-jar", ili2db_bin] self.configuration.tool_name = self.tool_name args = self.configuration.to_ili2db_args() if self.configuration.base_configuration.java_path: # A java path is configured: respect it no mather what java_paths = [self.configuration.base_configuration.java_path] else: # By default try JAVA_HOME and PATH java_paths = [] if 'JAVA_HOME' in os.environ: paths = os.environ['JAVA_HOME'].split(";") for path in paths: java_paths += [ os.path.join( path.replace("\"", "").replace("'", ""), 'java') ] java_paths += ['java'] proc = None for java_path in java_paths: proc = QProcess() proc.readyReadStandardError.connect( functools.partial(self.stderr_ready, proc=proc)) proc.readyReadStandardOutput.connect( functools.partial(self.stdout_ready, proc=proc)) proc.start(java_path, ili2db_jar_arg + args) if not proc.waitForStarted(): proc = None else: break if not proc: raise JavaNotFoundError() safe_args = ili2db_jar_arg + self.configuration.to_ili2db_args( hide_password=True) safe_command = java_path + ' ' + ' '.join(safe_args) self.process_started.emit(safe_command) self.__result = Exporter.ERROR loop = QEventLoop() proc.finished.connect(loop.exit) loop.exec() self.process_finished.emit(proc.exitCode(), self.__result) return self.__result
def runSurfit(self): runStr = os.path.join(self.plugin_dir, "bin/surfit ") + os.path.realpath(self.tclFilename) process = QProcess(iface) process.start(runStr) process.waitForFinished() # returnedstring = str(process.readAllStandardOutput()) # print returnedstring # progress.setText(returnedstring) process.kill()
def run(self): ili2db_bin = get_ili2db_bin(self.tool, self.stdout, self.stderr) if not ili2db_bin: return ili2db_jar_arg = ["-jar", ili2db_bin] self.configuration.tool = self.tool db_simple_factory = DbSimpleFactory() db_factory = db_simple_factory.create_factory(self.tool) config_manager = db_factory.get_db_command_config_manager( self.configuration) args = config_manager.get_ili2db_args(False) args_hide_password = config_manager.get_ili2db_args(True) java_path = get_java_path(self.configuration.base_configuration) proc = QProcess() proc.readyReadStandardError.connect( functools.partial(self.stderr_ready, proc=proc)) proc.readyReadStandardOutput.connect( functools.partial(self.stdout_ready, proc=proc)) proc.start(java_path, ili2db_jar_arg + args) if not proc.waitForStarted(): proc = None if not proc: raise JavaNotFoundError() safe_args = ili2db_jar_arg + args_hide_password safe_command = java_path + ' ' + ' '.join(safe_args) self.process_started.emit(safe_command) self.__result = Importer.ERROR loop = QEventLoop() proc.finished.connect(loop.exit) loop.exec() self.process_finished.emit(proc.exitCode(), self.__result) return self.__result
def run(self, mode, value): java_home_set = self.java_dependency.set_java_home() if not java_home_set: self.java_dependency.get_java_on_demand() return if not self.crypto_dependency.check_if_dependency_is_valid(): self.crypto_dependency.download_dependency(URL_CRYPTO_LIBRARY) return java_path = self.java_dependency.get_full_java_exe_path() args = ["-jar", CRYPTO_LIBRARY_PATH] args += [mode, self._secret_key, self._salt, value] proc = QProcess() proc.setProcessChannelMode(QProcess.MergedChannels) proc.start(java_path, args) proc.waitForReadyRead() output = bytearray(proc.readAllStandardOutput()) output = output.decode("ascii") return output.strip()
def accept(self): """Collecting all the stuff we need to know to start the import process. """ # Save the settings. self.settings.value("file/export/output_itf_path", self.lineEditOutputFile.text()) # Gather all data/information for ili2pg arguments. self.itf = self.lineEditOutputFile.text().strip() current_index = self.cBoxProject.currentIndex() if current_index == 0: return db_schema = str(self.cBoxProject.itemData(current_index)) # Get the connections parameters from the projects list we created in # the init_gui method. i = 0 for project in self.projects: if db_schema == str(project["dbschema"]): self.db_host = str(project["dbhost"]) self.db_name = str(project["dbname"]) self.db_port = str(project["dbport"]) self.db_schema = db_schema self.db_admin = str(project["dbadmin"]) self.db_admin_pwd = str(project["dbadminpwd"]) self.app_module = str(project["appmodule"]) self.app_module_name = str(project["appmodulename"]) self.db_user = str(project["dbuser"]) self.db_pwd = str(project["dbpwd"]) self.ili = str(project["ilimodelname"]) self.project_index = i break i += 1 import_vm_arguments = self.settings.value( "options/import/vm_arguments", "") # Check if we have everything we need. if self.itf == "": self.message_bar.pushWarning("VeriSO", tr("No Interlis transfer file " "set.")) return if self.ili == "": self.message_bar.pushWarning("VeriSO", tr("No Interlis model name set.")) return if self.db_schema == "": self.message_bar.pushWarning("VeriSO", tr("No project name set.")) return if self.app_module == "": self.message_bar.pushWarning("VeriSO", tr("No application module " "set.")) return if not self.db_host: self.message_bar.pushWarning("VeriSO", tr("Missing database host " "parameter.")) return if not self.db_name: self.message_bar.pushWarning("VeriSO", tr("Missing database name " "parameter.")) return if not self.db_port: self.message_bar.pushWarning("VeriSO", tr("Missing database port " "parameter.")) return if not self.db_user: self.message_bar.pushWarning("VeriSO", tr("Missing database user " "parameter.")) return if not self.db_pwd: self.message_bar.pushWarning("VeriSO", tr("Missing database password " "parameter.")) return if not self.db_admin: self.message_bar.pushWarning("VeriSO", tr( "Missing database administrator parameter.")) return if not self.db_admin_pwd: self.message_bar.pushWarning("VeriSO", tr( "Missing database administrator password parameter.")) return if jre_version() is None: self.message_bar.pushWarning("VeriSO", tr("No java runtime detected.")) return self.textEditExportOutput.clear() # Set all the arguments for ili2pg. arguments = [] vm_arguments_list = import_vm_arguments.split(" ") for arg in vm_arguments_list: arguments.append(arg) import_jar = os.path.dirname(__file__) + '/../../lib/ili2pg-3.6.1/ili2pg.jar' arguments.append("-Duser.country=CH") arguments.append("-Duser.language=de") arguments.append("-jar") arguments.append(import_jar) arguments.append("--export") arguments.append("--dbhost") arguments.append(self.db_host) arguments.append("--dbport") arguments.append(self.db_port) arguments.append("--dbdatabase") arguments.append(self.db_name) arguments.append("--dbschema") arguments.append(self.db_schema) arguments.append("--dbusr") arguments.append(self.db_admin) arguments.append("--dbpwd") arguments.append(self.db_admin_pwd) arguments.append("--modeldir") model_dir = ';'.join(self.settings.value( "options/model_repositories/repositories")) arguments.append(model_dir) arguments.append("--models") arguments.append(self.ili) arguments.append("--defaultSrsAuth") arguments.append("EPSG") arguments.append(self.itf) self.process = QProcess() self.process.readyReadStandardOutput.connect(self.read_output) self.process.readyReadStandardError.connect(self.read_error) self.process.finished.connect(self.finish_import) QApplication.setOverrideCursor(Qt.WaitCursor) self.buttonBox.setEnabled(False) self.report_progress("Info: Starting ili2pg") self.report_progress("Info: java %s" % ' '.join(arguments)) try: if(sys.platform == 'win32'): j = win_which('java.exe') self.process.start(j, arguments) else: self.process.start("java", arguments) except Exception as e: self.restore_cursor() message = "Could not start export process." self.message_bar.pushMessage("VeriSO", tr(message), Qgis.Critical, duration=0) QgsMessageLog.logMessage(str(e), tag="VeriSO", level=Qgis.Critical)
def generate_report(self, db, report_type): # Check if mapfish and Jasper are installed, otherwise show where to # download them from and return if not self.report_dependency.check_if_dependency_is_valid(): self.report_dependency.download_dependency(URL_REPORTS_LIBRARIES) return java_home_set = self.java_dependency.set_java_home() if not java_home_set: self.java_dependency.get_java_on_demand() self.logger.info_msg( __name__, QCoreApplication.translate( "ReportGenerator", "Java is a prerequisite. Since it was not found, it is being configured..." )) return plot_layer = self.app.core.get_layer(db, db.names.LC_PLOT_T, load=True) if not plot_layer: return selected_plots = plot_layer.selectedFeatures() if not selected_plots: self.logger.warning_msg( __name__, QCoreApplication.translate( "ReportGenerator", "To generate reports, first select at least a plot!")) return # Where to store the reports? previous_folder = QSettings().value( "Asistente-LADM-COL/reports/save_into_dir", ".") save_into_folder = QFileDialog.getExistingDirectory( None, QCoreApplication.translate( "ReportGenerator", "Select a folder to save the reports to be generated"), previous_folder) if not save_into_folder: self.logger.warning_msg( __name__, QCoreApplication.translate( "ReportGenerator", "You need to select a folder where to save the reports before continuing." )) return QSettings().setValue("Asistente-LADM-COL/reports/save_into_dir", save_into_folder) config_path = os.path.join(DEPENDENCY_REPORTS_DIR_NAME, report_type) json_spec_file = os.path.join(config_path, 'spec_json_file.json') script_name = '' if os.name == 'posix': script_name = 'print' elif os.name == 'nt': script_name = 'print.bat' script_path = os.path.join(DEPENDENCY_REPORTS_DIR_NAME, 'bin', script_name) if not os.path.isfile(script_path): self.logger.warning( __name__, "Script file for reports wasn't found! {}".format(script_path)) return self.enable_action_requested.emit(report_type, False) # Update config file yaml_config_path = self.update_yaml_config(db, config_path) self.logger.debug( __name__, "Config file for reports: {}".format(yaml_config_path)) total = len(selected_plots) step = 0 count = 0 tmp_dir = self.get_tmp_dir() # Progress bar setup progress = QProgressBar() if total == 1: progress.setRange(0, 0) else: progress.setRange(0, 100) progress.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.app.gui.create_progress_message_bar( QCoreApplication.translate("ReportGenerator", "Generating {} report{}...").format( total, '' if total == 1 else 's'), progress) polygons_with_holes = [] multi_polygons = [] for selected_plot in selected_plots: plot_id = selected_plot[db.names.T_ID_F] geometry = selected_plot.geometry() abstract_geometry = geometry.get() if abstract_geometry.ringCount() > 1: polygons_with_holes.append(str(plot_id)) self.logger.warning( __name__, QCoreApplication.translate( "ReportGenerator", "Skipping Annex 17 for plot with {}={} because it has holes. The reporter module does not support such polygons." ).format(db.names.T_ID_F, plot_id)) continue if abstract_geometry.numGeometries() > 1: multi_polygons.append(str(plot_id)) self.logger.warning( __name__, QCoreApplication.translate( "ReportGenerator", "Skipping Annex 17 for plot with {}={} because it is a multi-polygon. The reporter module does not support such polygons." ).format(db.names.T_ID_F, plot_id)) continue # Generate data file json_file = self.update_json_data(db, json_spec_file, plot_id, tmp_dir, report_type) self.logger.debug(__name__, "JSON file for reports: {}".format(json_file)) # Run sh/bat passing config and data files proc = QProcess() proc.readyReadStandardError.connect( functools.partial(self.stderr_ready, proc=proc)) proc.readyReadStandardOutput.connect( functools.partial(self.stdout_ready, proc=proc)) parcel_number = self.ladm_data.get_parcels_related_to_plots( db, [plot_id], db.names.LC_PARCEL_T_PARCEL_NUMBER_F) or [''] file_name = '{}_{}_{}.pdf'.format(report_type, plot_id, parcel_number[0]) current_report_path = os.path.join(save_into_folder, file_name) proc.start(script_path, [ '-config', yaml_config_path, '-spec', json_file, '-output', current_report_path ]) if not proc.waitForStarted(): # Grant execution permissions os.chmod( script_path, stat.S_IXOTH | stat.S_IXGRP | stat.S_IXUSR | stat.S_IRUSR | stat.S_IRGRP) proc.start(script_path, [ '-config', yaml_config_path, '-spec', json_file, '-output', current_report_path ]) if not proc.waitForStarted(): proc = None self.logger.warning( __name__, "Couldn't execute script to generate report...") else: loop = QEventLoop() proc.finished.connect(loop.exit) loop.exec() self.logger.debug(__name__, "{}:{}".format(plot_id, proc.exitCode())) if proc.exitCode() == 0: count += 1 step += 1 progress.setValue(step * 100 / total) os.remove(yaml_config_path) self.enable_action_requested.emit(report_type, True) self.logger.clear_message_bar() if total == count: if total == 1: msg = QCoreApplication.translate( "ReportGenerator", "The report <a href='file:///{}'>{}</a> was successfully generated!" ).format(normalize_local_url(save_into_folder), file_name) else: msg = QCoreApplication.translate( "ReportGenerator", "All reports were successfully generated in folder <a href='file:///{path}'>{path}</a>!" ).format(path=normalize_local_url(save_into_folder)) self.logger.success_msg(__name__, msg) else: details_msg = '' if polygons_with_holes: details_msg += QCoreApplication.translate( "ReportGenerator", " The following polygons were skipped because they have holes and are not supported: {}." ).format(", ".join(polygons_with_holes)) if multi_polygons: details_msg += QCoreApplication.translate( "ReportGenerator", " The following polygons were skipped because they are multi-polygons and are not supported: {}." ).format(", ".join(multi_polygons)) if total == 1: msg = QCoreApplication.translate( "ReportGenerator", "The report for plot {} couldn't be generated!{} See QGIS log (tab '{}') for details." ).format(plot_id, details_msg, self.LOG_TAB) else: if count == 0: msg = QCoreApplication.translate( "ReportGenerator", "No report could be generated!{} See QGIS log (tab '{}') for details." ).format(details_msg, self.LOG_TAB) else: msg = QCoreApplication.translate( "ReportGenerator", "At least one report couldn't be generated!{details_msg} See QGIS log (tab '{log_tab}') for details. Go to <a href='file:///{path}'>{path}</a> to see the reports that were generated." ).format(details_msg=details_msg, path=normalize_local_url(save_into_folder), log_tab=self.LOG_TAB) self.logger.warning_msg(__name__, msg)
def generate_report(self, db, button): # Check if mapfish and Jasper are installed, otherwise show where to # download them from and return base_path = os.path.join(os.path.expanduser('~'), 'Asistente-LADM_COL', 'impresion') bin_path = os.path.join(base_path, 'bin') if not os.path.exists(bin_path): self.qgis_utils.message_with_button_download_report_dependency_emitted.emit( QCoreApplication.translate( "ReportGenerator", "The dependency library to generate reports is not installed. Click on the button to download and install it." )) return # Check version required_version_found = True version_path = os.path.join(base_path, 'version') if not os.path.exists(version_path): required_version_found = False else: version_found = '' with open(version_path) as f: version_found = f.read() if version_found != REPORTS_REQUIRED_VERSION: required_version_found = False if not required_version_found: self.qgis_utils.message_with_button_remove_report_dependency_emitted.emit( QCoreApplication.translate( "ReportGenerator", "The dependency library to generate reports was found, but does not match with the version required. Click the button to remove the installed version and try again." )) return # Check if JAVA_HOME path is set, otherwise use path from project Generator if os.name == 'nt': if 'JAVA_HOME' not in os.environ: java_path = self.get_java_path_from_project_generator() if not java_path: self.qgis_utils.message_emitted.emit( QCoreApplication.translate( "ReportGenerator", "Please set JAVA_HOME path in Project Generator Settings or in Environmental Variables for your OS" ), Qgis.Warning) return else: os.environ["JAVA_HOME"] = java_path self.log.logMessage( "The JAVA_HOME path has been set using Project Generator Settings for reports.", PLUGIN_NAME, Qgis.Info) plot_layer = self.qgis_utils.get_layer(db, PLOT_TABLE, QgsWkbTypes.PolygonGeometry, load=True) if plot_layer is None: self.qgis_utils.message_emitted.emit( QCoreApplication.translate( "ReportGenerator", "Layer 'Plot' not found in DB! {}").format( db.get_description()), Qgis.Warning) return selected_plots = plot_layer.selectedFeatures() if not selected_plots: self.qgis_utils.message_emitted.emit( QCoreApplication.translate( "ReportGenerator", "To generate reports, first select at least a plot!"), Qgis.Warning) return # Where to store the reports? previous_folder = QSettings().value( "Asistente-LADM_COL/reports/save_into_dir", ".") save_into_folder = QFileDialog.getExistingDirectory( None, QCoreApplication.translate( "ReportGenerator", "Select a folder to save the reports to be generated"), previous_folder) if not save_into_folder: self.qgis_utils.message_emitted.emit( QCoreApplication.translate( "ReportGenerator", "You need to select a folder where to save the reports before continuing." ), Qgis.Warning) return QSettings().setValue("Asistente-LADM_COL/reports/save_into_dir", save_into_folder) config_path = os.path.join(base_path, 'ANT') json_spec_file = os.path.join(config_path, 'spec_json_file.json') script_name = '' if os.name == 'posix': script_name = 'print' elif os.name == 'nt': script_name = 'print.bat' script_path = os.path.join(bin_path, script_name) if not os.path.isfile(script_path): print("### SCRIPT FILE WASN'T FOUND") return button.setEnabled(False) # Update config file yaml_config_path = self.update_yaml_config(db, config_path) print("CONFIG FILE:", yaml_config_path) total = len(selected_plots) step = 0 count = 0 tmp_dir = self.get_tmp_dir() # Progress bar setup progress = QProgressBar() if total == 1: progress.setRange(0, 0) else: progress.setRange(0, 100) progress.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.qgis_utils.create_progress_message_bar_emitted.emit( QCoreApplication.translate("ReportGenerator", "Generating {} report{}...").format( total, '' if total == 1 else 's'), progress) for selected_plot in selected_plots: plot_id = selected_plot[ID_FIELD] # Generate data file json_file = self.update_json_data(db, json_spec_file, plot_id, tmp_dir) print("JSON FILE:", json_file) # Run sh/bat passing config and data files proc = QProcess() proc.readyReadStandardError.connect( functools.partial(self.stderr_ready, proc=proc)) proc.readyReadStandardOutput.connect( functools.partial(self.stdout_ready, proc=proc)) current_report_path = os.path.join( save_into_folder, 'anexo_17_{}.pdf'.format(plot_id)) proc.start(script_path, [ '-config', yaml_config_path, '-spec', json_file, '-output', current_report_path ]) if not proc.waitForStarted(): # Grant execution permissions os.chmod( script_path, stat.S_IXOTH | stat.S_IXGRP | stat.S_IXUSR | stat.S_IRUSR | stat.S_IRGRP) proc.start(script_path, [ '-config', yaml_config_path, '-spec', json_file, '-output', current_report_path ]) if not proc.waitForStarted(): proc = None print("### COULDN'T EXECUTE SCRIPT TO GENERATE REPORT...") else: loop = QEventLoop() proc.finished.connect(loop.exit) loop.exec() print(plot_id, ':', proc.exitCode()) if proc.exitCode() == 0: count += 1 step += 1 progress.setValue(step * 100 / total) os.remove(yaml_config_path) button.setEnabled(True) self.qgis_utils.clear_message_bar_emitted.emit() if total == count: if total == 1: msg = QCoreApplication.translate( "ReportGenerator", "The report <a href='file://{}'>anexo_17_{}.pdf</a> was successfully generated!" ).format(save_into_folder, plot_id) else: msg = QCoreApplication.translate( "ReportGenerator", "All reports were successfully generated in folder <a href='file://{path}'>{path}</a>!" ).format(path=save_into_folder) self.qgis_utils.message_with_duration_emitted.emit( msg, Qgis.Success, 0) else: if total == 1: msg = QCoreApplication.translate( "ReportGenerator", "The report for plot {} couldn't be generated! See QGIS log (tab 'Anexo_17') for details." ).format(plot_id) else: if count == 0: msg = QCoreApplication.translate( "ReportGenerator", "No report could be generated! See QGIS log (tab 'Anexo_17') for details." ) else: msg = QCoreApplication.translate( "ReportGenerator", "At least one report couldn't be generated! See QGIS log (tab 'Anexo_17') for details. Go to <a href='file://{path}'>{path}</a> to see the reports that were generated." ).format(path=save_into_folder) self.qgis_utils.message_with_duration_emitted.emit( msg, Qgis.Warning, 0)
def run(self): ili2db_bin = get_ili2db_bin(self.tool_name, self.stdout, self.stderr, ili2db_tools) if not ili2db_bin: return args = ["-jar", ili2db_bin] args += ["--export"] if self.tool_name == 'ili2pg': # PostgreSQL specific options args += ["--dbhost", self.configuration.host] if self.configuration.port: args += ["--dbport", self.configuration.port] args += ["--dbusr", self.configuration.user] if self.configuration.password: args += ["--dbpwd", self.configuration.password] args += ["--dbdatabase", self.configuration.database] args += [ "--dbschema", self.configuration.schema or self.configuration.database ] elif self.tool_name == 'ili2gpkg': args += ["--dbfile", self.configuration.dbfile] args += self.configuration.base_configuration.to_ili2db_args(False) if self.configuration.ilimodels: args += ['--models', self.configuration.ilimodels] args += [self.configuration.xtffile] if self.configuration.base_configuration.java_path: # A java path is configured: respect it no mather what java_paths = [self.configuration.base_configuration.java_path] else: # By default try JAVA_HOME and PATH java_paths = [] if 'JAVA_HOME' in os.environ: paths = os.environ['JAVA_HOME'].split(";") for path in paths: java_paths += [ os.path.join( path.replace("\"", "").replace("'", ""), 'java') ] java_paths += ['java'] proc = None for java_path in java_paths: proc = QProcess() proc.readyReadStandardError.connect( functools.partial(self.stderr_ready, proc=proc)) proc.readyReadStandardOutput.connect( functools.partial(self.stdout_ready, proc=proc)) proc.start(java_path, args) if not proc.waitForStarted(): proc = None else: break if not proc: raise JavaNotFoundError() self.process_started.emit(java_path + ' ' + ' '.join(args)) self.__result = Exporter.ERROR loop = QEventLoop() proc.finished.connect(loop.exit) loop.exec() self.process_finished.emit(proc.exitCode(), self.__result) return self.__result
def run(self): ili2db_bin = get_ili2db_bin(self.tool_name, self.stdout, self.stderr, ili2db_tools) if not ili2db_bin: return args = ["-jar", ili2db_bin] args += ["--schemaimport"] if self.tool_name == 'ili2pg': # PostgreSQL specific options args += ["--dbhost", self.configuration.host] if self.configuration.port: args += ["--dbport", self.configuration.port] args += ["--dbusr", self.configuration.user] if self.configuration.password: args += ["--dbpwd", self.configuration.password] args += ["--dbdatabase", self.configuration.database] args += [ "--dbschema", self.configuration.schema or self.configuration.database ] args += ["--setupPgExt"] elif self.tool_name == 'ili2gpkg': args += ["--dbfile", self.configuration.dbfile] args += ["--coalesceCatalogueRef"] args += ["--createEnumTabs"] args += ["--createNumChecks"] args += ["--coalesceMultiSurface"] args += ["--coalesceMultiLine"] args += ["--strokeArcs"] args += ["--beautifyEnumDispName"] #args += ["--createBasketCol"] args += ["--createUnique"] args += ["--createGeomIdx"] args += ["--createFk"] args += ["--createFkIdx"] args += ["--createMetaInfo"] if self.configuration.inheritance == 'smart1': args += ["--smart1Inheritance"] elif self.configuration.inheritance == 'smart2': args += ["--smart2Inheritance"] else: args += ["--noSmartMapping"] proxy = QgsNetworkAccessManager.instance().fallbackProxy() if proxy.type() == QNetworkProxy.HttpProxy: args += ["--proxy", proxy.hostName()] args += ["--proxyPort", str(proxy.port())] if self.configuration.epsg != 21781: args += ["--defaultSrsCode", "{}".format(self.configuration.epsg)] if self.configuration.ilimodels: args += ['--models', self.configuration.ilimodels] if self.configuration.ilifile: # Valid ili file, don't pass --modelDir (it can cause ili2db # errors) args += self.configuration.base_configuration.to_ili2db_args( export_modeldir=False) args += [self.configuration.ilifile] else: args += self.configuration.base_configuration.to_ili2db_args() if self.configuration.base_configuration.java_path: # A java path is configured: respect it no mather what java_paths = [self.configuration.base_configuration.java_path] else: # By default try JAVA_HOME and PATH java_paths = [] if 'JAVA_HOME' in os.environ: paths = os.environ['JAVA_HOME'].split(os.pathsep) for path in paths: java_paths += [ os.path.join( path.replace("\"", "").replace("'", ""), 'java') ] java_paths += ['java'] proc = None for java_path in java_paths: proc = QProcess() proc.readyReadStandardError.connect( functools.partial(self.stderr_ready, proc=proc)) proc.readyReadStandardOutput.connect( functools.partial(self.stdout_ready, proc=proc)) proc.start(java_path, args) if not proc.waitForStarted(): proc = None else: break if not proc: raise JavaNotFoundError() command = java_path + ' ' + ' '.join(args) safe_command = command.replace( "--dbpwd {}".format(self.configuration.password), "--dbpwd ***") self.process_started.emit(safe_command) self.__result = Importer.ERROR loop = QEventLoop() proc.finished.connect(loop.exit) loop.exec() self.process_finished.emit(proc.exitCode(), self.__result) return self.__result
def generate_report(self, db, report_type): # Check if mapfish and Jasper are installed, otherwise show where to # download them from and return base_path = os.path.join(os.path.expanduser('~'), 'Asistente-LADM_COL', 'impresion') bin_path = os.path.join(base_path, 'bin') if not os.path.exists(bin_path): self.qgis_utils.message_with_button_download_report_dependency_emitted.emit( QCoreApplication.translate( "ReportGenerator", "The dependency library to generate reports is not installed. Click on the button to download and install it." )) return # Check version required_version_found = True version_path = os.path.join(base_path, 'version') if not os.path.exists(version_path): required_version_found = False else: version_found = '' with open(version_path) as f: version_found = f.read() if version_found.strip() != REPORTS_REQUIRED_VERSION: required_version_found = False if not required_version_found: self.qgis_utils.message_with_button_remove_report_dependency_emitted.emit( QCoreApplication.translate( "ReportGenerator", "The dependency library to generate reports was found, but does not match with the version required. Click the button to remove the installed version and try again." )) return # Check if JAVA_HOME path is set, otherwise use path from QGIS Model Baker if os.name == 'nt': if 'JAVA_HOME' not in os.environ: self.msg = QMessageBox() self.msg.setIcon(QMessageBox.Information) self.msg.setText( QCoreApplication.translate( "ReportGenerator", "JAVA_HOME environment variable is not defined, please define it as an enviroment variable on Windows and restart QGIS before generating the annex 17." )) self.msg.setWindowTitle( QCoreApplication.translate("ReportGenerator", "JAVA_HOME not defined")) self.msg.setStandardButtons(QMessageBox.Close) self.msg.exec_() return plot_layer = self.qgis_utils.get_layer(db, PLOT_TABLE, QgsWkbTypes.PolygonGeometry, load=True) if plot_layer is None: self.qgis_utils.message_emitted.emit( QCoreApplication.translate( "ReportGenerator", "Layer 'Plot' not found in DB! {}").format( db.get_description()), Qgis.Warning) return selected_plots = plot_layer.selectedFeatures() if not selected_plots: self.qgis_utils.message_emitted.emit( QCoreApplication.translate( "ReportGenerator", "To generate reports, first select at least a plot!"), Qgis.Warning) return # Where to store the reports? previous_folder = QSettings().value( "Asistente-LADM_COL/reports/save_into_dir", ".") save_into_folder = QFileDialog.getExistingDirectory( None, QCoreApplication.translate( "ReportGenerator", "Select a folder to save the reports to be generated"), previous_folder) if not save_into_folder: self.qgis_utils.message_emitted.emit( QCoreApplication.translate( "ReportGenerator", "You need to select a folder where to save the reports before continuing." ), Qgis.Warning) return QSettings().setValue("Asistente-LADM_COL/reports/save_into_dir", save_into_folder) config_path = os.path.join(base_path, report_type) json_spec_file = os.path.join(config_path, 'spec_json_file.json') script_name = '' if os.name == 'posix': script_name = 'print' elif os.name == 'nt': script_name = 'print.bat' script_path = os.path.join(bin_path, script_name) if not os.path.isfile(script_path): print("### SCRIPT FILE WASN'T FOUND") return self.enable_action_requested.emit(report_type, False) # Update config file yaml_config_path = self.update_yaml_config(db, config_path) print("CONFIG FILE:", yaml_config_path) total = len(selected_plots) step = 0 count = 0 tmp_dir = self.get_tmp_dir() # Progress bar setup progress = QProgressBar() if total == 1: progress.setRange(0, 0) else: progress.setRange(0, 100) progress.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.qgis_utils.create_progress_message_bar_emitted.emit( QCoreApplication.translate("ReportGenerator", "Generating {} report{}...").format( total, '' if total == 1 else 's'), progress) polygons_with_holes = [] multi_polygons = [] for selected_plot in selected_plots: plot_id = selected_plot[ID_FIELD] geometry = selected_plot.geometry() abstract_geometry = geometry.get() if abstract_geometry.ringCount() > 1: polygons_with_holes.append(str(plot_id)) self.log.logMessage( QCoreApplication.translate( "ReportGenerator", "Skipping Annex 17 for plot with {}={} because it has holes. The reporter module does not support such polygons." ).format(ID_FIELD, plot_id), PLUGIN_NAME, Qgis.Warning) continue if abstract_geometry.numGeometries() > 1: multi_polygons.append(str(plot_id)) self.log.logMessage( QCoreApplication.translate( "ReportGenerator", "Skipping Annex 17 for plot with {}={} because it is a multi-polygon. The reporter module does not support such polygons." ).format(ID_FIELD, plot_id), PLUGIN_NAME, Qgis.Warning) continue # Generate data file json_file = self.update_json_data(db, json_spec_file, plot_id, tmp_dir, report_type) print("JSON FILE:", json_file) # Run sh/bat passing config and data files proc = QProcess() proc.readyReadStandardError.connect( functools.partial(self.stderr_ready, proc=proc)) proc.readyReadStandardOutput.connect( functools.partial(self.stdout_ready, proc=proc)) parcel_number = self.ladm_data.get_parcels_related_to_plot( db, plot_id, PARCEL_NUMBER_FIELD) or [''] file_name = '{}_{}_{}.pdf'.format(report_type, plot_id, parcel_number[0]) current_report_path = os.path.join(save_into_folder, file_name) proc.start(script_path, [ '-config', yaml_config_path, '-spec', json_file, '-output', current_report_path ]) if not proc.waitForStarted(): # Grant execution permissions os.chmod( script_path, stat.S_IXOTH | stat.S_IXGRP | stat.S_IXUSR | stat.S_IRUSR | stat.S_IRGRP) proc.start(script_path, [ '-config', yaml_config_path, '-spec', json_file, '-output', current_report_path ]) if not proc.waitForStarted(): proc = None print("### COULDN'T EXECUTE SCRIPT TO GENERATE REPORT...") else: loop = QEventLoop() proc.finished.connect(loop.exit) loop.exec() print(plot_id, ':', proc.exitCode()) if proc.exitCode() == 0: count += 1 step += 1 progress.setValue(step * 100 / total) os.remove(yaml_config_path) self.enable_action_requested.emit(report_type, True) self.qgis_utils.clear_message_bar_emitted.emit() if total == count: if total == 1: msg = QCoreApplication.translate( "ReportGenerator", "The report <a href='file:///{}'>{}</a> was successfully generated!" ).format(normalize_local_url(save_into_folder), file_name) else: msg = QCoreApplication.translate( "ReportGenerator", "All reports were successfully generated in folder <a href='file:///{path}'>{path}</a>!" ).format(path=normalize_local_url(save_into_folder)) self.qgis_utils.message_with_duration_emitted.emit( msg, Qgis.Success, 0) else: details_msg = '' if polygons_with_holes: details_msg += QCoreApplication.translate( "ReportGenerator", " The following polygons were skipped because they have holes and are not supported: {}." ).format(", ".join(polygons_with_holes)) if multi_polygons: details_msg += QCoreApplication.translate( "ReportGenerator", " The following polygons were skipped because they are multi-polygons and are not supported: {}." ).format(", ".join(multi_polygons)) if total == 1: msg = QCoreApplication.translate( "ReportGenerator", "The report for plot {} couldn't be generated!{} See QGIS log (tab '{}') for details." ).format(plot_id, details_msg, self.LOG_TAB) else: if count == 0: msg = QCoreApplication.translate( "ReportGenerator", "No report could be generated!{} See QGIS log (tab '{}') for details." ).format(details_msg, self.LOG_TAB) else: msg = QCoreApplication.translate( "ReportGenerator", "At least one report couldn't be generated!{details_msg} See QGIS log (tab '{log_tab}') for details. Go to <a href='file:///{path}'>{path}</a> to see the reports that were generated." ).format(details_msg=details_msg, path=normalize_local_url(save_into_folder), log_tab=self.LOG_TAB) self.qgis_utils.message_with_duration_emitted.emit( msg, Qgis.Warning, 0)
def accept(self): """Collecting all the stuff we need to know to start the import process. """ # Save the settings. self.settings.setValue("file/import/input_itf_path", self.lineEditInputFile.text()) self.settings.setValue("file/import/ili", self.ili) # Check if project name (db schema) already exists. project_name = self.lineEditDbSchema.text().strip() if len(project_name) > 0: project_found = self.check_project_name(project_name) if project_found == -1: message = "An error occured while connecting the database." self.message_bar.pushMessage("VeriSO", tr(message), Qgis.Critical, duration=0) return elif project_found == 1: message = "Project name already exists." self.message_bar.pushWarning("VeriSO", tr(message)) QgsMessageLog.logMessage(tr(message), "VeriSO", Qgis.Warning) return # Gather all data/information for ili2pg arguments. self.itf = self.lineEditInputFile.text().strip() self.db_schema = self.lineEditDbSchema.text().strip() self.data_date = self.dateTimeEdit.date().toString("yyyy-MM-dd") self.notes = self.textEditNotes.toPlainText().strip() if len(self.notes) > 10000: message = "Notes are to big (allowed 10000 characters): " self.message_bar.pushMessage("VeriSO", tr(message) + str(len(self.notes)), Qgis.Critical, duration=0) QgsMessageLog.logMessage( str(message) + str(len(self.notes)), "VeriSO", Qgis.Warning) return self.projects_database = self.settings.value( "options/general/projects_database", "") if self.projects_database is None: self.projects_database = "" self.projects_root_directory = self.settings.value( "options/general/projects_root_directory", "") import_jar = self.settings.value("options/import/jar", "") self.use_pg_projects_database = self.settings.value( "options/general/use_pg_projects_database", False, type=bool) self.ignore_ili2pg_errors = self.settings.value( "options/import/ignore_ili2pg_errors", False, type=bool) self.ignore_postprocessing_errors = self.settings.value( "options/import/ignore_postprocessing_errors", False, type=bool) import_vm_arguments = self.settings.value( "options/import/vm_arguments", "") # Check if we have everything we need. if not os.path.isfile( self.projects_database) and self.projects_database != "": self.message_bar.pushWarning( "VeriSO", tr("Projects database not " "found: ") + str(self.projects_database)) return if self.itf == "": # in veriti, if no itf file is set, use a "empty" default itf file if self.app_module == 'veriti': self.itf = os.path.dirname( __file__) + "/../../modules/veriti/varia/default.itf" else: self.message_bar.pushWarning( "VeriSO", tr("No Interlis transfer file " "set.")) return if self.ili == "": self.message_bar.pushWarning("VeriSO", tr("No Interlis model name set.")) return if self.db_schema == "": self.message_bar.pushWarning("VeriSO", tr("No project name set.")) return if self.cmbBoxAppModule.currentIndex() == 0: self.message_bar.pushWarning("VeriSO", tr("No application module chosen.")) return if not self.db_host: self.message_bar.pushWarning( "VeriSO", tr("Missing database host " "parameter.")) return if not self.db_name: self.message_bar.pushWarning( "VeriSO", tr("Missing database name " "parameter.")) return if not self.db_port: self.message_bar.pushWarning( "VeriSO", tr("Missing database port " "parameter.")) return if not self.db_user: self.message_bar.pushWarning( "VeriSO", tr("Missing database user " "parameter.")) return if not self.db_pwd: self.message_bar.pushWarning( "VeriSO", tr("Missing database password " "parameter.")) return if not self.db_admin: self.message_bar.pushWarning( "VeriSO", tr("Missing database administrator parameter.")) return if not self.db_admin_pwd: self.message_bar.pushWarning( "VeriSO", tr("Missing database administrator password parameter.")) return if self.projects_root_directory == "": self.message_bar.pushWarning( "VeriSO", tr("No root directory for " "projects set.")) return if self.projects_database == "": self.message_bar.pushInfo( "VeriSO", tr("No projects database found. Will create one in the " "project root directory.")) if jre_version() is None: self.message_bar.pushWarning("VeriSO", tr("No java runtime detected.")) return max_scale_role = self.get_module_allow_max_scale_role() self.max_scale = 0 if self.max_scale_check.isChecked(): if db_user_has_role(self.db_user, max_scale_role): self.max_scale = self.max_scale_value.value() else: self.max_scale = 1000 self.textEditImportOutput.clear() # Set all the arguments for ili2pg. arguments = [] vm_arguments_list = import_vm_arguments.split(" ") for arg in vm_arguments_list: arguments.append(arg) if import_jar == "": import_jar = os.path.join(os.path.dirname(__file__), '..', '..', 'lib', 'ili2pg-3.10.7', 'ili2pg.jar') arguments.append("-Duser.country=CH") arguments.append("-Duser.language=de") arguments.append("-jar") arguments.append(import_jar) arguments.append("--import") arguments.append("--dbhost") arguments.append(self.db_host) arguments.append("--dbport") arguments.append(self.db_port) arguments.append("--dbdatabase") arguments.append(self.db_name) arguments.append("--dbschema") arguments.append(self.db_schema) arguments.append("--dbusr") arguments.append(self.db_admin) arguments.append("--dbpwd") arguments.append(self.db_admin_pwd) arguments.append("--modeldir") model_dir = ';'.join( self.settings.value("options/model_repositories/repositories")) arguments.append(model_dir) arguments.append("--models") arguments.append(self.ili) arguments.append("--defaultSrsAuth") arguments.append("EPSG") arguments.append("--defaultSrsCode") arguments.append(self.epsg) # TODO: ili2pg has a lot of options. At least some of them should be # exposed to the user. arguments.append("--t_id_Name") arguments.append("ogc_fid") arguments.append("--importTid") arguments.append("--createGeomIdx") if self.app_module == 'veriti': arguments.append("--createEnumTabs") arguments.append("--createFk") else: arguments.append("--createEnumColAsItfCode") arguments.append("--createEnumTxtCol") arguments.append("--nameByTopic") arguments.append("--strokeArcs") arguments.append(self.itf) self.process = QProcess() self.process.readyReadStandardOutput.connect(self.read_output) self.process.readyReadStandardError.connect(self.read_error) self.process.finished.connect(self.finish_import) QApplication.setOverrideCursor(Qt.WaitCursor) self.buttonBox.setEnabled(False) self.report_progress("Info: Starting ili2pg") self.report_progress("Info: java %s" % ' '.join(arguments)) try: if (sys.platform == 'win32'): j = win_which('java.exe') self.process.start(j, arguments) else: self.process.start("java", arguments) except Exception as e: self.restore_cursor() message = "Could not start import process." self.message_bar.pushMessage("VeriSO", tr(message), Qgis.Critical, duration=0) QgsMessageLog.logMessage(str(e), "VeriSO", Qgis.Critical)
def accept(self): """Collecting all the stuff we need to know to start the import process. """ # Save the settings. self.settings.setValue("file/import/input_itf_path", self.lineEditInputFile.text()) self.settings.setValue("file/import/ili", self.ili) # Check if project name (db schema) already exists. project_name = self.lineEditDbSchema.text().strip() if len(project_name) > 0: project_found = self.check_project_name(project_name) if project_found == -1: message = "An error occured while connecting the database." self.message_bar.pushMessage("VeriSO", tr(message), QgsMessageBar.CRITICAL, duration=0) return elif project_found == 1: message = "Project name already exists." self.message_bar.pushWarning("VeriSO", tr(message)) QgsMessageLog.logMessage(tr(message), "VeriSO", QgsMessageLog.WARNING) return # Gather all data/information for ili2pg arguments. self.itf = self.lineEditInputFile.text().strip() self.db_schema = self.lineEditDbSchema.text().strip() self.data_date = self.dateTimeEdit.date().toString("yyyy-MM-dd") self.notes = self.textEditNotes.toPlainText().strip() if len(self.notes) > 10000: message = "Notes are to big (allowed 10000 characters): " self.message_bar.pushMessage("VeriSO", tr(message) + str(len(self.notes)), QgsMessageBar.CRITICAL, duration=0) QgsMessageLog.logMessage( str(message) + str(len(self.notes)), "VeriSO", QgsMessageLog.WARNING) return self.projects_database = self.settings.value( "options/general/projects_database", "") self.projects_root_directory = self.settings.value( "options/general/projects_root_directory", "") import_jar = self.settings.value("options/import/jar", "") import_vm_arguments = self.settings.value( "options/import/vm_arguments", "") # Check if we have everything we need. if not os.path.isfile( self.projects_database) and self.projects_database != "": self.message_bar.pushWarning( "VeriSO", tr("Projects database not " "found: ") + str(self.projects_database)) return if self.itf == "": self.message_bar.pushWarning( "VeriSO", tr("No Interlis transfer file " "set.")) return if self.ili == "": self.message_bar.pushWarning("VeriSO", tr("No Interlis model name set.")) return if self.db_schema == "": self.message_bar.pushWarning("VeriSO", tr("No project name set.")) return if self.cmbBoxAppModule.currentIndex() == 0: self.message_bar.pushWarning( "VeriSO", tr("No application module " "chosen.")) return if not self.db_host: self.message_bar.pushWarning( "VeriSO", tr("Missing database host " "parameter.")) return if not self.db_name: self.message_bar.pushWarning( "VeriSO", tr("Missing database name " "parameter.")) return if not self.db_port: self.message_bar.pushWarning( "VeriSO", tr("Missing database port " "parameter.")) return if not self.db_user: self.message_bar.pushWarning( "VeriSO", tr("Missing database user " "parameter.")) return if not self.db_pwd: self.message_bar.pushWarning( "VeriSO", tr("Missing database password " "parameter.")) return if not self.db_admin: self.message_bar.pushWarning( "VeriSO", tr("Missing database administrator parameter.")) return if not self.db_admin_pwd: self.message_bar.pushWarning( "VeriSO", tr("Missing database administrator password parameter.")) return if self.projects_root_directory == "": self.message_bar.pushWarning( "VeriSO", tr("No root directory for " "projects " "set.")) return if self.projects_database == "": self.message_bar.pushInfo( "VeriSO", tr("No projects database found. Will create one in the " "project root directory.")) if import_jar == "": self.message_bar.pushWarning("VeriSO", tr("No jar file set for import.")) return self.textEditImportOutput.clear() # Set all the arguments for ili2pg. arguments = [] vm_arguments_list = import_vm_arguments.split(" ") for arg in vm_arguments_list: arguments.append(arg) arguments.append("-jar") arguments.append(import_jar) arguments.append("--import") arguments.append("--dbhost") arguments.append(self.db_host) arguments.append("--dbport") arguments.append(self.db_port) arguments.append("--dbdatabase") arguments.append(self.db_name) arguments.append("--dbschema") arguments.append(self.db_schema) arguments.append("--dbusr") arguments.append(self.db_admin) arguments.append("--dbpwd") arguments.append(self.db_admin_pwd) arguments.append("--modeldir") model_dir = ';'.join( self.settings.value("options/model_repositories/repositories")) arguments.append(model_dir) arguments.append("--models") arguments.append(self.ili) arguments.append("--defaultSrsAuth") arguments.append("EPSG") arguments.append("--defaultSrsCode") arguments.append(self.epsg) # TODO: ili2pg has a lot of options. At least some of them should be # exposed to the user. arguments.append("--t_id_Name") arguments.append("ogc_fid") arguments.append("--importTid") arguments.append("--createGeomIdx") arguments.append("--createEnumTabs") arguments.append("--createEnumTxtCol") arguments.append("--createEnumColAsItfCode") arguments.append("--nameByTopic") arguments.append("--strokeArcs") arguments.append(self.itf) self.process = QProcess() self.process.readyReadStandardOutput.connect(self.read_output) self.process.readyReadStandardError.connect(self.read_error) self.process.finished.connect(self.finish_import) QApplication.setOverrideCursor(Qt.WaitCursor) self.buttonBox.setEnabled(False) self.report_progress("Info: Starting ili2pg") self.report_progress("Info: java %s" % ' '.join(arguments)) try: self.process.start("java", arguments) except Exception as e: self.restore_cursor() message = "Could not start import process." self.message_bar.pushMessage("VeriSO", tr(message), QgsMessageBar.CRITICAL, duration=0) QgsMessageLog.logMessage(str(e), "VeriSO", QgsMessageLog.CRITICAL)
def run(self): ili2db_bin = get_ili2db_bin(self.tool_name, self.stdout, self.stderr, ili2db_tools) if not ili2db_bin: return args = ["-jar", ili2db_bin] args += ["--import"] if self.configuration.delete_data: args += ["--deleteData"] if self.tool_name == 'ili2pg': # PostgreSQL specific options args += ["--dbhost", self.configuration.host] if self.configuration.port: args += ["--dbport", self.configuration.port] args += ["--dbusr", self.configuration.user] if self.configuration.password: args += ["--dbpwd", self.configuration.password] args += ["--dbdatabase", self.configuration.database] args += [ "--dbschema", self.configuration.schema or self.configuration.database ] elif self.tool_name == 'ili2gpkg': args += ["--dbfile", self.configuration.dbfile] args += self.configuration.base_configuration.to_ili2db_args() if self.configuration.ilimodels: args += ['--models', self.configuration.ilimodels] # Use our default schema-import parameters and get others from QSettings. # They're used by ili2db in case the schema doesn't exist. If it exists, # this doesn't have any effect on the import. args += ["--createEnumTabs"] args += ["--createNumChecks"] args += ["--coalesceMultiSurface"] args += ["--createGeomIdx"] args += ["--createFk"] args += ["--createMetaInfo"] if self.tool_name == 'ili2pg': args += ["--setupPgExt"] proxy = QgsNetworkAccessManager.instance().fallbackProxy() if proxy.type() == QNetworkProxy.HttpProxy: args += ["--proxy", proxy.hostName()] args += ["--proxyPort", str(proxy.port())] settings = QSettings() epsg = settings.value('QgsProjectGenerator/ili2pg/epsg') if epsg: args += ["--defaultSrsCode", "{}".format(epsg)] inheritance = settings.value('QgsProjectGenerator/ili2pg/inheritance', 'smart2') if inheritance == 'smart1': args += ["--smart1Inheritance"] elif inheritance == 'smart2': args += ["--smart2Inheritance"] else: args += ["--noSmartMapping"] args += [self.configuration.xtffile] if self.configuration.base_configuration.java_path: # A java path is configured: respect it no mather what java_paths = [self.configuration.base_configuration.java_path] else: # By default try JAVA_HOME and PATH java_paths = [] if 'JAVA_HOME' in os.environ: paths = os.environ['JAVA_HOME'].split(";") for path in paths: java_paths += [ os.path.join( path.replace("\"", "").replace("'", ""), 'java') ] java_paths += ['java'] proc = None for java_path in java_paths: proc = QProcess() proc.readyReadStandardError.connect( functools.partial(self.stderr_ready, proc=proc)) proc.readyReadStandardOutput.connect( functools.partial(self.stdout_ready, proc=proc)) proc.start(java_path, args) if not proc.waitForStarted(): proc = None else: break if not proc: raise JavaNotFoundError() self.process_started.emit(java_path + ' ' + ' '.join(args)) self.__result = DataImporter.ERROR loop = QEventLoop() proc.finished.connect(loop.exit) loop.exec() self.process_finished.emit(proc.exitCode(), self.__result) return self.__result