Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[quest][wip] stateless metadata rendering #790

Draft
wants to merge 2 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions api/pls_render_metadata/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from django.urls import path

from . import views


urlpatterns = [
path('pls-render-metadata', views.pls_render_metadata),
]
54 changes: 54 additions & 0 deletions api/pls_render_metadata/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
"""pls-render-metadata: an amnesiac metadata renderer

a django view that takes a POST request with a raw metadata record in the request body

sidenote: using the pls ("please") prefix to mean we (the server) are:
- acting at explicit request of someone else
- aiming to help
- behaving politely/discreetly (will forget all data/metadata)

"""

import json

from django.http import HttpResponse

from share.util.extensions import Extensions
from share.regulate import Regulator


def pls_render_metadata(request):
if request.method != 'POST':
return HttpResponse(
status=405,
headers={'Allow': 'POST'},
content='only POST!'
)

transformer_key = request.GET.get('transformer', 'v2_push')
normal_graph = pls_normalize(request.body, transformer_key)
requested_formats = request.GET.getlist('formats')
formatted_records = [
pls_render(normal_graph, format_key)
for format_key in requested_formats
]
return HttpResponse(
content=json.dumps(formatted_records),
)


def pls_normalize(raw_datum, transformer_key):
transformer = Extensions.get('share.transformers', transformer_key)()
graph = transformer.transform(raw_datum)
Regulator().regulate(graph) # in-place


def pls_render(graph, record_formats):
formatters = [
Extensions.get('share.metadata_formats', record_format)()
for record_format in record_formats
]
return [
formatter.format_from_graph(graph)
for formatter in formatters
]
2 changes: 2 additions & 0 deletions api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
url('^', include('api.suids.urls')),
url('^', include('api.users.urls')),

url('^', include('api.pls_render_metadata.urls')),

url('^schemas?/', include('api.schemas.urls'), name='schema'),
url('^search/', include('api.search.urls'), name='search'),

Expand Down
267 changes: 0 additions & 267 deletions share/ingest/change_builder.py

This file was deleted.

9 changes: 8 additions & 1 deletion share/metadata_formats/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,18 @@

from share.models.core import NormalizedData
from share.models.ingest import SourceUniqueIdentifier
from share.util.graph import MutableGraph


class MetadataFormatter(ABC):
@abstractmethod
def format(self, normalized_data: NormalizedData) -> Optional[str]:
"""return a string representation of the given metadata in the formatter's format
"""
mgraph = MutableGraph.from_jsonld(normalized_data.data)
return self.format_from_graph(mgraph)

@abstractmethod
def format_from_graph(self, normalized_data: NormalizedData) -> Optional[str]:
"""return a string representation of the given metadata in the formatter's format
"""
raise NotImplementedError
Expand Down
3 changes: 3 additions & 0 deletions share/metadata_formats/oai_dc.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ class OaiDcFormatter(MetadataFormatter):

def format(self, normalized_datum):
mgraph = MutableGraph.from_jsonld(normalized_datum.data)
return self.format_from_graph(mgraph)

def format_from_graph(self, mgraph):
central_work = mgraph.get_central_node(guess=True)

if (
Expand Down
4 changes: 4 additions & 0 deletions share/metadata_formats/sharev2_elastic.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ def format_as_deleted(self, suid):
'is_deleted': True,
})

def format_from_graph(self, mgraph):
# HACK because sharev2_elastic is dumb
raise NotImplementedError('sharev2_elastic formatter depends on a NormalizedData')

def format(self, normalized_datum):
mgraph = MutableGraph.from_jsonld(normalized_datum.data)
central_work = mgraph.get_central_node(guess=True)
Expand Down
2 changes: 1 addition & 1 deletion share/transform/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

class BaseTransformer(metaclass=abc.ABCMeta):

def __init__(self, source_config):
def __init__(self, source_config=None):
self.config = source_config

@abc.abstractmethod
Expand Down
2 changes: 1 addition & 1 deletion share/transform/chain/links.py
Original file line number Diff line number Diff line change
Expand Up @@ -1029,7 +1029,7 @@ def execute(self, obj):
break

if not final[0]:
if self._urn_fallback:
if self._urn_fallback and getattr(Context(), '_config', None):
urn = self.FALLBACK_FORMAT.format(source=Context()._config.label, id=urllib.parse.quote(obj))
return URNLink().execute(urn)
else:
Expand Down
Loading