Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions application_istsoslib.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
# =============================================================================

import sys
import os
from os import path
import traceback
import waconf2sos
Expand Down Expand Up @@ -57,11 +58,11 @@ def executeSos(environ, start_response):
sys.path.insert(0, sosConfig.istsos_librarypath)

pgdb = sosDatabase.PgDB(
sosConfig.connection["user"],
sosConfig.connection["password"],
sosConfig.connection["dbname"],
sosConfig.connection["host"],
sosConfig.connection["port"]
os.environ["GROUNDWATER_DATABASE_USER"],
os.environ["GROUNDWATER_DATABASE_PASSWORD"],
os.environ["GROUNDWATER_DATABASE"],
os.environ["GROUNDWATER_DATABASE_HOST"],
os.environ["GROUNDWATER_DATABASE_PORT"]
)

req_filter = FF.sosFactoryFilter(environ, sosConfig)
Expand Down
3 changes: 2 additions & 1 deletion istsoslib/filters/factory_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
__maintainer__ = 'Massimiliano Cannata, Milan Antonovic'
__email__ = 'milan.antonovic@gmail.com'

from html import unescape
from istsoslib import sosException
import cgi
from urllib.parse import parse_qs, unquote
Expand Down Expand Up @@ -57,7 +58,7 @@ def sosFactoryFilter(environ, sosConfig):
# > keep_blank_values used in version 2.0.0 to check
# > null parameter exceptions
rect = parse_qs(
environ['QUERY_STRING'],
unescape(environ['QUERY_STRING']),
keep_blank_values=True
)
requestObject = {}
Expand Down
93 changes: 92 additions & 1 deletion istsoslib/renderers/DSresponseRender.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,10 @@ def render(DS,sosConfig):
constraint = et.SubElement(time, "{%s}constraint" % ns['swe'])
allowedTimes = et.SubElement(constraint, "{%s}AllowedTimes" % ns['swe'])
interval = et.SubElement(allowedTimes, "{%s}interval" % ns['swe'])
interval.text = "%s %s" %(DS.stime.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), DS.etime.strftime("%Y-%m-%dT%H:%M:%S.%fZ"))
begin = et.SubElement(interval, "{%s}begin" % ns['swe'])
begin.text = DS.stime.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
end = et.SubElement(interval, "{%s}end" % ns['swe'])
end.text = DS.etime.strftime("%Y-%m-%dT%H:%M:%S.%fZ")

if DS.procedureType=="insitu-mobile-point": # Adding 3d coordinates observation

Expand Down Expand Up @@ -127,6 +130,12 @@ def render(DS,sosConfig):
if not (field["name_uom"]=="" or field["name_uom"]==None or field["name_uom"]=="NULL"):
uom = et.SubElement(quantity,"{%s}uom" % ns["swe"])
uom.attrib["code"] = field["name_uom"]

