Skip to content

Commit 1c4811f

Browse files
committed
Add Is Not Null and Is Not Between type search/filters
1 parent 383fc05 commit 1c4811f

11 files changed

+65
-11
lines changed

python/gui/editorwidgets/core/qgssearchwidgetwrapper.sip

+2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ class QgsSearchWidgetWrapper : QgsWidgetWrapper
7777
Contains, /*!< Supports value "contains" searching */
7878
DoesNotContain, /*!< Supports value does not contain searching */
7979
IsNull, /*!< Supports searching for null values */
80+
IsNotBetween, /*!< Supports searching for values outside of a set range */
81+
IsNotNull, /*!< Supports searching for non-null values */
8082
};
8183
typedef QFlags<QgsSearchWidgetWrapper::FilterFlag> FilterFlags;
8284

src/gui/editorwidgets/core/qgssearchwidgetwrapper.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ QList<QgsSearchWidgetWrapper::FilterFlag> QgsSearchWidgetWrapper::exclusiveFilte
3232
<< Between
3333
<< Contains
3434
<< DoesNotContain
35-
<< IsNull;
35+
<< IsNull
36+
<< IsNotBetween
37+
<< IsNotNull;
3638
}
3739

3840
QList<QgsSearchWidgetWrapper::FilterFlag> QgsSearchWidgetWrapper::nonExclusiveFilterFlags()
@@ -67,6 +69,11 @@ QString QgsSearchWidgetWrapper::toString( QgsSearchWidgetWrapper::FilterFlag fla
6769
return QObject::tr( "Does not contain" );
6870
case IsNull:
6971
return QObject::tr( "Is missing (null)" );
72+
case IsNotNull:
73+
return QObject::tr( "Is not missing (null)" );
74+
case IsNotBetween:
75+
return QObject::tr( "Is not between (inclusive)" );
76+
7077
}
7178
return QString();
7279
}

src/gui/editorwidgets/core/qgssearchwidgetwrapper.h

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class GUI_EXPORT QgsSearchWidgetWrapper : public QgsWidgetWrapper
5757
Contains = 1 << 9, /*!< Supports value "contains" searching */
5858
DoesNotContain = 1 << 10, /*!< Supports value does not contain searching */
5959
IsNull = 1 << 11, /*!< Supports searching for null values */
60+
IsNotBetween = 1 << 12, /*!< Supports searching for values outside of a set range */
61+
IsNotNull = 1 << 13, /*!< Supports searching for non-null values */
6062
};
6163
Q_DECLARE_FLAGS( FilterFlags, FilterFlag )
6264

src/gui/editorwidgets/qgscheckboxsearchwidgetwrapper.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ QVariant QgsCheckboxSearchWidgetWrapper::value() const
5151

5252
QgsSearchWidgetWrapper::FilterFlags QgsCheckboxSearchWidgetWrapper::supportedFlags() const
5353
{
54-
return EqualTo | IsNull;
54+
return EqualTo | IsNull | IsNotNull;
5555
}
5656

