"""
TODO: explain
"""
from rdflib import URIRef, Graph
from oldman.vocabulary import HYDRA_MEMBER_IRI
from oldman.utils.crud import extract_subjects, create_regular_resources, create_blank_nodes
from oldman.exception import OMBadRequestException
[docs]class Operation(object):
""" TODO: describe """
def __init__(self, http_method, excepted_type, returned_type, function, name):
self._http_method = http_method
self._excepted_type = excepted_type
self._returned_type = returned_type
self._function = function
self._name = name
@property
[docs] def name(self):
return self._name
@property
[docs] def expected_type(self):
return self._excepted_type
@property
[docs] def returned_type(self):
return self._returned_type
def __call__(self, resource, **kwargs):
return self._function(resource, **kwargs)
# ---------------------------------
# Pre-defined operation functions
# ---------------------------------
[docs]def append_to_hydra_collection(collection_resource, new_resources=None, graph=None, **kwargs):
"""TODO: improve the mechanism of operation """
if new_resources is not None and graph is not None:
# TODO: throw the right exception
raise Exception("Cannot add new_resources and graphs in the same time")
elif new_resources is not None:
return _append_resources_to_hydra_collection(collection_resource, new_resources)
else:
return _append_to_hydra_coll_from_graph(collection_resource, graph)
def _append_to_hydra_coll_from_graph(collection_resource, graph):
collection_iri = collection_resource.id
resource_manager = collection_resource.model_manager.resource_manager
# Extracts and classifies subjects
bnode_subjects, other_subjects = extract_subjects(graph)
# Blank nodes (may obtain a regular IRI)
new_resources = create_blank_nodes(resource_manager, graph, bnode_subjects, collection_iri=collection_iri)
# Objects with an existing IRI
# TODO: ask if it should be accepted
reg_resources, _ = create_regular_resources(resource_manager, graph, other_subjects, collection_iri=collection_iri)
new_resources += reg_resources
return _append_resources_to_hydra_collection(collection_resource, new_resources)
def _append_resources_to_hydra_collection(collection_resource, new_resources):
# Check that they are valid
for new_resource in new_resources:
if not new_resource.is_valid():
# TODO: find a better exception
raise OMBadRequestException("One resource is not valid")
collection_graph = Graph().parse(data=collection_resource.to_rdf(rdf_format="nt"), format="nt")
for new_resource in new_resources:
new_resource.save()
collection_graph.add((URIRef(collection_resource.id), URIRef(HYDRA_MEMBER_IRI), URIRef(new_resource.id)))
collection_resource.update_from_graph(collection_graph)
[docs]def append_to_hydra_paged_collection(collection, graph=None, new_resources=None, **kwargs):
raise NotImplementedError("TODO: implement me!")
[docs]def not_implemented(resource, **kwargs):
# TODO: find a better error
raise NotImplementedError("This method is declared but not implemented.")