# -*- coding: utf-8 -*-
"""
controller functions for contributors, versions, configs, and other metadata
"""
from __future__ import absolute_import, division, print_function
#import uuid
import six # NOQA
#from os.path import join
import functools
from six.moves import range, input, zip, map # NOQA
from ibeis import constants as const
from ibeis.control import accessor_decors, controller_inject
import utool as ut
from ibeis.algo import Config
#from ibeis.other import ibsfuncs
from ibeis.control.controller_inject import make_ibs_register_decorator
print, print_, profile = ut.inject2(__name__, '[manual_meta]')
CLASS_INJECT_KEY, register_ibs_method = make_ibs_register_decorator(__name__)
register_api = controller_inject.get_ibeis_flask_api(__name__)
register_route = controller_inject.get_ibeis_flask_route(__name__)
@register_ibs_method
@accessor_decors.adder
@register_api('/api/contributor/', methods=['POST'])
[docs]def add_contributors(ibs, tag_list, uuid_list=None, name_first_list=None, name_last_list=None,
loc_city_list=None, loc_state_list=None,
loc_country_list=None, loc_zip_list=None,
notes_list=None):
r"""
Adds a list of contributors.
Returns:
contrib_id_list (list): contributor rowids
RESTful:
Method: POST
URL: /api/contributor/
"""
import datetime
def _valid_zip(_zip, default='00000'):
_zip = str(_zip)
if len(_zip) == 5 and _zip.isdigit():
return _zip
return default
if ut.VERBOSE:
print('[ibs] adding %d imagesets' % len(tag_list))
# Add contributors to database
if name_first_list is None:
name_first_list = [''] * len(tag_list)
if name_last_list is None:
name_last_list = [''] * len(tag_list)
if loc_city_list is None:
loc_city_list = [''] * len(tag_list)
if loc_state_list is None:
loc_state_list = [''] * len(tag_list)
if loc_country_list is None:
loc_country_list = [''] * len(tag_list)
if loc_zip_list is None:
loc_zip_list = [''] * len(tag_list)
if notes_list is None:
notes_list = [ "Created %s" % (datetime.datetime.now(),) for _ in range(len(tag_list))]
loc_zip_list = [ _valid_zip(_zip) for _zip in loc_zip_list]
if uuid_list is None:
#contrib_rowid_list = ibs.get_contributor_rowid_from_tag(tag_list)
#uuid_list = ibs.get_contributor_uuid(contrib_rowid_list)
#uuid_list = ibs.get_contributor_uuid(contrib_rowid_list)
#uuid_list = [ uuid.uuid4() if uuid_ is None else uuid_ for uuid_ in uuid_list ]
# DETERMENISTIC UUIDS
zero_uuid = ut.get_zero_uuid()
uuid_list = [ut.augment_uuid(zero_uuid, tag) for tag in tag_list]
colnames = ['contributor_uuid', 'contributor_tag', 'contributor_name_first',
'contributor_name_last', 'contributor_location_city',
'contributor_location_state', 'contributor_location_country',
'contributor_location_zip', 'contributor_note']
params_iter = zip(uuid_list, tag_list, name_first_list,
name_last_list, loc_city_list, loc_state_list,
loc_country_list, loc_zip_list, notes_list)
get_rowid_from_superkey = ibs.get_contributor_rowid_from_uuid
#get_rowid_from_superkey = ibs.get_contributor_rowid_from_tag # ?? is tag a superkey?
contrib_id_list = ibs.db.add_cleanly(const.CONTRIBUTOR_TABLE, colnames, params_iter, get_rowid_from_superkey)
return contrib_id_list
@register_ibs_method
@accessor_decors.adder
[docs]def add_version(ibs, versiontext_list):
r"""
Adds an algorithm / actor configuration as a string
"""
# FIXME: Configs are still handled poorly
params_iter = ((versiontext,) for versiontext in versiontext_list)
get_rowid_from_superkey = ibs.get_version_rowid_from_superkey
versionid_list = ibs.db.add_cleanly(const.VERSIONS_TABLE, ('version_text',),
params_iter, get_rowid_from_superkey)
return versionid_list
@register_ibs_method
@accessor_decors.adder
@register_api('/api/config/', methods=['POST'])
[docs]def add_config(ibs, cfgsuffix_list, contrib_rowid_list=None):
r"""
Adds an algorithm / actor configuration as a string
RESTful:
Method: POST
URL: /api/config/
Args:
ibs (IBEISController): ibeis controller object
cfgsuffix_list (list):
contrib_rowid_list (list): (default = None)
Returns:
list: config_rowid_list
CommandLine:
python -m ibeis.control.manual_meta_funcs --exec-add_config
Example:
>>> # DISABLE_DOCTEST
>>> from ibeis.control.manual_meta_funcs import * # NOQA
>>> import ibeis
>>> ibs = ibeis.opendb(defaultdb='testdb1')
>>> cfgsuffix_list = ['_CHIP(sz450)']
>>> contrib_rowid_list = None
>>> config_rowid_list = add_config(ibs, cfgsuffix_list, contrib_rowid_list)
>>> result = ('config_rowid_list = %s' % (str(config_rowid_list),))
>>> print(result)
"""
# FIXME: Configs are still handled poorly. This function is an ensure
params_iter = ((suffix,) for suffix in cfgsuffix_list)
get_rowid_from_superkey = ibs.get_config_rowid_from_suffix
config_rowid_list = ibs.db.add_cleanly(const.CONFIG_TABLE, ('config_suffix',),
params_iter, get_rowid_from_superkey)
if contrib_rowid_list is not None:
ibs.set_config_contributor_rowid(config_rowid_list, contrib_rowid_list)
return config_rowid_list
@register_ibs_method
@accessor_decors.getter_1to1
[docs]def ensure_config_rowid_from_suffix(ibs, cfgsuffix_list):
config_rowid_list = ibs.get_config_rowid_from_suffix(cfgsuffix_list)
is_dirty_list = ut.flag_None_items(config_rowid_list)
if any(is_dirty_list):
# Only call adder if needed, adders cause debug output to be large
return ibs.add_config(cfgsuffix_list)
else:
return config_rowid_list
#@register_ibs_method
#@accessor_decors.default_decorator
#@register_api('/api/query/config_rowid/', methods=['GET'])
#def get_query_config_rowid(ibs):
# r"""
# # FIXME: Configs are still handled poorly
# RESTful:
# Method: GET
# URL: /api/query/config_rowid/
# """
# query_cfg_suffix = ibs.cfg.query_cfg.get_cfgstr()
# query_cfg_rowid = ibs.add_config(query_cfg_suffix)
# return query_cfg_rowid
# SETTERS::METADATA
@register_ibs_method
@accessor_decors.setter
@register_api('/api/metadata/value/', methods=['PUT'])
@register_ibs_method
[docs]def set_database_version(ibs, db, version):
r"""
Sets the specified database's version from the controller
"""
db.set_db_version(version)
# SETTERS::CONTRIBUTORS
@register_ibs_method
@register_api('/api/config/contributor_rowid/', methods=['PUT'])
[docs]def set_config_contributor_rowid(ibs, config_rowid_list, contrib_rowid_list):
r"""
Sets the config's contributor rowid
RESTful:
Method: PUT
URL: /api/config/contributor_rowid/
"""
id_iter = ((config_rowid,) for config_rowid in config_rowid_list)
val_list = ((contrib_rowid,) for contrib_rowid in contrib_rowid_list)
ibs.db.set(const.CONFIG_TABLE, ('contributor_rowid',), val_list, id_iter)
@register_ibs_method
@register_api('/api/contributor/new_temp/', methods=['POST'])
[docs]def add_new_temp_contributor(ibs, user_prompt=False, offset=None, autolocate=False):
r"""
RESTful:
Method: POST
URL: /api/contributor/new_temp/
"""
name_first = ibs.get_dbname()
name_last = ut.get_computer_name() + ':' + ut.get_user_name() + ':' + ibs.get_dbdir()
print('[collect_transfer_data] Contributor default first name: %s' % (name_first, ))
print('[collect_transfer_data] Contributor default last name: %s' % (name_last, ))
if user_prompt:
name_first = input('\n[collect_transfer_data] Change first name (Enter to use default): ')
name_last = input('\n[collect_transfer_data] Change last name (Enter to use default): ')
if autolocate:
success, location_city, location_state, location_country, location_zip = ut.geo_locate()
else:
success = False
if success:
print('\n[collect_transfer_data] Your location was be determined automatically.')
print('[collect_transfer_data] Contributor default city: %s' % (location_city, ))
print('[collect_transfer_data] Contributor default state: %s' % (location_state, ))
print('[collect_transfer_data] Contributor default zip: %s' % (location_country, ))
print('[collect_transfer_data] Contributor default country: %s' % (location_zip, ))
if user_prompt:
location_city = input('\n[collect_transfer_data] Change default location city (Enter to use default): ')
location_state = input('\n[collect_transfer_data] Change default location state (Enter to use default): ')
location_zip = input('\n[collect_transfer_data] Change default location zip (Enter to use default): ')
location_country = input('\n[collect_transfer_data] Change default location country (Enter to use default): ')
else:
if user_prompt:
print('\n')
print('[collect_transfer_data] Your location could not be determined automatically.')
if user_prompt:
location_city = input('[collect_transfer_data] Enter your location city (Enter to skip): ')
location_state = input('[collect_transfer_data] Enter your location state (Enter to skip): ')
location_zip = input('[collect_transfer_data] Enter your location zip (Enter to skip): ')
location_country = input('[collect_transfer_data] Enter your location country (Enter to skip): ')
else:
location_city = ''
location_state = ''
location_zip = ''
location_country = ''
#tag = '::'.join([name_first, name_last, location_city, location_state, location_zip, location_country])
tag_components = [name_first, name_last, location_city, location_state, location_zip, location_country]
if offset is not None:
tag_components += [str(offset)]
tag_components_clean = [comp.replace(';', '<semi>') for comp in tag_components]
tag = ','.join(tag_components_clean)
contrib_rowid = ibs.add_contributors(
[tag], name_first_list=[name_first],
name_last_list=[name_last], loc_city_list=[location_city],
loc_state_list=[location_state], loc_country_list=[location_country],
loc_zip_list=[location_zip])[0]
return contrib_rowid
@register_ibs_method
[docs]def ensure_contributor_rowids(ibs, user_prompt=False, autolocate=False):
r"""
Args:
ibs (IBEISController): ibeis controller object
user_prompt (bool):
Returns:
list:
CommandLine:
python -m ibeis.control.manual_meta_funcs --test-ensure_contributor_rowids
Example:
>>> # ENABLE_DOCTEST
>>> from ibeis.control.manual_meta_funcs import * # NOQA
>>> import ibeis
>>> # build test data
>>> ibs = ibeis.opendb(db='testdb1')
>>> gid_list = ibs.get_valid_gids()
>>> ibs.delete_contributors(ibs.get_valid_contrib_rowids())
>>> contrib_rowid_list1 = ibs.get_image_contributor_rowid(gid_list)
>>> assert ut.allsame(contrib_rowid_list1)
>>> ut.assert_eq(contrib_rowid_list1[0], None)
>>> user_prompt = ut.get_argflag('--user-prompt')
>>> autolocate = ut.get_argflag('--user-prompt')
>>> # execute function
>>> result = ensure_contributor_rowids(ibs, user_prompt, autolocate)
>>> # verify results
>>> ibs.print_contributor_table()
>>> print(result)
>>> contrib_rowid_list2 = ibs.get_image_contributor_rowid(gid_list)
>>> assert ut.allsame(contrib_rowid_list2)
>>> ut.assert_eq(contrib_rowid_list2[0], 1)
"""
# TODO: Alter this check to support merging databases with more than one contributor, but none assigned to the manual config
if not ut.QUIET:
print('[ensure_contributor_rowids] Ensuring all images have contributors for dbname=%r' % (ibs.get_dbname()))
contrib_rowid_list = ibs.get_valid_contrib_rowids()
unassigned_gid_list = ibs.get_all_uncontributed_images()
if not ut.QUIET:
print('[ensure_contributor_rowids] %d Contributors exist. %d images are unassigned' %
(len(contrib_rowid_list), len(unassigned_gid_list)))
if len(unassigned_gid_list) > 0:
new_contrib_rowid = ibs.add_new_temp_contributor(offset=len(contrib_rowid_list), user_prompt=user_prompt, autolocate=autolocate)
# SET UNASSIGNED IMAGE CONTRIBUTORS
ibs.set_image_contributor_rowid(unassigned_gid_list, [new_contrib_rowid] * len(unassigned_gid_list))
ibs.ensure_imageset_configs_populated()
# make sure that all images have assigned contributors
# Get new non-conflicting contributor for unassigned images
#contrib_rowid_list = list([new_contrib_rowid]) * len(unassigned_gid_list)
#ibs.set_config_contributor_rowid(unassigned_gid_list, contrib_rowid_list)
return ibs.get_valid_contrib_rowids()
@register_ibs_method
@register_api('/api/contributor/all_uncontributed_images/', methods=['GET'])
[docs]def get_all_uncontributed_images(ibs):
r"""
RESTful:
Method: GET
URL: /api/contributor/all_uncontributed_images/
"""
gid_list = ibs.get_valid_gids()
contrib_rowid_list = ibs.get_image_contributor_rowid(gid_list)
is_unassigned = [contrib_rowid is None for contrib_rowid in contrib_rowid_list]
unassigned_gid_list = ut.compress(gid_list, is_unassigned)
#sum(is_unassigned)
#len(is_unassignd)
#unassigned_gid_list = [
# gid
# for gid, _contrib_rowid in zip(gid_list, contrib_rowid_list)
# if _contrib_rowid is None
#]
return unassigned_gid_list
@register_ibs_method
@register_api('/api/contributor/all_uncontributed_configs/', methods=['GET'])
[docs]def get_all_uncontributed_configs(ibs):
r"""
RESTful:
Method: GET
URL: /api/contributor/all_uncontributed_configs/
"""
config_rowid_list = ibs.get_valid_configids()
contrib_rowid_list = ibs.get_config_contributor_rowid(config_rowid_list)
isunassigned_list = [_contrib_rowid is None for _contrib_rowid in contrib_rowid_list]
unassigned_config_rowid_list = ut.compress(contrib_rowid_list, isunassigned_list)
#unassigned_config_rowid_list = [
# config_rowid
# for config_rowid, _contrib_rowid in zip(config_rowid_list, contrib_rowid_list)
# if _contrib_rowid is None
#]
return unassigned_config_rowid_list
@register_ibs_method
@register_api('/api/config/contributor_unassigned/', methods=['PUT'])
[docs]def set_config_contributor_unassigned(ibs, contrib_rowid):
r"""
RESTful:
Method: PUT
URL: /api/config/contributor_unassigned/
"""
# IS THIS NECESSARY?
unassigned_config_rowid_list = ibs.get_all_uncontributed_configs()
contrib_rowid_list = [contrib_rowid] * len(unassigned_config_rowid_list)
ibs.set_config_contributor_rowid(unassigned_config_rowid_list, contrib_rowid_list)
@register_ibs_method
[docs]def ensure_imageset_configs_populated(ibs):
r"""
"""
imgsetid_list = ibs.get_valid_imgsetids()
config_rowid_list = ibs.get_imageset_configid(imgsetid_list)
isunassigned_list = [config_rowid is None for config_rowid in config_rowid_list]
unassigned_imgsetid_list = ut.compress(imgsetid_list, isunassigned_list)
#unassigned_imgsetid_list = [
# imgsetid
# for imgsetid, config_rowid in zip(imgsetid_list, config_rowid_list)
# if config_rowid is None
#]
id_iter = ((imgsetid,) for imgsetid in unassigned_imgsetid_list)
config_rowid_list = list([ibs.MANUAL_CONFIGID]) * len(unassigned_imgsetid_list)
val_list = ((config_rowid,) for config_rowid in config_rowid_list)
ibs.db.set(const.IMAGESET_TABLE, ('config_rowid',), val_list, id_iter)
#
# GETTERS::.CONTRIBUTOR_TABLE
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/rowid_from_uuid/', methods=['GET'])
[docs]def get_contributor_rowid_from_uuid(ibs, uuid_list):
r"""
Returns:
contrib_rowid_list (list): a contributor
RESTful:
Method: GET
URL: /api/contributor/rowid_from_uuid/
"""
# FIXME: MAKE SQL-METHOD FOR NON-ROWID GETTERS
contrib_rowid_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_rowid',), uuid_list, id_colname='contributor_uuid')
return contrib_rowid_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/rowid_from_tag/', methods=['GET'])
[docs]def get_contributor_rowid_from_tag(ibs, tag_list):
r"""
Returns:
contrib_rowid_list (list): a contributor
RESTful:
Method: GET
URL: /api/contributor/rowid_from_tag/
"""
# FIXME: MAKE SQL-METHOD FOR NON-ROWID GETTERS
contrib_rowid_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_rowid',), tag_list, id_colname='contributor_tag')
return contrib_rowid_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/uuid/', methods=['GET'])
[docs]def get_contributor_uuid(ibs, contrib_rowid_list):
r"""
Returns:
contrib_uuid_list (list): a contributor's uuid
RESTful:
Method: GET
URL: /api/contributor/uuid/
"""
contrib_uuid_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_uuid',), contrib_rowid_list)
return contrib_uuid_list
#@register_ibs_method
#def get_contributor_tag(ibs, contrib_rowid_list):
# Returns:
# contrib_tag_list (list): a contributor's tag
# contrib_tag_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_tag',), contrib_rowid_list)
# return contrib_tag_list
CONFIG_ROWID = 'config_rowid'
CONTRIBUTOR_LOCATION_CITY = 'contributor_location_city'
CONTRIBUTOR_LOCATION_COUNTRY = 'contributor_location_country'
CONTRIBUTOR_LOCATION_STATE = 'contributor_location_state'
CONTRIBUTOR_LOCATION_ZIP = 'contributor_location_zip'
CONTRIBUTOR_NAME_FIRST = 'contributor_name_first'
CONTRIBUTOR_NAME_LAST = 'contributor_name_last'
CONTRIBUTOR_NOTE = 'contributor_note'
CONTRIBUTOR_ROWID = 'contributor_rowid'
CONTRIBUTOR_TAG = 'contributor_tag'
CONTRIBUTOR_UUID = 'contributor_uuid'
FEATWEIGHT_ROWID = 'featweight_rowid'
[docs]def testdata_ibs():
r"""
"""
import ibeis
ibs = ibeis.opendb('testdb1')
qreq_ = None
return ibs, qreq_
@register_ibs_method
def _get_all_contributor_rowids(ibs):
r"""
all_contributor_rowids <- contributor.get_all_rowids()
Returns:
list_ (list): unfiltered contributor_rowids
TemplateInfo:
Tider_all_rowids
tbl = contributor
Example:
>>> # ENABLE_DOCTEST
>>> from ibeis.control.manual_meta_funcs import * # NOQA
>>> ibs, qreq_ = testdata_ibs()
>>> ibs._get_all_contributor_rowids()
"""
all_contributor_rowids = ibs.db.get_all_rowids(const.CONTRIBUTOR_TABLE)
return all_contributor_rowids
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/tag/', methods=['GET'])
[docs]def get_contributor_tag(ibs, contributor_rowid_list, eager=True, nInput=None):
r"""
contributor_tag_list <- contributor.contributor_tag[contributor_rowid_list]
gets data from the "native" column "contributor_tag" in the "contributor" table
Args:
contributor_rowid_list (list):
Returns:
list: contributor_tag_list - a contributor's tag
TemplateInfo:
Tgetter_table_column
col = contributor_tag
tbl = contributor
CommandLine:
python -m ibeis.templates.template_generator --key contributor --Tcfg with_api_cache=False with_deleters=False
RESTful:
Method: GET
URL: /api/contributor/tag/
Example:
>>> # ENABLE_DOCTEST
>>> from ibeis.control.manual_meta_funcs import * # NOQA
>>> ibs, qreq_ = testdata_ibs()
>>> contributor_rowid_list = ibs._get_all_contributor_rowids()
>>> eager = True
>>> contributor_tag_list = ibs.get_contributor_tag(contributor_rowid_list, eager=eager)
>>> assert len(contributor_rowid_list) == len(contributor_tag_list)
"""
id_iter = contributor_rowid_list
colnames = (CONTRIBUTOR_TAG,)
contributor_tag_list = ibs.db.get(
const.CONTRIBUTOR_TABLE, colnames, id_iter, id_colname='rowid', eager=eager, nInput=nInput)
return contributor_tag_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/first_name/', methods=['GET'])
[docs]def get_contributor_first_name(ibs, contrib_rowid_list):
r"""
Returns:
contrib_name_first_list (list): a contributor's first name
RESTful:
Method: GET
URL: /api/contributor/first_name/
"""
contrib_name_first_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_name_first',), contrib_rowid_list)
return contrib_name_first_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/last_name/', methods=['GET'])
[docs]def get_contributor_last_name(ibs, contrib_rowid_list):
r"""
Returns:
contrib_name_last_list (list): a contributor's last name
RESTful:
Method: GET
URL: /api/contributor/last_name/
"""
contrib_name_last_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_name_last',), contrib_rowid_list)
return contrib_name_last_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/name_string/', methods=['GET'])
[docs]def get_contributor_name_string(ibs, contrib_rowid_list, include_tag=False):
r"""
Returns:
contrib_name_list (list): a contributor's full name
RESTful:
Method: GET
URL: /api/contributor/name_string/
"""
first_list = ibs.get_contributor_first_name(contrib_rowid_list)
last_list = ibs.get_contributor_last_name(contrib_rowid_list)
if include_tag:
tag_list = ibs.get_contributor_tag(contrib_rowid_list)
name_list = zip(first_list, last_list, tag_list)
contrib_name_list = [
"%s %s (%s)" % (first, last, tag)
for first, last, tag in name_list
]
else:
name_list = zip(first_list, last_list)
contrib_name_list = [
"%s %s" % (first, last)
for first, last in name_list
]
return contrib_name_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/city/', methods=['GET'])
[docs]def get_contributor_city(ibs, contrib_rowid_list):
r"""
Returns:
contrib_city_list (list): a contributor's location - city
RESTful:
Method: GET
URL: /api/contributor/city/
"""
contrib_city_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_location_city',), contrib_rowid_list)
return contrib_city_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/state/', methods=['GET'])
[docs]def get_contributor_state(ibs, contrib_rowid_list):
r"""
Returns:
list_ (list): a contributor's location - state
RESTful:
Method: GET
URL: /api/contributor/state/
"""
contrib_state_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_location_state',), contrib_rowid_list)
return contrib_state_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/country/', methods=['GET'])
[docs]def get_contributor_country(ibs, contrib_rowid_list):
r"""
Returns:
contrib_country_list (list): a contributor's location - country
RESTful:
Method: GET
URL: /api/contributor/country/
"""
contrib_country_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_location_country',), contrib_rowid_list)
return contrib_country_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/zip/', methods=['GET'])
[docs]def get_contributor_zip(ibs, contrib_rowid_list):
r"""
Returns:
contrib_zip_list (list): a contributor's location - zip
RESTful:
Method: GET
URL: /api/contributor/zip/
"""
contrib_zip_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_location_zip',), contrib_rowid_list)
return contrib_zip_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/location_string/', methods=['GET'])
[docs]def get_contributor_location_string(ibs, contrib_rowid_list):
r"""
Returns:
contrib_list (list): a contributor's location
RESTful:
Method: GET
URL: /api/contributor/location_string/
"""
city_list = ibs.get_contributor_city(contrib_rowid_list)
state_list = ibs.get_contributor_state(contrib_rowid_list)
zip_list = ibs.get_contributor_zip(contrib_rowid_list)
country_list = ibs.get_contributor_country(contrib_rowid_list)
location_list = zip(city_list, state_list, zip_list, country_list)
contrib_list = [
"%s, %s\n%s %s" % (city, state, _zip, country)
for city, state, _zip, country in location_list
]
return contrib_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/note/', methods=['GET'])
[docs]def get_contributor_note(ibs, contrib_rowid_list):
r"""
Returns:
contrib_note_list (list): a contributor's note
RESTful:
Method: GET
URL: /api/contributor/note/
"""
contrib_note_list = ibs.db.get(const.CONTRIBUTOR_TABLE, ('contributor_note',), contrib_rowid_list)
return contrib_note_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/config_rowids/', methods=['GET'])
[docs]def get_contributor_config_rowids(ibs, contrib_rowid_list):
r"""
Returns:
config_rowid_list (list): config rowids for a contributor
RESTful:
Method: GET
URL: /api/contributor/config_rowids/
"""
config_rowid_list = ibs.db.get(const.CONFIG_TABLE, ('config_rowid',), contrib_rowid_list, id_colname='contributor_rowid', unpack_scalars=False)
return config_rowid_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/imgsetids/', methods=['GET'])
[docs]def get_contributor_imgsetids(ibs, config_rowid_list):
r"""
Returns:
imgsetid_list (list): imgsetids for a contributor
RESTful:
Method: GET
URL: /api/contributor/imgsetids/
"""
imgsetid_list = ibs.db.get(const.IMAGESET_TABLE, ('imageset_rowid',), config_rowid_list, id_colname='config_rowid', unpack_scalars=False)
return imgsetid_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/gids/', methods=['GET'])
[docs]def get_contributor_gids(ibs, contrib_rowid_list):
r"""
TODO: Template 1_M reverse getter
Returns:
gid_list (list): gids for a contributor
RESTful:
Method: GET
URL: /api/contributor/gids/
"""
gid_list = ibs.db.get(const.IMAGE_TABLE, ('image_rowid',), contrib_rowid_list, id_colname='contributor_rowid', unpack_scalars=False)
return gid_list
#
# GETTERS::CONFIG_TABLE
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/config_rowid_from_suffix/', methods=['GET'])
[docs]def get_config_rowid_from_suffix(ibs, cfgsuffix_list):
r"""
Gets an algorithm configuration as a string
DEPRICATE
RESTful:
Method: GET
URL: /api/contributor/config_rowid_from_suffix/
Args:
ibs (IBEISController): ibeis controller object
cfgsuffix_list (list):
Returns:
list: gid_list
CommandLine:
python -m ibeis.control.manual_meta_funcs --exec-get_config_rowid_from_suffix
"""
# FIXME: This is causing a crash when converting old hotspotter databses.
# probably because the superkey changed
# SEE DBSchema.
# TODO: MAKE SQL-METHOD FOR NON-ROWID GETTERS
config_rowid_list = ibs.db.get(const.CONFIG_TABLE, ('config_rowid',), cfgsuffix_list, id_colname='config_suffix')
# executeone always returns a list
#if config_rowid_list is not None and len(config_rowid_list) == 1:
# config_rowid_list = config_rowid_list[0]
return config_rowid_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/config_rowid/', methods=['GET'])
[docs]def get_config_contributor_rowid(ibs, config_rowid_list):
r"""
Returns:
cfgsuffix_list (list): contributor's rowid for algorithm configs
RESTful:
Method: GET
URL: /api/contributor/config_rowid/
"""
cfgsuffix_list = ibs.db.get(const.CONFIG_TABLE, ('contributor_rowid',), config_rowid_list)
return cfgsuffix_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/contributor/config_suffixes/', methods=['GET'])
[docs]def get_config_suffixes(ibs, config_rowid_list):
r"""
Returns:
cfgsuffix_list (list): suffixes for algorithm configs
RESTful:
Method: GET
URL: /api/contributor/config_suffixes/
"""
cfgsuffix_list = ibs.db.get(const.CONFIG_TABLE, ('config_suffix',), config_rowid_list)
return cfgsuffix_list
@register_ibs_method
@accessor_decors.deleter
@register_api('/api/contributor/', methods=['DELETE'])
[docs]def delete_contributors(ibs, contrib_rowid_list):
r"""
deletes contributors from the database and all information associated
RESTful:
Method: DELETE
URL: /api/contributor/
"""
# TODO: FIXME TESTME
if not ut.QUIET:
print('[ibs] deleting %d contributors' % len(contrib_rowid_list))
config_rowid_list = ut.flatten(ibs.get_contributor_config_rowids(contrib_rowid_list))
# Delete configs (UNSURE IF THIS IS CORRECT)
ibs.delete_configs(config_rowid_list)
# CONTRIBUTORS SHOULD NOT DELETE IMAGES
# Delete imagesets
#imgsetid_list = ibs.get_valid_imgsetids()
#imgsetid_config_list = ibs.get_imageset_configid(imgsetid_list)
#valid_list = [config in config_rowid_list for config in imgsetid_config_list ]
#imgsetid_list = ut.compress(imgsetid_list, valid_list)
#ibs.delete_imagesets(imgsetid_list)
# Remote image contributors ~~~Delete images~~~~
gid_list = ut.flatten(ibs.get_contributor_gids(contrib_rowid_list))
ibs.set_image_contributor_rowid(gid_list, [None] * len(gid_list))
#ibs.delete_images(gid_list)
# Delete contributors
ibs.db.delete_rowids(const.CONTRIBUTOR_TABLE, contrib_rowid_list)
@register_ibs_method
@accessor_decors.ider
def _get_all_contrib_rowids(ibs):
r"""
Returns:
list_ (list): all unfiltered contrib_rowid (contributor rowid)
"""
all_contrib_rowids = ibs.db.get_all_rowids(const.CONTRIBUTOR_TABLE)
return all_contrib_rowids
@register_ibs_method
@accessor_decors.ider
@register_api('/api/contributor/valid_rowids/', methods=['GET'])
[docs]def get_valid_contrib_rowids(ibs):
r"""
Returns:
list_ (list): list of all contributor ids
Returns:
list: contrib_rowids_list
CommandLine:
python -m ibeis.control.manual_meta_funcs --test-get_valid_contrib_rowids
RESTful:
Method: GET
URL: /api/contributor/valid_rowids/
Example:
>>> # ENABLE_DOCTEST
>>> from ibeis.control.manual_meta_funcs import * # NOQA
>>> import ibeis
>>> ibs = ibeis.opendb('testdb1')
>>> contrib_rowids_list = get_valid_contrib_rowids(ibs)
>>> result = str(contrib_rowids_list)
>>> print(result)
"""
contrib_rowids_list = ibs._get_all_contrib_rowids()
return contrib_rowids_list
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/metadata/value/', methods=['GET'])
@register_ibs_method
@accessor_decors.getter_1to1
@register_api('/api/metadata/rowid_from_metadata_key/', methods=['GET'])
@register_api('/api/core/version/', methods=['GET'])
[docs]def get_database_version_alias(ibs, db):
r"""
Alias: `func:get_database_version`
RESTful:
Method: GET
URL: /api/core/version/
"""
return ibs.get_database_version(db)
@register_ibs_method
@accessor_decors.ider
@register_api('/api/core/dbversion/', methods=['GET'])
[docs]def get_database_version(ibs, db):
r"""
Gets the specified database version from the controller
RESTful:
Method: GET
URL: /api/core/dbversion/
"""
return db.get_db_version()
@register_ibs_method
@accessor_decors.adder
@register_api('/api/metadata/', methods=['POST'])
@register_ibs_method
@accessor_decors.deleter
@register_api('/api/config/', methods=['DELETE'])
[docs]def delete_configs(ibs, config_rowid_list):
r"""
deletes images from the database that belong to fids
RESTful:
Method: DELETE
URL: /api/config/
"""
if ut.VERBOSE:
print('[ibs] deleting %d configs' % len(config_rowid_list))
ibs.db.delete_rowids(const.CONFIG_TABLE, config_rowid_list)
@register_ibs_method
def _init_config(ibs):
r"""
Loads the database's algorithm configuration
TODO: per-species config
"""
#####
# <GENERAL CONFIG>
config_fpath = ut.unixjoin(ibs.get_dbdir(), 'general_config.cPkl')
try:
general_config = ut.load_cPkl(config_fpath, verbose=ut.VERBOSE)
except IOError:
general_config = {}
current_species = general_config.get('current_species', None)
if ut.VERBOSE and ut.NOT_QUIET:
print('[_init_config] general_config.current_species = %r' % (current_species,))
# </GENERAL CONFIG>
#####
species_list = ibs.get_database_species()
if current_species is None:
species_list = ibs.get_database_species()
current_species = species_list[0] if len(species_list) == 1 else None
cfgname = 'cfg' if current_species is None else current_species
if ut.VERBOSE and ut.NOT_QUIET:
print('[_init_config] Loading database with species_list = %r ' % (species_list,))
print('[_init_config] Using cfgname=%r' % (cfgname,))
# try to be intelligent about the default speceis
ibs._load_named_config(cfgname)
@register_ibs_method
def _init_burned_in_species(ibs):
# Add missing "required" species
species_nice_list = [
'Giraffe (Masai)',
'Giraffe (Reticulated)',
'Other',
'Zebra (Grevy\'s)',
'Zebra (Hybrid)',
'Zebra (Plains)',
]
species_text_list = [
'giraffe_masai',
'giraffe_reticulated',
'other',
'zebra_grevys',
'zebra_hybrid',
'zebra_plains',
]
species_code_list = [
'GIRM',
'GIR',
'OTHER',
'GZ',
'HZ',
'PZ',
]
ibs.add_species(species_nice_list, species_text_list, species_code_list)
print('[_init_burned_in_species] Burned in mising species...')
@register_ibs_method
def _load_named_config(ibs, cfgname=None):
r"""
"""
# TODO: update cfgs between versions
# Try to load previous config otherwise default
#use_config_cache = not (ut.is_developer() and not ut.get_argflag(('--nocache-pref',)))
use_config_cache = not ut.get_argflag(('--nocache-pref',))
ibs.cfg = Config.load_named_config(cfgname, ibs.get_dbdir(), use_config_cache)
ibs.reset_table_cache()
@register_ibs_method
def _default_config(ibs, cfgname=None, new=True):
r"""
Resets the databases's algorithm configuration
Args:
ibs (IBEISController): ibeis controller object
cfgname (None):
CommandLine:
python -m ibeis.control.manual_meta_funcs --test-_default_config
Example:
>>> # ENABLE_DOCTEST
>>> from ibeis.algo.Config import * # NOQA
>>> from ibeis.control.manual_meta_funcs import * # NOQA
>>> import ibeis
>>> # build test data
>>> ibs = ibeis.opendb('testdb1')
>>> assert not hasattr(ibs.cfg.query_cfg.flann_cfg, 'badparam')
>>> ibs.cfg.query_cfg.flann_cfg.badparam = True
>>> assert ibs.cfg.query_cfg.flann_cfg.cb_index == .4
>>> ibs.cfg.query_cfg.flann_cfg.cb_index = .5
>>> assert ibs.cfg.query_cfg.flann_cfg.cb_index == .5
>>> assert hasattr(ibs.cfg.query_cfg.flann_cfg, 'badparam')
>>> # bad params is not initially removed but when you specify new it is
>>> ibs._default_config(new=False)
>>> assert ibs.cfg.query_cfg.flann_cfg.cb_index == .4
>>> assert hasattr(ibs.cfg.query_cfg.flann_cfg, 'badparam')
>>> # bad param should be removed when config is defaulted
>>> ibs._default_config(new=True)
>>> assert not hasattr(ibs.cfg.query_cfg.flann_cfg, 'badparam')
cfg = ibs.cfg
"""
#species_list = ibs.get_database_species()
#if len(species_list) == 1:
# # try to be intelligent about the default speceis
# cfgname = species_list[0]
ibs.cfg = Config._default_config(ibs.cfg, cfgname, new=new)
ibs.reset_table_cache()
#@register_ibs_method
#@accessor_decors.default_decorator
#@register_api('/api/query/cfg/', methods=['PUT'])
#def set_query_cfg(ibs, query_cfg):
# r"""
# DEPRICATE
# RESTful:
# Method: PUT
# URL: /api/query/cfg/
# """
# Config.set_query_cfg(ibs.cfg, query_cfg)
# ibs.reset_table_cache()
# #if ibs.qreq is not None:
# # ibs.qreq.set_cfg(query_cfg)
@register_ibs_method
@accessor_decors.default_decorator
@register_api('/api/query/cfg/', methods=['PUT'])
[docs]def update_query_cfg(ibs, **kwargs):
r"""
Updates query config only. Configs needs a restructure very badly
DEPRICATE
RESTful:
Method: PUT
URL: /api/query/cfg/
"""
Config.update_query_config(ibs.cfg, **kwargs)
ibs.reset_table_cache()
@register_ibs_method
@accessor_decors.ider
@register_api('/api/config/valid_rowids/', methods=['GET'])
[docs]def get_valid_configids(ibs):
r"""
RESTful:
Method: GET
URL: /api/config/valid_rowids/
"""
config_rowid_list = ibs.db.get_all_rowids(const.CONFIG_TABLE)
return config_rowid_list
if __name__ == '__main__':
r"""
CommandLine:
python -m ibeis.control.manual_meta_funcs
python -m ibeis.control.manual_meta_funcs --allexamples
python -m ibeis.control.manual_meta_funcs --allexamples --noface --nosrc
RESTful:
Method: GET
URL: /api/contributor/query_config_rowid/
"""
import multiprocessing
multiprocessing.freeze_support() # for win32
import utool as ut # NOQA
ut.doctest_funcs()