5757
QgsSearchWidgetWrapper::FilterFlags QgsCheckboxSearchWidgetWrapper::defaultFlags() const
@@ -69,6 +69,9 @@ QString QgsCheckboxSearchWidgetWrapper::createExpression( QgsSearchWidgetWrapper
6969
if ( flags & IsNull )
7070
return fieldName + " IS NULL";
7171

72+
if ( flags & IsNotNull )
73+
return fieldName + " IS NOT NULL";
74+
7275
QVariant v = value();
7376
if ( !v.isValid() )
7477
return QString();

src/gui/editorwidgets/qgsdatetimesearchwidgetwrapper.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ QVariant QgsDateTimeSearchWidgetWrapper::value() const
5151

5252
QgsSearchWidgetWrapper::FilterFlags QgsDateTimeSearchWidgetWrapper::supportedFlags() const
5353
{
54-
return EqualTo | NotEqualTo | GreaterThan | LessThan | GreaterThanOrEqualTo | LessThanOrEqualTo | IsNull | Between;
54+
return EqualTo | NotEqualTo | GreaterThan | LessThan | GreaterThanOrEqualTo | LessThanOrEqualTo | IsNull | Between | IsNotNull | IsNotBetween;
5555
}
5656

5757
QgsSearchWidgetWrapper::FilterFlags QgsDateTimeSearchWidgetWrapper::defaultFlags() const
@@ -67,6 +67,8 @@ QString QgsDateTimeSearchWidgetWrapper::createExpression( QgsSearchWidgetWrapper
6767
flags &= supportedFlags();
6868
if ( flags & IsNull )
6969
return fieldName + " IS NULL";
70+
if ( flags & IsNotNull )
71+
return fieldName + " IS NOT NULL";
7072

7173
QVariant v = value();
7274
if ( !v.isValid() )

src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ bool QgsDefaultSearchWidgetWrapper::applyDirectly()
9090

9191
QgsSearchWidgetWrapper::FilterFlags QgsDefaultSearchWidgetWrapper::supportedFlags() const
9292
{
93-
FilterFlags flags = EqualTo | NotEqualTo | IsNull;
93+
FilterFlags flags = EqualTo | NotEqualTo | IsNull | IsNotNull;
9494

9595
QVariant::Type fldType = layer()->fields().at( mFieldIdx ).type();
9696
switch ( fldType )
@@ -107,7 +107,7 @@ QgsSearchWidgetWrapper::FilterFlags QgsDefaultSearchWidgetWrapper::supportedFlag
107107
case QVariant::Date:
108108
case QVariant::DateTime:
109109
case QVariant::Time:
110-
flags |= GreaterThan | LessThan | GreaterThanOrEqualTo | LessThanOrEqualTo | Between;
110+
flags |= GreaterThan | LessThan | GreaterThanOrEqualTo | LessThanOrEqualTo | Between | IsNotBetween;
111111
break;
112112

113113
case QVariant::String:
@@ -157,6 +157,8 @@ QString QgsDefaultSearchWidgetWrapper::createExpression( QgsSearchWidgetWrapper:
157157

158158
if ( flags & IsNull )
159159
return fieldName + " IS NULL";
160+
if ( flags & IsNotNull )
161+
return fieldName + " IS NOT NULL";
160162

161163
switch ( fldType )
162164
{

src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ bool QgsValueMapSearchWidgetWrapper::valid() const
6868

6969
QgsSearchWidgetWrapper::FilterFlags QgsValueMapSearchWidgetWrapper::supportedFlags() const
7070
{
71-
return EqualTo | NotEqualTo | IsNull;
71+
return EqualTo | NotEqualTo | IsNull | IsNotNull;
7272
}
7373

7474
QgsSearchWidgetWrapper::FilterFlags QgsValueMapSearchWidgetWrapper::defaultFlags() const
@@ -90,6 +90,8 @@ QString QgsValueMapSearchWidgetWrapper::createExpression( QgsSearchWidgetWrapper
9090

9191
if ( flags & IsNull )
9292
return fieldName + " IS NULL";
93+
if ( flags & IsNotNull )
94+
return fieldName + " IS NOT NULL";
9395

9496
QString currentKey = mComboBox->itemData( mComboBox->currentIndex() ).toString();
9597

src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ QVariant QgsValueRelationSearchWidgetWrapper::value() const
9191

9292
QgsSearchWidgetWrapper::FilterFlags QgsValueRelationSearchWidgetWrapper::supportedFlags() const
9393
{
94-
return EqualTo | NotEqualTo | IsNull;
94+
return EqualTo | NotEqualTo | IsNull | IsNotNull;
9595
}
9696

9797
QgsSearchWidgetWrapper::FilterFlags QgsValueRelationSearchWidgetWrapper::defaultFlags() const
@@ -107,6 +107,8 @@ QString QgsValueRelationSearchWidgetWrapper::createExpression( QgsSearchWidgetWr
107107
flags &= supportedFlags();
108108
if ( flags & IsNull )
109109
return fieldName + " IS NULL";
110+
if ( flags & IsNotNull )
111+
return fieldName + " IS NOT NULL";
110112

111113
QVariant v = value();
112114
if ( !v.isValid() )

src/gui/qgsattributeformeditorwidget.cpp

+13-3
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ void QgsAttributeFormEditorWidget::createSearchWidgetWrappers( const QString& wi
100100
QgsSearchWidgetWrapper* sww = QgsEditorWidgetRegistry::instance()->createSearchWidget( widgetId, layer(), fieldIdx, config,
101101
mSearchFrame, context );
102102
setSearchWidgetWrapper( sww );
103-
if ( sww->supportedFlags() & QgsSearchWidgetWrapper::Between )
103+
if ( sww->supportedFlags() & QgsSearchWidgetWrapper::Between ||
104+
sww->supportedFlags() & QgsSearchWidgetWrapper::IsNotBetween )
104105
{
105106
// create secondary widget for between type searches
106107
QgsSearchWidgetWrapper* sww2 = QgsEditorWidgetRegistry::instance()->createSearchWidget( widgetId, layer(), fieldIdx, config,
@@ -200,6 +201,13 @@ QString QgsAttributeFormEditorWidget::currentFilterExpression() const
200201
QString filter2 = mSearchWidgets.at( 1 )->createExpression( QgsSearchWidgetWrapper::LessThanOrEqualTo );
201202
return QString( "%1 AND %2" ).arg( filter1, filter2 );
202203
}
204+
else if ( mSearchWidgetToolButton->activeFlags() & QgsSearchWidgetWrapper::IsNotBetween )
205+
{
206+
// special case: Is Not Between search
207+
QString filter1 = mSearchWidgets.at( 0 )->createExpression( QgsSearchWidgetWrapper::LessThan );
208+
QString filter2 = mSearchWidgets.at( 1 )->createExpression( QgsSearchWidgetWrapper::GreaterThan );
209+
return QString( "%1 OR %2" ).arg( filter1, filter2 );
210+
}
203211

204212
return mSearchWidgets.at( 0 )->createExpression( mSearchWidgetToolButton->activeFlags() );
205213
}
@@ -255,7 +263,8 @@ void QgsAttributeFormEditorWidget::searchWidgetFlagsChanged( QgsSearchWidgetWrap
255263
{
256264
Q_FOREACH ( QgsSearchWidgetWrapper* widget, mSearchWidgets )
257265
{
258-
widget->setEnabled( !( flags & QgsSearchWidgetWrapper::IsNull ) );
266+
widget->setEnabled( !( flags & QgsSearchWidgetWrapper::IsNull )
267+
&& !( flags & QgsSearchWidgetWrapper::IsNotNull ) );
259268
if ( !mSearchWidgetToolButton->isActive() )
260269
{
261270
widget->clearWidget();
@@ -264,7 +273,8 @@ void QgsAttributeFormEditorWidget::searchWidgetFlagsChanged( QgsSearchWidgetWrap
264273

265274
if ( mSearchWidgets.count() >= 2 )
266275
{
267-
mSearchWidgets.at( 1 )->widget()->setVisible( flags & QgsSearchWidgetWrapper::Between );
276+
mSearchWidgets.at( 1 )->widget()->setVisible( flags & QgsSearchWidgetWrapper::Between ||
277+
flags & QgsSearchWidgetWrapper::IsNotBetween );
268278
}
269279
}
270280

tests/src/python/test_qgsattributeformeditorwidget.py

+2
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ def testBetweenFilter(self):
8989

9090
af.searchWidgetToolButton().setActiveFlags(QgsSearchWidgetWrapper.Between)
9191
self.assertEquals(af.currentFilterExpression(), '"fldtext">=\'2013-05-06\' AND "fldtext"<=\'2013-05-16\'')
92+
af.searchWidgetToolButton().setActiveFlags(QgsSearchWidgetWrapper.IsNotBetween)
93+
self.assertEquals(af.currentFilterExpression(), '"fldtext"<\'2013-05-06\' OR "fldtext">\'2013-05-16\'')
9294

9395

9496
if __name__ == '__main__':

tests/src/python/test_qgssearchwidgetwrapper.py

+21-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ def testFlagToString(self):
4646
QgsSearchWidgetWrapper.CaseInsensitive,
4747
QgsSearchWidgetWrapper.Contains,
4848
QgsSearchWidgetWrapper.DoesNotContain,
49-
QgsSearchWidgetWrapper.IsNull
49+
QgsSearchWidgetWrapper.IsNull,
50+
QgsSearchWidgetWrapper.IsNotNull,
51+
QgsSearchWidgetWrapper.IsNotBetween
5052
]
5153
for t in tests:
5254
self.assertTrue(len(QgsSearchWidgetWrapper.toString(t)) > 0)
@@ -76,6 +78,7 @@ def testCreateExpression(self):
7678

7779
case_sensitive.setChecked(False)
7880
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldtxt" IS NULL')
81+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldtxt" IS NOT NULL')
7982
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), 'lower("fldtxt")=lower(\'test\')')
8083
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), 'lower("fldtxt")<>lower(\'test\')')
8184
case_sensitive.setChecked(True)
@@ -136,15 +139,18 @@ def testCreateExpression(self):
136139
c.setCurrentIndex(0)
137140

138141
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '')
142+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '')
139143
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '')
140144
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '')
141145

142146
c.setCurrentIndex(1)
143147
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldtxt" IS NULL')
148+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldtxt" IS NOT NULL')
144149
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldtxt"=\'1\'')
145150
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"fldtxt"<>\'1\'')
146151
c.setCurrentIndex(2)
147152
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldtxt" IS NULL')
153+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldtxt" IS NOT NULL')
148154
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldtxt"=\'200\'')
149155
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"fldtxt"<>\'200\'')
150156

@@ -154,6 +160,7 @@ def testCreateExpression(self):
154160
c = w.widget()
155161
c.setCurrentIndex(1)
156162
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldint" IS NULL')
163+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldint" IS NOT NULL')
157164
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldint"=1')
158165
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"fldint"<>1')
159166

@@ -186,15 +193,18 @@ def testCreateExpression(self):
186193
c.setCurrentIndex(0)
187194

188195
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldtxt" IS NULL')
196+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldtxt" IS NOT NULL')
189197
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '')
190198
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '')
191199

