Skip to content

Commit 78236c0

Browse files
committed
Use contextGenerator in refactor fields algorithm
1 parent a8d9dea commit 78236c0

File tree

2 files changed

+25
-25
lines changed

2 files changed

+25
-25
lines changed

python/plugins/processing/algs/qgis/FieldsMapper.py

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,7 @@ def processAlgorithm(self, progress):
7878
da.setEllipsoid(QgsProject.instance().readEntry(
7979
'Measure', '/Ellipsoid', GEO_NONE)[0])
8080

81-
exp_context = QgsExpressionContext()
82-
exp_context.appendScope(QgsExpressionContextUtils.globalScope())
83-
exp_context.appendScope(QgsExpressionContextUtils.projectScope())
84-
exp_context.appendScope(QgsExpressionContextUtils.layerScope(layer))
81+
exp_context = layer.createExpressionContext()
8582

8683
for field_def in mapping:
8784
fields.append(QgsField(name=field_def['name'],
@@ -93,27 +90,20 @@ def processAlgorithm(self, progress):
9390
expression.setGeomCalculator(da)
9491
expression.setDistanceUnits(QgsProject.instance().distanceUnits())
9592
expression.setAreaUnits(QgsProject.instance().areaUnits())
96-
93+
expression.prepare(exp_context)
9794
if expression.hasParserError():
9895
raise GeoAlgorithmExecutionException(
9996
self.tr(u'Parser error in expression "{}": {}')
100-
.format(str(field_def['expression']),
101-
str(expression.parserErrorString())))
102-
expression.prepare(exp_context)
103-
if expression.hasEvalError():
104-
raise GeoAlgorithmExecutionException(
105-
self.tr(u'Evaluation error in expression "{}": {}')
106-
.format(str(field_def['expression']),
107-
str(expression.evalErrorString())))
97+
.format(unicode(expression.expression()),
98+
unicode(expression.parserErrorString())))
10899
expressions.append(expression)
109100

110101
writer = output.getVectorWriter(fields,
111102
layer.wkbType(),
112103
layer.crs())
113104

114105
# Create output vector layer with new attributes
115-
error = ''
116-
calculationSuccess = True
106+
error_exp = None
117107
inFeat = QgsFeature()
118108
outFeat = QgsFeature()
119109
features = vector.features(layer)
@@ -132,8 +122,7 @@ def processAlgorithm(self, progress):
132122
exp_context.lastScope().setVariable("row_number", rownum)
133123
value = expression.evaluate(exp_context)
134124
if expression.hasEvalError():
135-
calculationSuccess = False
136-
error = expression.evalErrorString()
125+
error_exp = expression
137126
break
138127

139128
attrs.append(value)
@@ -145,7 +134,8 @@ def processAlgorithm(self, progress):
145134

146135
del writer
147136

148-
if not calculationSuccess:
137+
if error_exp is not None:
149138
raise GeoAlgorithmExecutionException(
150-
self.tr('An error occurred while evaluating the calculation'
151-
' string:\n') + error)
139+
self.tr(u'Evaluation error in expression "{}": {}')
140+
.format(unicode(error_exp.expression()),
141+
unicode(error_exp.parserErrorString())))

python/plugins/processing/algs/qgis/ui/FieldsMappingPanel.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
from qgis.PyQt.QtWidgets import QComboBox, QHeaderView, QLineEdit, QMessageBox, QSpinBox, QStyledItemDelegate
3636
from qgis.PyQt.QtCore import QItemSelectionModel, QAbstractTableModel, QModelIndex, QVariant, Qt, pyqtSlot
3737

38-
from qgis.core import QgsExpression, QgsExpressionContextUtils, QgsApplication, QgsFeature
38+
from qgis.core import QgsExpression, QgsProject, QgsApplication
3939
from qgis.gui import QgsFieldExpressionWidget
4040

4141
from processing.gui.wrappers import WidgetWrapper, DIALOG_STANDARD, DIALOG_MODELER
@@ -87,21 +87,30 @@ def testAllExpressions(self):
8787
def testExpression(self, row):
8888
self._errors[row] = None
8989
field = self._mapping[row]
90+
exp_context = self.contextGenerator().createExpressionContext()
91+
9092
expression = QgsExpression(field['expression'])
93+
expression.prepare(exp_context)
9194
if expression.hasParserError():
9295
self._errors[row] = expression.parserErrorString()
9396
return
97+
98+
# test evaluation on the first feature
9499
if self._layer is None:
95100
return
96-
context = QgsExpressionContextUtils.createFeatureBasedContext(QgsFeature(), self._layer.fields())
97101
for feature in self._layer.getFeatures():
98-
context.setFeature(feature)
99-
expression.evaluate(context)
102+
exp_context.setFeature(feature)
103+
exp_context.lastScope().setVariable("row_number", 1)
104+
expression.evaluate(exp_context)
100105
if expression.hasEvalError():
101106
self._errors[row] = expression.evalErrorString()
102-
return
103107
break
104108

109+
def contextGenerator(self):
110+
if self._layer:
111+
return self._layer
112+
return QgsProject.instance()
113+
105114
def layer(self):
106115
return self._layer
107116

@@ -254,6 +263,7 @@ def createEditor(self, parent, option, index):
254263
elif fieldType == QgsExpression:
255264
editor = QgsFieldExpressionWidget(parent)
256265
editor.setLayer(index.model().layer())
266+
editor.registerExpressionContextGenerator(index.model().contextGenerator())
257267
editor.fieldChanged.connect(self.on_expression_fieldChange)
258268

259269
else:

0 commit comments

Comments
 (0)