Source code for gavo.registry.nonservice
"""
Resources that are not services.
"""
#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 rscdef
from gavo import svcs
from gavo.base import meta
[docs]class NonServiceResource(
base.Structure,
base.StandardMacroMixin,
base.ComputedMetaMixin):
"""A base class for resources that are not services.
"""
def _meta_identifier(self):
# Special case the authority
if base.getMetaText(self, "resType")=="authority":
localPart = ""
else:
localPart = "/%s/%s"%(self.rd.sourceId, self.id)
return "ivo://%s%s"%(base.getConfig("ivoa", "authority"), localPart)
[docs]class ResRec(rscdef.IVOMetaMixin, NonServiceResource):
"""A resource for pure registration purposes.
A Resource without DaCHS defined behaviour. This can be
Organizations or Instruments, but possibly also external services
All resources must either have an id (which is used in the construction of
their IVOID), or you must give an identifier meta item.
You must further set the following meta items:
- resType specifying the kind of resource record. You should not
use this element to build resource records for services or tables
(use the normal elements, even if the actual resources are external
to DaCHS). resType can be registry, organization, authority,
deleted, or anything else for which registry.builders has a
handling class.
- title
- subject(s)
- description
- referenceURL
- creationDate
Additional meta keys (e.g., accessURL for a registry) may be required
depending on resType. See the registry section in the operator's guide.
ResRecs can also have publication children. These will be turned into
the appropriate capabilities depending on the value of the render
attribute.
"""
name_ = "resRec"
_rd = rscdef.RDAttribute()
_publications = base.StructListAttribute("publications",
childFactory=svcs.Publication,
description="Capabilities the record should have (this is empty"
" for standards, organisations, instruments, etc.)")
[docs] def onElementComplete(self):
super().onElementComplete()
self.setMetaParent(self.rd)
[docs] def getPublicationsForSet(self, names):
"""returns publications for set names in names.
names must be a python set.
"""
for pub in self.publications:
if pub.sets&names:
yield pub
[docs] def getTableSet(self):
for relatedTable in self.iterMeta("tableset"):
yield base.resolveCrossId(relatedTable.getContent("text"))
def _meta_sets(self):
# This is a copy of the corresponding code in svcs.Service.
# See there for more info.
sets = set()
for p in self.publications:
sets |= p.sets
return meta.MetaItem.fromSequence(
[meta.MetaValue(s) for s in sets])
class _FakeRD(object):
def __init__(self, id):
self.sourceId = id
[docs]class DeletedResource(NonServiceResource):
"""a remainder of a deleted resource. These are always built from information
in the database, since that is the only place they are remembered.
"""
resType = "deleted"
_resTuple = base.RawAttribute("resTuple")
def _meta_status(self):
return "deleted"
def _meta_identifier(self):
return self.resTuple["ivoid"]
[docs] def completeElement(self, ctx):
super().completeElement(ctx)
self.rd = _FakeRD(self.resTuple["sourceRD"])
self.id = self.resTuple["resId"]
self.setMeta("_metadataUpdated", self.resTuple["recTimestamp"])