1
- # -*- coding: utf-8 -*-
2
1
# -----------------------------------------------------------
3
2
#
4
3
# QGIS Ordered Relation Editor Plugin
9
8
# -----------------------------------------------------------
10
9
11
10
from enum import Enum
12
- from qgis .PyQt .QtCore import pyqtSlot , pyqtSignal , pyqtProperty , Qt , QObject , QAbstractTableModel , QModelIndex
13
- from qgis .core import QgsRelation , QgsFeature , QgsExpression , QgsExpressionContext , QgsExpressionContextUtils , QgsMessageLog
11
+
12
+ from qgis .core import (
13
+ QgsExpression ,
14
+ QgsExpressionContext ,
15
+ QgsExpressionContextUtils ,
16
+ QgsFeature ,
17
+ QgsMessageLog ,
18
+ QgsRelation ,
19
+ )
20
+ from qgis .PyQt .QtCore import (
21
+ QAbstractTableModel ,
22
+ QModelIndex ,
23
+ QObject ,
24
+ Qt ,
25
+ pyqtProperty ,
26
+ pyqtSignal ,
27
+ pyqtSlot ,
28
+ )
14
29
15
30
Debug = True
16
31
17
- class OrderedRelationModel (QAbstractTableModel ):
18
32
33
+ class OrderedRelationModel (QAbstractTableModel ):
19
34
ImagePathRole = Qt .UserRole + 1
20
35
DescriptionRole = Qt .UserRole + 2
21
36
FeatureIdRole = Qt .UserRole + 5
@@ -24,15 +39,22 @@ class OrderedRelationModel(QAbstractTableModel):
24
39
currentFeatureChanged = pyqtSignal (QgsFeature )
25
40
26
41
def __init__ (self , parent : QObject = None ):
27
- super (OrderedRelationModel , self ).__init__ (parent )
42
+ super ().__init__ (parent )
28
43
self ._relation = QgsRelation ()
29
- self ._ordering_field = str ()
30
- self ._image_path = str ()
31
- self ._description = str ()
44
+ self ._ordering_field = ""
45
+ self ._image_path = ""
46
+ self ._description = ""
32
47
self ._feature = QgsFeature ()
33
48
self ._related_features = []
34
49
35
- def init (self , relation : QgsRelation , ordering_field : str , feature : QgsFeature , image_path : str , description : str ):
50
+ def init (
51
+ self ,
52
+ relation : QgsRelation ,
53
+ ordering_field : str ,
54
+ feature : QgsFeature ,
55
+ image_path : str ,
56
+ description : str ,
57
+ ):
36
58
self ._relation = relation
37
59
self ._ordering_field = ordering_field
38
60
self ._image_path = image_path
@@ -85,25 +107,33 @@ def data(self, index: QModelIndex, role: int = ...):
85
107
if role == self .ImagePathRole :
86
108
exp = QgsExpression (self ._image_path )
87
109
context = QgsExpressionContext ()
88
- context .appendScopes (QgsExpressionContextUtils .globalProjectLayerScopes (self ._relation .referencingLayer ()))
110
+ context .appendScopes (
111
+ QgsExpressionContextUtils .globalProjectLayerScopes (
112
+ self ._relation .referencingLayer ()
113
+ )
114
+ )
89
115
context .setFeature (self ._related_features [index .row ()])
90
116
res = exp .evaluate (context )
91
117
if res is None :
92
- res = str ()
118
+ res = ""
93
119
if Debug :
94
- QgsMessageLog .logMessage ("ImagePath role: '{0}'" . format ( str (res )) )
120
+ QgsMessageLog .logMessage (f "ImagePath role: '{ str (res )} '" )
95
121
return res
96
122
97
123
elif role == self .DescriptionRole :
98
124
exp = QgsExpression (self ._description )
99
125
context = QgsExpressionContext ()
100
- context .appendScopes (QgsExpressionContextUtils .globalProjectLayerScopes (self ._relation .referencingLayer ()))
126
+ context .appendScopes (
127
+ QgsExpressionContextUtils .globalProjectLayerScopes (
128
+ self ._relation .referencingLayer ()
129
+ )
130
+ )
101
131
context .setFeature (self ._related_features [index .row ()])
102
132
res = exp .evaluate (context )
103
133
if res is None :
104
- res = str ()
134
+ res = ""
105
135
if Debug :
106
- QgsMessageLog .logMessage ("Description role: '{0}'" . format ( str (res )) )
136
+ QgsMessageLog .logMessage (f "Description role: '{ str (res )} '" )
107
137
return res
108
138
109
139
elif role == self .FeatureIdRole :
@@ -123,7 +153,11 @@ def moveitems(self, index_from, index_to):
123
153
if index_from == index_to :
124
154
return
125
155
126
- field_index = self ._relation .referencingLayer ().fields ().indexFromName (self ._ordering_field )
156
+ field_index = (
157
+ self ._relation .referencingLayer ()
158
+ .fields ()
159
+ .indexFromName (self ._ordering_field )
160
+ )
127
161
if field_index < 0 :
128
162
return
129
163
@@ -133,17 +167,23 @@ def moveitems(self, index_from, index_to):
133
167
134
168
self .beginResetModel ()
135
169
136
- for i in range (start_index , end_index + 1 ):
170
+ for i in range (start_index , end_index + 1 ):
137
171
f = self ._related_features [i ]
138
172
if i == index_from :
139
- self ._related_features [i ][self ._ordering_field ] = index_to + 1 # ranks are index +1 (start at 1)
173
+ self ._related_features [i ][self ._ordering_field ] = (
174
+ index_to + 1
175
+ ) # ranks are index +1 (start at 1)
140
176
else :
141
177
self ._related_features [i ][self ._ordering_field ] += delta
142
178
143
- res = self ._relation .referencingLayer ().changeAttributeValue (f .id (), field_index , f [self ._ordering_field ])
179
+ res = self ._relation .referencingLayer ().changeAttributeValue (
180
+ f .id (), field_index , f [self ._ordering_field ]
181
+ )
144
182
print (res )
145
183
146
- self ._related_features = sorted (self ._related_features , key = lambda _f : _f [self ._ordering_field ])
184
+ self ._related_features = sorted (
185
+ self ._related_features , key = lambda _f : _f [self ._ordering_field ]
186
+ )
147
187
148
188
self .endResetModel ()
149
189
@@ -154,28 +194,36 @@ def onViewCurrentFeatureChanged(self, index):
154
194
155
195
def roleNames (self ):
156
196
return {
157
- self .ImagePathRole : b' ImagePath' ,
158
- self .DescriptionRole : b' Description' ,
159
- self .FeatureIdRole : b' FeatureId'
197
+ self .ImagePathRole : b" ImagePath" ,
198
+ self .DescriptionRole : b" Description" ,
199
+ self .FeatureIdRole : b" FeatureId" ,
160
200
}
161
201
162
202
def reloadData (self ):
163
203
self .beginResetModel ()
164
204
self ._related_features = []
165
205
166
206
if Debug :
167
- QgsMessageLog .logMessage ("Reload data: Ordering field='{0}', Relation valid/id={1}/'{2}', Feature valid={3}"
168
- .format (self ._ordering_field , self ._relation .isValid (), self ._relation .id (), self ._feature .isValid ()))
169
-
170
- if len (self ._ordering_field ) > 0 and self ._relation .isValid () and self ._feature .isValid ():
207
+ QgsMessageLog .logMessage (
208
+ "Reload data: Ordering field='{}', Relation valid/id={}/'{}', Feature valid={}" .format (
209
+ self ._ordering_field ,
210
+ self ._relation .isValid (),
211
+ self ._relation .id (),
212
+ self ._feature .isValid (),
213
+ )
214
+ )
215
+
216
+ if (
217
+ len (self ._ordering_field ) > 0
218
+ and self ._relation .isValid ()
219
+ and self ._feature .isValid ()
220
+ ):
171
221
request = self ._relation .getRelatedFeaturesRequest (self ._feature )
172
222
for f in self ._relation .referencingLayer ().getFeatures (request ):
173
223
self ._related_features .append (f )
174
224
175
- self ._related_features = sorted (self ._related_features , key = lambda _f : _f [self ._ordering_field ])
225
+ self ._related_features = sorted (
226
+ self ._related_features , key = lambda _f : _f [self ._ordering_field ]
227
+ )
176
228
177
229
self .endResetModel ()
178
-
179
-
180
-
181
-
0 commit comments