def add_multiple_references(SerializerClass, user, data, parent_resource, host_url): expressions = data.get('expressions', []) concept_expressions = data.get('concepts', []) mapping_expressions = data.get('mappings', []) uri = data.get('uri') search_term = data.get('search_term', '') if '*' in [concept_expressions, mapping_expressions]: ResourceContainer = SourceVersion if uri.split('/')[3] == 'sources' else CollectionVersion if concept_expressions == '*': url = host_url + uri + 'concepts?q=' + search_term view = ConceptVersionListView.as_view() request = APIRequestFactory().get(url) response = view(request) response.render() concepts_dict = json.loads(response.content) concept_uris = [c['url'] for c in concepts_dict] concepts = Concept.objects.filter(uri__in=concept_uris) expressions.extend(map(lambda c: c.uri, concepts)) else: expressions.extend(concept_expressions) if mapping_expressions == '*': url = host_url + uri + 'mappings?q=' + search_term view = MappingListView.as_view() request = APIRequestFactory().get(url) response = view(request) response.render() mappings_dict = json.loads(response.content) mapping_uris = [c['url'] for c in mappings_dict] mappings = Mapping.objects.filter(uri__in=mapping_uris) expressions.extend(map(lambda m: m.uri, mappings)) else: expressions.extend(mapping_expressions) expressions = set(expressions) prev_refs = parent_resource.references save_kwargs = { 'force_update': True, 'expressions': expressions, 'user': user } serializer = SerializerClass(parent_resource, partial=True) serializer.save(**save_kwargs) update_collection_in_solr.delay( serializer.object.get_head().id, CollectionReference.diff(serializer.object.references, prev_refs) ) if 'references' in serializer.errors: serializer.object.save() diff = map(lambda ref: ref.expression, CollectionReference.diff(serializer.object.references, prev_refs)) errors = serializer.errors.get('references', []) return diff, errors
def add_multiple_references(SerializerClass, user, data, parent_resource, host_url): expressions = data.get('expressions', []) concept_expressions = data.get('concepts', []) mapping_expressions = data.get('mappings', []) uri = data.get('uri') search_term = data.get('search_term', '') if '*' in [concept_expressions, mapping_expressions]: ResourceContainer = SourceVersion if uri.split( '/')[3] == 'sources' else CollectionVersion if concept_expressions == '*': url = host_url + uri + 'concepts?q=' + search_term view = ConceptVersionListView.as_view() request = APIRequestFactory().get(url) response = view(request) response.render() concepts_dict = json.loads(response.content) concept_uris = [c['url'] for c in concepts_dict] concepts = Concept.objects.filter(uri__in=concept_uris) expressions.extend(map(lambda c: c.uri, concepts)) else: expressions.extend(concept_expressions) if mapping_expressions == '*': url = host_url + uri + 'mappings?q=' + search_term view = MappingListView.as_view() request = APIRequestFactory().get(url) response = view(request) response.render() mappings_dict = json.loads(response.content) mapping_uris = [c['url'] for c in mappings_dict] mappings = Mapping.objects.filter(uri__in=mapping_uris) expressions.extend(map(lambda m: m.uri, mappings)) else: expressions.extend(mapping_expressions) expressions = set(expressions) prev_refs = parent_resource.references save_kwargs = { 'force_update': True, 'expressions': expressions, 'user': user } serializer = SerializerClass(parent_resource, partial=True) serializer.save(**save_kwargs) update_collection_in_solr.delay( serializer.object.get_head().id, CollectionReference.diff(serializer.object.references, prev_refs)) if 'references' in serializer.errors: serializer.object.save() return serializer.errors['references']
def select_update_message(self, expression): adding_head_version = not CollectionReference.version_specified(expression) expression_parts = expression.split('/') resource_type = expression_parts[5] if adding_head_version: return self.adding_to_head_message_by_type(resource_type) resource_name = expression_parts[6] return self.version_added_message_by_type(resource_name, self.parent_resource.name, resource_type)
def update(self, request, *args, **kwargs): if not self.parent_resource: return HttpResponse(status=status.HTTP_405_METHOD_NOT_ALLOWED) prev_refs = self.parent_resource.references created = False save_kwargs = {'force_update': True, 'expressions': request.DATA.get("expressions")} success_status_code = status.HTTP_200_OK serializer = self.get_serializer(self.parent_resource, data=request.DATA, files=request.FILES, partial=True) if serializer.is_valid(): self.pre_save(serializer.object) self.parent_resource = serializer.save(**save_kwargs) if serializer.is_valid(): self.post_save(self.parent_resource, created=created) update_collection_in_solr.delay(serializer.object.get_head().id, CollectionReference.diff(serializer.object.references, prev_refs)) return Response(serializer.data, status=success_status_code) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def add_references(SerializerClass, user, data, parent_resource, host_url, cascade_mappings=False): from concepts.models import Concept from mappings.models import Mapping from collection.models import CollectionVersion from sources.models import SourceVersion from concepts.views import ConceptVersionListView from mappings.views import MappingListView from collection.models import CollectionReferenceUtils from collection.models import CollectionReference expressions = data.get('expressions', []) concept_expressions = data.get('concepts', []) mapping_expressions = data.get('mappings', []) uri = data.get('uri') search_term = data.get('search_term', '') if '*' in [concept_expressions, mapping_expressions]: ResourceContainer = SourceVersion if uri.split( '/')[3] == 'sources' else CollectionVersion if concept_expressions == '*': url = host_url + uri + 'concepts?q=' + search_term + '&limit=0' view = ConceptVersionListView.as_view() request = APIRequestFactory().get(url) response = view(request) response.render() concepts_dict = json.loads(response.content) concept_uris = [c['url'] for c in concepts_dict] concepts = Concept.objects.filter(uri__in=concept_uris) expressions.extend(map(lambda c: c.uri, concepts)) else: expressions.extend(concept_expressions) if mapping_expressions == '*': url = host_url + uri + 'mappings?q=' + search_term + '&limit=0' view = MappingListView.as_view() request = APIRequestFactory().get(url) response = view(request) response.render() mappings_dict = json.loads(response.content) mapping_uris = [c['url'] for c in mappings_dict] mappings = Mapping.objects.filter(uri__in=mapping_uris) expressions.extend(map(lambda m: m.uri, mappings)) else: expressions.extend(mapping_expressions) expressions = set(expressions) if cascade_mappings: all_related_mappings = CollectionReferenceUtils.get_all_related_mappings( expressions, parent_resource) expressions = expressions.union(set(all_related_mappings)) prev_refs = parent_resource.references save_kwargs = { 'force_update': True, 'expressions': expressions, 'user': user } serializer = SerializerClass(parent_resource, partial=True) serializer.save(**save_kwargs) update_collection_in_solr.delay( serializer.object.get_head().id, CollectionReference.diff(serializer.object.references, prev_refs)) if 'references' in serializer.errors: serializer.object.save() diff = map( lambda ref: ref, CollectionReference.diff(serializer.object.references, prev_refs)) errors = serializer.errors.get('references', []) return diff, errors