def project_canvases(request, project_uri, canvas_uri): if request.method == 'GET': return NegotiatedGraphResponse( request, read_canvas(request, project_uri, canvas_uri)) elif request.method == 'PUT': input_graph = parse_request_into_graph(request) return NegotiatedGraphResponse( request, update_canvas(project_uri, canvas_uri, input_graph)) else: return HttpResponseNotAllowed(('GET', 'PUT'))
def post(self, request, project_uri): project_uri = URIRef(project_uri) project_graph = get_project_graph(project_uri) project_metadata_graph = get_project_metadata_graph(project_uri) canvas_graph = Graph() image_file = request.FILES['image_file'] title = request.POST.get('title', '') uri = uris.uuid() if hasattr(settings, 'MAX_IMAGE_UPLOAD_FILE_SIZE' ) and image_file.size > settings.MAX_IMAGE_UPLOAD_FILE_SIZE: return HttpResponse(status=406) if not image_file.content_type.startswith('image/'): return HttpResponse(status=406) uploaded = UploadedImage.objects.create(imagefile=image_file, owner=request.user) create_canvas_from_upload(canvas_graph, uploaded, uri, request.user, title) # Make the canvas a top level project resource canvas_graph.add((project_uri, NS.ore.aggregates, uri)) project_graph += canvas_graph project_metadata_graph += canvas_graph canvas_graph += metadata_triples(project_metadata_graph, project_uri) canvas_graph += project_metadata_graph.triples( (project_uri, NS.ore.aggregates, None)) return NegotiatedGraphResponse(request, canvas_graph)
def remove_project_canvas_triples(request, project_uri, canvas_uri): if request.method == 'PUT': return NegotiatedGraphResponse( request, remove_canvas_triples(project_uri, canvas_uri, input_graph)) else: return HttpResponseNotAllowed(('PUT'))
def delete_triples_from_project(request, uri): """Deletes the triples in a graph provided by a request object from the project graph. Returns an HttpResponse of all the triples which were successfully removed from the graph.""" if request.user.is_authenticated(): if permissions.has_permission_over(uri, user=request.user, permission=NS.perm.mayUpdate): removed = Graph() bind_namespaces(removed) try: logger.debug('!!!!!!!!!!!!!!! project_texts.py - delete_triples_from_project') g = parse_request_into_graph(request) except (ParserError, SyntaxError) as e: return HttpResponse(status=400, content="Unable to parse serialization.\n%s" % e) project_g = get_project_graph(uri) project_metadata_g = get_project_metadata_graph(uri) for t in g: if t in project_g: project_g.remove(t) removed.add(t) project_metadata_g.remove(t) return NegotiatedGraphResponse(request, removed) else: return HttpResponseForbidden('User "%s" does not have update permissions over project "%s"' % (request.user.username, uri)) else: return HttpResponse(status=401)
def read_project(request, project_uri): """Returns a HttpResponse of the cached project metadata graph""" project_uri = URIRef(project_uri) if request.user.is_authenticated(): if permissions.has_permission_over(project_uri, user=request.user, permission=NS.perm.mayRead): identifier = uris.uri('semantic_store_projects', uri=project_uri) store_metadata_graph = get_project_metadata_graph(project_uri) ret_graph = Graph() ret_graph += store_metadata_graph add_is_described_bys(request, project_uri, ret_graph) for permission in ProjectPermission.objects.filter(identifier=project_uri): user = permission.user user_uri = uris.uri('semantic_store_users', username=user.username) perm_uri = permissions.PERMISSION_URIS_BY_MODEL_VALUE[permission.permission] ret_graph += user_metadata_graph(user=user) ret_graph.add((user_uri, NS.perm.hasPermissionOver, project_uri)) ret_graph.add((user_uri, perm_uri, project_uri)) if len(ret_graph) > 0: return NegotiatedGraphResponse(request, ret_graph) else: return HttpResponseNotFound() else: return HttpResponseForbidden('User "%s" does not have read permissions over project "%s"' % (request.user.username, project_uri)) else: return HttpResponse(status=401)
def get(self, request, project_uri, manuscript_uri=None): project_uri = URIRef(project_uri) project_graph = get_project_graph(project_uri) if manuscript_uri: manuscript_uri = URIRef(manuscript_uri) return NegotiatedGraphResponse( request, self.manuscript_graph(manuscript_uri, project_uri)) else: graph = Graph() for manuscript in project_graph.subjects(NS.rdf.type, NS.sc.Manifest): graph += self.manuscript_graph(manuscript, project_uri) return NegotiatedGraphResponse(request, graph)
def specific_resource_graph(request, project_uri, specific_resource, source): if request.method == 'GET': return NegotiatedGraphResponse( request, read_specific_resource(project_uri, specific_resource, source)) elif request.method == 'PUT': g = parse_request_into_graph(request) update_specific_resource(g, URIRef(project_uri), URIRef(specific_resource))
def get(self, request, project_uri, canvas_uri, transcription_uri): project_uri = URIRef(project_uri) canvas_uri = URIRef(canvas_uri) if transcription_uri: transcription_uri = URIRef(transcription_uri) project_graph = get_project_graph(project_uri) return NegotiatedGraphResponse( request, resource_annotation_subgraph(project_graph, transcription_uri))
def resources(request, uri, ext=None): if request.user.is_authenticated(): perms = ProjectPermission.objects.filter(user=request.user) else: perms = [] uri = uri.rstrip('/') store_g = Graph(store=rdfstore(), identifier=URIRef(uri)) g = Graph() g += store_g if len(g) > 0: for i in perms: anno_uri = settings.URI_MINT_BASE \ + "/projects/" + i.identifier \ + "/resources/" + uri \ + "/annotations/" anno_url = reverse('semantic_store_project_annotations', kwargs={'project_uri': i.identifier}) \ + "?uri=" + uri g.add((URIRef(uri), NS.ore['aggregates'], URIRef(anno_uri))) g.add( (URIRef(anno_uri), NS.ore['isDescribedBy'], URIRef(anno_url))) g.add((URIRef(anno_uri), NS.rdf['type'], NS.ore['Aggregation'])) g.add((URIRef(anno_uri), NS.rdf['type'], NS.rdf['List'])) g.add((URIRef(anno_uri), NS.rdf['type'], NS.dms['AnnotationList'])) return NegotiatedGraphResponse(request, g) else: main_graph_store = ConjunctiveGraph(store=rdfstore(), identifier=default_identifier) main_graph = Graph() main_graph += main_graph_store g = Graph() bind_namespaces(g) for t in main_graph.triples((URIRef(uri), None, None)): g.add(t) if len(g) > 0: return NegotiatedGraphResponse(request, g) else: return HttpResponseNotFound()
def project_texts(request, project_uri, text_uri): if request.method == 'POST': return create_project_text_from_request(request, project_uri) elif request.method == 'GET': g = read_project_text(project_uri, text_uri) return NegotiatedGraphResponse(request, g) elif request.method == 'PUT': return update_project_text_from_request(request, project_uri, text_uri) elif request.method == 'DELETE': remove_project_text(project_uri, text_uri) return HttpResponse(status=204) else: return HttpResponseNotAllowed(['POST', 'PUT', 'DELETE', 'GET'])
def create_project_text_from_request(request, project_uri): if request.user.is_authenticated(): if has_permission_over(project_uri, user=request.user, permission=NS.perm.mayUpdate): try: g = parse_request_into_graph(request) except (ParserError, SyntaxError) as e: return HttpResponse(status=400, content="Unable to parse serialization.\n%s" % e) else: text_uri = URIRef(uris.uuid()) update_project_text(g, project_uri, text_uri, request.user) return NegotiatedGraphResponse(request, read_project_text(project_uri, text_uri)) else: return HttpResponseForbidden() else: return HttpResponse(status=401)
def create_project_text_from_request(request, project_uri, request_text_uri): if request.user.is_authenticated(): if has_permission_over(project_uri, user=request.user, permission=NS.perm.mayUpdate): try: logger.debug( '!!!!!!!!!!!!!!! project_texts.py - create_project_text_from_request' ) g = parse_request_into_graph(request) except (ParserError, SyntaxError) as e: logger.debug( '!!!!!!!!!!!!!!! project_texts.py - create_project_text_from_request - EXCEPTION !!!!!!!!' ) return HttpResponse( status=400, content="Unable to parse serialization.\n%s" % e) else: logger.debug( '!!!!!!!!!!!!!!! project_texts.py - create_project_text_from_request - ELSE !!!!!!!!' ) text_uri = URIRef(uris.uuid()) logger.debug("uris.uuid(): %s", uris.uuid()) logger.debug("text_uri: %s", text_uri) logger.debug( '!!!!!!!!!!!!!!! project_texts.py - create_project_text_from_request - CREATING TEXT... !!!!!!!!' ) update_project_text(g, project_uri, text_uri, request.user) logger.debug( '!!!!!!!!!!!!!!! project_texts.py - create_project_text_from_request - CREATING TEXT COMPLETE !!!!!!!!' ) logger.debug( '!!!!!!!!!!!!!!! project_texts.py - create_project_text_from_request - UPDATING... !!!!!!!!' ) update_project_text(g, project_uri, request_text_uri, request.user) logger.debug( '!!!!!!!!!!!!!!! project_texts.py - create_project_text_from_request - UPDATING COMPLETE !!!!!!!!' ) return NegotiatedGraphResponse( request, read_project_text(project_uri, text_uri)) else: return HttpResponseForbidden() else: return HttpResponse(status=401)
def create_or_update_annotations(request, dest_graph_uri=None, anno_uri=None): dest_g = destination_graph(dest_graph_uri) annotations_g = graph() try: parse_request_into_graph(request, annotations_g) except (ParserError, SyntaxError) as e: return HttpResponse(status=400, content="Unable to parse serialization.\n%s" % e) anno_uris = annotation_uris(annotations_g) if not anno_uris: return HttpResponse(status=400, content="No %s nodes found." % URIRef(NS.oa['Annotation'])) if not valid_annotations(dest_g, annotations_g, anno_uris): return HttpResponse(status=400, content=validator.failure) with transaction.commit_on_success(): for i in anno_uris: stored_g = update_annotation(request, dest_g, annotations_g, i) return NegotiatedGraphResponse(request, stored_g, status=201)
def get_annotations(request, graph_uri, anno_uris=None): if anno_uris is None: anno_uris = [] result_g = graph() g = destination_graph(graph_uri) num_anno_uris = len(anno_uris) if num_anno_uris > 1: agg_bnode = BNode() for i in anno_uris: anno_g = annotation_graph(g, URIRef(i)) if len(list(anno_g)) > 0: result_g.add((agg_bnode, NS.ore['aggregates'], URIRef(i))) for t in anno_g: result_g.add(t) elif num_anno_uris == 1: anno_g = annotation_graph(g, URIRef(anno_uris[0])) for t in anno_g: result_g.add(t) else: subjects = g.subjects(NS.rdf['type'], NS.oa['Annotation']) agg_bnode = BNode() for i in subjects: result_g.add((agg_bnode, NS.ore['aggregates'], URIRef(i))) result_g.add((URIRef(i), NS.rdf['type'], NS.oa['Annotation'])) url = reverse('semantic_store_project_annotations', kwargs={ 'project_uri': graph_uri, 'anno_uri': i }) url = "http://dm.drew.edu" + url result_g.add((URIRef(i), NS.ore['isDescribedBy'], URIRef(url))) if len(result_g) > 0: return NegotiatedGraphResponse(request, result_g, status=200) else: return HttpResponse(status=204) # Not really a 404, just no content