Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
self.context = context
self.filter = repo_filter
self.fts = False
self.label = 'HHypermap'
self.local_ingest = True
self.dbtype = settings.DATABASES['default']['ENGINE'].split('.')[-1]
# HHypermap PostgreSQL installs are PostGIS enabled
if self.dbtype == 'postgis':
self.dbtype = 'postgresql+postgis+wkt'
if self.dbtype in ['sqlite', 'sqlite3']: # load SQLite query bindings
connection.connection.create_function('query_spatial', 4, util.query_spatial)
connection.connection.create_function('get_anytext', 1, util.get_anytext)
connection.connection.create_function('get_geometry_area', 1, util.get_geometry_area)
# generate core queryables db and obj bindings
self.queryables = {}
for tname in self.context.model['typenames']:
for qname in self.context.model['typenames'][tname]['queryables']:
self.queryables[qname] = {}
items = self.context.model['typenames'][tname]['queryables'][qname].items()
for qkey, qvalue in items:
self.queryables[qname][qkey] = qvalue
# flatten all queryables
# TODO smarter way of doing this
self.queryables['_all'] = {}
if hhclass == 'Layer':
# TODO: better way of figuring out duplicates
match = Layer.objects.filter(name=source.name, title=source.title, abstract=source.abstract, is_monitored=False)
matches = match.all()
if matches:
if mode == 'insert':
raise RuntimeError('HHypermap error: Layer %d \'%s\' already exists' % (matches[0].id, source.title))
elif mode == 'update':
match.update(
name=source.name,
title=source.title,
abstract=source.abstract,
is_monitored=False,
xml=source.xml,
wkt_geometry=source.wkt_geometry,
anytext=util.get_anytext([source.title, source.abstract, source.keywords_csv])
)
res, keywords = create_layer_from_metadata_xml(resourcetype, source.xml, monitor=False)
else:
if resourcetype == 'http://www.opengis.net/cat/csw/2.0.2':
res = Endpoint(url=source)
else:
res = Service(type=HYPERMAP_SERVICE_TYPES[resourcetype], url=source)
if self.filter is not None:
res.catalog = Catalog.objects.get(id=int(self.filter.split()[-1]))
res.save()
if keywords:
for kw in keywords:
res.keywords.add(kw)
except Exception as err:
md = GM03(exml)
if hasattr(md.data, 'core'):
data = md.data.core
elif hasattr(md.data, 'comprehensive'):
data = md.data.comprehensive
language = data.metadata.language
_set(context, recobj, 'pycsw:Identifier', data.metadata.file_identifier)
_set(context, recobj, 'pycsw:Typename', 'gm03:TRANSFER')
_set(context, recobj, 'pycsw:Schema', context.namespaces['gm03'])
_set(context, recobj, 'pycsw:MdSource', 'local')
_set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
_set(context, recobj, 'pycsw:XML', md.xml)
_set(context, recobj, 'pycsw:AnyText', util.get_anytext(exml))
_set(context, recobj, 'pycsw:Language', data.metadata.language)
_set(context, recobj, 'pycsw:Type', data.metadata.hierarchy_level[0])
_set(context, recobj, 'pycsw:Date', data.metadata.date_stamp)
for dt in data.date:
if dt.date_type == 'modified':
_set(context, recobj, 'pycsw:Modified', dt.date)
elif dt.date_type == 'creation':
_set(context, recobj, 'pycsw:CreationDate', dt.date)
elif dt.date_type == 'publication':
_set(context, recobj, 'pycsw:PublicationDate', dt.date)
elif dt.date_type == 'revision':
_set(context, recobj, 'pycsw:RevisionDate', dt.date)
if hasattr(data, 'metadata_point_of_contact'):
_set(context, recobj, 'pycsw:ResponsiblePartyRole', data.metadata_point_of_contact.role)
_set(context, recobj, 'pycsw:Identifier', identifier2)
_set(context, recobj, 'pycsw:Typename', 'csw:Record')
_set(context, recobj, 'pycsw:Schema', 'http://www.opengis.net/wms')
_set(context, recobj, 'pycsw:MdSource', record)
_set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
_set(context, recobj, 'pycsw:Type', 'dataset')
_set(context, recobj, 'pycsw:ParentIdentifier', identifier)
_set(context, recobj, 'pycsw:Title', md.contents[layer].title)
_set(context, recobj, 'pycsw:Abstract', md.contents[layer].abstract)
_set(context, recobj, 'pycsw:Keywords', ','.join(md.contents[layer].keywords))
_set(
context,
recobj,
'pycsw:AnyText',
util.get_anytext([
md.contents[layer].title,
md.contents[layer].abstract,
','.join(md.contents[layer].keywords)
])
)
bbox = md.contents[layer].boundingBoxWGS84
if bbox is not None:
tmp = '%s,%s,%s,%s' % (bbox[0], bbox[1], bbox[2], bbox[3])
_set(context, recobj, 'pycsw:BoundingBox', util.bbox2wktpolygon(tmp))
_set(context, recobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:4326')
_set(context, recobj, 'pycsw:DistanceUOM', 'degrees')
else:
bbox = md.contents[layer].boundingBox
if bbox:
tmp = '%s,%s,%s,%s' % (bbox[0], bbox[1], bbox[2], bbox[3])
abstract=source.abstract,
is_monitored=False)
matches = match.all()
if matches:
if mode == 'insert':
raise RuntimeError('HHypermap error: Layer %d \'%s\' already exists' % (
matches[0].id, source.title))
elif mode == 'update':
match.update(
name=source.name,
title=source.title,
abstract=source.abstract,
is_monitored=False,
xml=source.xml,
wkt_geometry=source.wkt_geometry,
anytext=util.get_anytext([source.title, source.abstract, source.keywords_csv])
)
service = get_service(source.xml)
res, keywords = create_layer_from_metadata_xml(resourcetype, source.xml,
monitor=False, service=service,
catalog=catalog)
res.save()
LOGGER.debug('Indexing layer with id %s on search engine' % res.uuid)
index_layer(res.id, use_cache=True)
else:
if resourcetype == 'http://www.opengis.net/cat/csw/2.0.2':
res = Endpoint(url=source, catalog=catalog)
else:
recobjs = []
serviceobj = repos.dataset()
md = WebProcessingService(record)
# generate record of service instance
_set(context, serviceobj, 'pycsw:Identifier', identifier)
_set(context, serviceobj, 'pycsw:Typename', 'csw:Record')
_set(context, serviceobj, 'pycsw:Schema', 'http://www.opengis.net/wps/1.0.0')
_set(context, serviceobj, 'pycsw:MdSource', record)
_set(context, serviceobj, 'pycsw:InsertDate', util.get_today_and_now())
_set(
context,
serviceobj,
'pycsw:AnyText',
util.get_anytext(md._capabilities)
)
_set(context, serviceobj, 'pycsw:Type', 'service')
_set(context, serviceobj, 'pycsw:Title', md.identification.title)
_set(context, serviceobj, 'pycsw:Abstract', md.identification.abstract)
_set(context, serviceobj, 'pycsw:Keywords', ','.join(md.identification.keywords))
_set(context, serviceobj, 'pycsw:Creator', md.provider.contact.name)
_set(context, serviceobj, 'pycsw:Publisher', md.provider.name)
_set(context, serviceobj, 'pycsw:Contributor', md.provider.contact.name)
_set(context, serviceobj, 'pycsw:OrganizationName', md.provider.contact.name)
_set(context, serviceobj, 'pycsw:AccessConstraints', md.identification.accessconstraints)
_set(context, serviceobj, 'pycsw:OtherConstraints', md.identification.fees)
_set(context, serviceobj, 'pycsw:Source', record)
_set(context, serviceobj, 'pycsw:Format', md.identification.type)
_set(context, serviceobj, 'pycsw:ServiceType', 'OGC:WPS')
_set(context, serviceobj, 'pycsw:ServiceTypeVersion', md.identification.version)
recobjs = []
serviceobj = repos.dataset()
md = WebCoverageService(record, '1.0.0')
# generate record of service instance
_set(context, serviceobj, 'pycsw:Identifier', identifier)
_set(context, serviceobj, 'pycsw:Typename', 'csw:Record')
_set(context, serviceobj, 'pycsw:Schema', 'http://www.opengis.net/wcs')
_set(context, serviceobj, 'pycsw:MdSource', record)
_set(context, serviceobj, 'pycsw:InsertDate', util.get_today_and_now())
_set(
context,
serviceobj,
'pycsw:AnyText',
util.get_anytext(etree.tostring(md._capabilities))
)
_set(context, serviceobj, 'pycsw:Type', 'service')
_set(context, serviceobj, 'pycsw:Title', md.identification.title)
_set(context, serviceobj, 'pycsw:Abstract', md.identification.abstract)
_set(context, serviceobj, 'pycsw:Keywords', ','.join(md.identification.keywords))
_set(context, serviceobj, 'pycsw:Creator', md.provider.contact.name)
_set(context, serviceobj, 'pycsw:Publisher', md.provider.name)
_set(context, serviceobj, 'pycsw:Contributor', md.provider.contact.name)
_set(context, serviceobj, 'pycsw:OrganizationName', md.provider.contact.name)
_set(context, serviceobj, 'pycsw:AccessConstraints', md.identification.accessConstraints)
_set(context, serviceobj, 'pycsw:OtherConstraints', md.identification.fees)
_set(context, serviceobj, 'pycsw:Source', record)
_set(context, serviceobj, 'pycsw:Format', md.identification.type)
_set(context, serviceobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:4326')
_set(context, serviceobj, 'pycsw:DistanceUOM', 'degrees')
_set(context, serviceobj, 'pycsw:ServiceType', 'OGC:WCS')
identifier2 = '%s-%s' % (identifier, process.identifier)
_set(context, recobj, 'pycsw:Identifier', identifier2)
_set(context, recobj, 'pycsw:Typename', 'csw:Record')
_set(context, recobj, 'pycsw:Schema', 'http://www.opengis.net/wps/1.0.0')
_set(context, recobj, 'pycsw:MdSource', record)
_set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
_set(context, recobj, 'pycsw:Type', 'software')
_set(context, recobj, 'pycsw:ParentIdentifier', identifier)
_set(context, recobj, 'pycsw:Title', process.title)
_set(context, recobj, 'pycsw:Abstract', process.abstract)
_set(
context,
recobj,
'pycsw:AnyText',
util.get_anytext([process.title, process.abstract])
)
params = {
'service': 'WPS',
'version': '1.0.0',
'request': 'DescribeProcess',
'identifier': process.identifier
}
links.append(
'%s,OGC-WPS DescribeProcess service (ver 1.0.0),OGC:WPS-1.0.0-http-describe-process,%s' % (identifier, build_get_url(md.url, {'service': 'WPS', 'version': '1.0.0', 'request': 'DescribeProcess', 'identifier': process.identifier})))
_set(context, recobj, 'pycsw:Links', '^'.join(links))
_set(context, recobj, 'pycsw:XML', caps2iso(recobj, md, context))
recobjs.append(recobj)
_set(context, recobj, 'pycsw:Identifier', identifier2)
_set(context, recobj, 'pycsw:Typename', 'csw:Record')
_set(context, recobj, 'pycsw:Schema', 'http://www.opengis.net/wcs')
_set(context, recobj, 'pycsw:MdSource', record)
_set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
_set(context, recobj, 'pycsw:Type', 'dataset')
_set(context, recobj, 'pycsw:ParentIdentifier', identifier)
_set(context, recobj, 'pycsw:Title', md.contents[coverage].title)
_set(context, recobj, 'pycsw:Abstract', md.contents[coverage].abstract)
_set(context, recobj, 'pycsw:Keywords', ','.join(md.contents[coverage].keywords))
_set(
context,
recobj,
'pycsw:AnyText',
util.get_anytext([
md.contents[coverage].title,
md.contents[coverage].abstract,
','.join(md.contents[coverage].keywords)
])
)
bbox = md.contents[coverage].boundingBoxWGS84
if bbox is not None:
tmp = '%s,%s,%s,%s' % (bbox[0], bbox[1], bbox[2], bbox[3])
wkt_polygon = util.bbox2wktpolygon(tmp)
_set(context, recobj, 'pycsw:BoundingBox', wkt_polygon)
_set(context, recobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:4326')
_set(context, recobj, 'pycsw:DistanceUOM', 'degrees')
bboxs.append(wkt_polygon)
links = [
identifier2 = '%s-%s' % (identifier, process.identifier)
_set(context, recobj, 'pycsw:Identifier', identifier2)
_set(context, recobj, 'pycsw:Typename', 'csw:Record')
_set(context, recobj, 'pycsw:Schema', 'http://www.opengis.net/wps/1.0.0')
_set(context, recobj, 'pycsw:MdSource', record)
_set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
_set(context, recobj, 'pycsw:Type', 'software')
_set(context, recobj, 'pycsw:ParentIdentifier', identifier)
_set(context, recobj, 'pycsw:Title', process.title)
_set(context, recobj, 'pycsw:Abstract', process.abstract)
_set(
context,
recobj,
'pycsw:AnyText',
util.get_anytext([process.title, process.abstract])
)
params = {
'service': 'WPS',
'version': '1.0.0',
'request': 'DescribeProcess',
'identifier': process.identifier
}
links.append(
'%s,OGC-WPS DescribeProcess service (ver 1.0.0),OGC:WPS-1.0.0-http-describe-process,%s' % (identifier, build_get_url(md.url, {'service': 'WPS', 'version': '1.0.0', 'request': 'DescribeProcess', 'identifier': process.identifier})))
_set(context, recobj, 'pycsw:Links', '^'.join(links))
_set(context, recobj, 'pycsw:XML', caps2iso(recobj, md, context))
recobjs.append(recobj)