def add_taxon(tsn):
    #http://www.itis.gov/ITISWebService/services/ITISService/getScientificNameFromTSN?tsn=531894
    
    taxon = Taxon(tsn=tsn)
    
    sci_name_xml = _get_itis('getScientificNameFromTSN', {'tsn': tsn})
    sci_name = None
    for i in range(1,5):
        this_name = sci_name_xml.xpath("//ns:return/ax:unitName%d" % i, namespaces=itis_namespaces)[0].text
        if this_name:
            sci_name = this_name
    taxon.name = sci_name
    
    rank_name_xml = _get_itis('getTaxonomicRankNameFromTSN', {'tsn': tsn})
    rank_name = rank_name_xml.xpath("//ns:return/ax:rankName", namespaces=itis_namespaces)[0].text
    taxon.rank = Taxon.ITIS_RANKS[rank_name]

    supertaxon_xml = _get_itis('getParentTSNFromTSN', {'tsn': tsn})
    supertaxon_tsn = supertaxon_xml.xpath("//ns:return/ax:parentTsn", namespaces=itis_namespaces)[0]
    supertaxon_tsn = int(supertaxon_tsn.text)
    q = Taxon.objects.filter(tsn=supertaxon_tsn)
    if q.exists():
        taxon.supertaxon = q[0]
    
    common_names_xml = _get_itis('getCommonNamesFromTSN', {'tsn': tsn})
    common_names_elements = common_names_xml.xpath("//ns:return/ax:commonNames", namespaces=itis_namespaces)
    common_names = []
    for name in common_names_elements:
        name = objectify.fromstring(etree.tostring(name))

        nil_key = '{%s}nil' % itis_namespaces['xsi']
        if nil_key in name.attrib:
            if name.attrib[nil_key] == 'true':
                continue

        if not len(name):
            continue

        if name.language != "English":
            continue

        common_names.append(unicode(name.commonName))
    taxon.common_names = ", ".join(common_names)
        
    return taxon
def itis_search(request):
    xml_doc = _get_itis('searchForAnyMatch', request.GET)
    
    match_elements = xml_doc.xpath("//ns:return/ax:anyMatchList", namespaces=itis_namespaces)
    
    results = []
    for e in match_elements:
        # TODO better way to transmute an etree element into a objectified 
        # element
        o = objectify.fromstring(etree.tostring(e))
        if not len(o): # no matches were returned
            break
        
        try:
            taxon = Taxon.objects.get(tsn=o.tsn)
        except:
            taxon = Taxon()
        
            taxon.tsn = o.tsn
            taxon.name = o.sciName
            taxon.itis_rank = itis_get_rank(o.tsn)
            taxon.rank = Taxon.ITIS_RANKS[taxon.itis_rank]

        # skip taxa above Order
        if taxon.rank > 2:
            continue
        
        common_names = []
        for name in o.commonNameList.commonNames:
            if len(name):
                if name.language == 'English':
                    common_names.append(unicode(name.commonName))
        taxon.common_names = ', '.join(common_names)
        
        results.append(taxon)
    
    # render an HTML fragment that can be inserted into the taxon_import page
    return HttpResponse(
        render_to_string('taxons/itis_search_results.html', {
            'results': results,
            'MEDIA_URL': settings.MEDIA_URL,
        }),
        mimetype="text/plain",
    )