interval = et.SubElement(quantity, "{%s}interval" % ns['swe'])
begin = et.SubElement(interval, "{%s}begin" % ns['swe'])
begin.text = field['stime_prc'].strftime("%Y-%m-%dT%H:%M:%S.%fZ")
end = et.SubElement(interval, "{%s}end" % ns['swe'])
end.text = field['etime_prc'].strftime("%Y-%m-%dT%H:%M:%S.%fZ")
"""
if not (field["desc_opr"]=="" or field["desc_opr"]==None or field["desc_opr"]=="NULL"):
description = et.SubElement(quantity,"{%s}description" % ns["swe"])
Expand Down Expand Up @@ -252,6 +261,88 @@ def render(DS,sosConfig):
root = tree.getroot()
root.attrib["xmlns"]="http://www.opengis.net/sensorML/1.0.1"
root.attrib["version"]="1.0.1"

# TODO:
# Specifically for IGRAC
#--- Update well information ---#
for index, field in enumerate(DS.sensorProperties):
name = tree.find("{%s}member/{%s}System/{%s}name" % (ns['sml'], ns['sml'], ns['gml']))
name.text = field['name']

photo = et.Element("{%s}photo" % ns["gml"])
if field["photo"]:
photo.text = field["photo"]
name.addnext(photo)

org = et.Element("{%s}OriginatingOrganization" % ns["gml"])
if field["manager"]:
org.text = field["manager"]
photo.addnext(org)

# Hydrogeology
hydrogeology = et.Element("{%s}Hydrogeology" % ns["gml"])
aquifer = et.SubElement(hydrogeology, "{%s}Aquifer" % ns["gml"])
aquifer_name = et.SubElement(aquifer, "{%s}AquiferName" % ns["gml"])
if field["aquifer_name"]:
aquifer_name.text = field["aquifer_name"]
aquifer_material = et.SubElement(aquifer, "{%s}AquiferMaterial" % ns["gml"])
if field["aquifer_material"]:
aquifer_material.text = field["aquifer_material"]
aquifer_type = et.SubElement(aquifer, "{%s}AquiferType" % ns["gml"])
if field["aquifer_type"]:
aquifer_type.text = field["aquifer_type"]
aquifer_thickness = et.SubElement(aquifer, "{%s}AquiferThickness" % ns["gml"])
if field["aquifer_thickness"]:
aquifer_thickness.text = field["aquifer_thickness"]
confinement = et.SubElement(aquifer, "{%s}Confinement" % ns["gml"])
if field["confinement"]:
confinement.text = field["confinement"]
org.addnext(hydrogeology)

id = tree.find("{%s}member/{%s}System/{%s}identification/{%s}IdentifierList/{%s}identifier/{%s}Term/{%s}value" % (ns['sml'], ns['sml'], ns['sml'], ns['sml'], ns['sml'], ns['sml'], ns['sml']))
id.text = field['ggis_uid']
point = tree.find("{%s}member/{%s}System/{%s}location/{%s}Point" % (ns['sml'], ns['sml'], ns['sml'], ns['gml']))
point.attrib["{%s}id" % ns['gml']] = field['original_id']
location = tree.find("{%s}member/{%s}System/{%s}location" % (ns['sml'], ns['sml'], ns['sml']))
if field['country']:
country = et.SubElement(location, "{%s}country" % ns["gml"])
country.text = f"{field['country']}"

coordinates = tree.find("{%s}member/{%s}System/{%s}location/{%s}Point/{%s}coordinates" % (ns['sml'], ns['sml'], ns['sml'], ns['gml'], ns['gml']))
# if field['elevation_value']:
# coordinates.text = f"{field['longitude']},{field['latitude']},{field['elevation_value']}"
# else:
# coordinates.text = f"{field['longitude']},{field['latitude']}"
#
# # TODO: WE COMMENT THIS TO ASK FIRST
latitude = et.SubElement(coordinates, "{%s}latitude" % ns["gml"])
latitude.text = f"{field['latitude']}"
longitude = et.SubElement(coordinates, "{%s}longitude" % ns["gml"])
longitude.text = f"{field['longitude']}"
elevation = et.SubElement(coordinates, "{%s}elevation" % ns["gml"])
value = et.SubElement(elevation, "{%s}value" % ns["gml"])
value.text = f"{field['elevation_value'] if field['elevation_value'] else ''}"
unit = et.SubElement(elevation, "{%s}unit" % ns["gml"])
unit.text = f"{field['elevation_unit'] if field['elevation_unit'] else ''}"

license = tree.find("{%s}member/{%s}System/{%s}License" % (ns['sml'], ns['sml'], ns['gml']))
if 'license' in field and field['license']:
if 'summary' in field and field['summary']:
el = et.SubElement(license, "{%s}summary" % ns["gml"])
el.text = f"{field['summary']}"
el = et.SubElement(license, "{%s}name" % ns["gml"])
el.text = f"{field['license']}"
el = et.SubElement(license, "{%s}description" % ns["gml"])
el.text = f"{field['license_desc']}"

restriction = tree.find("{%s}member/{%s}System/{%s}Restriction" % (ns['sml'], ns['sml'], ns['gml']))
if 'restriction_code_type_desc' in field and field['restriction_code_type_desc']:
el = et.SubElement(restriction, "{%s}description" % ns["gml"])
el.text = f"{field['restriction_code_type_desc']}"
el = et.SubElement(restriction, "{%s}other" % ns["gml"])
el.text = f"{field['constraints_other']}"


return b'<?xml version="1.0" encoding="UTF-8"?>' + et.tostring(root)


Expand Down
4 changes: 3 additions & 1 deletion istsoslib/renderers/GCresponseRender.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import sys
import isodate as iso

from ..utils import escape

def render(GC,sosConfig):
r = '''<?xml version="1.0" encoding="UTF-8"?>
<Capabilities
Expand Down Expand Up @@ -103,7 +105,7 @@ def render(GC,sosConfig):
r += " <ows:AllowedValues>\n"
if len(p.allowedValues)>0:
for a in p.allowedValues:
r += " <ows:Value>" + str(a) + "</ows:Value>\n"
r += " <ows:Value>" + escape(a) + "</ows:Value>\n"
if len(p.range)>0:
r += " <ows:Range>\n"
r += " <ows:MinimumValue>"
Expand Down
22 changes: 15 additions & 7 deletions istsoslib/renderers/GFresponseRender.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,28 @@
#
# ===============================================================================
import isodate as iso
from lxml import etree as et
#import sosConfig

def render(GF,sosConfig):
r = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
r = ""
if GF.type.lower()=="station" or GF.type.lower()=="point":
r += "<sa:SamplingPoint \n"
elif GF.type=="surface":
r += "<sa:SamplingSurface \n"
else:
r += "<sa:SamplingPoint \n"
r += "gml:id=\"" + GF.name + "\" \n"
r += "xmlns:sa=\"http://www.opengis.net/sampling/1.0\" \n"
r += "xmlns:swe=\"http://www.opengis.net/swe/1.0.1\" \n"
r += "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n"
r += "xmlns:xlink=\"http://www.w3.org/1999/xlink\" \n"
r += "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n"
r += "xmlns:xlink=\"http://www.w3.org/1999/xlink\" \n"
r += "xmlns:gml=\"http://www.opengis.net/gml\" \n"
r += "xmlns:om=\"http://www.opengis.net/om/1.0\" \n"
r += "xsi:schemaLocation=\"http://www.opengis.net/sampling/1.0 http://schemas.opengis.net/sampling/1.0.0/sampling.xsd\">\n"

r += " <gml:description>" + GF.desc + "</gml:description>\n"
if GF.desc:
r += " <gml:description>" + GF.desc + "</gml:description>\n"
r += " <gml:name>" + GF.name + "</gml:name> \n"
r += " <sa:sampledFeature/>\n"

Expand Down Expand Up @@ -98,11 +102,15 @@ def render(GF,sosConfig):
r += " </sa:relatedObservation>\n"

r += " <sa:position> \n"
r += " " + GF.geom + "\n"
if GF.geom:
r += " " + GF.geom + "\n"
r += " </sa:position>\n"
if GF.type.lower()=="station" or GF.type.lower()=="point":
r += "</sa:SamplingPoint> \n"
elif GF.type=="surface":
r += "</sa:SamplingSurface> \n"

return r
else:
r += "</sa:SamplingPoint> \n"
tree = et.ElementTree(et.fromstring(r))
root = tree.getroot()
return b'<?xml version="1.0" encoding="UTF-8"?>' + et.tostring(root)
14 changes: 11 additions & 3 deletions istsoslib/renderers/GOresponseRender.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import sys
import datetime

from ..utils import escape

date_handler = lambda obj: (
obj.isoformat()
if isinstance(obj, (datetime.datetime, datetime.date))
Expand Down Expand Up @@ -103,7 +105,7 @@ def XMLformat(GO):
r += " <om:samplingTime/>\n"

#PROCEDURE
r += " <om:procedure xlink:href=\"" + ob.procedure + "\"/>\n"
r += " <om:procedure xlink:href=\"" + escape(ob.procedure) + "\"/>\n"

#PROPRIETA OSSERVATA
if ob.procedureType == "insitu-mobile-point":
Expand All @@ -128,7 +130,7 @@ def XMLformat(GO):
r += " </om:observedProperty>\n"

#FEATURE OF INTEREST
r += " <om:featureOfInterest xlink:href=\"" + ob.foi_urn + "\">\n"
r += " <om:featureOfInterest xlink:href=\"" + escape(ob.foi_urn) + "\">\n"
r += " <gml:FeatureCollection>\n"
r += " <gml:location>\n"
r += " " + ob.foiGml + "\n"
Expand Down Expand Up @@ -195,7 +197,13 @@ def XMLformat(GO):
r += " </swe:encoding>\n"

if ob.csv:
r += " <swe:values>%s</swe:values>" % ob.csv
values = ''
for row in ob.csv.split('@'):
val = row.split(',')
values += f' <swe:value dateTime="{val[0]}">{val[1]}</swe:value>\n'
r += " <swe:values>\n"
r += values
r += " </swe:values>\n"

elif len(ob.data) > 0:
data=[]
Expand Down
Loading