def match(request): initial_query = request.GET.get('q').lstrip() # only lstrip, because whitespace on right may be significant for autocompletion autocomplete = request.GET.get('autocomplete', False) sceners_only = request.GET.get('sceners_only', False) groups_only = request.GET.get('groups_only', False) # irritating workaround for not being able to pass an "omit this parameter" value to jquery if autocomplete == 'false' or autocomplete == 'null' or autocomplete == '0': autocomplete = False filters = {} # also doubles up as options to pass to NickSearch if sceners_only: filters['sceners_only'] = True elif groups_only: filters['groups_only'] = True if autocomplete: query = initial_query + NickVariant.autocomplete(initial_query, **filters) else: query = initial_query nick_search = NickSearch(query.rstrip(), **filters) data = { 'query': query, 'initial_query': initial_query, 'match': nick_search.match_data, } # to simulate network lag: #import time #time.sleep(2) return HttpResponse(json.dumps(data), mimetype="text/javascript")
def match(request): initial_query = request.GET.get('q').lstrip( ) # only lstrip, because whitespace on right may be significant for autocompletion autocomplete = request.GET.get('autocomplete', False) sceners_only = request.GET.get('sceners_only', False) groups_only = request.GET.get('groups_only', False) # irritating workaround for not being able to pass an "omit this parameter" value to jquery if autocomplete == 'false' or autocomplete == 'null' or autocomplete == '0': autocomplete = False filters = {} # also doubles up as options to pass to NickSearch if sceners_only: filters['sceners_only'] = True elif groups_only: filters['groups_only'] = True if autocomplete: query = initial_query + NickVariant.autocomplete( initial_query, **filters) else: query = initial_query nick_search = NickSearch(query.rstrip(), **filters) data = { 'query': query, 'initial_query': initial_query, 'match': nick_search.match_data, } # to simulate network lag: #import time #time.sleep(2) return HttpResponse(json.dumps(data), mimetype="text/javascript")
def __init__(self, search_term, author_nick_selections=[], affiliation_nick_selections=[], autocomplete=False): self.search_term = search_term # parse the byline parts = self.search_term.split('/') authors_string = parts[0] # everything before first slash is an author affiliations_string = '^'.join( parts[1:]) # everything after first slash is an affiliation # split on separators that have a trailing (and optionally leading) space author_names = re.split(r"\s*[\,\+\^\&]\s+", authors_string) author_names = [name.lstrip() for name in author_names if name.strip()] affiliation_names = re.split(r"\s*[\,\+\^\&]\s+", affiliations_string) affiliation_names = [ name.lstrip() for name in affiliation_names if name.strip() ] # Now, for any item in author_names or affiliation_names with an internal separator character, # perform a pre-check for that name. If not present, split it and move on. vetted_author_names = [] for name in author_names: if re.search(r"[\,\+\^\&]", name) and not NickVariant.objects.filter( name__iexact=name.strip()).exists(): for subname in re.split(r"[\,\+\^\&]", name): subname = subname.lstrip() if subname: vetted_author_names.append(subname) else: vetted_author_names.append(name) vetted_affiliation_names = [] for name in affiliation_names: if re.search(r"[\,\+\^\&]", name) and not NickVariant.objects.filter( name__iexact=name.strip(), nick__releaser__is_group=True).exists(): for subname in re.split(r"[\,\+\^\&]", name): subname = subname.lstrip() if subname: vetted_affiliation_names.append(subname) else: vetted_affiliation_names.append(name) author_names = vetted_author_names affiliation_names = vetted_affiliation_names # attempt to autocomplete the last element of the name, # if autocomplete flag is True and search term has no trailing ,+^/& separator if autocomplete and not re.search(r"[\,\+\^\/\&]\s*$", self.search_term): if affiliation_names: autocompletion = NickVariant.autocomplete( affiliation_names[-1], significant_whitespace=False, groups_only=True, member_names=[name.strip() for name in author_names]) affiliation_names[-1] += autocompletion self.search_term += autocompletion elif author_names: autocompletion = NickVariant.autocomplete( author_names[-1], significant_whitespace=False) author_names[-1] += autocompletion self.search_term += autocompletion author_names = [name.strip() for name in author_names] affiliation_names = [name.strip() for name in affiliation_names] # construct a NickSearch for each element self.author_nick_searches = [] for (i, author_name) in enumerate(author_names): try: selection = author_nick_selections[i] except IndexError: selection = None self.author_nick_searches.append( NickSearch(author_name, selection, group_names=affiliation_names)) self.affiliation_nick_searches = [] for (i, affiliation_name) in enumerate(affiliation_names): try: selection = affiliation_nick_selections[i] except IndexError: selection = None self.affiliation_nick_searches.append( NickSearch(affiliation_name, selection, groups_only=True, member_names=author_names)) self.author_nick_selections = [ nick_search.selection for nick_search in self.author_nick_searches ] self.affiliation_nick_selections = [ nick_search.selection for nick_search in self.affiliation_nick_searches ]
def __init__(self, search_term, author_nick_selections=[], affiliation_nick_selections=[], autocomplete=False): self.search_term = search_term # parse the byline parts = self.search_term.split('/') authors_string = parts[0] # everything before first slash is an author affiliations_string = '^'.join(parts[1:]) # everything after first slash is an affiliation # split on separators that have a trailing (and optionally leading) space author_names = re.split(r"\s*[\,\+\^\&]\s+", authors_string) author_names = [name.lstrip() for name in author_names if name.strip()] affiliation_names = re.split(r"\s*[\,\+\^\&]\s+", affiliations_string) affiliation_names = [name.lstrip() for name in affiliation_names if name.strip()] # Now, for any item in author_names or affiliation_names with an internal separator character, # perform a pre-check for that name. If not present, split it and move on. vetted_author_names = [] for name in author_names: if re.search(r"[\,\+\^\&]", name) and not NickVariant.objects.filter(name__iexact=name.strip()).exists(): for subname in re.split(r"[\,\+\^\&]", name): subname = subname.lstrip() if subname: vetted_author_names.append(subname) else: vetted_author_names.append(name) vetted_affiliation_names = [] for name in affiliation_names: if re.search(r"[\,\+\^\&]", name) and not NickVariant.objects.filter(name__iexact=name.strip(), nick__releaser__is_group=True).exists(): for subname in re.split(r"[\,\+\^\&]", name): subname = subname.lstrip() if subname: vetted_affiliation_names.append(subname) else: vetted_affiliation_names.append(name) author_names = vetted_author_names affiliation_names = vetted_affiliation_names # attempt to autocomplete the last element of the name, # if autocomplete flag is True and search term has no trailing ,+^/& separator if autocomplete and not re.search(r"[\,\+\^\/\&]\s*$", self.search_term): if affiliation_names: autocompletion = NickVariant.autocomplete( affiliation_names[-1], significant_whitespace=False, groups_only=True, members=[name.strip() for name in author_names]) affiliation_names[-1] += autocompletion self.search_term += autocompletion elif author_names: autocompletion = NickVariant.autocomplete( author_names[-1], significant_whitespace=False) author_names[-1] += autocompletion self.search_term += autocompletion author_names = [name.strip() for name in author_names] affiliation_names = [name.strip() for name in affiliation_names] # construct a NickSearch for each element self.author_nick_searches = [] for (i, author_name) in enumerate(author_names): try: selection = author_nick_selections[i] except IndexError: selection = None self.author_nick_searches.append( NickSearch(author_name, selection, group_names=affiliation_names) ) self.affiliation_nick_searches = [] for (i, affiliation_name) in enumerate(affiliation_names): try: selection = affiliation_nick_selections[i] except IndexError: selection = None self.affiliation_nick_searches.append( NickSearch(affiliation_name, selection, groups_only=True, member_names=author_names) ) self.author_nick_selections = [nick_search.selection for nick_search in self.author_nick_searches] self.affiliation_nick_selections = [nick_search.selection for nick_search in self.affiliation_nick_searches]