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", )