diff --git a/prez/config.py b/prez/config.py index d848fa8..af7a662 100755 --- a/prez/config.py +++ b/prez/config.py @@ -84,6 +84,7 @@ class Settings(BaseSettings): configuration_mode: bool = False temporal_predicate: Optional[URIRef] = SDO.temporal endpoint_to_template_query_filename: Optional[Dict[str, str]] = {} + prez_ui_url: Optional[str] = None @field_validator("prez_version") @classmethod diff --git a/prez/services/link_generation.py b/prez/services/link_generation.py index 1cd0b34..75ffcd4 100755 --- a/prez/services/link_generation.py +++ b/prez/services/link_generation.py @@ -25,13 +25,14 @@ log = logging.getLogger(__name__) -async def add_prez_links(graph: Graph, repo: Repo, endpoint_structure): +async def add_prez_links(graph: Graph, repo: Repo, endpoint_structure, uris: list[URIRef] | None = None): """ Adds internal links to the given graph for all URIRefs that have a class and endpoint associated with them. """ t_start = time.time() # get all URIRefs - if Prez can find a class and endpoint for them, an internal link will be generated. - uris = [uri for uri in graph.all_nodes() if isinstance(uri, URIRef)] + if uris is None: + uris = [uri for uri in graph.all_nodes() if isinstance(uri, URIRef)] uri_to_klasses = {} t = time.time() # for uri in uris: diff --git a/prez/services/objects.py b/prez/services/objects.py index 4fc835c..c92ccf1 100755 --- a/prez/services/objects.py +++ b/prez/services/objects.py @@ -1,10 +1,12 @@ import io import json import logging +import re import time +import urllib.parse from urllib.parse import urlencode -from fastapi.responses import PlainTextResponse +from fastapi.responses import PlainTextResponse, RedirectResponse from rdf2geojson import convert from rdflib import RDF, URIRef, RDFS from rdflib.namespace import GEO @@ -89,6 +91,17 @@ async def object_function( query_start_time = time.time() item_graph, _ = await data_repo.send_queries([query], []) log.debug(f"Query time: {time.time() - query_start_time}") + if settings.prez_ui_url: + # If HTML or no specific media type requested + if pmts.requested_mediatypes[0][0] in ('text/html', '*/*'): + item_uri = URIRef(profile_nodeshape.focus_node.value) + await add_prez_links(item_graph, data_repo, endpoint_structure, [item_uri]) + prez_link = item_graph.value(subject=item_uri, predicate=URIRef("https://prez.dev/link"), any=True) + prez_ui_url = re.sub(r'/+$', '', settings.prez_ui_url) + if prez_link: + return RedirectResponse(prez_ui_url + str(prez_link)) + else: + return RedirectResponse(prez_ui_url + '/404?uri=' + urllib.parse.quote_plus(item_uri)) if "anot+" in pmts.selected["mediatype"]: await add_prez_links(item_graph, data_repo, endpoint_structure) return await return_from_graph(