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,