diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml deleted file mode 100644 index 7d6a3abd..00000000 --- a/.github/workflows/pre-commit.yaml +++ /dev/null @@ -1,13 +0,0 @@ -name: pre-commit - -on: - pull_request: - push: - branches: [master] - -jobs: - pre-commit: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: pre-commit/action@v3.0.1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8380154b..5798a9f1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ exclude: '^.*\.xtf|.*\.xml|.*\.ili|qgepqwat2ili/bin.*$' repos: # Fix end of files - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.6.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -14,7 +14,7 @@ repos: # Remove unused imports/variables - repo: https://github.com/myint/autoflake - rev: v2.0.1 + rev: v2.3.1 hooks: - id: autoflake args: @@ -24,7 +24,7 @@ repos: # Sort imports - repo: https://github.com/pycqa/isort - rev: "5.12.0" + rev: "5.13.2" hooks: - id: isort args: @@ -33,6 +33,38 @@ repos: # Black formatting - repo: https://github.com/psf/black - rev: 22.12.0 + rev: "24.4.2" hooks: - id: black + args: ["--line-length=99"] + + # tool to automatically upgrade syntax for newer versions of the language + - repo: https://github.com/asottile/pyupgrade + rev: v3.16.0 + hooks: + - id: pyupgrade + args: [--py37-plus] + + # Lint files + - repo: https://github.com/pycqa/flake8 + rev: "7.1.0" + hooks: + - id: flake8 + args: [ + "--max-line-length=115", + # ignore long comments (E501), as long lines are formatted by black + "--ignore=E501,E203,W503", + ] + +# # Static type-checking with mypy +# - repo: https://github.com/pre-commit/mirrors-mypy +# rev: 'v1.5.1' +# hooks: +# - id: mypy +# additional_dependencies: [types-pytz, types-Deprecated, types-PyYAML, types-requests, types-tabulate, types-jsonschema, django-stubs] +# pass_filenames: false +# entry: bash -c 'mypy -p docker-qgis -p docker-app "$@"' -- + +ci: + autofix_prs: true + autoupdate_schedule: quarterly diff --git a/qgepplugin/gui/dlgabout.py b/qgepplugin/gui/dlgabout.py index 70c7d74e..5f00b921 100644 --- a/qgepplugin/gui/dlgabout.py +++ b/qgepplugin/gui/dlgabout.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Profile diff --git a/qgepplugin/gui/forms.py b/qgepplugin/gui/forms.py index 9149fef0..5c287a2d 100644 --- a/qgepplugin/gui/forms.py +++ b/qgepplugin/gui/forms.py @@ -20,13 +20,18 @@ def mapToolDeactivated(tool): def digitizeDrainageChannel(fid, layerid): layer = QgsProject.instance().mapLayer(layerid) layer.startEditing() - tool = QgepMapToolDigitizeDrainageChannel( - qgis.utils.plugins["qgepplugin"].iface, layer - ) + tool = QgepMapToolDigitizeDrainageChannel(qgis.utils.plugins["qgepplugin"].iface, layer) qgis.utils.plugins["qgepplugin"].iface.mapCanvas().setMapTool(tool) - tool.geometryDigitized.connect(lambda: geometryDigitized(fid, layer, tool)) + + def on_geometry_digitized(): + geometryDigitized(fid, layer, tool) + + def on_tool_deactivated(): + mapToolDeactivated(tool) + + tool.geometryDigitized.connect(on_geometry_digitized) # form.window().hide() - tool.deactivated.connect(lambda: mapToolDeactivated(tool)) + tool.deactivated.connect(on_tool_deactivated) def manholeOpen(form, layer, feature): @@ -37,17 +42,26 @@ def manholeOpen(form, layer, feature): except TypeError: pass + def digitize(): + digitizeDrainageChannel(form, feature, layer) + + def enable_button(): + button.setEnabled(True) + + def disable_button(): + button.setEnabled(False) + if feature.isValid(): - button.clicked.connect(lambda: digitizeDrainageChannel(form, feature, layer)) + button.clicked.connect(digitize) button.setEnabled(layer.isEditable()) - enable_button = lambda: button.setEnabled(True) - disable_button = lambda: button.setEnabled(False) - layer.editingStarted.connect(enable_button) layer.editingStopped.connect(disable_button) - form.destroyed.connect(lambda: layer.editingStarted.disconnect(enable_button)) - form.destroyed.connect(lambda: layer.editingStopped.disconnect(disable_button)) + def cleanup(): + layer.editingStarted.disconnect(enable_button) + layer.editingStopped.disconnect(disable_button) + + form.destroyed.connect(cleanup) else: button.setEnabled(False) diff --git a/qgepplugin/gui/qgepdatamodeldialog.py b/qgepplugin/gui/qgepdatamodeldialog.py index f51ddc6e..01c3bd4e 100644 --- a/qgepplugin/gui/qgepdatamodeldialog.py +++ b/qgepplugin/gui/qgepdatamodeldialog.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Profile @@ -60,9 +59,9 @@ # Allow to choose which releases can be installed AVAILABLE_RELEASES = { # TODO: change to final - "1.6.2": f"https://github.com/QGEP/datamodel/archive/1.6.2.zip", - "1.6.1": f"https://github.com/QGEP/datamodel/archive/1.6.1.zip", - "1.6.0": f"https://github.com/QGEP/datamodel/archive/1.6.0.zip", + "1.6.2": "https://github.com/QGEP/datamodel/archive/1.6.2.zip", + "1.6.1": "https://github.com/QGEP/datamodel/archive/1.6.1.zip", + "1.6.0": "https://github.com/QGEP/datamodel/archive/1.6.0.zip", } if QSettings().value("/QGEP/DeveloperMode", False, type=bool): AVAILABLE_RELEASES.update( @@ -93,15 +92,15 @@ PG_CONFIG_PATH = "~/.pg_service.conf" else: PG_CONFIG_PATH_KNOWN = False - PG_CONFIG_PATH = os.path.join( - QgsApplication.qgisSettingsDirPath(), "pg_service.conf" - ) + PG_CONFIG_PATH = os.path.join(QgsApplication.qgisSettingsDirPath(), "pg_service.conf") # Derived urls/paths, may require adaptations if release structure changes DATAMODEL_URL_TEMPLATE = "https://github.com/QGEP/datamodel/archive/{}.zip" REQUIREMENTS_PATH_TEMPLATE = os.path.join(TEMP_DIR, "datamodel-{}", "requirements.txt") DELTAS_PATH_TEMPLATE = os.path.join(TEMP_DIR, "datamodel-{}", "delta") -INIT_SCRIPT_URL_TEMPLATE = "https://github.com/QGEP/datamodel/releases/download/{}/qgep_{}_structure_with_value_lists.sql" +INIT_SCRIPT_URL_TEMPLATE = ( + "https://github.com/QGEP/datamodel/releases/download/{}/qgep_{}_structure_with_value_lists.sql" +) QGEP_PROJECT_PATH_TEMPLATE = os.path.join(TEMP_DIR, "project", "qgep.qgs") @@ -129,9 +128,7 @@ def __init__(self, cur_name, cur_config, taken_names): self.taken_names = taken_names self.nameLineEdit.textChanged.connect(self.check_name) self.pgconfigUserCheckBox.toggled.connect(self.pgconfigUserLineEdit.setEnabled) - self.pgconfigPasswordCheckBox.toggled.connect( - self.pgconfigPasswordLineEdit.setEnabled - ) + self.pgconfigPasswordCheckBox.toggled.connect(self.pgconfigPasswordLineEdit.setEnabled) self.nameLineEdit.setText(cur_name) self.pgconfigHostLineEdit.setText(cur_config.get("host", "")) @@ -150,14 +147,10 @@ def __init__(self, cur_name, cur_config, taken_names): def check_name(self, new_text): if new_text in self.taken_names: self.nameCheckLabel.setText("will overwrite") - self.nameCheckLabel.setStyleSheet( - "color: rgb(170, 95, 0);\nfont-weight: bold;" - ) + self.nameCheckLabel.setStyleSheet("color: rgb(170, 95, 0);\nfont-weight: bold;") else: self.nameCheckLabel.setText("will be created") - self.nameCheckLabel.setStyleSheet( - "color: rgb(0, 170, 0);\nfont-weight: bold;" - ) + self.nameCheckLabel.setStyleSheet("color: rgb(0, 170, 0);\nfont-weight: bold;") def conf_name(self): return self.nameLineEdit.text() @@ -202,10 +195,8 @@ def __init__(self, parent=None): # Show the pgconfig path path_label = PG_CONFIG_PATH if not PG_CONFIG_PATH_KNOWN: - self.pgservicePathLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-style: italic;" - ) - path_label += f"
Note: you must create a PGSYSCONFDIR variable for this configuration to work.More info here." + self.pgservicePathLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-style: italic;") + path_label += "
Note: you must create a PGSYSCONFDIR variable for this configuration to work.More info here." self.pgservicePathLabel.setTextFormat(Qt.RichText) self.pgservicePathLabel.setTextInteractionFlags(Qt.TextBrowserInteraction) self.pgservicePathLabel.setWordWrap(True) @@ -256,9 +247,7 @@ def conf(self): def _show_progress(self, message): if self.progress_dialog is None: - self.progress_dialog = QProgressDialog( - self.tr("Starting..."), self.tr("Cancel"), 0, 0 - ) + self.progress_dialog = QProgressDialog(self.tr("Starting..."), self.tr("Cancel"), 0, 0) cancel_button = QPushButton(self.tr("Cancel")) cancel_button.setEnabled(False) self.progress_dialog.setCancelButton(cancel_button) @@ -422,31 +411,21 @@ def enable_buttons_if_ready(self): # Datamodel def check_datamodel(self): - requirements_exists = os.path.exists( - REQUIREMENTS_PATH_TEMPLATE.format(self.version) - ) + requirements_exists = os.path.exists(REQUIREMENTS_PATH_TEMPLATE.format(self.version)) deltas_exists = os.path.exists(DELTAS_PATH_TEMPLATE.format(self.version)) check = requirements_exists and deltas_exists if check: if self.version == "master": - self.releaseCheckLabel.setText( - "DEV RELEASE - DO NOT USE FOR PRODUCTION" - ) - self.releaseCheckLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-weight: bold;" - ) + self.releaseCheckLabel.setText("DEV RELEASE - DO NOT USE FOR PRODUCTION") + self.releaseCheckLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-weight: bold;") else: self.releaseCheckLabel.setText("ok") - self.releaseCheckLabel.setStyleSheet( - "color: rgb(0, 170, 0);\nfont-weight: bold;" - ) + self.releaseCheckLabel.setStyleSheet("color: rgb(0, 170, 0);\nfont-weight: bold;") else: self.releaseCheckLabel.setText("not found") - self.releaseCheckLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-weight: bold;" - ) + self.releaseCheckLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-weight: bold;") self.checks["datamodel"] = check self.enable_buttons_if_ready() @@ -462,9 +441,7 @@ def switch_datamodel(self, _=None): self._show_progress("Downloading the release") # Download files - datamodel_path = self._download( - AVAILABLE_RELEASES[self.version], "datamodel.zip" - ) + datamodel_path = self._download(AVAILABLE_RELEASES[self.version], "datamodel.zip") # Unzip datamodel_zip = zipfile.ZipFile(datamodel_path) @@ -505,16 +482,10 @@ def check_requirements(self): if check: self.pythonCheckLabel.setText("ok") - self.pythonCheckLabel.setStyleSheet( - "color: rgb(0, 170, 0);\nfont-weight: bold;" - ) + self.pythonCheckLabel.setStyleSheet("color: rgb(0, 170, 0);\nfont-weight: bold;") else: - self.pythonCheckLabel.setText( - "\n".join(f"{dep}: {err}" for dep, err in missing) - ) - self.pythonCheckLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-weight: bold;" - ) + self.pythonCheckLabel.setText("\n".join(f"{dep}: {err}" for dep, err in missing)) + self.pythonCheckLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-weight: bold;") self.checks["requirements"] = check self.enable_buttons_if_ready() @@ -543,13 +514,8 @@ def install_requirements(self): QgsMessageLog.logMessage( f"Installing python dependencies from {requirements_file_path}", "QGEP" ) - dependencies = " ".join( - [ - f'"{l.strip()}"' - for l in open(requirements_file_path, "r").read().splitlines() - if l.strip() - ] - ) + with open(requirements_file_path) as file: + dependencies = " ".join(f'"{line.strip()}"' for line in file if line.strip()) command_line = "the OSGeo4W shell" if os.name == "nt" else "the terminal" self._run_cmd( f"python3 -m pip install --user {dependencies}", @@ -569,14 +535,10 @@ def check_pgconfig(self): check = bool(self.pgserviceComboBox.currentData()) if check: self.pgconfigCheckLabel.setText("ok") - self.pgconfigCheckLabel.setStyleSheet( - "color: rgb(0, 170, 0);\nfont-weight: bold;" - ) + self.pgconfigCheckLabel.setStyleSheet("color: rgb(0, 170, 0);\nfont-weight: bold;") else: self.pgconfigCheckLabel.setText("not set") - self.pgconfigCheckLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-weight: bold;" - ) + self.pgconfigCheckLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-weight: bold;") self.checks["pgconfig"] = check self.enable_buttons_if_ready() @@ -596,9 +558,7 @@ def add_pgconfig(self): conf = add_dialog.conf_dict() self._write_pgservice_conf(name, conf) self.update_pgconfig_combobox() - self.pgserviceComboBox.setCurrentIndex( - self.pgserviceComboBox.findData(name) - ) + self.pgserviceComboBox.setCurrentIndex(self.pgserviceComboBox.findData(name)) self.select_pgconfig() def update_pgconfig_combobox(self): @@ -614,9 +574,7 @@ def select_pgconfig(self, _=None): port = config.get(self.conf, "port", fallback="-") dbname = config.get(self.conf, "dbname", fallback="-") user = config.get(self.conf, "user", fallback="-") - password = ( - len(config.get(self.conf, "password", fallback="")) * "*" - ) or "-" + password = (len(config.get(self.conf, "password", fallback="")) * "*") or "-" self.pgserviceCurrentLabel.setText( f"host: {host}:{port}\ndbname: {dbname}\nuser: {user}\npassword: {password}" ) @@ -658,15 +616,11 @@ def check_version(self, _=None): pgservice = self.pgserviceComboBox.currentData() if not pgservice: self.versionCheckLabel.setText("service not selected") - self.versionCheckLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-weight: bold;" - ) + self.versionCheckLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-weight: bold;") elif not available_versions: self.versionCheckLabel.setText("no delta in datamodel") - self.versionCheckLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-weight: bold;" - ) + self.versionCheckLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-weight: bold;") else: @@ -703,37 +657,25 @@ def check_version(self, _=None): if not connection_works: check = False self.versionCheckLabel.setText(error) - self.versionCheckLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-weight: bold;" - ) + self.versionCheckLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-weight: bold;") elif error is not None: check = False self.versionCheckLabel.setText(error) - self.versionCheckLabel.setStyleSheet( - "color: rgb(170, 95, 0);\nfont-weight: bold;" - ) + self.versionCheckLabel.setStyleSheet("color: rgb(170, 95, 0);\nfont-weight: bold;") elif current_version <= target_version: check = True self.versionCheckLabel.setText(current_version) - self.versionCheckLabel.setStyleSheet( - "color: rgb(0, 170, 0);\nfont-weight: bold;" - ) + self.versionCheckLabel.setStyleSheet("color: rgb(0, 170, 0);\nfont-weight: bold;") elif current_version > target_version: check = False self.versionCheckLabel.setText(f"{current_version} (cannot downgrade)") - self.versionCheckLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-weight: bold;" - ) + self.versionCheckLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-weight: bold;") else: check = False self.versionCheckLabel.setText(f"{current_version} (invalid version)") - self.versionCheckLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-weight: bold;" - ) + self.versionCheckLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-weight: bold;") - self.initializeButton.setVisible( - current_version is None and connection_works - ) + self.initializeButton.setVisible(current_version is None and connection_works) self.targetVersionComboBox.setVisible(current_version is not None) self.versionUpgradeButton.setVisible(current_version is not None) @@ -779,14 +721,14 @@ def initialize_version(self): # Dirty hack to customize SRID in a dump if srid != "2056": - with open(sql_path, "r") as file: + with open(sql_path) as file: contents = file.read() contents = contents.replace("2056", srid) with open(sql_path, "w") as file: file.write(contents) try: - conn = psycopg2.connect(f"service={self.conf}") + psycopg2.connect(f"service={self.conf}") except psycopg2.Error: # It may be that the database doesn't exist yet # in that case, we try to connect to the postgres database and to create it from there @@ -888,14 +830,10 @@ def check_project(self): if check: self.projectCheckLabel.setText("ok") - self.projectCheckLabel.setStyleSheet( - "color: rgb(0, 170, 0);\nfont-weight: bold;" - ) + self.projectCheckLabel.setStyleSheet("color: rgb(0, 170, 0);\nfont-weight: bold;") else: self.projectCheckLabel.setText("version not found") - self.projectCheckLabel.setStyleSheet( - "color: rgb(170, 0, 0);\nfont-weight: bold;" - ) + self.projectCheckLabel.setStyleSheet("color: rgb(170, 0, 0);\nfont-weight: bold;") self.checks["project"] = check self.enable_buttons_if_ready() @@ -916,7 +854,7 @@ def load_project(self): qgep_zip = zipfile.ZipFile(qgep_path) qgep_zip.extractall(TEMP_DIR) - with open(QGEP_PROJECT_PATH_TEMPLATE, "r") as original_project: + with open(QGEP_PROJECT_PATH_TEMPLATE) as original_project: contents = original_project.read() # replace the service name diff --git a/qgepplugin/gui/qgepplotsvgwidget.py b/qgepplugin/gui/qgepplotsvgwidget.py index 563d2916..c317537d 100644 --- a/qgepplugin/gui/qgepplotsvgwidget.py +++ b/qgepplugin/gui/qgepplotsvgwidget.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Profile @@ -43,7 +42,7 @@ def __init__(self, parent): QWebPage.__init__(self, parent) def javaScriptConsoleMessage(self, msg, line, source): - self.logger.debug("{} line {}: {}".format(source, line, msg)) + self.logger.debug(f"{source} line {line}: {msg}") class QgepPlotSVGWidget(QWidget): @@ -82,18 +81,14 @@ def __init__(self, parent, network_analyzer: QgepGraphManager, url: str = None): layout = QVBoxLayout(self) if url is None: # Starting with QGIS 3.4, QWebView requires paths with / even on windows. - default_url = ( - plugin_root_path().replace("\\", "/") + "/svgprofile/index.html" - ) + default_url = plugin_root_path().replace("\\", "/") + "/svgprofile/index.html" url = settings.value("/QGEP/SvgProfilePath", default_url) url = "file:///" + url developer_mode = settings.value("/QGEP/DeveloperMode", False, type=bool) if developer_mode is True: - self.webView.page().settings().setAttribute( - QWebSettings.DeveloperExtrasEnabled, True - ) + self.webView.page().settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True) else: self.webView.setContextMenuPolicy(Qt.NoContextMenu) diff --git a/qgepplugin/gui/qgepprofiledockwidget.py b/qgepplugin/gui/qgepprofiledockwidget.py index ca13fa12..462146c8 100644 --- a/qgepplugin/gui/qgepprofiledockwidget.py +++ b/qgepplugin/gui/qgepprofiledockwidget.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Profile @@ -23,7 +22,6 @@ # # --------------------------------------------------------------------- -from builtins import str from qgis.core import QgsFeatureRequest, QgsProject from qgis.PyQt.QtCore import Qt, pyqtSignal, pyqtSlot @@ -54,14 +52,10 @@ def __init__(self, parent, canvas, add_dock_widget): QDockWidget.__init__(self, parent) self.setupUi(self) - self.selectCurrentPathAction = QAction( - self.tr("Select current path"), self.selectButton - ) + self.selectCurrentPathAction = QAction(self.tr("Select current path"), self.selectButton) self.selectCurrentPathAction.triggered.connect(self.onSelectCurrentPathAction) self.selectButton.setDefaultAction(self.selectCurrentPathAction) - self.configureSelectionAction = QAction( - self.tr("Configure Select"), self.selectButton - ) + self.configureSelectionAction = QAction(self.tr("Configure Select"), self.selectButton) self.configureSelectionAction.triggered.connect(self.onConfigureSelectAction) self.selectButton.addAction(self.configureSelectionAction) self.setAttribute(Qt.WA_DeleteOnClose) @@ -82,9 +76,7 @@ def showIt(self): self.printButton.clicked.connect(self.onPrintButtonClicked) - self.mSliderVerticalExaggeration.valueChanged.connect( - self.onVerticalExaggerationChanged - ) + self.mSliderVerticalExaggeration.valueChanged.connect(self.onVerticalExaggerationChanged) def closeEvent(self, event): self.closed.emit() @@ -113,24 +105,16 @@ def onConfigureSelectAction(self): dlg.setLayout(QGridLayout()) ww_current_checkbox = QCheckBox(self.tr("Wastewater current")) - status, _ = QgsProject.instance().readBoolEntry( - "Qgep", "FollowWastewaterCurrent", True - ) + status, _ = QgsProject.instance().readBoolEntry("Qgep", "FollowWastewaterCurrent", True) ww_current_checkbox.setChecked(status) ww_planned_checkbox = QCheckBox(self.tr("Wastewater planned")) - status, _ = QgsProject.instance().readBoolEntry( - "Qgep", "FollowWastewaterPlanned", True - ) + status, _ = QgsProject.instance().readBoolEntry("Qgep", "FollowWastewaterPlanned", True) ww_planned_checkbox.setChecked(status) rw_current_checkbox = QCheckBox(self.tr("Rainwater current")) - status, _ = QgsProject.instance().readBoolEntry( - "Qgep", "FollowRainwaterCurrent", True - ) + status, _ = QgsProject.instance().readBoolEntry("Qgep", "FollowRainwaterCurrent", True) rw_current_checkbox.setChecked(status) rw_planned_checkbox = QCheckBox(self.tr("Rainwater planned")) - status, _ = QgsProject.instance().readBoolEntry( - "Qgep", "FollowRainwaterPlanned", True - ) + status, _ = QgsProject.instance().readBoolEntry("Qgep", "FollowRainwaterPlanned", True) rw_planned_checkbox.setChecked(status) btn_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) btn_box.accepted.connect(dlg.accept) @@ -170,50 +154,32 @@ def onSelectCurrentPathAction(self): if item["objType"] == "wastewater_node": wastewater_nodes.append(item["objId"]) - qgep_wastewater_structures_layer = QgepLayerManager.layer( - "vw_qgep_wastewater_structure" - ) + qgep_wastewater_structures_layer = QgepLayerManager.layer("vw_qgep_wastewater_structure") wastewater_nodes_layer = QgepLayerManager.layer("vw_wastewater_node") qgep_reach_layer = QgepLayerManager.layer("vw_qgep_reach") catchment_areas_layer = QgepLayerManager.layer("od_catchment_area") - wastewater_node_list = ",".join(("'" + id + "'" for id in wastewater_nodes)) - reach_list = ",".join(("'" + id + "'" for id in reaches)) + wastewater_node_list = ",".join("'" + id + "'" for id in wastewater_nodes) + reach_list = ",".join("'" + id + "'" for id in reaches) if catchment_areas_layer: request = QgsFeatureRequest() filters = list() - if QgsProject.instance().readBoolEntry( - "Qgep", "FollowWastewaterCurrent", True - )[0]: + if QgsProject.instance().readBoolEntry("Qgep", "FollowWastewaterCurrent", True)[0]: filters.append( - "fk_wastewater_networkelement_ww_current IN ({})".format( - wastewater_node_list - ) + f"fk_wastewater_networkelement_ww_current IN ({wastewater_node_list})" ) - if QgsProject.instance().readBoolEntry( - "Qgep", "FollowWastewaterPlanned", True - )[0]: + if QgsProject.instance().readBoolEntry("Qgep", "FollowWastewaterPlanned", True)[0]: filters.append( - "fk_wastewater_networkelement_ww_planned IN ({})".format( - wastewater_node_list - ) + f"fk_wastewater_networkelement_ww_planned IN ({wastewater_node_list})" ) - if QgsProject.instance().readBoolEntry( - "Qgep", "FollowRainwaterCurrent", True - )[0]: + if QgsProject.instance().readBoolEntry("Qgep", "FollowRainwaterCurrent", True)[0]: filters.append( - "fk_wastewater_networkelement_rw_current IN ({})".format( - wastewater_node_list - ) + f"fk_wastewater_networkelement_rw_current IN ({wastewater_node_list})" ) - if QgsProject.instance().readBoolEntry( - "Qgep", "FollowRainwaterPlanned", True - )[0]: + if QgsProject.instance().readBoolEntry("Qgep", "FollowRainwaterPlanned", True)[0]: filters.append( - "fk_wastewater_networkelement_rw_planned IN ({})".format( - wastewater_node_list - ) + f"fk_wastewater_networkelement_rw_planned IN ({wastewater_node_list})" ) if filters: @@ -223,13 +189,13 @@ def onSelectCurrentPathAction(self): if qgep_reach_layer: request = QgsFeatureRequest() - request.setFilterExpression("obj_id IN ({})".format(reach_list)) + request.setFilterExpression(f"obj_id IN ({reach_list})") features = qgep_reach_layer.getFeatures(request) qgep_reach_layer.select([f.id() for f in features]) if wastewater_nodes_layer: request = QgsFeatureRequest() - request.setFilterExpression("obj_id IN ({})".format(wastewater_node_list)) + request.setFilterExpression(f"obj_id IN ({wastewater_node_list})") features = wastewater_nodes_layer.getFeatures(request) ids = list() for feature in features: @@ -238,14 +204,12 @@ def onSelectCurrentPathAction(self): wastewater_nodes_layer.select(ids) wastewater_structure_list = ",".join( - ("'" + id + "'" for id in wastewater_structures if type(id) is str) + "'" + id + "'" for id in wastewater_structures if type(id) is str ) if qgep_wastewater_structures_layer: request = QgsFeatureRequest() - request.setFilterExpression( - "obj_id IN ({})".format(wastewater_structure_list) - ) + request.setFilterExpression(f"obj_id IN ({wastewater_structure_list})") features = qgep_wastewater_structures_layer.getFeatures(request) qgep_wastewater_structures_layer.select([f.id() for f in features]) diff --git a/qgepplugin/gui/qgepsettingsdialog.py b/qgepplugin/gui/qgepsettingsdialog.py index 54edef6d..e1eaa3f2 100644 --- a/qgepplugin/gui/qgepsettingsdialog.py +++ b/qgepplugin/gui/qgepsettingsdialog.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Profile @@ -24,7 +23,6 @@ # --------------------------------------------------------------------- import logging -from builtins import str from qgis.core import QgsProject from qgis.PyQt.QtCore import QSettings, pyqtSlot @@ -78,9 +76,7 @@ def __init__(self, parent=None): QColor(self.settings.value("/QGEP/HighlightColor", "#40FF40")) ) - self.mPbnChooseProfileTemplateFile.clicked.connect( - self.onChooseProfileTemplateFileClicked - ) + self.mPbnChooseProfileTemplateFile.clicked.connect(self.onChooseProfileTemplateFileClicked) self.mPbnChooseLogFile.clicked.connect(self.onChooseLogFileClicked) self.accepted.connect(self.onAccept) @@ -98,7 +94,7 @@ def __init__(self, parent=None): def initLayerCombobox(self, combobox, default): reg = QgsProject.instance() - for (key, layer) in list(reg.mapLayers().items()): + for key, layer in list(reg.mapLayers().items()): combobox.addItem(layer.name(), key) idx = combobox.findData(default) @@ -109,13 +105,8 @@ def initLayerCombobox(self, combobox, default): def onAccept(self): qgeplogger = logging.getLogger("qgep") # General settings - if ( - self.mGbOverrideDefaultProfileTemplate.isChecked() - and self.mProfileTemplateFile.text() - ): - self.settings.setValue( - "/QGEP/SvgProfilePath", self.mProfileTemplateFile.text() - ) + if self.mGbOverrideDefaultProfileTemplate.isChecked() and self.mProfileTemplateFile.text(): + self.settings.setValue("/QGEP/SvgProfilePath", self.mProfileTemplateFile.text()) else: self.settings.remove("/QGEP/SvgProfilePath") @@ -152,12 +143,8 @@ def onAccept(self): self.settings.setValue("/QGEP/LogLevel", "Error") # Save colors - self.settings.setValue( - "/QGEP/HelperLineColor", self.mHelperLineColorButton.color().name() - ) - self.settings.setValue( - "/QGEP/HighlightColor", self.mHighlightColorButton.color().name() - ) + self.settings.setValue("/QGEP/HelperLineColor", self.mHelperLineColorButton.color().name()) + self.settings.setValue("/QGEP/HighlightColor", self.mHighlightColorButton.color().name()) self.settings.setValue( "/QGEP/CurrentProfileColor", self.mCurrentProfileColorButton.color().name() ) diff --git a/qgepplugin/gui/qgepwizard.py b/qgepplugin/gui/qgepwizard.py index 1c3f6804..faa41626 100644 --- a/qgepplugin/gui/qgepwizard.py +++ b/qgepplugin/gui/qgepwizard.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Qgep @@ -49,9 +48,7 @@ def __init__(self, parent, iface): self.tr("Wastewater Structure"), "wastewater_structure", ) - self.layerComboBox.insertItem( - self.layerComboBox.count(), self.tr("Reach"), "reach" - ) + self.layerComboBox.insertItem(self.layerComboBox.count(), self.tr("Reach"), "reach") self.stateButton.setProperty("state", "inactive") self.mapToolAddReach = QgepMapToolAddReach( diff --git a/qgepplugin/processing_provider/QgepSwmm.py b/qgepplugin/processing_provider/QgepSwmm.py index 35288f65..00784555 100644 --- a/qgepplugin/processing_provider/QgepSwmm.py +++ b/qgepplugin/processing_provider/QgepSwmm.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ /*************************************************************************** QGEP-swmm processing provider @@ -22,6 +21,8 @@ import subprocess from datetime import datetime, timedelta +import psycopg2 + MEASURING_POINT_KIND = "Diverse kind of SWMM simulation parameters" MEASURING_DEVICE_REMARK = "SWMM Simulation" @@ -106,14 +107,9 @@ NON_PHYSICAL_REM = "Non-physical point which materializes swmm simulations" -import psycopg2 - class QgepSwmm: - def __init__( - self, title, service, state, inpfile, inptemplate, rptfile, binfile, feedback - ): - + def __init__(self, title, service, state, inpfile, inptemplate, rptfile, binfile, feedback): """ Initiate QgepSwmm @@ -195,9 +191,7 @@ def get_swmm_table(self, table_name, state, selected_structures, hierarchy): ) ) if hierarchy: - where_clauses.append( - """hierarchy = '{hierarchy}'""".format(hierarchy=hierarchy) - ) + where_clauses.append(f"""hierarchy = '{hierarchy}'""") sql = """ select * from qgep_swmm.vw_{table_name} @@ -214,20 +208,16 @@ def get_swmm_table(self, table_name, state, selected_structures, hierarchy): try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push("error", "Error while executing: {sql}".format(sql=sql)) + self.feedback_push("error", f"Error while executing: {sql}") return None, None - self.feedback_push( - "info", "Process vw_{table_name}".format(table_name=table_name) - ) + self.feedback_push("info", f"Process vw_{table_name}") data = cur.fetchall() attributes = [desc[0] for desc in cur.description] del cur return data, attributes - def swmm_table( - self, table_name, hierarchy=None, state=None, selected_structures=[] - ): + def swmm_table(self, table_name, hierarchy=None, state=None, selected_structures=[]): """ Write swmm objects extracted from QGEP in swmm input file. Selects according to the state planned or current. If the object is a qgep wastewater structure @@ -254,9 +244,7 @@ def swmm_table( ] # Create commented line which contains the field names fields = "" - data, attributes = self.get_swmm_table( - table_name, state, selected_structures, hierarchy - ) + data, attributes = self.get_swmm_table(table_name, state, selected_structures, hierarchy) if data is not None: for i, field in enumerate(attributes): # Does not write values stored in columns descriptions, tags and geom @@ -300,11 +288,9 @@ def copy_parameters_from_template(self, parameter_name): """ # Read template - options_template = open(self.options_template_file, "r").read() + options_template = open(self.options_template_file).read() # Find and extract options - index_start = options_template.find( - "[{parameter_name}]".format(parameter_name=parameter_name) - ) + index_start = options_template.find(f"[{parameter_name}]") if index_start == -1: # The balise options is not found self.feedback_push( @@ -366,17 +352,13 @@ def write_input(self, hierarchy, selected_structures, selected_reaches): f.write(self.swmm_table("RAINGAGES", hierarchy, state, selected_structures)) f.write(self.swmm_table("SYMBOLS", hierarchy, state, selected_structures)) self.feedback_set_progress(10) - f.write( - self.swmm_table("SUBCATCHMENTS", hierarchy, state, selected_structures) - ) + f.write(self.swmm_table("SUBCATCHMENTS", hierarchy, state, selected_structures)) self.feedback_set_progress(15) f.write(self.swmm_table("SUBAREAS", hierarchy, state, selected_structures)) self.feedback_set_progress(20) f.write(self.swmm_table("AQUIFERS")) self.feedback_set_progress(25) - f.write( - self.swmm_table("INFILTRATION", hierarchy, state, selected_structures) - ) + f.write(self.swmm_table("INFILTRATION", hierarchy, state, selected_structures)) self.feedback_set_progress(30) f.write(self.swmm_table("POLYGONS")) @@ -617,7 +599,7 @@ def execute_swmm(self): stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, - universal_newlines=True, + text=True, ).stdout return proc @@ -647,12 +629,8 @@ def import_full_results(self, sim_description): """ - simulation_start_date = self.convert_to_datetime( - self.get_analysis_option("Starting Date") - ) - simulation_end_date = self.convert_to_datetime( - self.get_analysis_option("Ending Date") - ) + simulation_start_date = self.convert_to_datetime(self.get_analysis_option("Starting Date")) + simulation_end_date = self.convert_to_datetime(self.get_analysis_option("Ending Date")) simulation_duration = simulation_end_date - simulation_start_date measuring_duration = simulation_duration.total_seconds() @@ -682,9 +660,7 @@ def import_full_results(self, sim_description): m_counter = 0 for m in measurement_data: m_counter += 1 - time = self.convert_to_datetime( - m["date"] + " " + m["time"] - ).isoformat() + time = self.convert_to_datetime(m["date"] + " " + m["time"]).isoformat() for k in m.keys(): if k in SWMM_RESULTS_PARAMETERS.keys(): if SWMM_RESULTS_PARAMETERS[k]["recorded"]: @@ -748,12 +724,8 @@ def import_summary(self, sim_description): sim_description (string): Title of the simulation """ - simulation_start_date = self.convert_to_datetime( - self.get_analysis_option("Starting Date") - ) - simulation_end_date = self.convert_to_datetime( - self.get_analysis_option("Ending Date") - ) + simulation_start_date = self.convert_to_datetime(self.get_analysis_option("Starting Date")) + simulation_end_date = self.convert_to_datetime(self.get_analysis_option("Ending Date")) simulation_duration = simulation_end_date - simulation_start_date measuring_duration = simulation_duration.total_seconds() self.feedback_push("info", "Import nodes summary") @@ -778,7 +750,6 @@ def import_summary(self, sim_description): return def convert_max_over_full_flow(self, link_summary): - """ Convert max_over_full_flow in percent @@ -796,7 +767,6 @@ def convert_max_over_full_flow(self, link_summary): return link_summary def import_backflow_level(self): - """ Import the backflow level from an SWMM report file """ @@ -804,14 +774,11 @@ def import_backflow_level(self): print("1") node_summary = self.extract_node_depth_summary() print("2") - self.populate_attribute( - node_summary, "wastewater_node", "backflow_level", "maximum_hgl" - ) + self.populate_attribute(node_summary, "wastewater_node", "backflow_level", "maximum_hgl") return def import_hydraulic_load(self): - """ Import the hydraulic load from an SWMM report file """ @@ -830,7 +797,6 @@ def import_hydraulic_load(self): def record_summary( self, data, simulation_start_date, sim_description, measuring_duration, obj_type ): - """ Record the node and link summary in the database @@ -878,7 +844,6 @@ def record_summary( return def populate_attribute(self, data, table_name, attribute_name, swmm_attribute): - """ Update an attribute of a qgep_od table according to a swmm result @@ -911,9 +876,7 @@ def populate_attribute(self, data, table_name, attribute_name, swmm_attribute): try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push( - "error", "Error while excecuting: {sql}".format(sql=sql) - ) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", str(psycopg2.ProgrammingError)) return None, None res = cur.fetchone() @@ -930,7 +893,6 @@ def populate_attribute(self, data, table_name, attribute_name, swmm_attribute): return def create_measuring_point_node(self, node_obj_id, sim_description): - """ For a node creates a measuring point or get its id. @@ -979,9 +941,7 @@ def create_measuring_point_node(self, node_obj_id, sim_description): try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push( - "error", "Error while excecuting: {sql}".format(sql=sql) - ) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", str(psycopg2.ProgrammingError)) return None, None res = cur.fetchone() @@ -996,7 +956,6 @@ def create_measuring_point_node(self, node_obj_id, sim_description): return mp_obj_id def create_measuring_point_link(self, reach_obj_id, sim_description): - """ For a node creates a measuring point or get its id. @@ -1046,9 +1005,7 @@ def create_measuring_point_link(self, reach_obj_id, sim_description): try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push( - "error", "Error while excecuting: {sql}".format(sql=sql) - ) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", str(psycopg2.ProgrammingError)) return None res = cur.fetchone() @@ -1060,7 +1017,6 @@ def create_measuring_point_link(self, reach_obj_id, sim_description): return mp_obj_id def create_measuring_device(self, mp_obj_id): - """ For a measuring point creates a measuring device or get its id. @@ -1100,9 +1056,7 @@ def create_measuring_device(self, mp_obj_id): try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push( - "error", "Error while excecuting: {sql}".format(sql=sql) - ) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", str(psycopg2.ProgrammingError)) return None, None res = cur.fetchone() @@ -1117,7 +1071,6 @@ def create_measuring_device(self, mp_obj_id): return mp_obj_id def create_measurement_series(self, mp_obj_id, parameter_name, parameter_dimension): - """ Creates a measurement serie or get its id. @@ -1166,9 +1119,7 @@ def create_measurement_series(self, mp_obj_id, parameter_name, parameter_dimensi try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push( - "error", "Error while excecuting: {sql}".format(sql=sql) - ) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", str(psycopg2.ProgrammingError)) return None ms_obj_id = cur.fetchone()[0] @@ -1181,7 +1132,6 @@ def create_measurement_series(self, mp_obj_id, parameter_name, parameter_dimensi def create_measurement_result( self, ms_obj_id, measurement_type, measuring_duration, time, value ): - """ Creates a measurement result or update it. @@ -1212,7 +1162,7 @@ def create_measurement_result( try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push("error", "Error while excecuting: {sql}".format(sql=sql)) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", (str(psycopg2.ProgrammingError))) return None res = cur.fetchone() @@ -1238,9 +1188,7 @@ def create_measurement_result( try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push( - "error", "Error while excecuting: {sql}".format(sql=sql) - ) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", (str(psycopg2.ProgrammingError))) return None mr_obj_id = cur.fetchone()[0] @@ -1259,9 +1207,7 @@ def create_measurement_result( try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push( - "error", "Error while excecuting: {sql}".format(sql=sql) - ) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", (str(psycopg2.ProgrammingError))) return None mr_obj_id = cur.fetchone()[0] @@ -1270,7 +1216,6 @@ def create_measurement_result( return mr_obj_id def disable_reach_trigger(self): - """ Disable triggers on the table qgep_od.reach """ @@ -1284,7 +1229,7 @@ def disable_reach_trigger(self): try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push("error", "Error while excecuting: {sql}".format(sql=sql)) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", (str(psycopg2.ProgrammingError))) return None self.con.commit() @@ -1292,7 +1237,6 @@ def disable_reach_trigger(self): return def enable_reach_trigger(self): - """ Enable triggers on the table qgep_od.reach """ @@ -1306,7 +1250,7 @@ def enable_reach_trigger(self): try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push("error", "Error while excecuting: {sql}".format(sql=sql)) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", (str(psycopg2.ProgrammingError))) return None self.con.commit() @@ -1314,7 +1258,6 @@ def enable_reach_trigger(self): return def set_reach_default_friction(self): - """ Set default friction in qgep_od.reach where default friction is not set """ @@ -1331,7 +1274,7 @@ def set_reach_default_friction(self): try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push("error", "Error while excecuting: {sql}".format(sql=sql)) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", (str(psycopg2.ProgrammingError))) return None self.con.commit() @@ -1339,7 +1282,6 @@ def set_reach_default_friction(self): return def overwrite_reach_default_friction(self): - """ Reset default friction in qgep_od.reach where default friction """ @@ -1356,7 +1298,7 @@ def overwrite_reach_default_friction(self): try: cur.execute(sql) except psycopg2.ProgrammingError: - self.feedback_push("error", "Error while excecuting: {sql}".format(sql=sql)) + self.feedback_push("error", f"Error while excecuting: {sql}") self.feedback_push("error", (str(psycopg2.ProgrammingError))) return None self.con.commit() diff --git a/qgepplugin/processing_provider/change_reach_direction.py b/qgepplugin/processing_provider/change_reach_direction.py index 29bd72db..05e907ab 100644 --- a/qgepplugin/processing_provider/change_reach_direction.py +++ b/qgepplugin/processing_provider/change_reach_direction.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP processing provider diff --git a/qgepplugin/processing_provider/flow_times.py b/qgepplugin/processing_provider/flow_times.py index e36adb4e..f044e93f 100644 --- a/qgepplugin/processing_provider/flow_times.py +++ b/qgepplugin/processing_provider/flow_times.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP processing provider @@ -109,9 +107,7 @@ def initAlgorithm(self, config=None): ) ) - self.addParameter( - QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr("Flow times")) - ) + self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr("Flow times"))) def processAlgorithm( self, parameters, context: QgsProcessingContext, feedback: QgsProcessingFeedback @@ -123,15 +119,9 @@ def processAlgorithm( # init params reach_layer = self.parameterAsVectorLayer(parameters, self.REACH_LAYER, context) - flow_layer = self.parameterAsVectorLayer( - parameters, self.FLOWTIMES_LAYER, context - ) - fk_reach_field = self.parameterAsFields( - parameters, self.FK_REACH_FIELD, context - )[0] - flow_time_field = self.parameterAsFields( - parameters, self.FLOWTIMES_FIELD, context - )[0] + flow_layer = self.parameterAsVectorLayer(parameters, self.FLOWTIMES_LAYER, context) + fk_reach_field = self.parameterAsFields(parameters, self.FK_REACH_FIELD, context)[0] + flow_time_field = self.parameterAsFields(parameters, self.FLOWTIMES_FIELD, context)[0] # create feature sink fields = QgsFields() @@ -151,9 +141,7 @@ def processAlgorithm( iterator = reach_layer.getSelectedFeatures() feature_count = reach_layer.selectedFeatureCount() if feature_count != 1: - raise QgsProcessingException( - self.invalidSourceError(parameters, self.REACH_LAYER) - ) + raise QgsProcessingException(self.invalidSourceError(parameters, self.REACH_LAYER)) reach_feature = QgsFeature() iterator.nextFeature(reach_feature) assert reach_feature.isValid() diff --git a/qgepplugin/processing_provider/provider.py b/qgepplugin/processing_provider/provider.py index 7d8d394f..d9033c31 100644 --- a/qgepplugin/processing_provider/provider.py +++ b/qgepplugin/processing_provider/provider.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP processing provider diff --git a/qgepplugin/processing_provider/qgep_algorithm.py b/qgepplugin/processing_provider/qgep_algorithm.py index 94dbba66..4b8bbea6 100644 --- a/qgepplugin/processing_provider/qgep_algorithm.py +++ b/qgepplugin/processing_provider/qgep_algorithm.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP processing provider diff --git a/qgepplugin/processing_provider/snap_reach.py b/qgepplugin/processing_provider/snap_reach.py index 564836c2..c0dc761e 100644 --- a/qgepplugin/processing_provider/snap_reach.py +++ b/qgepplugin/processing_provider/snap_reach.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP processing provider @@ -88,9 +86,7 @@ def initAlgorithm(self, config=None): self.addParameter( QgsProcessingParameterVectorLayer( self.WASTEWATER_NODE_LAYER, - description=self.tr( - "Wastewater node layer, will be used as snapping target" - ), + description=self.tr("Wastewater node layer, will be used as snapping target"), ) ) @@ -123,9 +119,7 @@ def processAlgorithm(self, parameters, context, feedback): reaches.append(reach) # Batch processing: process blocks of 2000 reaches if len(reaches) == 2000: - self.processFeatures( - reaches, reach_layer, wastewater_node_layer, distance - ) + self.processFeatures(reaches, reach_layer, wastewater_node_layer, distance) reaches = list() current_feature += 1 @@ -140,9 +134,7 @@ def processAlgorithm(self, parameters, context, feedback): return {} - def processFeatures( - self, reaches, reach_layer, wastewater_node_layer, distance_threshold - ): + def processFeatures(self, reaches, reach_layer, wastewater_node_layer, distance_threshold): ids = list() to_ids = list() # Gather ids of connected networkelements @@ -184,9 +176,7 @@ def processFeatures( if from_id in list(nodes.keys()): if ( distance_threshold == 0 - or reach_geometry.sqrDistToVertexAt( - nodes[from_id].geometry().asPoint(), 0 - ) + or reach_geometry.sqrDistToVertexAt(nodes[from_id].geometry().asPoint(), 0) < distance_threshold ): reach_geometry.moveVertex(nodes[from_id].geometry().constGet(), 0) @@ -201,9 +191,7 @@ def processFeatures( ) < distance_threshold ): - reach_geometry.moveVertex( - nodes[to_id].geometry().constGet(), last_vertex - ) + reach_geometry.moveVertex(nodes[to_id].geometry().constGet(), last_vertex) if to_id in list(target_reaches.keys()): last_vertex = reach_geometry.constGet().nCoordinates() - 1 diff --git a/qgepplugin/processing_provider/sum_up_upstream.py b/qgepplugin/processing_provider/sum_up_upstream.py index d6222fa2..6812a380 100644 --- a/qgepplugin/processing_provider/sum_up_upstream.py +++ b/qgepplugin/processing_provider/sum_up_upstream.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP processing provider @@ -19,7 +17,6 @@ ***************************************************************************/ """ - import statistics from PyQt5.QtCore import QVariant @@ -113,9 +110,7 @@ def initAlgorithm(self, config=None): ) ) - self.addParameter( - QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr("Summed up")) - ) + self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr("Summed up"))) description = self.tr("Create a layer with nodes in loops") self.addAdvancedParameter( @@ -193,9 +188,7 @@ def initAlgorithm(self, config=None): ) def addAdvancedParameter(self, parameter): - parameter.setFlags( - parameter.flags() | QgsProcessingParameterDefinition.FlagAdvanced - ) + parameter.setFlags(parameter.flags() | QgsProcessingParameterDefinition.FlagAdvanced) self.addParameter(parameter) def processAlgorithm( @@ -210,36 +203,34 @@ def processAlgorithm( wastewater_node_layer = self.parameterAsVectorLayer( parameters, self.WASTEWATER_NODE_LAYER, context ) - value_expression = self.parameterAsExpression( - parameters, self.VALUE_EXPRESSION, context - ) - reach_pk_name = self.parameterAsFields(parameters, self.REACH_PK_NAME, context)[ - 0 - ] + value_expression = self.parameterAsExpression(parameters, self.VALUE_EXPRESSION, context) + reach_pk_name = self.parameterAsFields(parameters, self.REACH_PK_NAME, context)[0] node_pk_name = self.parameterAsFields(parameters, self.NODE_PK_NAME, context)[0] - node_from_fk_name = self.parameterAsFields( - parameters, self.NODE_FROM_FK_NAME, context - )[0] - node_to_fk_name = self.parameterAsFields( - parameters, self.NODE_TO_FK_NAME, context - )[0] - branch_behavior = self.parameterAsEnum( - parameters, self.BRANCH_BEHAVIOR, context - ) - create_loop_layer = self.parameterAsBool( - parameters, self.CREATE_LOOP_LAYER, context - ) + node_from_fk_name = self.parameterAsFields(parameters, self.NODE_FROM_FK_NAME, context)[0] + node_to_fk_name = self.parameterAsFields(parameters, self.NODE_TO_FK_NAME, context)[0] + branch_behavior = self.parameterAsEnum(parameters, self.BRANCH_BEHAVIOR, context) + create_loop_layer = self.parameterAsBool(parameters, self.CREATE_LOOP_LAYER, context) + + def aggregate_min(values): + return min(values) if values else 0 + + def aggregate_max(values): + return max(values) if values else 0 + + def aggregate_mean(values): + return statistics.mean(values) if values else 0 + + def aggregate_error(values): + feedback.pushError("Aggregate method not implemented") if branch_behavior == 0: - aggregate_method = lambda values: min(values) if values else 0 + aggregate_method = aggregate_min elif branch_behavior == 1: - aggregate_method = lambda values: max(values) if values else 0 + aggregate_method = aggregate_max elif branch_behavior == 2: - aggregate_method = lambda values: statistics.mean(values) if values else 0 + aggregate_method = aggregate_mean else: - aggregate_method = lambda values: feedback.pushError( - "Aggregate method not implemented" - ) + aggregate_method = aggregate_error # create feature sink fields = wastewater_node_layer.fields() diff --git a/qgepplugin/processing_provider/swmm_create_input.py b/qgepplugin/processing_provider/swmm_create_input.py index 61606eb2..e99deab0 100644 --- a/qgepplugin/processing_provider/swmm_create_input.py +++ b/qgepplugin/processing_provider/swmm_create_input.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP-swmm processing provider @@ -19,7 +17,6 @@ ***************************************************************************/ """ - import datetime from qgis.core import ( @@ -130,9 +127,7 @@ def processAlgorithm( # init params database = self.parameterAsString(parameters, self.DATABASE, context) state = self.parameterAsString(parameters, self.STATE, context) - template_inp_file = self.parameterAsFile( - parameters, self.TEMPLATE_INP_FILE, context - ) + template_inp_file = self.parameterAsFile(parameters, self.TEMPLATE_INP_FILE, context) inp_file = self.parameterAsFileOutput(parameters, self.INP_FILE, context) state = self.stateOptions[int(state)] if state not in ["current", "planned"]: diff --git a/qgepplugin/processing_provider/swmm_execute.py b/qgepplugin/processing_provider/swmm_execute.py index c5529be0..543ea491 100644 --- a/qgepplugin/processing_provider/swmm_execute.py +++ b/qgepplugin/processing_provider/swmm_execute.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP-swmm processing provider @@ -75,9 +73,7 @@ def initAlgorithm(self, config=None): # The parameters description = self.tr("INP File") self.addParameter( - QgsProcessingParameterFile( - self.INP_FILE, description=description, extension="inp" - ) + QgsProcessingParameterFile(self.INP_FILE, description=description, extension="inp") ) description = self.tr("RPT File") @@ -107,18 +103,14 @@ def processAlgorithm( ) ) - with QgepSwmm( - None, None, None, inp_file, None, rpt_file, swmm_cli, feedback - ) as qs: + with QgepSwmm(None, None, None, inp_file, None, rpt_file, swmm_cli, feedback) as qs: prompt = qs.execute_swmm() feedback.pushInfo(prompt) if re.search("There are errors", prompt): feedback.reportError(prompt) - feedback.reportError( - "There were errors, run the file in SWMM GUI for more details" - ) + feedback.reportError("There were errors, run the file in SWMM GUI for more details") feedback.setProgress(100) diff --git a/qgepplugin/processing_provider/swmm_extract_results.py b/qgepplugin/processing_provider/swmm_extract_results.py index d61be82d..5465a764 100644 --- a/qgepplugin/processing_provider/swmm_extract_results.py +++ b/qgepplugin/processing_provider/swmm_extract_results.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP-swmm processing provider @@ -83,15 +81,11 @@ def initAlgorithm(self, config=None): ) self.addParameter( - QgsProcessingParameterFeatureSink( - self.NODE_SUMMARY, self.tr("Node summary") - ) + QgsProcessingParameterFeatureSink(self.NODE_SUMMARY, self.tr("Node summary")) ) self.addParameter( - QgsProcessingParameterFeatureSink( - self.LINK_SUMMARY, self.tr("Link summary") - ) + QgsProcessingParameterFeatureSink(self.LINK_SUMMARY, self.tr("Link summary")) ) def processAlgorithm( @@ -115,13 +109,9 @@ def processAlgorithm( fields.append(QgsField("time_max_day", QVariant.Int)) fields.append(QgsField("time_max_time", QVariant.String)) fields.append(QgsField("reported_max_depth", QVariant.Double)) - (sink_node, dest_id) = self.parameterAsSink( - parameters, self.NODE_SUMMARY, context, fields - ) + (sink_node, dest_id) = self.parameterAsSink(parameters, self.NODE_SUMMARY, context, fields) if sink_node is None: - raise QgsProcessingException( - self.invalidSinkError(parameters, self.NODE_SUMMARY) - ) + raise QgsProcessingException(self.invalidSinkError(parameters, self.NODE_SUMMARY)) # Get node summary from output file qs = QgepSwmm(None, None, None, None, None, rpt_file, None, feedback) @@ -148,13 +138,9 @@ def processAlgorithm( fields.append(QgsField("maximum_velocity", QVariant.Double)) fields.append(QgsField("max_over_full_flow", QVariant.Double)) fields.append(QgsField("max_over_full_depth", QVariant.Double)) - (sink_link, dest_id) = self.parameterAsSink( - parameters, self.LINK_SUMMARY, context, fields - ) + (sink_link, dest_id) = self.parameterAsSink(parameters, self.LINK_SUMMARY, context, fields) if sink_link is None: - raise QgsProcessingException( - self.invalidSinkError(parameters, self.LINK_SUMMARY) - ) + raise QgsProcessingException(self.invalidSinkError(parameters, self.LINK_SUMMARY)) # Get link summary from output file link_summary = qs.extract_link_flow_summary() diff --git a/qgepplugin/processing_provider/swmm_import_results.py b/qgepplugin/processing_provider/swmm_import_results.py index b0757e25..2ffb33d2 100644 --- a/qgepplugin/processing_provider/swmm_import_results.py +++ b/qgepplugin/processing_provider/swmm_import_results.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP-swmm processing provider @@ -74,9 +72,7 @@ def initAlgorithm(self, config=None): # The parameters description = self.tr("SWMM report file (.rpt)") - self.addParameter( - QgsProcessingParameterFile(self.RPT_FILE, description=description) - ) + self.addParameter(QgsProcessingParameterFile(self.RPT_FILE, description=description)) description = self.tr("Database") self.addParameter( @@ -108,9 +104,7 @@ def initAlgorithm(self, config=None): ) ) - description = self.tr( - "Import Max HGL in qgep_od.wastewater_node.backflow_level" - ) + description = self.tr("Import Max HGL in qgep_od.wastewater_node.backflow_level") self.addParameter( QgsProcessingParameterBoolean( self.POPULATE_BACKFLOW_LEVEL, @@ -141,15 +135,9 @@ def processAlgorithm( # init params rpt_file = self.parameterAsFileOutput(parameters, self.RPT_FILE, context) database = self.parameterAsString(parameters, self.DATABASE, context) - sim_description = self.parameterAsString( - parameters, self.SIM_DESCRIPTION, context - ) - import_summary = self.parameterAsBoolean( - parameters, self.IMPORT_SUMMARY, context - ) - import_full_result = self.parameterAsBoolean( - parameters, self.IMPORT_FULL_RESULTS, context - ) + sim_description = self.parameterAsString(parameters, self.SIM_DESCRIPTION, context) + import_summary = self.parameterAsBoolean(parameters, self.IMPORT_SUMMARY, context) + import_full_result = self.parameterAsBoolean(parameters, self.IMPORT_FULL_RESULTS, context) import_backflow_level = self.parameterAsBoolean( parameters, self.POPULATE_BACKFLOW_LEVEL, context ) @@ -158,9 +146,7 @@ def processAlgorithm( ) # Get node summary from output file - with QgepSwmm( - sim_description, database, None, None, None, rpt_file, None, feedback - ) as qs: + with QgepSwmm(sim_description, database, None, None, None, rpt_file, None, feedback) as qs: if import_summary: qs.import_summary(sim_description) if import_full_result: diff --git a/qgepplugin/processing_provider/swmm_set_friction.py b/qgepplugin/processing_provider/swmm_set_friction.py index ee88aa63..9ea34ac6 100644 --- a/qgepplugin/processing_provider/swmm_set_friction.py +++ b/qgepplugin/processing_provider/swmm_set_friction.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** QGEP-swmm processing provider @@ -19,7 +17,6 @@ ***************************************************************************/ """ - from qgis.core import ( QgsProcessingContext, QgsProcessingFeedback, @@ -92,9 +89,7 @@ def processAlgorithm( # init params database = self.parameterAsString(parameters, self.DATABASE, context) - overwrite_values = self.parameterAsBoolean( - parameters, self.OVERWRITE_VALUES, context - ) + overwrite_values = self.parameterAsBoolean(parameters, self.OVERWRITE_VALUES, context) # Connect to QGEP database and perform translation with QgepSwmm(None, database, None, None, None, None, None, feedback) as qs: qs.disable_reach_trigger() diff --git a/qgepplugin/qgepplugin.py b/qgepplugin/qgepplugin.py index 49a41598..2f2db0b9 100644 --- a/qgepplugin/qgepplugin.py +++ b/qgepplugin/qgepplugin.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # QGEP @@ -24,11 +23,9 @@ # # --------------------------------------------------------------------- -from __future__ import absolute_import, print_function import logging import os -from builtins import object, str from qgis.core import Qgis, QgsApplication from qgis.PyQt.QtCore import QLocale, QSettings, Qt @@ -61,7 +58,7 @@ def locale(values, feature, parent): return QSettings().value("locale/userLocale", QLocale.system().name()) -class QgepPlugin(object): +class QgepPlugin: """ A plugin for wastewater management http://www.github.com/qgep/QGEP @@ -199,11 +196,7 @@ def initGui(self): self.wizardAction.triggered.connect(self.wizard) self.connectNetworkElementsAction = QAction( - QIcon( - os.path.join( - plugin_root_path(), "icons/link-wastewater-networkelement.svg" - ) - ), + QIcon(os.path.join(plugin_root_path(), "icons/link-wastewater-networkelement.svg")), QApplication.translate("qgepplugin", "Connect wastewater networkelements"), self.iface.mainWindow(), ) @@ -216,9 +209,7 @@ def initGui(self): "Refresh network topology", self.iface.mainWindow(), ) - self.refreshNetworkTopologyAction.setWhatsThis( - self.tr("Refresh network topology") - ) + self.refreshNetworkTopologyAction.setWhatsThis(self.tr("Refresh network topology")) self.refreshNetworkTopologyAction.setEnabled(False) self.refreshNetworkTopologyAction.setCheckable(False) self.refreshNetworkTopologyAction.triggered.connect( @@ -251,9 +242,7 @@ def initGui(self): self.exportAction.setCheckable(False) self.exportAction.triggered.connect(self.actionExportClicked) - self.datamodelInitToolAction = QAction( - self.tr("Datamodel tool"), self.iface.mainWindow() - ) + self.datamodelInitToolAction = QAction(self.tr("Datamodel tool"), self.iface.mainWindow()) self.datamodelInitToolAction.triggered.connect(self.showDatamodelInitTool) # Add toolbar button and menu item @@ -292,9 +281,7 @@ def initGui(self): # Init the object maintaining the network self.network_analyzer = QgepGraphManager() - self.network_analyzer.message_emitted.connect( - self.iface.messageBar().pushMessage - ) + self.network_analyzer.message_emitted.connect(self.iface.messageBar().pushMessage) # Create the map tool for profile selection self.profile_tool = QgepProfileMapTool( self.iface, self.profileAction, self.network_analyzer @@ -414,15 +401,9 @@ def openDock(self): self.profile_dock.closed.connect(self.onDockClosed) self.profile_dock.showIt() - self.plotWidget = QgepPlotSVGWidget( - self.profile_dock, self.network_analyzer - ) - self.plotWidget.specialStructureMouseOver.connect( - self.highlightProfileElement - ) - self.plotWidget.specialStructureMouseOut.connect( - self.unhighlightProfileElement - ) + self.plotWidget = QgepPlotSVGWidget(self.profile_dock, self.network_analyzer) + self.plotWidget.specialStructureMouseOver.connect(self.highlightProfileElement) + self.plotWidget.specialStructureMouseOut.connect(self.unhighlightProfileElement) self.plotWidget.reachMouseOver.connect(self.highlightProfileElement) self.plotWidget.reachMouseOut.connect(self.unhighlightProfileElement) self.profile_dock.addPlotWidget(self.plotWidget) diff --git a/qgepplugin/tools/qgepmaptooladdfeature.py b/qgepplugin/tools/qgepmaptooladdfeature.py index ae2f3ac2..b2507a0a 100644 --- a/qgepplugin/tools/qgepmaptooladdfeature.py +++ b/qgepplugin/tools/qgepmaptooladdfeature.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Qgep @@ -28,7 +27,6 @@ """ import math -from builtins import next from qgis.core import ( NULL, @@ -74,12 +72,10 @@ def __init__(self, map_canvas: QgsMapCanvas, geometry_type): self.points = [] def addPoint3D(self, point): - assert type(point) == QgsPoint + assert type(point) is QgsPoint QgsRubberBand.addPoint(self, QgsPointXY(point.x(), point.y())) # Workaround crash with QGIS 3.10.2 (https://github.com/qgis/QGIS/issues/34557) - new_point = QgsPoint( - point.x(), point.y(), point.z(), point.m(), point.wkbType() - ) + new_point = QgsPoint(point.x(), point.y(), point.z(), point.m(), point.wkbType()) self.points.append(new_point) def reset3D(self): @@ -96,9 +92,7 @@ def ensure_z(z): wkt = ( "LineStringZ(" - + ", ".join( - ["{} {} {}".format(p.x(), p.y(), ensure_z(p.z())) for p in self.points] - ) + + ", ".join([f"{p.x()} {p.y()} {ensure_z(p.z())}" for p in self.points]) + ")" ) return QgsGeometry.fromWkt(wkt) @@ -110,9 +104,7 @@ class QgepMapToolAddFeature(QgsMapToolAdvancedDigitizing): """ def __init__(self, iface: QgisInterface, layer): - QgsMapToolAdvancedDigitizing.__init__( - self, iface.mapCanvas(), iface.cadDockWidget() - ) + QgsMapToolAdvancedDigitizing.__init__(self, iface.mapCanvas(), iface.cadDockWidget()) self.iface = iface self.canvas = iface.mapCanvas() self.layer = layer @@ -303,9 +295,7 @@ def snap(self, event): # if no match, snap to all layers (according to map settings) and try to grab Z match = ( - self.iface.mapCanvas() - .snappingUtils() - .snapToMap(QgsPointXY(event.originalMapPoint())) + self.iface.mapCanvas().snappingUtils().snapToMap(QgsPointXY(event.originalMapPoint())) ) if match.isValid() and match.hasVertex(): if match.layer(): @@ -315,7 +305,7 @@ def snap(self, event): (ok, vertex_id) = f.geometry().vertexIdFromVertexNr(match.vertexIndex()) assert ok point = f.geometry().constGet().vertexAt(vertex_id) - assert type(point) == QgsPoint + assert type(point) is QgsPoint return point, match else: return QgsPoint(match.point()), match @@ -371,9 +361,7 @@ def right_clicked(self, _): "to": self.last_snapping_match, } for dest, match in list(snapping_results.items()): - level_field_index = self.layer.fields().indexFromName( - "rp_{dest}_level".format(dest=dest) - ) + level_field_index = self.layer.fields().indexFromName(f"rp_{dest}_level") pt_idx = 0 if dest == "from" else -1 if match.isValid() and match.layer() in ( self.node_layer, @@ -384,7 +372,7 @@ def right_clicked(self, _): assert network_element.isValid() # set the related network element field = self.layer.fields().indexFromName( - "rp_{dest}_fk_wastewater_networkelement".format(dest=dest) + f"rp_{dest}_fk_wastewater_networkelement" ) f.setAttribute(field, network_element.attribute("obj_id")) # assign level if the match is a node or if we have 3D from snapping @@ -490,9 +478,7 @@ def canvasReleaseEvent(self, event): event.pos().x(), event.pos().y() ) self.rubberband.addPoint(mousepos) - if ( - self.firstPoint - ): # If the first point was set before, we are doing the second one + if self.firstPoint: # If the first point was set before, we are doing the second one lp1 = self.rubberband.asGeometry().asPolyline()[0] lp2 = self.rubberband.asGeometry().asPolyline()[1] width = 0.2 @@ -512,24 +498,14 @@ def canvasReleaseEvent(self, event): except ValueError: width = 0.2 - length = math.sqrt( - math.pow(lp1.x() - lp2.x(), 2) + math.pow(lp1.y() - lp2.y(), 2) - ) + length = math.sqrt(math.pow(lp1.x() - lp2.x(), 2) + math.pow(lp1.y() - lp2.y(), 2)) xd = lp2.x() - lp1.x() yd = lp2.y() - lp1.y() - pt1 = QgsPointXY( - lp1.x() + width * (yd / length), lp1.y() - width * (xd / length) - ) - pt2 = QgsPointXY( - lp1.x() - width * (yd / length), lp1.y() + width * (xd / length) - ) - pt3 = QgsPointXY( - lp2.x() - width * (yd / length), lp2.y() + width * (xd / length) - ) - pt4 = QgsPointXY( - lp2.x() + width * (yd / length), lp2.y() - width * (xd / length) - ) + pt1 = QgsPointXY(lp1.x() + width * (yd / length), lp1.y() - width * (xd / length)) + pt2 = QgsPointXY(lp1.x() - width * (yd / length), lp1.y() + width * (xd / length)) + pt3 = QgsPointXY(lp2.x() - width * (yd / length), lp2.y() + width * (xd / length)) + pt4 = QgsPointXY(lp2.x() + width * (yd / length), lp2.y() - width * (xd / length)) self.geometry = QgsGeometry.fromPolygonXY([[pt1, pt2, pt3, pt4, pt1]]) diff --git a/qgepplugin/tools/qgepmaptools.py b/qgepplugin/tools/qgepmaptools.py index aad58d58..50944503 100644 --- a/qgepplugin/tools/qgepmaptools.py +++ b/qgepplugin/tools/qgepmaptools.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Qgep @@ -28,7 +27,6 @@ """ import logging -from builtins import next from qgis.core import ( Qgis, @@ -89,9 +87,7 @@ class QgepMapTool(QgsMapTool): logger = logging.getLogger(__name__) snapper = None - def __init__( - self, iface: QgisInterface, button, network_analyzer: QgepGraphManager = None - ): + def __init__(self, iface: QgisInterface, button, network_analyzer: QgepGraphManager = None): QgsMapTool.__init__(self, iface.mapCanvas()) self.canvas = iface.mapCanvas() self.cursor = QCursor(Qt.CrossCursor) @@ -230,10 +226,7 @@ def snap_point(self, event, show_menu: bool = True) -> QgsPointLocator.Match: for fid, feature in filtered_features.items(): try: title = ( - feature.attribute("description") - + " (" - + feature.attribute("obj_id") - + ")" + feature.attribute("description") + " (" + feature.attribute("obj_id") + ")" ) except TypeError: title = " (" + feature.attribute("obj_id") + ")" @@ -355,12 +348,8 @@ def appendProfile(self, vertices, edges): edge_features.attrAsUnicode(feat, "to_obj_id_interpolate") for feat in list(edge_features.asDict().values()) ] - additional_ids = [ - self.network_analyzer.vertexIds[node] for node in interpolate_nodes_from - ] - additional_ids += [ - self.network_analyzer.vertexIds[node] for node in interpolate_nodes_to - ] + additional_ids = [self.network_analyzer.vertexIds[node] for node in interpolate_nodes_from] + additional_ids += [self.network_analyzer.vertexIds[node] for node in interpolate_nodes_to] # Now, fetch the nodes we need node_layer = self.network_analyzer.getNodeLayer() @@ -370,9 +359,7 @@ def appendProfile(self, vertices, edges): if len(vertices) > 1: self.rubberBand.reset() - elem = QgepProfileNodeElement( - vertices[0], node_features, self.segmentOffset - ) + elem = QgepProfileNodeElement(vertices[0], node_features, self.segmentOffset) self.profile.addElement(vertices[0], elem) for p1, p2, edge in edges: @@ -434,9 +421,7 @@ def appendProfile(self, vertices, edges): for feat_id in edge_ids: self.pathPolyline.extend(edge_features[feat_id].geometry().asPolyline()) - self.rubberBand.addGeometry( - QgsGeometry.fromPolylineXY(self.pathPolyline), node_layer - ) + self.rubberBand.addGeometry(QgsGeometry.fromPolylineXY(self.pathPolyline), node_layer) self.profileChanged.emit(self.profile) return True else: @@ -481,16 +466,12 @@ def leftClicked(self, event): if self.selectedPathPoints: pf = self.findPath(self.selectedPathPoints[-1][0], match.featureId()) if pf: - self.selectedPathPoints.append( - (match.featureId(), QgsPointXY(match.point())) - ) + self.selectedPathPoints.append((match.featureId(), QgsPointXY(match.point()))) else: msg = self.msgBar.createMessage("No path found") self.msgBar.pushWidget(msg, Qgis.Info) else: - self.selectedPathPoints.append( - (match.featureId(), QgsPointXY(match.point())) - ) + self.selectedPathPoints.append((match.featureId(), QgsPointXY(match.point()))) class QgepTreeMapTool(QgepMapTool): @@ -524,9 +505,7 @@ def getTree(self, node_id: str): self.rubberBand.reset() nodes, edges = self.network_analyzer.getTree(node_id, upstream) - polylines = self.network_analyzer.getEdgeGeometry( - [edge[2]["feature"] for edge in edges] - ) + polylines = self.network_analyzer.getEdgeGeometry([edge[2]["feature"] for edge in edges]) # Fix for QGIS < 2.0 filtered_polylines = [pl for pl in polylines if pl] @@ -664,9 +643,7 @@ def __init__(self, iface, action): self.rbline = QgsRubberBand(self.iface.mapCanvas(), QgsWkbTypes.LineGeometry) self.rbline.setColor(QColor("#f4530e")) self.rbline.setWidth(3) - self.rbmarkers = QgsRubberBand( - self.iface.mapCanvas(), QgsWkbTypes.PointGeometry - ) + self.rbmarkers = QgsRubberBand(self.iface.mapCanvas(), QgsWkbTypes.PointGeometry) self.rbmarkers.setColor(QColor("#f4530e")) self.rbmarkers.setIconSize(6) @@ -688,9 +665,7 @@ def activate(self): """ def is_closer_to_start_of_edge(source, target): - feature = next( - source.layer().getFeatures(QgsFeatureRequest(source.featureId())) - ) + feature = next(source.layer().getFeatures(QgsFeatureRequest(source.featureId()))) distance_from_start = feature.geometry().lineLocatePoint( QgsGeometry.fromPointXY(source.point()) ) @@ -763,9 +738,7 @@ def is_closer_to_start_of_edge(source, target): }, } - self.setSnapLayers( - self.source_snapper, list(self.network_element_sources.keys()) - ) + self.setSnapLayers(self.source_snapper, list(self.network_element_sources.keys())) self.reset() @@ -822,9 +795,7 @@ def canvasMoveEvent(self, event): ) self.setSnapLayers( self.target_snapper, - self.network_element_sources[snap_match.layer()][ - "target_layers" - ], + self.network_element_sources[snap_match.layer()]["target_layers"], ) self.rb_source_feature.show() self.rbmarkers.movePoint(pt, 0) @@ -887,11 +858,7 @@ def get_feature_for_match(self, match): @param match: The QgsPointLocator.SnapMatch object @return: A feature """ - return next( - match.layer().getFeatures( - QgsFeatureRequest().setFilterFid(match.featureId()) - ) - ) + return next(match.layer().getFeatures(QgsFeatureRequest().setFilterFid(match.featureId()))) def connect_features(self, source, target): """ diff --git a/qgepplugin/tools/qgepnetwork.py b/qgepplugin/tools/qgepnetwork.py index 83373ca9..5c4a105d 100644 --- a/qgepplugin/tools/qgepnetwork.py +++ b/qgepplugin/tools/qgepnetwork.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Profile @@ -26,14 +25,12 @@ """ Manages a graph of a wastewater network """ -from __future__ import print_function import copyreg import re import time # pylint: disable=no-name-in-module -from builtins import object, str, zip from collections import defaultdict import networkx as nx @@ -263,9 +260,7 @@ def shortestPath(self, start_point, end_point): try: path = nx.algorithms.dijkstra_path(self.graph, start_point, end_point) - edges = [ - (u, v, self.graph.edges[u, v]) for (u, v) in zip(path[0:], path[1:]) - ] + edges = [(u, v, self.graph.edges[u, v]) for (u, v) in zip(path[0:], path[1:])] p = (path, edges) @@ -301,9 +296,7 @@ def pickle_point(p): # Returns pred, weight pred, _ = nx.bellman_ford_predecessor_and_distance(my_graph, node) - edges = [ - (v[0], u, my_graph.edges[v[0], u]) for (u, v) in list(pred.items()) if v - ] + edges = [(v[0], u, my_graph.edges[v[0], u]) for (u, v) in list(pred.items()) if v] nodes = [ my_graph.nodes[n] for n in set(list(pred.keys()) + [v[0] for v in list(pred.values()) if v]) @@ -319,9 +312,7 @@ def getEdgeGeometry(self, edges): :return: A list of polylines """ cache = self.getFeaturesById(self.edge_layer, edges) - polylines = [ - feat.geometry().asPolyline() for feat in list(cache.asDict().values()) - ] + polylines = [feat.geometry().asPolyline() for feat in list(cache.asDict().values())] return polylines # pylint: disable=no-self-use @@ -361,11 +352,11 @@ def print_profile(self): """ Will print some performance profiling information """ - for (name, spenttime) in self.timings: + for name, spenttime in self.timings: print(name + ":" + str(spenttime)) -class QgepFeatureCache(object): +class QgepFeatureCache: """ A feature cache. The DB can be slow sometimes, so if we know, that we'll be using some features @@ -433,9 +424,7 @@ def attr(self, feat, attr): else: return feat[attr] except KeyError: - QgsMessageLog.logMessage( - "Unknown field {}".format(attr), "qgep", Qgis.Critical - ) + QgsMessageLog.logMessage(f"Unknown field {attr}", "qgep", Qgis.Critical) return None def attrAsGeometry(self, feat, attr): diff --git a/qgepplugin/tools/qgepprofile.py b/qgepplugin/tools/qgepprofile.py index d51ce59e..c42157f8 100644 --- a/qgepplugin/tools/qgepprofile.py +++ b/qgepplugin/tools/qgepprofile.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Profile @@ -28,10 +27,9 @@ """ import json -from builtins import object -class QgepProfileElement(object): +class QgepProfileElement: """ Base class for all profile elements """ @@ -132,9 +130,7 @@ def addSegment( from_pos = edge_cache.attrAsFloat(edge, "from_pos") to_pos = edge_cache.attrAsFloat(edge, "to_pos") - interpolate_from_obj_id = edge_cache.attrAsUnicode( - edge, "from_obj_id_interpolate" - ) + interpolate_from_obj_id = edge_cache.attrAsUnicode(edge, "from_obj_id_interpolate") interpolate_to_obj_id = edge_cache.attrAsUnicode(edge, "to_obj_id_interpolate") interpolate_from = node_cache.featureByObjId(interpolate_from_obj_id) interpolate_to = node_cache.featureByObjId(interpolate_to_obj_id) @@ -164,24 +160,18 @@ def addSegment( self.reachPoints[from_point_id]["offset"] = start_offset self.reachPoints[from_point_id]["level"] = fromlevel self.reachPoints[from_point_id]["pos"] = from_pos - self.reachPoints[from_point_id]["objId"] = node_cache.attrAsUnicode( - from_point, "obj_id" - ) + self.reachPoints[from_point_id]["objId"] = node_cache.attrAsUnicode(from_point, "obj_id") self.reachPoints[to_point_id]["offset"] = end_offset self.reachPoints[to_point_id]["level"] = tolevel self.reachPoints[to_point_id]["pos"] = to_pos - self.reachPoints[to_point_id]["objId"] = node_cache.attrAsUnicode( - to_point, "obj_id" - ) + self.reachPoints[to_point_id]["objId"] = node_cache.attrAsUnicode(to_point, "obj_id") def asDict(self): """ Returns this element as a dict. """ - reach_points = sorted( - list(self.reachPoints.values()), key=lambda p: p["offset"] - ) + reach_points = sorted(list(self.reachPoints.values()), key=lambda p: p["offset"]) startoffset = min([p["offset"] for p in reach_points]) endoffset = max([p["offset"] for p in reach_points]) fromlevel = reach_points[0]["level"] or 0 @@ -388,18 +378,10 @@ def addSegment( # There should always be a wastewater node but checking does not hurt if defining_wastewater_node is not None: - self.node_type = node_cache.attrAsUnicode( - defining_wastewater_node, "node_type" - ) - self.cover_level = node_cache.attrAsFloat( - defining_wastewater_node, "cover_level" - ) - self.description = node_cache.attrAsUnicode( - defining_wastewater_node, "description" - ) - self.usage_current = node_cache.attrAsFloat( - defining_wastewater_node, "usage_current" - ) + self.node_type = node_cache.attrAsUnicode(defining_wastewater_node, "node_type") + self.cover_level = node_cache.attrAsFloat(defining_wastewater_node, "cover_level") + self.description = node_cache.attrAsUnicode(defining_wastewater_node, "description") + self.usage_current = node_cache.attrAsFloat(defining_wastewater_node, "usage_current") self.detailGeometry = node_cache.attrAsGeometry( defining_wastewater_node, "detail_geometry" ) @@ -454,7 +436,7 @@ def asDict(self): return el -class QgepProfile(object): +class QgepProfile: """ Manages a profile of reaches and special structures """ @@ -513,9 +495,7 @@ def asJson(self): Prepare profile as JSON string, so the javascript responsible for the svg will know what to do with the data. """ - return json.dumps( - [element.asDict() for element in list(self.elements.values())] - ) + return json.dumps([element.asDict() for element in list(self.elements.values())]) def reset(self): """ diff --git a/qgepplugin/utils/plugin_utils.py b/qgepplugin/utils/plugin_utils.py index 02f641dd..f98dfc51 100644 --- a/qgepplugin/utils/plugin_utils.py +++ b/qgepplugin/utils/plugin_utils.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** Plugin Utils @@ -19,7 +17,6 @@ ***************************************************************************/ """ - import os diff --git a/qgepplugin/utils/qgeplayermanager.py b/qgepplugin/utils/qgeplayermanager.py index 3fcfb42e..a993c2ba 100644 --- a/qgepplugin/utils/qgeplayermanager.py +++ b/qgepplugin/utils/qgeplayermanager.py @@ -1,7 +1,6 @@ """ This module helps managing the QGEP project layers. """ -from builtins import object from qgis.core import QgsProject from qgis.PyQt.QtCore import QObject, pyqtSignal @@ -68,7 +67,7 @@ def layersAdded(self, _): # pylint: disable=too-few-public-methods -class QgepLayerManager(object): +class QgepLayerManager: """ Gives access to QGEP layers by the table name. """ diff --git a/qgepplugin/utils/qgeplogging.py b/qgepplugin/utils/qgeplogging.py index 18f57da8..1c126569 100644 --- a/qgepplugin/utils/qgeplogging.py +++ b/qgepplugin/utils/qgeplogging.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # Profile diff --git a/qgepplugin/utils/qt_utils.py b/qgepplugin/utils/qt_utils.py index 5853e9ce..a8957ca9 100644 --- a/qgepplugin/utils/qt_utils.py +++ b/qgepplugin/utils/qt_utils.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ /*************************************************************************** ------------------- diff --git a/qgepplugin/utils/translation.py b/qgepplugin/utils/translation.py index 9a285fe9..bd41e79d 100644 --- a/qgepplugin/utils/translation.py +++ b/qgepplugin/utils/translation.py @@ -1,9 +1,9 @@ """ This module is used for translation of the QGEP project """ + import logging import os -from builtins import str from qgis.PyQt.QtCore import ( QCoreApplication,