diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3197565..3a30567 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,4 +15,4 @@ jobs: run: | docker run -v ${GITHUB_WORKSPACE}:/src -w /src opengisch/qgis:stable sh -c 'xvfb-run pytest-3' env: - DOCKER_IMAGE: ${{ steps.docker-build.outputs.FULL_IMAGE_NAME }} \ No newline at end of file + DOCKER_IMAGE: ${{ steps.docker-build.outputs.FULL_IMAGE_NAME }} diff --git a/.gitignore b/.gitignore index 73e2e0b..3fcdca5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ __pycache__ i18n .DS_Store github_deploy_key.out -ordered_relation_editor/resources_rcs.py \ No newline at end of file +ordered_relation_editor/resources_rcs.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..d3e2ebb --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,40 @@ +exclude: ".venv|tests/dev/|tests/fixtures/" +fail_fast: false +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-added-large-files + args: ["--maxkb=500"] + - id: check-case-conflict + - id: check-toml + - id: check-xml + - id: check-yaml + - id: detect-private-key + - id: end-of-file-fixer + - id: fix-byte-order-marker + - id: fix-encoding-pragma + args: [--remove] + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + + - repo: https://github.com/asottile/pyupgrade + rev: v3.15.0 + hooks: + - id: pyupgrade + args: [--py39-plus] + + - repo: https://github.com/psf/black + rev: 23.9.1 + hooks: + - id: black + + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + args: ["--profile", "black", "--filter-files"] + +ci: + autofix_prs: true + autoupdate_schedule: quarterly diff --git a/ordered_relation_editor/__init__.py b/ordered_relation_editor/__init__.py index 5ef3f68..e211a49 100644 --- a/ordered_relation_editor/__init__.py +++ b/ordered_relation_editor/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # QGIS Ordered Relation Editor Plugin @@ -15,5 +14,8 @@ def classFactory(iface): :type iface: QgsInterface """ # - from ordered_relation_editor.core.ordered_relation_editor_plugin import OrderedRelationEditorPlugin + from ordered_relation_editor.core.ordered_relation_editor_plugin import ( + OrderedRelationEditorPlugin, + ) + return OrderedRelationEditorPlugin(iface) diff --git a/ordered_relation_editor/core/ordered_relation_editor_plugin.py b/ordered_relation_editor/core/ordered_relation_editor_plugin.py index ce2e4d0..9789658 100644 --- a/ordered_relation_editor/core/ordered_relation_editor_plugin.py +++ b/ordered_relation_editor/core/ordered_relation_editor_plugin.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # QGIS Ordered Relation Editor Plugin @@ -9,15 +8,19 @@ # ----------------------------------------------------------- import os -from qgis.PyQt.QtCore import QCoreApplication, QTranslator, QObject, QLocale, QSettings + from qgis.gui import QgisInterface, QgsGui -from ordered_relation_editor.gui.ordered_relation_editor_widget_factory import OrderedRelationEditorWidgetFactory, WIDGET_TYPE +from qgis.PyQt.QtCore import QCoreApplication, QLocale, QObject, QSettings, QTranslator + +from ordered_relation_editor.gui.ordered_relation_editor_widget_factory import ( + WIDGET_TYPE, + OrderedRelationEditorWidgetFactory, +) DEBUG = True class OrderedRelationEditorPlugin(QObject): - plugin_name = "&Ordered Relation Editor" def __init__(self, iface: QgisInterface): @@ -25,15 +28,16 @@ def __init__(self, iface: QgisInterface): self.iface = iface # initialize translation - qgis_locale = QLocale(QSettings().value('locale/userLocale')) - locale_path = os.path.join(os.path.dirname(__file__), 'i18n') + qgis_locale = QLocale(QSettings().value("locale/userLocale")) + locale_path = os.path.join(os.path.dirname(__file__), "i18n") self.translator = QTranslator() - self.translator.load(qgis_locale, 'actions_for_relations', '_', locale_path) + self.translator.load(qgis_locale, "actions_for_relations", "_", locale_path) QCoreApplication.installTranslator(self.translator) def initGui(self): - QgsGui.relationWidgetRegistry().addRelationWidget(OrderedRelationEditorWidgetFactory()) + QgsGui.relationWidgetRegistry().addRelationWidget( + OrderedRelationEditorWidgetFactory() + ) def unload(self): QgsGui.relationWidgetRegistry().removeRelationWidget(WIDGET_TYPE) - diff --git a/ordered_relation_editor/core/ordered_relation_model.py b/ordered_relation_editor/core/ordered_relation_model.py index f03e18a..f5c8b09 100644 --- a/ordered_relation_editor/core/ordered_relation_model.py +++ b/ordered_relation_editor/core/ordered_relation_model.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # QGIS Ordered Relation Editor Plugin @@ -9,13 +8,29 @@ # ----------------------------------------------------------- from enum import Enum -from qgis.PyQt.QtCore import pyqtSlot, pyqtSignal, pyqtProperty, Qt, QObject, QAbstractTableModel, QModelIndex -from qgis.core import QgsRelation, QgsFeature, QgsExpression, QgsExpressionContext, QgsExpressionContextUtils, QgsMessageLog + +from qgis.core import ( + QgsExpression, + QgsExpressionContext, + QgsExpressionContextUtils, + QgsFeature, + QgsMessageLog, + QgsRelation, +) +from qgis.PyQt.QtCore import ( + QAbstractTableModel, + QModelIndex, + QObject, + Qt, + pyqtProperty, + pyqtSignal, + pyqtSlot, +) Debug = True -class OrderedRelationModel(QAbstractTableModel): +class OrderedRelationModel(QAbstractTableModel): ImagePathRole = Qt.UserRole + 1 DescriptionRole = Qt.UserRole + 2 FeatureIdRole = Qt.UserRole + 5 @@ -24,15 +39,22 @@ class OrderedRelationModel(QAbstractTableModel): currentFeatureChanged = pyqtSignal(QgsFeature) def __init__(self, parent: QObject = None): - super(OrderedRelationModel, self).__init__(parent) + super().__init__(parent) self._relation = QgsRelation() - self._ordering_field = str() - self._image_path = str() - self._description = str() + self._ordering_field = "" + self._image_path = "" + self._description = "" self._feature = QgsFeature() self._related_features = [] - def init(self, relation: QgsRelation, ordering_field: str, feature: QgsFeature, image_path: str, description: str): + def init( + self, + relation: QgsRelation, + ordering_field: str, + feature: QgsFeature, + image_path: str, + description: str, + ): self._relation = relation self._ordering_field = ordering_field self._image_path = image_path @@ -85,25 +107,33 @@ def data(self, index: QModelIndex, role: int = ...): if role == self.ImagePathRole: exp = QgsExpression(self._image_path) context = QgsExpressionContext() - context.appendScopes(QgsExpressionContextUtils.globalProjectLayerScopes(self._relation.referencingLayer())) + context.appendScopes( + QgsExpressionContextUtils.globalProjectLayerScopes( + self._relation.referencingLayer() + ) + ) context.setFeature(self._related_features[index.row()]) res = exp.evaluate(context) if res is None: - res = str() + res = "" if Debug: - QgsMessageLog.logMessage("ImagePath role: '{0}'".format(str(res))) + QgsMessageLog.logMessage(f"ImagePath role: '{str(res)}'") return res elif role == self.DescriptionRole: exp = QgsExpression(self._description) context = QgsExpressionContext() - context.appendScopes(QgsExpressionContextUtils.globalProjectLayerScopes(self._relation.referencingLayer())) + context.appendScopes( + QgsExpressionContextUtils.globalProjectLayerScopes( + self._relation.referencingLayer() + ) + ) context.setFeature(self._related_features[index.row()]) res = exp.evaluate(context) if res is None: - res = str() + res = "" if Debug: - QgsMessageLog.logMessage("Description role: '{0}'".format(str(res))) + QgsMessageLog.logMessage(f"Description role: '{str(res)}'") return res elif role == self.FeatureIdRole: @@ -123,7 +153,11 @@ def moveitems(self, index_from, index_to): if index_from == index_to: return - field_index = self._relation.referencingLayer().fields().indexFromName(self._ordering_field) + field_index = ( + self._relation.referencingLayer() + .fields() + .indexFromName(self._ordering_field) + ) if field_index < 0: return @@ -133,17 +167,23 @@ def moveitems(self, index_from, index_to): self.beginResetModel() - for i in range(start_index, end_index+1): + for i in range(start_index, end_index + 1): f = self._related_features[i] if i == index_from: - self._related_features[i][self._ordering_field] = index_to + 1 # ranks are index +1 (start at 1) + self._related_features[i][self._ordering_field] = ( + index_to + 1 + ) # ranks are index +1 (start at 1) else: self._related_features[i][self._ordering_field] += delta - res = self._relation.referencingLayer().changeAttributeValue(f.id(), field_index, f[self._ordering_field]) + res = self._relation.referencingLayer().changeAttributeValue( + f.id(), field_index, f[self._ordering_field] + ) print(res) - self._related_features = sorted(self._related_features, key=lambda _f: _f[self._ordering_field]) + self._related_features = sorted( + self._related_features, key=lambda _f: _f[self._ordering_field] + ) self.endResetModel() @@ -154,9 +194,9 @@ def onViewCurrentFeatureChanged(self, index): def roleNames(self): return { - self.ImagePathRole: b'ImagePath', - self.DescriptionRole: b'Description', - self.FeatureIdRole: b'FeatureId' + self.ImagePathRole: b"ImagePath", + self.DescriptionRole: b"Description", + self.FeatureIdRole: b"FeatureId", } def reloadData(self): @@ -164,18 +204,26 @@ def reloadData(self): self._related_features = [] if Debug: - QgsMessageLog.logMessage("Reload data: Ordering field='{0}', Relation valid/id={1}/'{2}', Feature valid={3}" - .format(self._ordering_field, self._relation.isValid(), self._relation.id(), self._feature.isValid())) - - if len(self._ordering_field) > 0 and self._relation.isValid() and self._feature.isValid(): + QgsMessageLog.logMessage( + "Reload data: Ordering field='{}', Relation valid/id={}/'{}', Feature valid={}".format( + self._ordering_field, + self._relation.isValid(), + self._relation.id(), + self._feature.isValid(), + ) + ) + + if ( + len(self._ordering_field) > 0 + and self._relation.isValid() + and self._feature.isValid() + ): request = self._relation.getRelatedFeaturesRequest(self._feature) for f in self._relation.referencingLayer().getFeatures(request): self._related_features.append(f) - self._related_features = sorted(self._related_features, key=lambda _f: _f[self._ordering_field]) + self._related_features = sorted( + self._related_features, key=lambda _f: _f[self._ordering_field] + ) self.endResetModel() - - - - diff --git a/ordered_relation_editor/gui/ordered_relation_editor_config_widget.py b/ordered_relation_editor/gui/ordered_relation_editor_config_widget.py index bfb200e..fa3b99e 100644 --- a/ordered_relation_editor/gui/ordered_relation_editor_config_widget.py +++ b/ordered_relation_editor/gui/ordered_relation_editor_config_widget.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # QGIS Ordered Relation Editor Plugin @@ -9,15 +8,21 @@ # ----------------------------------------------------------- import os -from qgis.PyQt.uic import loadUiType -from qgis.PyQt.QtWidgets import QGridLayout, QLabel -from qgis.gui import QgsAbstractRelationEditorConfigWidget -WidgetUi, _ = loadUiType(os.path.join(os.path.dirname(__file__), '../ui/ordered_relation_editor_config_widget.ui')) +from qgis.gui import QgsAbstractRelationEditorConfigWidget +from qgis.PyQt.QtWidgets import QGridLayout, QLabel +from qgis.PyQt.uic import loadUiType +WidgetUi, _ = loadUiType( + os.path.join( + os.path.dirname(__file__), "../ui/ordered_relation_editor_config_widget.ui" + ) +) -class OrderedRelationEditorConfigWidget(QgsAbstractRelationEditorConfigWidget, WidgetUi): +class OrderedRelationEditorConfigWidget( + QgsAbstractRelationEditorConfigWidget, WidgetUi +): def __init__(self, relation, parent): super().__init__(relation, parent) self.setupUi(self) @@ -28,12 +33,12 @@ def __init__(self, relation, parent): def config(self): return { - 'ordering_field': self.mOrderingFieldComboBox.currentField(), - 'description': self.mDescriptionExpressionWidget.currentField()[0], - 'image_path': self.mImagePathExpressionWidget.currentField()[0] + "ordering_field": self.mOrderingFieldComboBox.currentField(), + "description": self.mDescriptionExpressionWidget.currentField()[0], + "image_path": self.mImagePathExpressionWidget.currentField()[0], } def setConfig(self, config): - self.mOrderingFieldComboBox.setField(config.get('ordering_field')) - self.mDescriptionExpressionWidget.setField(config.get('description')) - self.mImagePathExpressionWidget.setField(config.get('image_path')) + self.mOrderingFieldComboBox.setField(config.get("ordering_field")) + self.mDescriptionExpressionWidget.setField(config.get("description")) + self.mImagePathExpressionWidget.setField(config.get("image_path")) diff --git a/ordered_relation_editor/gui/ordered_relation_editor_widget.py b/ordered_relation_editor/gui/ordered_relation_editor_widget.py index 792ef3f..0f67827 100644 --- a/ordered_relation_editor/gui/ordered_relation_editor_widget.py +++ b/ordered_relation_editor/gui/ordered_relation_editor_widget.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # QGIS Ordered Relation Editor Plugin @@ -8,38 +7,46 @@ # # ----------------------------------------------------------- -from PyQt5.QtQuickWidgets import QQuickWidget import os -from qgis.PyQt.QtCore import QUrl, QModelIndex, QTimer + +from PyQt5.QtQuickWidgets import QQuickWidget +from qgis.core import QgsApplication, QgsFeature, QgsMessageLog +from qgis.gui import QgsAbstractRelationEditorWidget, QgsAttributeForm, QgsScrollArea +from qgis.PyQt.QtCore import QModelIndex, QTimer, QUrl from qgis.PyQt.QtWidgets import QVBoxLayout from qgis.PyQt.uic import loadUiType -from qgis.core import QgsFeature, QgsApplication, QgsMessageLog -from qgis.gui import QgsAbstractRelationEditorWidget, QgsAttributeForm, QgsScrollArea + from ordered_relation_editor.core.ordered_relation_model import OrderedRelationModel -WidgetUi, _ = loadUiType(os.path.join(os.path.dirname(__file__), '../ui/ordered_relation_editor_widget.ui')) +WidgetUi, _ = loadUiType( + os.path.join(os.path.dirname(__file__), "../ui/ordered_relation_editor_widget.ui") +) Debug = True -class OrderedRelationEditorWidget(QgsAbstractRelationEditorWidget, WidgetUi): +class OrderedRelationEditorWidget(QgsAbstractRelationEditorWidget, WidgetUi): def __init__(self, config, parent): super().__init__(config, parent) self.updateUiTimer = QTimer() self.updateUiTimer.setSingleShot(True) self.updateUiTimer.timeout.connect(self.updateUiTimeout) self.setupUi(self) - self.addFeatureToolButton.setIcon(QgsApplication.getThemeIcon('/mActionNewTableRow.svg')) + self.addFeatureToolButton.setIcon( + QgsApplication.getThemeIcon("/mActionNewTableRow.svg") + ) self.addFeatureToolButton.clicked.connect(self.addFeature) - self.deleteFeatureToolButton.setIcon(QgsApplication.getThemeIcon('/mActionDeleteSelected.svg')) + self.deleteFeatureToolButton.setIcon( + QgsApplication.getThemeIcon("/mActionDeleteSelected.svg") + ) self.deleteFeatureToolButton.clicked.connect(self.deleteSelectedFeature) self.attribute_form = None - print('__init__ OrderedRelationEditorWidget') + print("__init__ OrderedRelationEditorWidget") - self.ordering_field = str() - self.image_path = str() - self.description = str() + self.ordering_field = "" + self.image_path = "" + self.description = "" self.model = OrderedRelationModel() self.model.currentFeatureChanged.connect(self.onCurrentFeatureChanged) @@ -52,7 +59,11 @@ def __init__(self, config, parent): self.mListView.setMaximumWidth(300) self.view = QQuickWidget(self.mListView) self.view.rootContext().setContextProperty("orderedModel", self.model) - self.view.setSource(QUrl.fromLocalFile(os.path.join(os.path.dirname(__file__), '../qml/OrderedImageList.qml'))) + self.view.setSource( + QUrl.fromLocalFile( + os.path.join(os.path.dirname(__file__), "../qml/OrderedImageList.qml") + ) + ) self.view.setResizeMode(QQuickWidget.SizeRootObjectToView) layout.addWidget(self.view) @@ -60,9 +71,9 @@ def config(self): return {} def setConfig(self, config): - self.ordering_field = config['ordering_field'] - self.image_path = config['image_path'] - self.description = config['description'] + self.ordering_field = config["ordering_field"] + self.image_path = config["image_path"] + self.description = config["description"] def beforeSetRelationFeature(self, new_relation, new_feature): layer = self.relation().referencingLayer() @@ -70,7 +81,10 @@ def beforeSetRelationFeature(self, new_relation, new_feature): layer.editingStarted.disconnect(self.update_buttons) layer.editingStopped.disconnect(self.update_buttons) if self.attribute_form: - if self.relation().isValid() and self.relation().referencingLayer().isEditable(): + if ( + self.relation().isValid() + and self.relation().referencingLayer().isEditable() + ): self.attribute_form.save() self.view.rootObject().clearIndex() @@ -81,7 +95,10 @@ def afterSetRelationFeature(self): layer.editingStopped.connect(self.update_buttons) def update_buttons(self): - enabled = self.relation().isValid() and self.relation().referencingLayer().isEditable() + enabled = ( + self.relation().isValid() + and self.relation().referencingLayer().isEditable() + ) view_has_selection = self.view.rootObject().currentIndex() >= 0 self.addFeatureToolButton.setEnabled(enabled) self.deleteFeatureToolButton.setEnabled(enabled and view_has_selection) @@ -93,7 +110,13 @@ def updateUiTimeout(self): if Debug: QgsMessageLog.logMessage("updateUiTimeout()") - self.model.init(self.relation(), self.ordering_field, self.feature(), self.image_path, self.description) + self.model.init( + self.relation(), + self.ordering_field, + self.feature(), + self.image_path, + self.description, + ) # we defer attribute form creation on the first valid feature passed on if self.attribute_form: @@ -106,9 +129,11 @@ def parentFormValueChanged(self, attribute, newValue): if self.attribute_form: self.attribute_form.parentFormValueChanged(attribute, newValue) - def onCurrentFeatureChanged(self, feature = QgsFeature()): + def onCurrentFeatureChanged(self, feature=QgsFeature()): if not self.attribute_form and feature.isValid(): - self.attribute_form = QgsAttributeForm(self.relation().referencingLayer(), feature, self.editorContext()) + self.attribute_form = QgsAttributeForm( + self.relation().referencingLayer(), feature, self.editorContext() + ) if not self.editorContext().parentContext(): attribute_editor_scroll_area = QgsScrollArea() attribute_editor_scroll_area.setWidgetResizable(True) @@ -132,11 +157,11 @@ def onCurrentFeatureChanged(self, feature = QgsFeature()): def deleteSelectedFeature(self): index = self.view.rootObject().currentIndex() if Debug: - print('index', index) + print("index", index) if index >= 0: - feature_id = self.model.data(self.model.index(index, 0), OrderedRelationModel.FeatureIdRole) + feature_id = self.model.data( + self.model.index(index, 0), OrderedRelationModel.FeatureIdRole + ) if Debug: - print('fid', feature_id) + print("fid", feature_id) self.deleteFeatures([feature_id]) - - diff --git a/ordered_relation_editor/gui/ordered_relation_editor_widget_factory.py b/ordered_relation_editor/gui/ordered_relation_editor_widget_factory.py index 6ac3c06..bd6b78f 100644 --- a/ordered_relation_editor/gui/ordered_relation_editor_widget_factory.py +++ b/ordered_relation_editor/gui/ordered_relation_editor_widget_factory.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # ----------------------------------------------------------- # # QGIS Ordered Relation Editor Plugin @@ -8,10 +7,15 @@ # # ----------------------------------------------------------- -from qgis.PyQt.QtCore import QObject from qgis.gui import QgsAbstractRelationEditorWidgetFactory -from ordered_relation_editor.gui.ordered_relation_editor_widget import OrderedRelationEditorWidget -from ordered_relation_editor.gui.ordered_relation_editor_config_widget import OrderedRelationEditorConfigWidget +from qgis.PyQt.QtCore import QObject + +from ordered_relation_editor.gui.ordered_relation_editor_config_widget import ( + OrderedRelationEditorConfigWidget, +) +from ordered_relation_editor.gui.ordered_relation_editor_widget import ( + OrderedRelationEditorWidget, +) WIDGET_TYPE = "ordered_relation_editor" @@ -27,4 +31,4 @@ def create(self, config, parent): return OrderedRelationEditorWidget(config, parent) def configWidget(self, relation, parent): - return OrderedRelationEditorConfigWidget(relation, parent) \ No newline at end of file + return OrderedRelationEditorConfigWidget(relation, parent) diff --git a/ordered_relation_editor/tests/test_model.py b/ordered_relation_editor/tests/test_model.py index 1960283..8354f33 100644 --- a/ordered_relation_editor/tests/test_model.py +++ b/ordered_relation_editor/tests/test_model.py @@ -1,41 +1,54 @@ - from PyQt5.QtCore import QModelIndex -from qgis.core import QgsVectorLayer, QgsFeature, QgsRelation, QgsProject, QgsFeatureRequest -from qgis.testing import unittest, start_app +from qgis.core import ( + QgsFeature, + QgsFeatureRequest, + QgsProject, + QgsRelation, + QgsVectorLayer, +) +from qgis.testing import start_app, unittest + from ordered_relation_editor.core.ordered_relation_model import OrderedRelationModel start_app() class TestModel(unittest.TestCase): - @classmethod def setUp(self): - self.referenced_layer = QgsVectorLayer("NoGeometry?field=id:integer", "referencedlayer", "memory") + self.referenced_layer = QgsVectorLayer( + "NoGeometry?field=id:integer", "referencedlayer", "memory" + ) pr = self.referenced_layer.dataProvider() f0 = QgsFeature() f0.setFields(self.referenced_layer.fields()) f0.setAttributes([1]) assert pr.addFeatures([f0]) - - self.referencing_layer = QgsVectorLayer("NoGeometry?field=id:integer&field=foreignkey:integer&field=rank:integer", "referencinglayer", "memory") + + self.referencing_layer = QgsVectorLayer( + "NoGeometry?field=id:integer&field=foreignkey:integer&field=rank:integer", + "referencinglayer", + "memory", + ) pr = self.referencing_layer.dataProvider() features = [] for i in range(0, 10): f = QgsFeature() f.setFields(self.referencing_layer.fields()) - f.setAttributes([i+1, 1, i+1]) + f.setAttributes([i + 1, 1, i + 1]) features.append(f) assert pr.addFeatures(features) - QgsProject.instance().addMapLayers([self.referenced_layer, self.referencing_layer]) - + QgsProject.instance().addMapLayers( + [self.referenced_layer, self.referencing_layer] + ) + self.relation = QgsRelation() - self.relation.setName('rel1') - self.relation.setId('rel1') + self.relation.setName("rel1") + self.relation.setId("rel1") self.relation.setReferencingLayer(self.referencing_layer.id()) self.relation.setReferencedLayer(self.referenced_layer.id()) - self.relation.addFieldPair('foreignkey', 'id') + self.relation.addFieldPair("foreignkey", "id") assert self.relation.isValid() @@ -45,16 +58,16 @@ def setUp(self): feature = next(self.referenced_layer.getFeatures(req)) self.model = OrderedRelationModel() - self.model.init(self.relation, 'rank', feature, "\"id\"", "") + self.model.init(self.relation, "rank", feature, '"id"', "") def tearDown(self): QgsProject.instance().removeAllMapLayers() def test_order(self): - self.assertEqual(self.__features_in_order(), [i+1 for i in range(0, 10)]) + self.assertEqual(self.__features_in_order(), [i + 1 for i in range(0, 10)]) def test_move(self): - self.assertEqual(self.__features_in_order(), [i+1 for i in range(0, 10)]) + self.assertEqual(self.__features_in_order(), [i + 1 for i in range(0, 10)]) self.model.moveitems(2, 5) self.assertEqual(self.__features_in_order(), [1, 2, 4, 5, 6, 3, 7, 8, 9, 10]) @@ -64,4 +77,3 @@ def __features_in_order(self): idx = self.model.index(r, 0, QModelIndex()) features.append(self.model.data(idx, OrderedRelationModel.ImagePathRole)) return features -