# -*- coding: utf-8 -*-
"""
Dependencies: flask, tornado
"""
from __future__ import absolute_import, division, print_function
from flask import current_app
from ibeis.control import controller_inject
from ibeis.web import appfuncs as appf
import utool as ut
from ibeis.web import routes
register_route = controller_inject.get_ibeis_flask_route(__name__)
@register_route('/csv/sightings/', methods=['GET'])
[docs]def download_sightings():
filename = 'sightings.csv'
sightings = routes.sightings(html_encode=False)
return appf.send_csv_file(sightings, filename)
@register_route('/csv/nids_with_gids/', methods=['GET'])
[docs]def get_nid_with_gids_csv():
ibs = current_app.ibs
filename = 'nids_with_gids.csv'
combined_dict = ibs.get_name_nids_with_gids()
combined_list = [
','.join( map(str, [nid] + [name] + gid_list) )
for name, (nid, gid_list) in sorted(list(combined_dict.iteritems()))
]
combined_str = '\n'.join(combined_list)
max_length = 0
for aid_list in combined_dict.values():
max_length = max(max_length, len(aid_list[1]))
if max_length == 1:
gid_header_str = 'GID'
else:
gid_header_str = ','.join([ 'GID%d' % (i + 1, ) for i in range(max_length) ])
combined_str = 'NID,NAME,%s\n' % (gid_header_str, ) + combined_str
return appf.send_csv_file(combined_str, filename)
@register_route('/csv/image_info/', methods=['GET'])
[docs]def get_image_info():
import datetime
ibs = current_app.ibs
filename = 'image_info.csv'
gid_list = sorted(ibs.get_valid_gids())
gname_list = ibs.get_image_gnames(gid_list)
datetime_list = ibs.get_image_unixtime(gid_list)
datetime_list_ = [
datetime.datetime.fromtimestamp(datetime_).strftime('%Y-%m-%d %H:%M:%S')
for datetime_ in datetime_list
]
lat_list = ibs.get_image_lat(gid_list)
lon_list = ibs.get_image_lon(gid_list)
note_list = ibs.get_image_notes(gid_list)
party_list = []
contributor_list = []
for note in note_list:
try:
note = note.split(',')
party, contributor = note[:2]
party_list.append(party)
contributor_list.append(contributor)
except:
party_list.append('UNKNOWN')
contributor_list.append('UNKNOWN')
zipped_list = zip(gid_list, gname_list, datetime_list_, lat_list, lon_list,
party_list, contributor_list)
aids_list = ibs.get_image_aids(gid_list)
names_list = [ ibs.get_annot_name_texts(aid_list) for aid_list in aids_list ]
combined_list = [
','.join( map(str, list(zipped) + name_list) )
for zipped, name_list in zip(zipped_list, names_list)
]
max_length = 0
for name_list in names_list:
max_length = max(max_length, len(name_list))
if max_length == 1:
name_header_str = 'NAME'
else:
name_header_str = ','.join([ 'NAME%d' % (i + 1, ) for i in range(max_length) ])
combined_str = '\n'.join(combined_list)
combined_str = 'GID,FILENAME,TIMESTAMP,GPSLAT,GPSLON,PARTY,CONTRIBUTOR,%s\n' % (name_header_str, ) + combined_str
return appf.send_csv_file(combined_str, filename)
@register_route('/csv/demographics/', methods=['GET'])
[docs]def get_demographic_info():
ibs = current_app.ibs
filename = 'demographics.csv'
nid_list = sorted(ibs.get_valid_nids())
name_list = ibs.get_name_texts(nid_list)
sex_list = ibs.get_name_sex_text(nid_list)
min_ages_list = ibs.get_name_age_months_est_min(nid_list)
max_ages_list = ibs.get_name_age_months_est_max(nid_list)
age_list = []
for min_ages, max_ages in zip(min_ages_list, max_ages_list):
if len(set(min_ages)) > 1 or len(set(max_ages)) > 1:
age_list.append('AMBIGUOUS')
continue
min_age = None
max_age = None
if len(min_ages) > 0:
min_age = min_ages[0]
if len(max_ages) > 0:
max_age = max_ages[0]
# Histogram
if (min_age is None and max_age is None) or (min_age is -1 and max_age is -1):
age_list.append('UNREVIEWED')
continue
# Bins
if (min_age is None or min_age < 12) and max_age < 12:
age_list.append('FOAL')
elif 12 <= min_age and min_age < 24 and 12 <= max_age and max_age < 24:
age_list.append('YEARLING')
elif 24 <= min_age and min_age < 36 and 24 <= max_age and max_age < 36:
age_list.append('2 YEARS')
elif 36 <= min_age and (36 <= max_age or max_age is None):
age_list.append('3+ YEARS')
else:
age_list.append('UNKNOWN')
zipped_list = zip(nid_list, name_list, sex_list, age_list)
combined_list = [
','.join( map(str, list(zipped)) )
for zipped in zipped_list
]
combined_str = '\n'.join(combined_list)
combined_str = 'NID,NAME,SEX,AGE\n' + combined_str
return appf.send_csv_file(combined_str, filename)
@register_route('/csv/gids_with_aids/', methods=['GET'])
[docs]def get_gid_with_aids_csv():
ibs = current_app.ibs
combined_dict = ibs.get_image_gids_with_aids()
filename = 'gids_with_aids.csv'
combined_list = [
','.join( map(str, [gid] + aid_list) )
for gid, aid_list in sorted(list(combined_dict.iteritems()))
]
combined_str = '\n'.join(combined_list)
max_length = 0
for aid_list in combined_dict.values():
max_length = max(max_length, len(aid_list))
if max_length == 1:
aid_header_str = 'AID'
else:
aid_header_str = ','.join([ 'AID%d' % (i + 1, ) for i in range(max_length) ])
combined_str = 'GID,%s\n' % (aid_header_str, ) + combined_str
return appf.send_csv_file(combined_str, filename)
@register_route('/csv/image/', methods=['GET'])
[docs]def get_gid_list_csv():
filename = 'gids.csv'
ibs = current_app.ibs
gid_list = ibs.get_valid_gids()
return_str = '\n'.join( map(str, gid_list) )
return_str = 'GID\n' + return_str
return appf.send_csv_file(return_str, filename)
@register_route('/csv/annot/', methods=['GET'])
[docs]def get_aid_list_csv():
filename = 'aids.csv'
ibs = current_app.ibs
aid_list = ibs.get_valid_aids()
return_str = '\n'.join( map(str, aid_list) )
return_str = 'AID\n' + return_str
return appf.send_csv_file(return_str, filename)
if __name__ == '__main__':
"""
CommandLine:
python -m ibeis.web.app
python -m ibeis.web.app --allexamples
python -m ibeis.web.app --allexamples --noface --nosrc
"""
import multiprocessing
multiprocessing.freeze_support() # for win32
import utool as ut # NOQA
ut.doctest_funcs()