Skip to content

Commit a70c46c

Browse files
committed
fix: #804, issue with WFS filter passed as string
1 parent 6e1eca9 commit a70c46c

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

CHANGES.rst

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
Changes
22
=======
33

4+
0.27.2 (unreleased)
5+
-------------------
6+
7+
- WFS: Fix set_filter for string inputs (#804)
8+
49
0.27.1 (2022-08-28)
510
-------------------
611

owslib/feature/postrequest.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,9 @@ def set_filter(self, filter):
175175
"""
176176
if isinstance(filter, str):
177177
f = etree.fromstring(filter)
178-
sub_elem = f.find(util.nspath("Filter", FES_NAMESPACE))
178+
# If this raises an error, it means the filter string does not contain an actual Filter node.
179+
sub_elem = f.xpath("//FES:Filter", namespaces={"FES": FES_NAMESPACE})[0]
180+
179181
else:
180182
sub_elem = filter
181183

tests/test_wfs_postrequest.py

+24
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@
4444
</wfs:GetFeature>
4545
"""
4646

47+
raw_2_0_filter = """
48+
<fes:Filter xmlns:fes="http://www.opengis.net/fes/2.0"
49+
xmlns:erl="http://xmlns.earthresourceml.org/earthresourceml-lite/1.0">
50+
<fes:PropertyIsEqualTo>
51+
<fes:ValueReference>reference</fes:ValueReference>
52+
<fes:Literal>gold</fes:Literal>
53+
</fes:PropertyIsEqualTo>
54+
</fes:Filter>
55+
"""
56+
4757
typename = "ns:typename"
4858

4959

@@ -272,3 +282,17 @@ def test_filter_query(self, requestv200):
272282
assert equal_elem is not None
273283
assert propertyname == "status"
274284
assert literal == "rejected"
285+
286+
def test_filter_root_query(self, requestv200):
287+
"""Same as test_filter_query, but the filter is the root element."""
288+
requestv200.set_filter(raw_2_0_filter)
289+
290+
filter_elem = requestv200._query.find(util.nspath("Filter", FES_NAMESPACE))
291+
equal_elem = filter_elem.find(util.nspath("PropertyIsEqualTo", FES_NAMESPACE))
292+
propertyname = equal_elem.findtext(util.nspath("ValueReference", FES_NAMESPACE))
293+
literal = equal_elem.findtext(util.nspath("Literal", FES_NAMESPACE))
294+
295+
assert filter_elem is not None
296+
assert equal_elem is not None
297+
assert propertyname == "reference"
298+
assert literal == "gold"

0 commit comments

Comments
 (0)