def query(self, job_uri): base_uri = "http://example.com/columns/{id}".format(id=self.uuid) uri = escape_helpers.sparql_escape_uri(base_uri) query_str = "INSERT DATA { \n" query_str += "\tGRAPH {app_uri} {{ \n".format( app_uri=escape_helpers.sparql_escape_uri( "http://mu.semte.ch/application")) query_str += "\t\t{uri} a ext:Column . \n".format(uri=uri) for attr, value in self.__dict__.items(): print(attr, value, type(value)) relation = get_relation(attr) if relation == 'ext:file' and value is not None: str = "\t\t{uri} {relation} {value} . \n".format( uri=uri, relation=relation, value=value) query_str += str else: query_str += str_query(uri, relation, value) query_str += "{job} ext:column {column} . ".format( job=escape_helpers.sparql_escape_uri(job_uri), column=uri) query_str += "\t}\n" query_str += "}\n" prefixes = "PREFIX ext: {uri}\n".format( uri=escape_helpers.sparql_escape_uri( "http://mu.semte.ch/vocabularies/ext/")) prefixes += "PREFIX mu: {uri}\n".format( uri=escape_helpers.sparql_escape_uri( "http://mu.semte.ch/vocabularies/core/")) query_str = prefixes + query_str return query_str
def __register_start_signing_flow(signflow_uri: str): timestamp = datetime.now() update_activities_command = __update_activities_template.substitute( graph=sparql_escape_uri(APPLICATION_GRAPH), signflow=sparql_escape_uri(signflow_uri), start_date=sparql_escape_datetime(timestamp)) update(update_activities_command)
def construct_insert_document(document_name, file_uri, graph=APPLICATION_GRAPH): document = {"name": document_name, "created": datetime.now(TIMEZONE)} document["uuid"] = generate_uuid() document["uri"] = DOCUMENT_BASE_URI + document["uuid"] query_template = Template(""" PREFIX dossier: <https://data.vlaanderen.be/ns/dossier#> PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX dct: <http://purl.org/dc/terms/> PREFIX nfo: <http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#> PREFIX ext: <http://mu.semte.ch/vocabularies/ext/> INSERT { GRAPH $graph { $document a dossier:Stuk ; mu:uuid $uuid ; dct:title $name ; dct:created $created ; ext:file $file . } } WHERE { GRAPH $graph { $file a nfo:FileDataObject . } } """) return query_template.substitute( graph=sparql_escape_uri(graph), document=sparql_escape_uri(document["uri"]), uuid=sparql_escape_string(document["uuid"]), name=sparql_escape_string(document["name"]), created=sparql_escape_datetime(document["created"]), file=sparql_escape_uri(file_uri))
def construct_attach_document_to_previous_version(doc_uri, prev_ver_doc_uri, graph=APPLICATION_GRAPH): """ Also handles attaching the new version to the previous one's case""" query_template = Template(""" PREFIX dossier: <https://data.vlaanderen.be/ns/dossier#> PREFIX pav: <http://purl.org/pav/> INSERT { GRAPH $graph { $doc pav:previousVersion $prev_doc . ?case dossier:Dossier.bestaatUit $doc . } } WHERE { GRAPH $graph { $doc a dossier:Stuk . $prev_doc a dossier:Stuk . OPTIONAL { ?case a dossier:Dossier ; dossier:Dossier.bestaatUit $prev_doc . } } } """) return query_template.substitute( graph=sparql_escape_uri(graph), doc=sparql_escape_uri(doc_uri), prev_doc=sparql_escape_uri(prev_ver_doc_uri))
def construct_get_file_for_document(document_uri, file_mimetype=None, graph=APPLICATION_GRAPH): if file_mimetype is not None: format_filter = "FILTER( CONTAINS( ?format, {} ) )".format( sparql_escape_string(file_mimetype)) else: format_filter = "" query_template = Template(""" PREFIX dossier: <https://data.vlaanderen.be/ns/dossier#> PREFIX nfo: <http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#> PREFIX dct: <http://purl.org/dc/terms/> PREFIX ext: <http://mu.semte.ch/vocabularies/ext/> SELECT (?file AS ?uri) WHERE { GRAPH $graph { $document a dossier:Stuk ; ext:file ?file . ?file a nfo:FileDataObject ; nfo:fileName ?name ; dct:format ?format . $format_filter } } LIMIT 1 """) return query_template.substitute(graph=sparql_escape_uri(graph), document=sparql_escape_uri(document_uri), format_filter=format_filter)
def construct_get_mandatee_by_email(mandatee_email, graph=APPLICATION_GRAPH): mail_uri = "mailto:{}".format(mandatee_email) maximal_end_date = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) # Today # Sometimes a mandatee needs to sign some last docs a couple of days after the end of the mandate maximal_end_date = maximal_end_date - timedelta(days=30) query_template = Template(""" PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#> SELECT ?mandatee WHERE { GRAPH $graph { ?mandatee a mandaat:Mandataris ; mandaat:isBestuurlijkeAliasVan ?person ; mandaat:einde ?end_date ; mandaat:start ?start_date . ?person foaf:mbox $mail_uri . FILTER(?start_date < NOW()) FILTER(?end_date > $end_date) } } ORDER BY DESC(?end_date) """) return query_template.substitute( graph=sparql_escape_uri(graph), mail_uri=sparql_escape_uri(mail_uri), end_date=sparql_escape_datetime(maximal_end_date))
def construct_get_signinghub_machine_user_session_query(): query_template = Template(""" PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX oauth-2.0: <http://kanselarij.vo.data.gift/vocabularies/oauth-2.0-session/> PREFIX ext: <http://mu.semte.ch/vocabularies/ext/> SELECT (?signinghubSession AS ?uri) ?expiryTime ?token WHERE { GRAPH $session_graph { ?signinghubSession a ext:SigninghubSudoSession . ?signinghubSession oauth-2.0:hasEndpointURI $signinghub_token_endpoint ; oauth-2.0:hasTokenValue ?tokenUri. ?tokenUri oauth-2.0:hasTokenValue ?token ; oauth-2.0:hasExpirytime ?expiryTime . BIND($now as ?now) FILTER (?now < ?expiryTime) } } ORDER BY DESC(?expiryTime) LIMIT 1 """) query_string = query_template.substitute( session_graph=sparql_escape_uri(SESSION_GRAPH), signinghub_token_endpoint=sparql_escape_uri(SIGNINGHUB_OAUTH_TOKEN_EP), now=sparql_escape_datetime(datetime.now(tz=TIMEZONE))) return query_string
def construct_get_signinghub_session_query(mu_session_uri): # TODO: Model connection betheen Signinghub Session and user/account (now "ext:shSessionAccount"). query_template = Template(""" PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX session: <http://mu.semte.ch/vocabularies/session/> PREFIX ext: <http://mu.semte.ch/vocabularies/ext/> PREFIX oauth-2.0: <http://kanselarij.vo.data.gift/vocabularies/oauth-2.0-session/> SELECT (?signinghubSession AS ?uri) ?expiryTime ?token WHERE { GRAPH $session_graph { $mu_session session:account ?account . ?signinghubSession ext:shSessionAccount ?account . ?signinghubSession oauth-2.0:hasEndpointURI $signinghub_token_endpoint ; oauth-2.0:hasTokenValue ?tokenUri. ?tokenUri oauth-2.0:hasTokenValue ?token ; oauth-2.0:hasExpirytime ?expiryTime . BIND($now as ?now) FILTER (?now < ?expiryTime) } } ORDER BY DESC(?expiryTime) LIMIT 1 """) query_string = query_template.substitute( session_graph=sparql_escape_uri(SESSION_GRAPH), mu_session=sparql_escape_uri(mu_session_uri), signinghub_token_endpoint=sparql_escape_uri(SIGNINGHUB_OAUTH_TOKEN_EP), now=sparql_escape_datetime(datetime.now(tz=TIMEZONE))) return query_string
def construct_insert_signinghub_session_query(signinghub_session, signinghub_session_uri): signinghub_token_uri = SIGNINGHUB_TOKEN_BASE_URI + generate_uuid() expiry_time = signinghub_session.last_successful_auth_time + signinghub_session.access_token_expiry_time query_template = Template(""" PREFIX dct: <http://purl.org/dc/terms/> PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX oauth-2.0: <http://kanselarij.vo.data.gift/vocabularies/oauth-2.0-session/> INSERT DATA { GRAPH $session_graph { $signinghub_session a oauth-2.0:OauthSession ; oauth-2.0:hasEndpointURI $signinghub_token_endpoint ; oauth-2.0:hasTokenValue $token_uri . $token_uri a oauth-2.0:BearerToken ; dct:created $creation_time ; oauth-2.0:hasTokenValue $token_value ; oauth-2.0:hasExpirytime $expiry_time . } }""") query_string = query_template.substitute( session_graph=sparql_escape_uri(SESSION_GRAPH), signinghub_session=sparql_escape_uri(signinghub_session_uri), signinghub_token_endpoint=sparql_escape_uri(SIGNINGHUB_OAUTH_TOKEN_EP), token_uri=sparql_escape_uri(signinghub_token_uri), creation_time=sparql_escape_datetime( signinghub_session.last_successful_auth_time.astimezone(TIMEZONE)), expiry_time=sparql_escape_datetime(expiry_time.astimezone(TIMEZONE)), token_value=sparql_escape_string(signinghub_session.access_token)) return query_string
def construct_get_file_query(file_uri, graph=APPLICATION_GRAPH): """ Construct a SPARQL query for querying a file. :param file_uri: string containing file uri :returns: string containing SPARQL query """ query_template = Template(""" PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX nfo: <http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#> PREFIX nie: <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#> PREFIX dbpedia: <http://dbpedia.org/ontology/> SELECT (?file_uri AS ?uri) ?uuid ?name ?size ?extension ?physicalFile WHERE { GRAPH $graph { $file_uri a nfo:FileDataObject ; mu:uuid ?uuid ; nfo:fileName ?name ; nfo:fileSize ?size ; dbpedia:fileExtension ?extension ; ^nie:dataSource ?physicalFile . BIND($file_uri AS ?file_uri) ?physicalFile a nfo:FileDataObject . } } """) return query_template.substitute(graph=sparql_escape_uri(graph), file_uri=sparql_escape_uri(file_uri))
def construct(signflow_uri: str) -> str: query_template = Template(""" PREFIX prov: <http://www.w3.org/ns/prov#> PREFIX dossier: <https://data.vlaanderen.be/ns/dossier#> PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#> PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX sign: <http://mu.semte.ch/vocabularies/ext/handtekenen/> PREFIX signinghub: <http://mu.semte.ch/vocabularies/ext/signinghub/> SELECT ?signing_activity ?start_date ?end_date ?signer ?signer_id WHERE { GRAPH $graph { ?signflow a sign:Handtekenaangelegenheid ; sign:doorlooptHandtekening ?sign_subcase . ?sign_subcase a sign:HandtekenProcedurestap ; ^sign:handtekeningVindtPlaatsTijdens ?signing_activity . ?signing_activity a sign:Handtekenactiviteit ; dossier:Activiteit.startdatum ?start_date ; dossier:Activiteit.einddatum ?end_date ; sign:ondertekenaar ?signer . ?signer a mandaat:Mandataris ; mu:uuid ?signer_id . } VALUES ?signflow { $signflow } } """) return query_template.substitute( graph=sparql_escape_uri(APPLICATION_GRAPH), signflow=sparql_escape_uri(signflow_uri))
def generate_integration_url(signinghub_session: SigningHubSession, signflow_uri: str, piece_uri: str, collapse_panels: bool): pieces = signing_flow.get_pieces(signflow_uri) piece = query_result_helpers.ensure_1(pieces) if piece["uri"] != piece_uri: raise exceptions.InvalidStateException( f"Piece <{piece_uri}> is not linked to signflow <{signflow_uri}>.") query_string = _query_signinghub_document.substitute( graph=sparql_escape_uri(APPLICATION_GRAPH), signflow=sparql_escape_uri(signflow_uri), piece=sparql_escape_uri(piece_uri)) signinghub_document_result = query(query_string) signinghub_documents = query_result_helpers.to_recs( signinghub_document_result) signinghub_document = signinghub_documents[0] signinghub_package_id = signinghub_document["signinghub_package_id"] integration_url = signinghub_session.get_integration_link( signinghub_package_id, { "language": "nl-NL", # "user_email": "*****@*****.**", # Know through SSO login? # "callback_url":"https://web.signinghub.com/", # default configured fir the app. "collapse_panels": "true" if collapse_panels else "false", # "usercertificate_id": "31585" # Undocumented }) return integration_url
def str_query(uri, relation, value): if value is not None: if isinstance(value, list): # Store lists as json string dumps value = json.dumps(value) if type(value).__module__ == np.__name__: # Convert the numpy value (e.g. int64) to a python value value = value.item() uri_relations = (get_relation("data_type")) escaped_value = "" if relation in uri_relations: escaped_value = escape_helpers.sparql_escape_uri(value) else: escaped_value = escape_helpers.sparql_escape(value) if isinstance(value, bool): # Fix for weird problem with booleans escaped_value = escaped_value.replace("False", "false") escaped_value = escaped_value.replace("True", "true") escaped_value = escaped_value.replace("^^xsd:boolean", "^^<http://mu.semte.ch/vocabularies/typed-literals/boolean>") return "\t\t{uri} {relation} {value} . \n".format(uri=uri, relation=relation, value=escaped_value) return ""
def get_physical_file(uri): """ Fetches the physical file on disk that belongs to a certain virtual file object (virtual files can link to files that are not in the database, but every file in the database has a virtual file object that acts as an identifier). """ # Get file based on ?file file_query = """ PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX nfo: <http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#> PREFIX dbpedia: <http://dbpedia.org/ontology/> PREFIX dct: <http://purl.org/dc/terms/> PREFIX nie: <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#> SELECT (?uuid as ?id) ?logical_file ?extension WHERE{{ GRAPH <http://mu.semte.ch/application>{{ {uri} a nfo:FileDataObject ; dbpedia:fileExtension ?extension; mu:uuid ?uuid . ?logical_file nie:dataSource {uri} . }} }} LIMIT 20 """.format(uri=escape_helpers.sparql_escape_uri(uri)) result = helpers.query(file_query) pprint(flask.jsonify(result)) logical_file = extract_from_query(result, "logical_file") extension = extract_from_query(result, "extension") return logical_file, extension
def construct_select_docs_query(batch_size, graph): with open('/usr/src/app/ext/app/queries/1-select-docs.sparql', 'r') as file: template = file.read() template = template.replace('# GRAPH_PLACEHOLDER', escape_helpers.sparql_escape_uri(graph)) template = template.replace('# LIMIT_PLACEHOLDER', str(batch_size)) return template
def construct_insert_file_query(file, physical_file, graph=APPLICATION_GRAPH): """ Construct a SPARQL query for inserting a file. :param file: dict containing properties for file :param share_uri: :returns: string containing SPARQL query """ query_template = Template(""" PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX nfo: <http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#> PREFIX nie: <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#> PREFIX dct: <http://purl.org/dc/terms/> PREFIX dbpedia: <http://dbpedia.org/ontology/> INSERT DATA { GRAPH $graph { $uri a nfo:FileDataObject ; mu:uuid $uuid ; nfo:fileName $name ; dct:format $mimetype ; dct:created $created ; nfo:fileSize $size ; dbpedia:fileExtension $extension . $physical_uri a nfo:FileDataObject ; mu:uuid $physical_uuid ; nfo:fileName $physical_name ; dct:format $mimetype ; dct:created $created ; nfo:fileSize $size ; dbpedia:fileExtension $extension ; nie:dataSource $uri . } } """) return query_template.substitute( graph=sparql_escape_uri(graph), uri=sparql_escape_uri(file["uri"]), uuid=sparql_escape_string(file["uuid"]), name=sparql_escape_string(file["name"]), mimetype=sparql_escape_string(file["mimetype"]), created=sparql_escape_datetime(file["created"]), size=sparql_escape_int(file["size"]), extension=sparql_escape_string(file["extension"]), physical_uri=sparql_escape_uri(physical_file["uri"]), physical_uuid=sparql_escape_string(physical_file["uuid"]), physical_name=sparql_escape_string(physical_file["name"]))
def run_batch(batch_size, graph): documents = list( map( lambda res: res['doc']['value'], list( helpers.query(construct_select_docs_query( batch_size, graph))['results']['bindings']))) res = helpers.query(construct_list_doc_versions_query( documents, graph))['results']['bindings'] res_by_doc = itertools.groupby(res, lambda res: res['doc']['value']) triples = [] for doc_uri, results in res_by_doc: results = list(results) for i in range(len(results)): res = results[i] try: title = res['stuknummerVR']['value'] except KeyError: title = res['title']['value'] versioned_title = title + LATIN_ADVERBIAL_NUMERALS[int( res['num']['value'])] triples.append(( escape_helpers.sparql_escape_uri(results[i]['ver']['value']), 'dct:title', escape_helpers.sparql_escape_string(versioned_title), )) if i > 0: triples.append(( escape_helpers.sparql_escape_uri( results[i]['ver']['value']), 'pav:previousVersion', escape_helpers.sparql_escape_uri( results[i - 1]['ver']['value']), )) if triples: query = construct_insert_triples(triples, graph) res = helpers.update(query) query = construct_migrate_docs(documents, graph) res = helpers.update(query) return documents
def construct_get_document_for_file(file_uri, graph=APPLICATION_GRAPH): query_template = Template(""" PREFIX dossier: <https://data.vlaanderen.be/ns/dossier#> PREFIX nfo: <http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#> PREFIX ext: <http://mu.semte.ch/vocabularies/ext/> SELECT (?document AS ?uri) WHERE { GRAPH $graph { ?document a dossier:Stuk ; ext:file $file . $file a nfo:FileDataObject . } } LIMIT 1 """) return query_template.substitute(graph=sparql_escape_uri(graph), file=sparql_escape_uri(file_uri))
def construct_migrate_docs(document_uris, graph): document_uris = '\n '.join( map(escape_helpers.sparql_escape_uri, document_uris)) with open('/usr/src/app/ext/app/queries/4-migrate-docs.sparql', 'r') as file: template = file.read() template = template.replace('# GRAPH_PLACEHOLDER', escape_helpers.sparql_escape_uri(graph)) template = template.replace('# DOC_URIS_PLACEHOLDER', document_uris) return template
def construct_get_mandatee(mandatee_uri, graph=APPLICATION_GRAPH): query_template = Template(""" PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#> SELECT ?email ?first_name ?family_name WHERE { GRAPH $graph { $mandatee a mandaat:Mandataris ; mandaat:isBestuurlijkeAliasVan ?person . OPTIONAL { ?person foaf:firstName ?first_name } OPTIONAL { ?person foaf:familyName ?family_name } OPTIONAL { ?person foaf:mbox ?mail_uri . BIND( REPLACE(STR(?mail_uri), "mailto:", "") AS ?email) } } } """) return query_template.substitute(graph=sparql_escape_uri(graph), mandatee=sparql_escape_uri(mandatee_uri))
def construct_attach_signinghub_session_to_mu_session_query( signinghub_session_uri, mu_session_uri): # TODO: Model connection betheen Signinghub Session and user/account (now "ext:shSessionAccount"). query_template = Template(""" PREFIX session: <http://mu.semte.ch/vocabularies/session/> PREFIX ext: <http://mu.semte.ch/vocabularies/ext/> INSERT { GRAPH $session_graph { $signinghub_session ext:shSessionAccount ?account . } } WHERE { GRAPH $session_graph { $mu_session session:account ?account . } }""") query_string = query_template.substitute( session_graph=sparql_escape_uri(SESSION_GRAPH), signinghub_session=sparql_escape_uri(signinghub_session_uri), mu_session=sparql_escape_uri(mu_session_uri)) return query_string
def construct(signflow_uri: str): query_template = Template(""" PREFIX prov: <http://www.w3.org/ns/prov#> PREFIX dossier: <https://data.vlaanderen.be/ns/dossier#> PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX sign: <http://mu.semte.ch/vocabularies/ext/handtekenen/> PREFIX signinghub: <http://mu.semte.ch/vocabularies/ext/signinghub/> SELECT ?piece ?piece_id ?sh_document_id WHERE { GRAPH $graph { ?signflow a sign:Handtekenaangelegenheid ; sign:doorlooptHandtekening ?sign_subcase . ?sign_subcase a sign:HandtekenProcedurestap . ?marking_activity a sign:Markeringsactiviteit ; sign:markeringVindtPlaatsTijdens ?sign_subcase ; sign:gemarkeerdStuk ?piece . ?piece a dossier:Stuk ; mu:uuid ?piece_id . OPTIONAL { ?preparation_activity a sign:Voorbereidingsactiviteit ; sign:voorbereidingVindtPlaatsTijdens ?sign_subcase ; sign:voorbereidingGenereert ?signinghub_doc . ?signinghub_doc a signinghub:Document ; prov:hadPrimarySource ?piece ; signinghub:documentId ?sh_document_id . } } VALUES ?signflow { $signflow } } """) return query_template.substitute( graph=sparql_escape_uri(APPLICATION_GRAPH), signflow=sparql_escape_uri(signflow_uri) )
def construct_get_mu_session_query(mu_session_uri): query_template = Template(""" PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX session: <http://mu.semte.ch/vocabularies/session/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?uuid ?email WHERE { GRAPH $session_graph { $mu_session mu:uuid ?uuid ; session:account ?account . } GRAPH $account_graph { ?person foaf:account ?account ; foaf:mbox ?email_uri . BIND(REPLACE(STR(?email_uri), "^mailto:", "") AS ?email) } }""") query_string = query_template.substitute( session_graph=sparql_escape_uri(SESSION_GRAPH), account_graph=sparql_escape_uri(ACCOUNT_GRAPH), mu_session=sparql_escape_uri(mu_session_uri)) return query_string
def construct_mark_signinghub_session_as_machine_users_query( signinghub_session_uri): # TODO: this is a hacky way of marking the machine user session. # Should think about way to model the service as an agent (with a mu session?) query_template = Template(""" PREFIX ext: <http://mu.semte.ch/vocabularies/ext/> PREFIX oauth-2.0: <http://kanselarij.vo.data.gift/vocabularies/oauth-2.0-session/> INSERT { GRAPH $session_graph { $signinghub_session a ext:SigninghubSudoSession . } } WHERE { GRAPH $session_graph { $signinghub_session a oauth-2.0:OauthSession . } } """) query_string = query_template.substitute( session_graph=sparql_escape_uri(SESSION_GRAPH), signinghub_session=sparql_escape_uri(signinghub_session_uri), now=sparql_escape_datetime(datetime.now(tz=TIMEZONE))) return query_string
def construct_get_mandatee_by_id(mandatee_id, graph=APPLICATION_GRAPH): query_template = Template(""" PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#> PREFIX mu: <http://mu.semte.ch/vocabularies/core/> SELECT DISTINCT (?mandatee as ?uri) WHERE { GRAPH $graph { ?mandatee a mandaat:Mandataris ; mu:uuid $uuid . } } """) return query_template.substitute(graph=sparql_escape_uri(graph), uuid=sparql_escape_string(mandatee_id))
def construct_get_file_by_id(file_id, graph=APPLICATION_GRAPH): query_template = Template(""" PREFIX mu: <http://mu.semte.ch/vocabularies/core/> PREFIX nfo: <http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#> SELECT (?file AS ?uri) WHERE { GRAPH $graph { ?file a nfo:FileDataObject ; mu:uuid $uuid . } } LIMIT 1 """) return query_template.substitute(graph=sparql_escape_uri(graph), uuid=sparql_escape_string(file_id))
def construct_get_document_by_uuid(document_uuid, graph=APPLICATION_GRAPH): query_template = Template(""" PREFIX dossier: <https://data.vlaanderen.be/ns/dossier#> PREFIX mu: <http://mu.semte.ch/vocabularies/core/> SELECT (?document AS ?uri) WHERE { GRAPH $graph { ?document a dossier:Stuk ; mu:uuid $uuid . } } LIMIT 1 """) return query_template.substitute(graph=sparql_escape_uri(graph), uuid=sparql_escape_string(document_uuid))
def construct_insert_triples(triples, graph): query = """ PREFIX pav: <http://purl.org/pav/> PREFIX dct: <http://purl.org/dc/terms/> INSERT DATA { GRAPH # GRAPH_PLACEHOLDER { """ query = query.replace('# GRAPH_PLACEHOLDER', escape_helpers.sparql_escape_uri(graph)) for s, p, o in triples: query += " {} {} {} .\n".format(s, p, o) query += """ } } """ return query
def assign_signers(signinghub_session: SigningHubSession, signflow_uri: str, signer_uris: typing.List[str]): #TODO: validation: ensure signflow is in draft mandatees_query_command = _query_mandatees_template.substitute( graph=sparql_escape_uri(APPLICATION_GRAPH), mandatees=query_result_helpers.sparql_escape_list( [sparql_escape_uri(uri) for uri in signer_uris])) mandatee_result = query(mandatees_query_command) mandatee_records = query_result_helpers.to_recs(mandatee_result) mandatee_records_set = {r["mandatee"] for r in mandatee_records} mandatees_not_found = [ uri for uri in signer_uris if uri not in mandatee_records_set ] if mandatees_not_found: raise exceptions.ResourceNotFoundException( ','.join(mandatees_not_found)) signflow_record = signing_flow.get_signing_flow(signflow_uri) sh_package_id = signflow_record["sh_package_id"] sh_users = [{ "user_email": r["email"], "user_name": ' '.join( [name for name in [r["first_name"], r["family_name"]] if name]), "role": "SIGNER" } for r in mandatee_records] signinghub_session.add_users_to_workflow(sh_package_id, sh_users) signing_activities = [ _build_signing_activity(signer_uri) for signer_uri in signer_uris ] signing_activities_escaped = query_result_helpers.sparql_escape_table([[ sparql_escape_uri(r["uri"]), sparql_escape_string(r["id"]), sparql_escape_uri(r["mandatee_uri"]) ] for r in signing_activities]) assign_signers_command = _assign_signers_template.substitute( graph=sparql_escape_uri(APPLICATION_GRAPH), signflow=sparql_escape_uri(signflow_uri), signing_activities=signing_activities_escaped) update(assign_signers_command) return signing_activities
def str_query(uri, relation, value): if value is not None: uri_relations = ("ext:unitUri") escaped_value = "" if relation in uri_relations: escaped_value = escape_helpers.sparql_escape_uri(value) else: escaped_value = escape_helpers.sparql_escape(value) if isinstance(value, bool): # Fix for weird problem with booleans escaped_value = escaped_value.replace("False", "false") escaped_value = escaped_value.replace("True", "true") escaped_value = escaped_value.replace( "^^xsd:boolean", "^^<http://mu.semte.ch/vocabularies/typed-literals/boolean>") return "\t\t{uri} {relation} {value} . \n".format(uri=uri, relation=relation, value=escaped_value) return ""