def tree_list(request): with get_treestore() as treestore: if request.method == 'POST': form = SearchForm(request.POST) if form.is_valid(): taxa = form.cleaned_data['taxa'] filter = form.cleaned_data['filter'] params = [(x, y) for x, y in form.cleaned_data.items()] return redirect('/trees/?' + urllib.urlencode(params)) else: taxa = request.GET.get('taxa') filter = request.GET.get('filter') filter = filter if filter else None form = SearchForm(initial=request.GET) form.full_clean() taxa = [x.strip() for x in taxa.split(',')] if taxa else [] params = {'form': form, 'taxonomy':settings.DEFAULT_TAXONOMY} params.update(csrf(request)) try: trees = list(treestore.list_trees_containing_taxa(contains=taxa, filter=filter, taxonomy=settings.DEFAULT_TAXONOMY, show_counts=True)) except Exception as e: errors = form._errors.setdefault(NON_FIELD_ERRORS, ErrorList()) err_msg = "There was a problem with your search: %s" % e errors.append(err_msg) return render_to_response( 'list.html', params, context_instance=RequestContext(request) ) trees = [(tree_id_from_uri(m[0]), int(m[1])) for m in trees] paginator = Paginator(trees, TREES_PER_PAGE) page = request.GET.get('page') try: tree_list = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. tree_list = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. tree_list = paginator.page(paginator.num_pages) params.update({'tree_list': tree_list, 'max_match_count': len(taxa)}) num_pages = paginator.num_pages page_range = [n for n in range(tree_list.number - 2, tree_list.number + 3) if n >= 1 and n <= num_pages] params.update({ 'total_results': len(trees), 'low_result': TREES_PER_PAGE * (tree_list.number - 1) + 1, 'high_result': min(len(trees), TREES_PER_PAGE * tree_list.number) }) if page_range[0] == 2: page_range = [1] + page_range elif page_range[0] > 2: page_range = [1, '...'] + page_range if page_range[-1] == num_pages - 1: page_range += [num_pages] elif page_range[-1] < num_pages - 1: page_range += ['...', num_pages] pages = [] for page in page_range: if page == '...': pages.append((page, None)) else: p = [] for arg in ('taxa', 'filter'): if arg in request.GET: p += [(arg, request.GET.get(arg))] p += [('page', page)] pages.append((page, '/trees/?' + urllib.urlencode(p))) params['pages'] = pages return render_to_response( 'list.html', params, context_instance=RequestContext(request) )