Source code for gavo.registry.servicelist
"""
The (DC-internal) service list: querying, adding records, etc.
"""
#c Copyright 2008-2023, the GAVO project <gavo@ari.uni-heidelberg.de>
#c
#c This program is free software, covered by the GNU GPL. See the
#c COPYING file in the source distribution.
from gavo import base
from gavo import utils
from gavo import rsc
from gavo.protocols import vocabularies
from gavo.registry import common
[docs]def getSetsForResource(restup):
"""returns the list of set names the resource described by restup
belongs to.
"""
with base.getTableConn() as conn:
return [str(r[0]) for r in
conn.query("SELECT DISTINCT setName FROM dc.sets WHERE"
" sourceRD=%(sourceRD)s AND resId=%(resId)s AND NOT deleted",
restup)]
[docs]def getSets():
"""returns a sequence of dicts giving setName and and a list of
services belonging to that set.
"""
tableDef = common.getServicesRD().getById("sets")
setMembers = {}
for rec in tableDef.doSimpleQuery():
setMembers.setdefault(rec["setName"], []).append(
(rec["sourceRD"], rec["resId"]))
return [{"setName": key, "services": value}
for key, value in setMembers.items()]
[docs]def queryServicesList(whereClause="", pars={}, tableName="resources_join"):
"""returns a list of services based on selection criteria in
whereClause.
The table queried is the resources_join view, and you'll get back all
fields defined there.
"""
td = common.getServicesRD().getById(tableName)
return td.doSimpleQuery(fragments=whereClause, params=pars)
[docs]def querySubjectsList(setName=None):
"""returns a list of local services chunked by subjects.
This is mainly for the root page (see web.root). Query the
cache using the __system__/services key to clear the cache on services.
Note that this will translate known UAT terms to their labels.
"""
try:
uat = vocabularies.get_vocabulary("uat")
except base.ReportableError as msg:
# fetching the vocabulary somehow failed; don't stop operations
# just because of that.
base.ui.notifyWarning("Tried to get UAT but failed: %s. Trugding on."%
msg)
uat = {"terms": {}}
setName = setName or 'local'
svcsForSubjs = {}
td = common.getServicesRD().getById("subjects_join")
for row in td.doSimpleQuery(
fragments="setName=%(setName)s AND subject IS NOT NULL",
params={"setName": setName}):
svcsForSubjs.setdefault(row["subject"], []).append(row)
for s in list(svcsForSubjs.values()):
s.sort(key=lambda a: a["title"])
res = [{"subject": vocabularies.get_label(uat, subject), "chunk": s}
for subject, s in svcsForSubjs.items()]
res.sort(key=lambda i: i["subject"])
return res
[docs]def getChunkedServiceList(setName=None):
"""returns a list of local services chunked by title char.
This is mainly for the root page (see web.root). Query the
cache using the __system__/services key to clear the cache on services
reload.
"""
setName = setName or 'local'
return utils.chunk(
sorted(queryServicesList("setName=%(setName)s and not deleted",
{"setName": setName}),
key=lambda s: s.get("title").lower()),
lambda srec: srec.get("title", ".")[0].upper())
[docs]def cleanServiceTablesFor(rd, connection):
"""removes/invalidates all entries originating from rd from the service
tables.
"""
# this is a bit of a hack: We're running services#tables' newSource
# skript without then importing anything new.
tables = rsc.Data.create(
common.getServicesRD().getById("tables"),
connection=connection)
tables.runScripts("newSource", sourceToken=rd)
[docs]def basename(tableName):
if "." in tableName:
return tableName.split(".")[-1]
else:
return tableName
[docs]def getTableDef(tableName):
"""returns a tableDef instance for the schema-qualified tableName.
If no such table is known to the system, a NotFoundError is raised.
"""
with base.getTableConn() as conn:
res = list(conn.query("SELECT tableName, sourceRD FROM dc.tablemeta WHERE"
" LOWER(tableName)=LOWER(%(tableName)s)", {"tableName": tableName}))
if len(res)!=1:
raise base.NotFoundError(tableName, what="table",
within="DaCHS' table listing.", hint="The table is missing from"
" the dc.tablemeta table. This gets filled at gavoimp time.")
tableName, rdId = res[0]
return base.caches.getRD(rdId).getById(basename(tableName))