def add_item_annotation(self, post_data): """ Adds a linked data annotation to an item """ note = '' ok_predicates = [ 'dc-terms:creator', 'dc-terms:contributor', 'skos:closeMatch', 'skos:exactMatch', 'owl:sameAs', 'skos:broader', 'skos:related', 'rdfs:isDefinedBy' ] ok = True predicate_uri = self.request_param_val(post_data, 'predicate_uri') object_uri = self.request_param_val(post_data, 'object_uri') if predicate_uri is not False \ and object_uri is not False: p_entity = Entity() found_p = p_entity.dereference(predicate_uri) if found_p is False \ and predicate_uri in ok_predicates: found_p = True o_entity = Entity() found_o = o_entity.dereference(object_uri) if found_p and found_o: lequiv = LinkEquivalence() pred_list = lequiv.get_identifier_list_variants(predicate_uri) obj_list = lequiv.get_identifier_list_variants(object_uri) la_exist = LinkAnnotation.objects\ .filter(subject=self.uuid, predicate_uri__in=pred_list, object_uri__in=obj_list)[:1] if len(la_exist) < 1: # we don't have an annotation like this yet object_uri = o_entity.uri new_la = LinkAnnotation() new_la.subject = self.manifest.uuid new_la.subject_type = self.manifest.item_type new_la.project_uuid = self.manifest.project_uuid new_la.source_id = self.request_param_val( post_data, 'source_id', 'manual-web-form', False) new_la.sort = self.request_param_val( post_data, 'sort', 0, False) new_la.predicate_uri = predicate_uri new_la.object_uri = object_uri new_la.creator_uuid = self.creator_uuid new_la.save() else: ok = False note = 'This annotation already exists.' else: ok = False note = 'Missing a predicate or object entity' else: note = self.errors['params'] ok = False self.response = { 'action': 'add-item-annotation', 'ok': ok, 'change': { 'note': note } } return self.response
def match_california_site(self, site_uuid): """ Attempts to match California site name with a tDAR site key word """ found_matches = 0 oc_item = OCitem() exists = oc_item.check_exists(site_uuid) if exists: la_check = LinkAnnotation.objects\ .filter(subject=site_uuid, predicate_uri='dc-terms:subject', object_uri__contains=self.TDAR_VOCAB)[:1] if exists and len(la_check) < 1: # we don't already have a tDAR id for this item, continue with matches # first, generate the item's JSON-LD oc_item.generate_json_ld() request_keywords = [] if 'oc-gen:has-obs' in oc_item.json_ld: if isinstance(oc_item.json_ld['oc-gen:has-obs'], list): for obs in oc_item.json_ld['oc-gen:has-obs']: if 'oc-pred:52-alternate-site-or-place-name' in obs: if isinstance( obs['oc-pred:52-alternate-site-or-place-name'], list): for name_obj in obs[ 'oc-pred:52-alternate-site-or-place-name']: if 'xsd:string' in name_obj: if isinstance(name_obj['xsd:string'], str): name_str = name_obj['xsd:string'] request_keywords.append(name_str) print('Checking names in tDAR: ' + '; '.join(request_keywords)) for keyword in request_keywords: tdar_api = tdarAPI() results = tdar_api.get_site_keyword(keyword) if isinstance(results, list): for result in results[:self.max_results]: # assume it is a spurious match match_real = False lw_result = result['label'].lower() lw_keyword = keyword.lower() if lw_result == lw_keyword: # the trinomial and the tDAR result exactly match match_real = True if match_real: print('FOUND ' + result['label']) found_matches += 1 # OK! Found a match, first save the linked entity in the link entity table le_check = False try: le_check = LinkEntity.objects.get( uri=result['id']) except LinkEntity.DoesNotExist: le_check = False if le_check is False: le = LinkEntity() le.uri = result['id'] le.label = result['label'] le.alt_label = result['label'] le.vocab_uri = self.TDAR_VOCAB le.ent_type = 'type' le.save() # Now save the link annotation la = LinkAnnotation() la.subject = oc_item.manifest.uuid la.subject_type = oc_item.manifest.item_type la.project_uuid = oc_item.manifest.project_uuid la.source_id = 'tdar-api-lookup' la.predicate_uri = self.DC_TERMS_SUBJECT la.object_uri = result['id'] la.save() else: print('Almost! ' + result['label'] + ' is not exactly: ' + keyword) if tdar_api.request_error: self.request_error = True print('HTTP request to tDAR failed!') self.error_wait += self.base_wait if self.error_wait > self.max_wait: print('Too many failures, quiting...') sys.exit('Quitting process') else: # sleep some minutes before trying again print('Will try again in ' + str(self.error_wait) + ' seconds...') sleep(self.error_wait) else: self.request_error = False if self.error_wait >= self.base_wait: print('HTTP requests resumed OK, will continue.') self.error_wait = 0 return found_matches
def generate_table_metadata(self, table_id, overwrite=False): """ makes metadata for a specific table """ ex_id = ExpTableIdentifiers() ex_id.make_all_identifiers(table_id) table_ids = [ex_id.table_id, ex_id.public_table_id] try: ex_tab = ExpTable.objects.get(table_id=table_id) except ExpTable.DoesNotExist: print('No ExpTable object for: ' + ex_id.public_table_id) ex_tab = None try: man_obj = Manifest.objects.get(uuid=ex_id.public_table_id) except Manifest.DoesNotExist: print('No manifest object for: ' + ex_id.public_table_id) man_obj = None if ex_tab is not None and man_obj is not None: proj_uuid_counts = None for meta_pred in self.metadata_predicates: if overwrite: num_old_delete = LinkAnnotation.objects\ .filter(subject__in=table_ids, predicate_uri=meta_pred)\ .delete() print('Deleted annoations ' + str(num_old_delete) + ' for ' + meta_pred) add_meta_for_pred = True else: num_exists = LinkAnnotation.objects\ .filter(subject__in=table_ids, predicate_uri=meta_pred)[:1] if len(num_exists) < 1: add_meta_for_pred = True else: add_meta_for_pred = False if add_meta_for_pred: if meta_pred == 'dc-terms:contributor': print('Getting contributors for ' + table_id) sorted_author_list = self.get_table_author_counts( table_id) contrib_sort = 0 for s_author in sorted_author_list: contrib_sort += 1 obj_extra = LastUpdatedOrderedDict() obj_extra['count'] = s_author['count'] la = LinkAnnotation() la.subject = man_obj.uuid la.subject_type = man_obj.item_type la.project_uuid = man_obj.project_uuid la.source_id = 'exp-table-manage' la.predicate_uri = meta_pred la.object_uri = URImanagement.make_oc_uri( s_author['uuid'], 'persons') la.creator_uuid = '0' la.sort = contrib_sort la.obj_extra = obj_extra la.save() if meta_pred in ['dc-terms:creator', 'dc-terms:source']: # need to get projects for this if proj_uuid_counts is None: # only get this if not gotten yet print('Getting projects for ' + table_id) proj_uuid_counts = self.get_table_project_uuid_counts( table_id) if meta_pred == 'dc-terms:creator': print('Getting creators for ' + table_id) dc_creator_list = self.make_table_dc_creator_list( proj_uuid_counts) create_sort = 0 for dc_creator in dc_creator_list: create_sort += 1 obj_extra = LastUpdatedOrderedDict() obj_extra['count'] = dc_creator['count'] la = LinkAnnotation() la.subject = man_obj.uuid la.subject_type = man_obj.item_type la.project_uuid = man_obj.project_uuid la.source_id = 'exp-table-manage' la.predicate_uri = meta_pred la.object_uri = dc_creator['id'] la.creator_uuid = '0' la.sort = create_sort la.obj_extra = obj_extra la.save() if meta_pred == 'dc-terms:source': print('Getting sources for ' + table_id) proj_sort = 0 for proj_uuid_count in proj_uuid_counts: proj_sort += 1 obj_extra = LastUpdatedOrderedDict() obj_extra['count'] = proj_uuid_count[ 'num_uuids'] la = LinkAnnotation() la.subject = man_obj.uuid la.subject_type = man_obj.item_type la.project_uuid = man_obj.project_uuid la.source_id = 'exp-table-manage' la.predicate_uri = meta_pred la.object_uri = URImanagement.make_oc_uri( proj_uuid_count['project_uuid'], 'projects') la.creator_uuid = '0' la.sort = proj_sort la.obj_extra = obj_extra la.save() if meta_pred == 'dc-terms:subject': print('Getting subjects for ' + table_id) dc_subject_list = self.make_table_dc_subject_category_list( table_id) subj_sort = 0 for dc_subject in dc_subject_list: subj_sort += 1 obj_extra = LastUpdatedOrderedDict() obj_extra['count'] = dc_subject['count'] la = LinkAnnotation() la.subject = man_obj.uuid la.subject_type = man_obj.item_type la.project_uuid = man_obj.project_uuid la.source_id = 'exp-table-manage' la.predicate_uri = meta_pred la.object_uri = dc_subject['id'] la.creator_uuid = '0' la.sort = subj_sort la.obj_extra = obj_extra la.save()