192200
c.setCurrentIndex(1)
193201
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldtxt" IS NULL')
202+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldtxt" IS NOT NULL')
194203
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldtxt"=\'a\'')
195204
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"fldtxt"<>\'a\'')
196205
c.setCurrentIndex(2)
197206
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldtxt" IS NULL')
207+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldtxt" IS NOT NULL')
198208
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldtxt"=\'b\'')
199209
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"fldtxt"<>\'b\'')
200210

@@ -206,6 +216,7 @@ def testCreateExpression(self):
206216
c.setCurrentIndex(c.findText('value c'))
207217
self.assertEqual(c.currentIndex(), 3)
208218
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldint" IS NULL')
219+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldint" IS NOT NULL')
209220
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldint"=3')
210221
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"fldint"<>3')
211222

@@ -216,6 +227,7 @@ def testCreateExpression(self):
216227
c = w.widget()
217228
c.setCurrentIndex(c.findText('value c'))
218229
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldint" IS NULL')
230+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldint" IS NOT NULL')
219231
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldint"=3')
220232
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"fldint"<>3')
221233

@@ -226,6 +238,7 @@ def testCreateExpression(self):
226238
l = w.widget()
227239
l.setText('value b')
228240
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldint" IS NULL')
241+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldint" IS NOT NULL')
229242
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldint"=2')
230243
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"fldint"<>2')
231244

