def svgview(request, tree_id, tree_src=None): with get_treestore() as treestore: if not tree_src: tree_src = '/trees/%s/download?format=newick' % tree_id return render_to_response( 'svgview.html', {'tree_src': tree_src, 'tree_id': tree_id, 'tree_uri': uri_from_tree_id(tree_id)}, context_instance=RequestContext(request) )
def upload_approve(request, tree_id): submission = TreeSubmission.objects.get(id=tree_id) tree_id = submission.tree_id file_path = submission.tree_file.path try: tree = bp.read(file_path, submission.format) with get_treestore() as treestore: treestore.add_trees(file_path, submission.format, tree_uri=uri_from_tree_id(tree_id)) text = 'Successfully uploaded <b>%s</b>.' % (uri_from_tree_id(tree_id)) submission.delete() except Exception as e: text = '<b>ERROR:</b> <p>%s</p>' % e response = HttpResponse(mimetype='text/html') response.write(text) return response
def view(request, tree_id=None): with get_treestore() as treestore: tree_uri = uri_from_tree_id(tree_id) params = { 'tree_uri': tree_uri, 'tree_id': tree_id, 'formats': sorted(bp._io.supported_formats.keys()) + ['ascii'], } try: all_tree_info = treestore.get_tree_info(tree_uri) tree_info = {} tree_info.update(all_tree_info[0]) tree_info['citation'] = [] for x in all_tree_info: if x['citation']: tree_info['citation'].append(x['citation']) except IndexError: raise Http404 return not_found(request, tree_uri) obj_info = treestore.get_object_info(tree_uri) prefixes = treestore.prefixes def add_prefix(x): for prefix, uri in prefixes: if x.startswith(uri): if prefix == 'obo': try: return 'cdao:%s (obo:%s)' % (obo_to_cdao[x[len(uri):]], x[len(uri):]) except: pass return '%s:%s' % (prefix, x[len(uri):]) return x obj_info = [sum([(x, add_prefix(x)) for x in row], ()) for row in obj_info] params.update(tree_info) params['obj_info'] = obj_info return render_to_response( 'view.html', params, context_instance=RequestContext(request) )
def download(request, tree_id=None): with get_treestore() as treestore: tree_uri = uri_from_tree_id(tree_id) if 'format' in request.GET: format = request.GET.get('format') else: format = 'newick' if format == 'taxa_list': # download list of taxa names = treestore.get_names(tree_uri) spp_list = ','.join(names) return download_plaintext(request, spp_list) trees = treestore.get_trees(tree_uri=tree_uri) response = HttpResponse(mimetype='text/plain') if format == 'ascii': bp._utils.draw_ascii(trees[0], file=response) else: bp.write(trees, response, format) return download_plaintext(request, response=response)
def query(request): with get_treestore() as treestore: tree_uri = None params = { 'taxa': '', 'format': 'view', 'prune': True, 'tree': None, 'filter': '', 'taxonomy': settings.DEFAULT_TAXONOMY, } if request.method == 'POST': form = QueryForm(request.POST) if form.is_valid(): url = '/query/?' + urllib.urlencode(form.cleaned_data.items()) if len(url) < 200: return redirect(url) params.update(form.cleaned_data) submitted_query = True else: submitted_query = False elif request.method == 'GET' and 'taxa' in request.GET: submitted_query = True taxa = request.GET.get('taxa') params.update(request.GET.dict()) if 'prune' in request.GET: params['prune'] = params['prune'] == 'True' form = QueryForm(initial=request.GET.dict()) form.full_clean() else: submitted_query = False form = QueryForm(initial=request.GET.dict()) best_match = params['tree'] == 'best' if submitted_query: if best_match: tree_uri = None else: tree_uri = uri_from_tree_id(params['tree']) if params['tree'] else None taxonomy = uri_from_tree_id(params['taxonomy']) if params['taxonomy'] else None if params['format'] == 'view' and tree_uri: params['format'] = 'newick' tree_src = '/query/?' + urllib.urlencode(params.items()) return treeview.views.svgview(request, params['tree'], tree_src=tree_src) # execute the query and return the result as a plaintext tree contains = [t.strip() for t in params['taxa'].split(',')] e = None response = None if tree_uri is None: # 'select automatically' was chosen; perform the disambiguation step # if there are more than one matching tree trees = None matches = [] try: for match in treestore.list_trees_containing_taxa(contains=contains, show_counts=True, taxonomy=taxonomy, filter=params['filter']): if int(match[1]) < 2 and params['prune']: if not matches: raise Exception("The top match only matched one taxon, which isn't enough to make a tree. Try unchecking the 'prune results' checkbox or changing your search.") break matches.append((match[0], int(match[1]))) if len(matches) >= (1 if best_match else MAX_DISAMBIG_MATCHES): break except Exception as e: trees = None if matches and not e: if best_match: if params['format'] == 'view': params['format'] = 'newick' params['tree'] = matches[0][0] tree_src = '/query/?' + urllib.urlencode(params.items()) return treeview.views.svgview(request, tree_id_from_uri(matches[0][0]), tree_src=tree_src) response = HttpResponse(mimetype='text/plain') treestore.get_subtree(contains=contains, tree_uri=matches[0][0], format=params['format'], prune=params['prune'], filter=params['filter'], taxonomy=taxonomy, handle=response) else: return query_disambiguate(request, matches, params) elif not e: trees = None e = 'There were no trees that matched your query.' else: try: response = HttpResponse(mimetype='text/plain') treestore.get_subtree(contains=contains, tree_uri=tree_uri, format=params['format'], prune=params['prune'], filter=params['filter'], taxonomy=taxonomy, handle=response) except Exception as e: trees = None exception = e if response: return download_plaintext(request, response=response) elif trees: return download_plaintext(request, trees) else: errors = form._errors.setdefault(NON_FIELD_ERRORS, ErrorList()) if e: errors.append('There was a problem with your query: %s' % e) else: err_msg = "Your query didn't return a result. Try entering a new list of taxa" if tree_uri: err_msg += ' or selecting a different tree' err_msg += '.' errors.append(err_msg) # show the query builder page params = { 'form': form, 'domain': settings.DOMAIN.rstrip('/'), 'tree_uri': settings.TREE_URI, } params.update(csrf(request)) return render_to_response( 'query.html', params, context_instance=RequestContext(request) )