def manage_parents(request, conceptid): if request.method == 'POST': json = request.body if json != None: data = JSONDeserializer().deserialize(json) with transaction.atomic(): if len(data['deleted']) > 0: concept = Concept().get(id=conceptid, include=None) for deleted in data['deleted']: concept.addparent(deleted) concept.delete() concept.bulk_index() if len(data['added']) > 0: concept = Concept().get(id=conceptid) for added in data['added']: concept.addparent(added) concept.save() concept.bulk_index() return JSONResponse(data) else: return HttpResponseNotAllowed(['POST']) return HttpResponseNotFound()
def test_create_concept(self): """ Test of basic CRUD on a Concept model """ concept_in = Concept() concept_in.nodetype = 'Concept' concept_in.values = [ConceptValue({ #id: '', #conceptid: '', 'type': 'prefLabel', 'category': 'label', 'value': 'test pref label', 'language': 'en-US' })] concept_in.save() concept_out = Concept().get(id=concept_in.id) self.assertEqual(concept_out.id, concept_in.id) self.assertEqual(concept_out.values[0].value, 'test pref label') label = concept_in.values[0] label.value = 'updated pref label' concept_in.values[0] = label concept_in.save() concept_out = Concept().get(id=concept_in.id) self.assertEqual(concept_out.values[0].value, 'updated pref label') concept_out.delete(delete_self=True) with self.assertRaises(models.Concept.DoesNotExist): deleted_concept = Concept().get(id=concept_out.id)
def manage_parents(request, conceptid): # need to check user credentials here if request.method == 'POST': json = request.body if json != None: data = JSONDeserializer().deserialize(json) with transaction.atomic(): if len(data['deleted']) > 0: concept = Concept({'id': conceptid}) for deleted in data['deleted']: concept.addparent(deleted) concept.delete() if len(data['added']) > 0: concept = Concept({'id': conceptid}) for added in data['added']: concept.addparent(added) concept.save() return JSONResponse(data) else: return HttpResponseNotAllowed(['POST']) return HttpResponseNotFound()
def manage_parents(request, conceptid): # need to check user credentials here if request.method == "POST": json = request.body if json != None: data = JSONDeserializer().deserialize(json) with transaction.atomic(): if len(data["deleted"]) > 0: concept = Concept({"id": conceptid}) for deleted in data["deleted"]: concept.addparent(deleted) concept.delete() if len(data["added"]) > 0: concept = Concept({"id": conceptid}) for added in data["added"]: concept.addparent(added) concept.save() return JSONResponse(data) else: return HttpResponseNotAllowed(["POST"]) return HttpResponseNotFound()
def remove_entitytypes_and_concepts(all_entitytypeids_to_remove, only_entitytypes=False): # if the entity_types are no longer associated to any resource graph, then delete the entity_types themselves and then proceed with pruning concepts if not isinstance(all_entitytypeids_to_remove, list): all_entitytypeids_to_remove = [all_entitytypeids_to_remove] for entity_to_remove in all_entitytypeids_to_remove: still_linked = False if not models.Mappings.objects.filter( entitytypeidto=entity_to_remove) else True if not still_linked: entity_types = models.EntityTypes.objects.filter( entitytypeid=entity_to_remove) #### Prune the concepts concepts_to_delete = [] for entity_type in entity_types: # Find the root concept concept = entity_type.conceptid # only add this for deletion if the concept isn't used by any other entitytypes relations = models.EntityTypes.objects.filter( conceptid=concept.pk) if len(relations) <= 1: concepts_to_delete.append(entity_type.conceptid) else: logging.warning( "Concept type for entity in use (perhaps because this node was mapped to a new one). Not deleting. %s", entity_type) # delete the entity types, and then their concepts entity_types.delete() for concept_model in concepts_to_delete: # remove it and all of its relations and their values logging.warning( "Removing concept and children/values/relationships for %s", concept_model.legacyoid) concept = Concept() concept.get(concept_model.pk, semantic=False, include_subconcepts=False) concept.delete(delete_self=True)
def test_create_concept(self): """ Test of basic CRUD on a Concept model """ concept_in = Concept() concept_in.nodetype = "Concept" concept_in.values = [ ConceptValue( { # id: '', # conceptid: '', "type": "prefLabel", "category": "label", "value": "test pref label", "language": "en-US", } ) ] concept_in.save() concept_out = Concept().get(id=concept_in.id) self.assertEqual(concept_out.id, concept_in.id) self.assertEqual(concept_out.values[0].value, "test pref label") label = concept_in.values[0] label.value = "updated pref label" concept_in.values[0] = label concept_in.save() concept_out = Concept().get(id=concept_in.id) self.assertEqual(concept_out.values[0].value, "updated pref label") concept_out.delete(delete_self=True) with self.assertRaises(models.Concept.DoesNotExist): deleted_concept = Concept().get(id=concept_out.id)
def remove_concept_list(concepts): with open(concepts, 'rb') as csvfile: try: dialect = csv.Sniffer().sniff(csvfile.read(1024)) csvfile.seek(0) except csv.Error: print "The source data is not a CSV file" concept_list = csv.reader(csvfile, delimiter=',') print "There are", sum( 1 for line in open(concepts)), " concepts that will be deleted" concepts_to_delete = [] for c in concept_list: relations = models.EntityTypes.objects.filter(conceptid=c[0]) if len(relations) <= 1: concepts_to_delete.append(c[0]) else: logging.warning( "Concept type for entity in use (perhaps because this node was mapped to a new one). Not deleting. %s", c[0]) for concept_model in concepts_to_delete: # remove it and all of its relations and their values logging.warning( "Removing concept and children/values/relationships for %s", concept_model) concept = Concept() try: concept.get(concept_model, semantic=False, include_subconcepts=True) concept.delete(delete_self=True) concept_model.delete() except: print "Conceptid %s does not exist" % concept_model
def concept(request, conceptid): f = request.GET.get('f', 'json') mode = request.GET.get('mode', '') lang = request.GET.get('lang', settings.LANGUAGE_CODE) pretty = request.GET.get('pretty', False) if request.method == 'GET': include_subconcepts = request.GET.get('include_subconcepts', 'true') == 'true' include_parentconcepts = request.GET.get('include_parentconcepts', 'true') == 'true' include_relatedconcepts = request.GET.get('include_relatedconcepts', 'true') == 'true' emulate_elastic_search = request.GET.get('emulate_elastic_search', 'false') == 'true' depth_limit = request.GET.get('depth_limit', None) if f == 'html': depth_limit = 1 if not conceptid: return render_to_response( 'views/rdm/concept-report.htm', { 'lang': lang, 'concept_count': models.Concepts.objects.filter( nodetype='Concept').count(), 'collection_count': models.Concepts.objects.filter( nodetype='Collection').count(), 'scheme_count': models.Concepts.objects.filter( nodetype='ConceptScheme').count(), 'entitytype_count': models.Concepts.objects.filter( nodetype='EntityType').count(), 'default_report': True }, context_instance=RequestContext(request)) ret = [] labels = [] this_concept = Concept().get(id=conceptid) if f == 'html': if mode == '' and (this_concept.nodetype == 'Concept' or this_concept.nodetype == 'ConceptScheme' or this_concept.nodetype == 'EntityType'): concept_graph = Concept().get( id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang) else: concept_graph = Concept().get( id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang, semantic=False) languages = models.DLanguages.objects.all() valuetypes = models.ValueTypes.objects.all() relationtypes = models.DRelationtypes.objects.all() prefLabel = concept_graph.get_preflabel(lang=lang) for subconcept in concept_graph.subconcepts: subconcept.prefLabel = subconcept.get_preflabel(lang=lang) for relatedconcept in concept_graph.relatedconcepts: relatedconcept.prefLabel = relatedconcept.get_preflabel( lang=lang) for value in concept_graph.values: if value.category == 'label': labels.append(value) if mode == '' and (this_concept.nodetype == 'Concept' or this_concept.nodetype == 'ConceptScheme' or this_concept.nodetype == 'EntityType'): if concept_graph.nodetype == 'ConceptScheme': parent_relations = relationtypes.filter( category='Properties') else: parent_relations = relationtypes.filter( category='Semantic Relations').exclude( relationtype='related').exclude( relationtype='broader').exclude( relationtype='broaderTransitive') return render_to_response( 'views/rdm/concept-report.htm', { 'lang': lang, 'prefLabel': prefLabel, 'labels': labels, 'concept': concept_graph, 'languages': languages, 'sparql_providers': sparql_providers, 'valuetype_labels': valuetypes.filter(category='label'), 'valuetype_notes': valuetypes.filter(category='note'), 'valuetype_related_values': valuetypes.filter(category='undefined'), 'parent_relations': parent_relations, 'related_relations': relationtypes.filter( Q(category='Mapping Properties') | Q(relationtype='related')), 'concept_paths': concept_graph.get_paths(lang=lang), 'graph_json': JSONSerializer().serialize( concept_graph.get_node_and_links(lang=lang)), 'direct_parents': [ parent.get_preflabel(lang=lang) for parent in concept_graph.parentconcepts ] }, context_instance=RequestContext(request)) else: return render_to_response( 'views/rdm/entitytype-report.htm', { 'lang': lang, 'prefLabel': prefLabel, 'labels': labels, 'concept': concept_graph, 'languages': languages, 'valuetype_labels': valuetypes.filter(category='label'), 'valuetype_notes': valuetypes.filter(category='note'), 'valuetype_related_values': valuetypes.filter(category='undefined'), 'related_relations': relationtypes.filter(relationtype='member'), 'concept_paths': concept_graph.get_paths(lang=lang) }, context_instance=RequestContext(request)) concept_graph = Concept().get( id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang) if f == 'skos': include_parentconcepts = False include_subconcepts = True depth_limit = None skos = SKOSWriter() return HttpResponse(skos.write(concept_graph, format="pretty-xml"), content_type="application/xml") if emulate_elastic_search: ret.append({'_type': id, '_source': concept_graph}) else: ret.append(concept_graph) if emulate_elastic_search: ret = {'hits': {'hits': ret}} return JSONResponse(ret, indent=4 if pretty else None) if request.method == 'POST': if len(request.FILES) > 0: skosfile = request.FILES.get('skosfile', None) imagefile = request.FILES.get('file', None) if imagefile: value = models.FileValues(valueid=str(uuid.uuid4()), value=request.FILES.get( 'file', None), conceptid_id=conceptid, valuetype_id='image', languageid_id=settings.LANGUAGE_CODE) value.save() return JSONResponse(value) elif skosfile: skos = SKOSReader() rdf = skos.read_file(skosfile) ret = skos.save_concepts_from_skos(rdf) return JSONResponse(ret) else: data = JSONDeserializer().deserialize(request.body) if data: with transaction.atomic(): concept = Concept(data) concept.save() concept.index() return JSONResponse(concept) if request.method == 'DELETE': data = JSONDeserializer().deserialize(request.body) if data: with transaction.atomic(): concept = Concept(data) delete_self = data[ 'delete_self'] if 'delete_self' in data else False if not (delete_self and concept.id in CORE_CONCEPTS): in_use = False if delete_self: check_concept = Concept().get(data['id'], include_subconcepts=True) in_use = check_concept.check_if_concept_in_use() if 'subconcepts' in data: for subconcept in data['subconcepts']: if in_use == False: check_concept = Concept().get( subconcept['id'], include_subconcepts=True) in_use = check_concept.check_if_concept_in_use( ) if in_use == False: concept.delete_index(delete_self=delete_self) concept.delete(delete_self=delete_self) else: return JSONResponse({"in_use": in_use}) return JSONResponse(concept) return HttpResponseNotFound
def concept(request, conceptid): f = request.GET.get("f", "json") mode = request.GET.get("mode", "") lang = request.GET.get("lang", settings.LANGUAGE_CODE) pretty = request.GET.get("pretty", False) if request.method == "GET": include_subconcepts = request.GET.get("include_subconcepts", "true") == "true" include_parentconcepts = request.GET.get("include_parentconcepts", "true") == "true" include_relatedconcepts = request.GET.get("include_relatedconcepts", "true") == "true" emulate_elastic_search = request.GET.get("emulate_elastic_search", "false") == "true" depth_limit = request.GET.get("depth_limit", None) if f == "html": depth_limit = 1 if not conceptid: return render_to_response( "views/rdm/concept-report.htm", { "lang": lang, "concept_count": models.Concepts.objects.filter(nodetype="Concept").count(), "collection_count": models.Concepts.objects.filter(nodetype="Collection").count(), "scheme_count": models.Concepts.objects.filter(nodetype="ConceptScheme").count(), "entitytype_count": models.Concepts.objects.filter(nodetype="EntityType").count(), "default_report": True, }, context_instance=RequestContext(request), ) ret = [] labels = [] this_concept = Concept().get(id=conceptid) if f == "html": if mode == "" and ( this_concept.nodetype == "Concept" or this_concept.nodetype == "ConceptScheme" or this_concept.nodetype == "EntityType" ): concept_graph = Concept().get( id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang, ) else: concept_graph = Concept().get( id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang, semantic=False, ) languages = models.DLanguages.objects.all() valuetypes = models.ValueTypes.objects.all() relationtypes = models.DRelationtypes.objects.all() prefLabel = concept_graph.get_preflabel(lang=lang) for subconcept in concept_graph.subconcepts: subconcept.prefLabel = subconcept.get_preflabel(lang=lang) for relatedconcept in concept_graph.relatedconcepts: relatedconcept.prefLabel = relatedconcept.get_preflabel(lang=lang) for value in concept_graph.values: if value.category == "label": labels.append(value) if mode == "" and ( this_concept.nodetype == "Concept" or this_concept.nodetype == "ConceptScheme" or this_concept.nodetype == "EntityType" ): if concept_graph.nodetype == "ConceptScheme": parent_relations = relationtypes.filter(category="Properties") else: parent_relations = ( relationtypes.filter(category="Semantic Relations") .exclude(relationtype="related") .exclude(relationtype="broader") .exclude(relationtype="broaderTransitive") ) return render_to_response( "views/rdm/concept-report.htm", { "lang": lang, "prefLabel": prefLabel, "labels": labels, "concept": concept_graph, "languages": languages, "sparql_providers": get_sparql_providers(), "valuetype_labels": valuetypes.filter(category="label"), "valuetype_notes": valuetypes.filter(category="note"), "valuetype_related_values": valuetypes.filter(category="undefined"), "parent_relations": parent_relations, "related_relations": relationtypes.filter( Q(category="Mapping Properties") | Q(relationtype="related") ), "concept_paths": concept_graph.get_paths(lang=lang), "graph_json": JSONSerializer().serialize(concept_graph.get_node_and_links(lang=lang)), "direct_parents": [parent.get_preflabel(lang=lang) for parent in concept_graph.parentconcepts], }, context_instance=RequestContext(request), ) else: return render_to_response( "views/rdm/entitytype-report.htm", { "lang": lang, "prefLabel": prefLabel, "labels": labels, "concept": concept_graph, "languages": languages, "valuetype_labels": valuetypes.filter(category="label"), "valuetype_notes": valuetypes.filter(category="note"), "valuetype_related_values": valuetypes.filter(category="undefined"), "related_relations": relationtypes.filter(relationtype="member"), "concept_paths": concept_graph.get_paths(lang=lang), }, context_instance=RequestContext(request), ) concept_graph = Concept().get( id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang, ) if f == "skos": include_parentconcepts = False include_subconcepts = True depth_limit = None skos = SKOSWriter() return HttpResponse(skos.write(concept_graph, format="pretty-xml"), content_type="application/xml") if emulate_elastic_search: ret.append({"_type": id, "_source": concept_graph}) else: ret.append(concept_graph) if emulate_elastic_search: ret = {"hits": {"hits": ret}} return JSONResponse(ret, indent=4 if pretty else None) if request.method == "POST": if len(request.FILES) > 0: skosfile = request.FILES.get("skosfile", None) imagefile = request.FILES.get("file", None) if imagefile: value = models.FileValues( valueid=str(uuid.uuid4()), value=request.FILES.get("file", None), conceptid_id=conceptid, valuetype_id="image", languageid_id=settings.LANGUAGE_CODE, ) value.save() return JSONResponse(value) elif skosfile: skos = SKOSReader() rdf = skos.read_file(skosfile) ret = skos.save_concepts_from_skos(rdf) return JSONResponse(ret) else: data = JSONDeserializer().deserialize(request.body) if data: with transaction.atomic(): concept = Concept(data) concept.save() concept.index() return JSONResponse(concept) if request.method == "DELETE": data = JSONDeserializer().deserialize(request.body) if data: with transaction.atomic(): concept = Concept(data) delete_self = data["delete_self"] if "delete_self" in data else False if not (delete_self and concept.id in CORE_CONCEPTS): in_use = False if delete_self: check_concept = Concept().get(data["id"], include_subconcepts=True) in_use = check_concept.check_if_concept_in_use() if "subconcepts" in data: for subconcept in data["subconcepts"]: if in_use == False: check_concept = Concept().get(subconcept["id"], include_subconcepts=True) in_use = check_concept.check_if_concept_in_use() if in_use == False: concept.delete_index(delete_self=delete_self) concept.delete(delete_self=delete_self) else: return JSONResponse({"in_use": in_use}) return JSONResponse(concept) return HttpResponseNotFound
def concept(request, conceptid): f = request.GET.get('f', 'json') mode = request.GET.get('mode', '') lang = request.GET.get('lang', settings.LANGUAGE_CODE) pretty = request.GET.get('pretty', False) if request.method == 'GET': include_subconcepts = request.GET.get('include_subconcepts', 'true') == 'true' include_parentconcepts = request.GET.get('include_parentconcepts', 'true') == 'true' include_relatedconcepts = request.GET.get('include_relatedconcepts', 'true') == 'true' emulate_elastic_search = request.GET.get('emulate_elastic_search', 'false') == 'true' depth_limit = request.GET.get('depth_limit', None) depth_limit = 1 if not conceptid: return render(request, 'views/rdm/concept-report.htm', { 'lang': lang, 'concept_count': models.Concept.objects.filter(nodetype='Concept').count(), 'collection_count': models.Concept.objects.filter(nodetype='Collection').count(), 'scheme_count': models.Concept.objects.filter(nodetype='ConceptScheme').count(), 'entitytype_count': models.Concept.objects.filter(nodetype='EntityType').count(), 'default_report': True }) labels = [] concept_graph = Concept().get(id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang, semantic=(mode == 'semantic' or mode == '')) languages = sort_languages(models.DLanguage.objects.all(), lang) valuetypes = models.DValueType.objects.all() relationtypes = models.DRelationType.objects.all() prefLabel = concept_graph.get_preflabel(lang=lang) for subconcept in concept_graph.subconcepts: subconcept.prefLabel = subconcept.get_preflabel(lang=lang) for relatedconcept in concept_graph.relatedconcepts: relatedconcept.prefLabel = relatedconcept.get_preflabel(lang=lang) for value in concept_graph.values: if value.category == 'label': labels.append(value) if (mode == 'semantic' or mode == '') and (concept_graph.nodetype == 'Concept' or concept_graph.nodetype == 'ConceptScheme' or concept_graph.nodetype == 'EntityType'): if concept_graph.nodetype == 'ConceptScheme': parent_relations = relationtypes.filter(category='Properties') else: parent_relations = relationtypes.filter(category='Semantic Relations').exclude(relationtype = 'related').exclude(relationtype='broader').exclude(relationtype='broaderTransitive') return render(request, 'views/rdm/concept-report.htm', { 'lang': lang, 'prefLabel': prefLabel, 'labels': labels, 'concept': concept_graph, 'languages': languages, 'sparql_providers': get_sparql_providers(), 'valuetype_labels': valuetypes.filter(category='label'), 'valuetype_notes': valuetypes.filter(category='note'), 'valuetype_related_values': valuetypes.filter(category__in=['undefined','identifiers']), 'parent_relations': parent_relations, 'related_relations': relationtypes.filter(Q(category='Mapping Properties') | Q(relationtype = 'related')), 'concept_paths': concept_graph.get_paths(lang=lang), 'graph_json': JSONSerializer().serialize(concept_graph.get_node_and_links(lang=lang)), 'direct_parents': [parent.get_preflabel(lang=lang) for parent in concept_graph.parentconcepts] }) elif mode == 'collections': return render(request, 'views/rdm/entitytype-report.htm', { 'lang': lang, 'prefLabel': prefLabel, 'labels': labels, 'concept': concept_graph, 'languages': languages, 'valuetype_labels': valuetypes.filter(category='label'), 'valuetype_notes': valuetypes.filter(category='note'), 'valuetype_related_values': valuetypes.filter(category__in=['undefined','identifiers']), 'related_relations': relationtypes.filter(relationtype = 'member'), 'concept_paths': concept_graph.get_paths(lang=lang) }) if request.method == 'POST': if len(request.FILES) > 0: skosfile = request.FILES.get('skosfile', None) imagefile = request.FILES.get('file', None) if imagefile: value = models.FileValue(valueid = str(uuid.uuid4()), value = request.FILES.get('file', None), concept_id = conceptid, valuetype_id = 'image',language_id = settings.LANGUAGE_CODE) value.save() return JSONResponse(value) elif skosfile: overwrite_options = request.POST.get('overwrite_options', None) staging_options = request.POST.get('staging_options', None) skos = SKOSReader() try: rdf = skos.read_file(skosfile) ret = skos.save_concepts_from_skos(rdf, overwrite_options, staging_options) return JSONResponse(ret) except: return JSONResponse({'message':{'title': _('Unable to Load SKOS File'), 'text': _('There was an issue saving the contents of the file to Arches.')}}, status=500) else: data = JSONDeserializer().deserialize(request.body) if data: with transaction.atomic(): concept = Concept(data) concept.save() concept.index() return JSONResponse(concept) if request.method == 'DELETE': data = JSONDeserializer().deserialize(request.body) if data: with transaction.atomic(): concept = Concept(data) delete_self = data['delete_self'] if 'delete_self' in data else False if not (delete_self and concept.id in CORE_CONCEPTS): if concept.nodetype == 'Collection': concept.delete(delete_self=delete_self) else: in_use = False if delete_self: check_concept = Concept().get(data['id'], include_subconcepts=True) in_use = check_concept.check_if_concept_in_use() if 'subconcepts' in data: for subconcept in data['subconcepts']: if in_use == False: check_concept = Concept().get(subconcept['id'], include_subconcepts=True) in_use = check_concept.check_if_concept_in_use() if in_use == False: concept.delete_index(delete_self=delete_self) concept.delete(delete_self=delete_self) else: return JSONResponse({"in_use": in_use, 'message':{'title': _('Unable to Delete'), 'text': _('This concept or one of it\'s subconcepts is already in use by an existing resource.')}}) return JSONResponse(concept) return HttpResponseNotFound
def concept(request, conceptid): f = request.GET.get('f', 'json') mode = request.GET.get('mode', '') lang = request.GET.get('lang', settings.LANGUAGE_CODE) pretty = request.GET.get('pretty', False) if request.method == 'GET': include_subconcepts = request.GET.get('include_subconcepts', 'true') == 'true' include_parentconcepts = request.GET.get('include_parentconcepts', 'true') == 'true' include_relatedconcepts = request.GET.get('include_relatedconcepts', 'true') == 'true' emulate_elastic_search = request.GET.get('emulate_elastic_search', 'false') == 'true' depth_limit = request.GET.get('depth_limit', None) if f == 'html': depth_limit = 1 if not conceptid: return render(request, 'views/rdm/concept-report.htm', { 'lang': lang, 'concept_count': models.Concept.objects.filter(nodetype='Concept').count(), 'collection_count': models.Concept.objects.filter(nodetype='Collection').count(), 'scheme_count': models.Concept.objects.filter(nodetype='ConceptScheme').count(), 'entitytype_count': models.Concept.objects.filter(nodetype='EntityType').count(), 'default_report': True }) ret = [] labels = [] this_concept = Concept().get(id=conceptid) if f == 'html': if mode == '' and (this_concept.nodetype == 'Concept' or this_concept.nodetype == 'ConceptScheme' or this_concept.nodetype == 'EntityType'): concept_graph = Concept().get(id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang) else: concept_graph = Concept().get(id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang, semantic=False) languages = models.DLanguage.objects.all() valuetypes = models.DValueType.objects.all() relationtypes = models.DRelationType.objects.all() prefLabel = concept_graph.get_preflabel(lang=lang) for subconcept in concept_graph.subconcepts: subconcept.prefLabel = subconcept.get_preflabel(lang=lang) for relatedconcept in concept_graph.relatedconcepts: relatedconcept.prefLabel = relatedconcept.get_preflabel(lang=lang) for value in concept_graph.values: if value.category == 'label': labels.append(value) if mode == '' and (this_concept.nodetype == 'Concept' or this_concept.nodetype == 'ConceptScheme' or this_concept.nodetype == 'EntityType'): if concept_graph.nodetype == 'ConceptScheme': parent_relations = relationtypes.filter(category='Properties') else: parent_relations = relationtypes.filter(category='Semantic Relations').exclude(relationtype = 'related').exclude(relationtype='broader').exclude(relationtype='broaderTransitive') return render(request, 'views/rdm/concept-report.htm', { 'lang': lang, 'prefLabel': prefLabel, 'labels': labels, 'concept': concept_graph, 'languages': languages, 'sparql_providers': get_sparql_providers(), 'valuetype_labels': valuetypes.filter(category='label'), 'valuetype_notes': valuetypes.filter(category='note'), 'valuetype_related_values': valuetypes.filter(category='undefined'), 'parent_relations': parent_relations, 'related_relations': relationtypes.filter(Q(category='Mapping Properties') | Q(relationtype = 'related')), 'concept_paths': concept_graph.get_paths(lang=lang), 'graph_json': JSONSerializer().serialize(concept_graph.get_node_and_links(lang=lang)), 'direct_parents': [parent.get_preflabel(lang=lang) for parent in concept_graph.parentconcepts] }) else: return render(request, 'views/rdm/entitytype-report.htm', { 'lang': lang, 'prefLabel': prefLabel, 'labels': labels, 'concept': concept_graph, 'languages': languages, 'valuetype_labels': valuetypes.filter(category='label'), 'valuetype_notes': valuetypes.filter(category='note'), 'valuetype_related_values': valuetypes.filter(category='undefined'), 'related_relations': relationtypes.filter(relationtype = 'member'), 'concept_paths': concept_graph.get_paths(lang=lang) }) concept_graph = Concept().get(id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang) if f == 'skos': include_parentconcepts = False include_subconcepts = True depth_limit = None skos = SKOSWriter() return HttpResponse(skos.write(concept_graph, format="pretty-xml"), content_type="application/xml") if emulate_elastic_search: ret.append({'_type': id, '_source': concept_graph}) else: ret.append(concept_graph) if emulate_elastic_search: ret = {'hits':{'hits':ret}} return JSONResponse(ret, indent=4 if pretty else None) if request.method == 'POST': if len(request.FILES) > 0: skosfile = request.FILES.get('skosfile', None) imagefile = request.FILES.get('file', None) if imagefile: value = models.FileValue(valueid = str(uuid.uuid4()), value = request.FILES.get('file', None), conceptid_id = conceptid, valuetype_id = 'image',languageid_id = settings.LANGUAGE_CODE) value.save() return JSONResponse(value) elif skosfile: skos = SKOSReader() rdf = skos.read_file(skosfile) ret = skos.save_concepts_from_skos(rdf) return JSONResponse(ret) else: data = JSONDeserializer().deserialize(request.body) if data: with transaction.atomic(): concept = Concept(data) concept.save() concept.index() return JSONResponse(concept) if request.method == 'DELETE': data = JSONDeserializer().deserialize(request.body) if data: with transaction.atomic(): concept = Concept(data) delete_self = data['delete_self'] if 'delete_self' in data else False if not (delete_self and concept.id in CORE_CONCEPTS): in_use = False if delete_self: check_concept = Concept().get(data['id'], include_subconcepts=True) in_use = check_concept.check_if_concept_in_use() if 'subconcepts' in data: for subconcept in data['subconcepts']: if in_use == False: check_concept = Concept().get(subconcept['id'], include_subconcepts=True) in_use = check_concept.check_if_concept_in_use() if in_use == False: concept.delete_index(delete_self=delete_self) concept.delete(delete_self=delete_self) else: return JSONResponse({"in_use": in_use}) return JSONResponse(concept) return HttpResponseNotFound
def concept(request, conceptid): f = request.GET.get("f", "json") mode = request.GET.get("mode", "") lang = request.GET.get("lang", request.LANGUAGE_CODE) pretty = request.GET.get("pretty", False) if request.method == "GET": include_subconcepts = request.GET.get("include_subconcepts", "true") == "true" include_parentconcepts = request.GET.get("include_parentconcepts", "true") == "true" include_relatedconcepts = request.GET.get("include_relatedconcepts", "true") == "true" emulate_elastic_search = request.GET.get("emulate_elastic_search", "false") == "true" depth_limit = request.GET.get("depth_limit", None) depth_limit = 1 if not conceptid: return render( request, "views/rdm/concept-report.htm", { "lang": lang, "concept_count": models.Concept.objects.filter(nodetype="Concept").count(), "collection_count": models.Concept.objects.filter( nodetype="Collection").count(), "scheme_count": models.Concept.objects.filter( nodetype="ConceptScheme").count(), "entitytype_count": models.Concept.objects.filter( nodetype="EntityType").count(), "default_report": True, }, ) labels = [] concept_graph = Concept().get( id=conceptid, include_subconcepts=include_subconcepts, include_parentconcepts=include_parentconcepts, include_relatedconcepts=include_relatedconcepts, depth_limit=depth_limit, up_depth_limit=None, lang=lang, semantic=(mode == "semantic" or mode == ""), ) languages = sort_languages(models.DLanguage.objects.all(), lang) valuetypes = models.DValueType.objects.all() relationtypes = models.DRelationType.objects.all() prefLabel = concept_graph.get_preflabel(lang=lang) for subconcept in concept_graph.subconcepts: subconcept.prefLabel = subconcept.get_preflabel(lang=lang) for relatedconcept in concept_graph.relatedconcepts: relatedconcept.prefLabel = relatedconcept.get_preflabel(lang=lang) for value in concept_graph.values: if value.category == "label": labels.append(value) if value.type == "image": value.full_image_url = ( (settings.FORCE_SCRIPT_NAME if settings.FORCE_SCRIPT_NAME is not None else "") + settings.MEDIA_URL + value.value).replace("//", "/") if (mode == "semantic" or mode == "") and (concept_graph.nodetype == "Concept" or concept_graph.nodetype == "ConceptScheme" or concept_graph.nodetype == "EntityType"): if concept_graph.nodetype == "ConceptScheme": parent_relations = relationtypes.filter(category="Properties") else: parent_relations = (relationtypes.filter( category="Semantic Relations").exclude( relationtype="related").exclude( relationtype="broader").exclude( relationtype="broaderTransitive")) return render( request, "views/rdm/concept-report.htm", { "FORCE_SCRIPT_NAME": settings.FORCE_SCRIPT_NAME, "lang": lang, "prefLabel": prefLabel, "labels": labels, "concept": concept_graph, "languages": languages, "sparql_providers": get_sparql_providers(), "valuetype_labels": valuetypes.filter(category="label"), "valuetype_notes": valuetypes.filter(category="note"), "valuetype_related_values": valuetypes.filter( category__in=["undefined", "identifiers"]), "parent_relations": parent_relations, "related_relations": relationtypes.filter( Q(category="Mapping Properties") | Q(relationtype="related")), "concept_paths": concept_graph.get_paths(lang=lang), "graph_json": JSONSerializer().serialize( concept_graph.get_node_and_links(lang=lang)), "direct_parents": [ parent.get_preflabel(lang=lang) for parent in concept_graph.parentconcepts ], }, ) elif mode == "collections": return render( request, "views/rdm/entitytype-report.htm", { "lang": lang, "prefLabel": prefLabel, "labels": labels, "concept": concept_graph, "languages": languages, "valuetype_labels": valuetypes.filter(category="label"), "valuetype_notes": valuetypes.filter(category="note"), "valuetype_related_values": valuetypes.filter( category__in=["undefined", "identifiers"]), "related_relations": relationtypes.filter(relationtype="member"), "concept_paths": concept_graph.get_paths(lang=lang), }, ) if request.method == "POST": if len(request.FILES) > 0: skosfile = request.FILES.get("skosfile", None) imagefile = request.FILES.get("file", None) if imagefile: value = models.FileValue( valueid=str(uuid.uuid4()), value=request.FILES.get("file", None), concept_id=conceptid, valuetype_id="image", language_id=lang, ) value.save() return JSONResponse(value) elif skosfile: overwrite_options = request.POST.get("overwrite_options", None) staging_options = request.POST.get("staging_options", None) skos = SKOSReader() try: rdf = skos.read_file(skosfile) ret = skos.save_concepts_from_skos(rdf, overwrite_options, staging_options) return JSONResponse(ret) except Exception as e: return JSONErrorResponse( _('Unable to Load SKOS File'), _('There was an issue saving the contents of the file to Arches. ' ) + str(e)) else: data = JSONDeserializer().deserialize(request.body) if data: with transaction.atomic(): concept = Concept(data) concept.save() concept.index() return JSONResponse(concept) if request.method == "DELETE": data = JSONDeserializer().deserialize(request.body) if data: with transaction.atomic(): concept = Concept(data) delete_self = data[ "delete_self"] if "delete_self" in data else False if not (delete_self and concept.id in CORE_CONCEPTS): if concept.nodetype == "Collection": concept.delete(delete_self=delete_self) else: in_use = False if delete_self: check_concept = Concept().get( data["id"], include_subconcepts=True) in_use = check_concept.check_if_concept_in_use() if "subconcepts" in data: for subconcept in data["subconcepts"]: if in_use == False: check_concept = Concept().get( subconcept["id"], include_subconcepts=True) in_use = check_concept.check_if_concept_in_use( ) if in_use == False: concept.delete_index(delete_self=delete_self) concept.delete(delete_self=delete_self) else: return JSONErrorResponse( _('Unable to Delete'), _('This concept or one of it\'s subconcepts is already in use by an existing resource.' ), {"in_use": in_use}) return JSONResponse(concept) return HttpResponseNotFound