@@ -245,9 +258,11 @@ def testCreateExpression(self):
245258
# first check with string field type
246259
c.setChecked(True)
247260
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldtxt" IS NULL')
261+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldtxt" IS NOT NULL')
248262
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldtxt"=\'5\'')
249263
c.setChecked(False)
250264
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldtxt" IS NULL')
265+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldtxt" IS NOT NULL')
251266
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldtxt"=\'9\'')
252267

253268
# try with numeric field
@@ -256,9 +271,11 @@ def testCreateExpression(self):
256271
c = w.widget()
257272
c.setChecked(True)
258273
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldint" IS NULL')
274+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldint" IS NOT NULL')
259275
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldint"=5')
260276
c.setChecked(False)
261277
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"fldint" IS NULL')
278+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"fldint" IS NOT NULL')
262279
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"fldint"=9')
263280

264281

@@ -277,6 +294,7 @@ def testCreateExpression(self):
277294
# first check with date field type
278295
c.setDateTime(QDateTime(QDate(2013, 4, 5), QTime()))
279296
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"date" IS NULL')
297+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"date" IS NOT NULL')
280298
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"date"=\'2013-04-05\'')
281299
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"date"<>\'2013-04-05\'')
282300
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.GreaterThan), '"date">\'2013-04-05\'')
@@ -293,6 +311,7 @@ def testCreateExpression(self):
293311

294312
c.setDateTime(QDateTime(QDate(2013, 4, 5), QTime(13, 14, 15)))
295313
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"time" IS NULL')
314+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"time" IS NOT NULL')
296315
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"time"=\'13:14:15\'')
297316
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"time"<>\'13:14:15\'')
298317
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.GreaterThan), '"time">\'13:14:15\'')
@@ -309,6 +328,7 @@ def testCreateExpression(self):
309328

310329
c.setDateTime(QDateTime(QDate(2013, 4, 5), QTime(13, 14, 15)))
311330
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"datetime" IS NULL')
331+
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"datetime" IS NOT NULL')
312332
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"datetime"=\'2013-04-05 13:14:15\'')
313333
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"datetime"<>\'2013-04-05 13:14:15\'')
314334
self.assertEquals(w.createExpression(QgsSearchWidgetWrapper.GreaterThan), '"datetime">\'2013-04-05 13:14:15\'')

0 commit comments

Comments
 (0)