Source code for gavo.registry.identifiers
"""
Parsing identifiers, getting res tuples and resobs from them.
The DC-internal identifiers are, by default, formed as
ivo://<authority-from-config>/<sourceRD path>/<id within path>.
Thus, all renderers of a given service have the same ivo-id, which is
to say, they are all just capabilities on the same record.
"""
#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.
import re
from gavo import base
from gavo.registry import common
from gavo.registry import nonservice
from gavo.registry import servicelist
[docs]def computeIdentifierFromRestup(restup):
"""returns an identifier from a res tuple.
"""
return restup["ivoid"]
_idPattern = re.compile("ivo://(\w[^!;:@%$,/]+)(/[^?#]*)?")
[docs]def parseIdentifier(identifier):
"""returns a pair of authority, resource key for identifier.
Identifier has to be an ivo URI.
In the context of the DaCHS, the resource key either starts with
static/ or consists of an RD id and a service ID.
"""
mat = _idPattern.match(identifier)
if not mat:
raise common.IdDoesNotExist(identifier)
return mat.group(1), (mat.group(2) or "")[1:]
[docs]def getRestupFromIdentifier(identifier):
"""returns the record for identifier in the services table.
"""
matches = servicelist.queryServicesList(
"ivoid=%(identifier)s",
locals(), tableName="resources")
if len(matches)!=1:
raise common.IdDoesNotExist(identifier)
return matches[0]
[docs]def getResobFromRestup(restup):
"""returns a resob for a res tuple.
restup at least has to contain the sourceRD and resId fields.
The item that is being returned is either a service or a
NonServiceResource (including DeletedResource). All of these have
a getMeta method and should be able to return the standard DC
metadata.
"""
if restup["deleted"]:
return base.makeStruct(nonservice.DeletedResource,
resTuple=restup)
sourceRD, resId = restup["sourceRD"], restup["resId"]
try:
return base.caches.getRD(sourceRD).getById(resId)
except KeyError:
raise base.ui.logOldExc(base.NotFoundError(resId, what="service",
within="RD %s"%sourceRD, hint="This usually happens when you"
" forgot to run gavopublish %s"%sourceRD))
[docs]def getResobFromIdentifier(identifier):
"""returns a resob for an identifier.
"""
return getResobFromRestup(getRestupFromIdentifier(identifier))