Source code for ibeis.control.manual_wildbook_funcs

# -*- coding: utf-8 -*-
"""
CommandLine;
    # Reset IBEIS database (can skip if done)
    python -m ibeis.tests.reset_testdbs --reset_mtest
    python -m ibeis --tf reset_mtest

CommandLine;
    # Reset Wildbook database
    python -m ibeis.control.manual_wildbook_funcs --exec-reset_local_wildbook

    # Install Wildbook
    python -m ibeis.control.manual_wildbook_funcs --exec-install_wildbook

    # Startup Wildbook
    python -m ibeis.control.manual_wildbook_funcs --exec-startup_wildbook_server

    # Login to wildbook (can skip)
    python -m ibeis.control.manual_wildbook_funcs --exec-test_wildbook_login

    # Ship ImageSets to wildbook
    python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_imgsetid_list

    # Change annotations names to a single name
    python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_annot_name_changes:1

    # Change annotations names back to normal
    python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_annot_name_changes:2

"""
from __future__ import absolute_import, division, print_function
import six  # NOQA
import re
import utool as ut
import lockfile
import os
import requests
import time
import subprocess
from os.path import dirname, join, basename, splitext
from ibeis.control import controller_inject
from ibeis.control.controller_inject import make_ibs_register_decorator
print, rrr, profile = ut.inject2(__name__, '[manual_wildbook]')

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__)


#PREFERED_BROWSER = 'chrome'
#webbrowser._tryorder
PREFERED_BROWSER = None
if ut.get_computer_name() == 'hyrule':
    PREFERED_BROWSER = 'firefox'


# FIXME add as controller config
ALLOW_SYSTEM_TOMCAT = ut.get_argflag('--allow-system-tomcat')


[docs]def get_tomcat_startup_tmpdir(): dpath_list = [ #os.environ.get('CATALINA_TMPDIR', None), ut.ensure_app_resource_dir('ibeis', 'tomcat', 'ibeis_startup_tmpdir'), ] tomcat_startup_dir = ut.search_candidate_paths(dpath_list, verbose=True) return tomcat_startup_dir
@ut.tracefunc_xml
[docs]def find_tomcat(verbose=ut.NOT_QUIET): r""" Returns: str: tomcat_dpath CommandLine: python -m ibeis.control.manual_wildbook_funcs --test-find_tomcat python -m ibeis --tf find_tomcat Example: >>> # SCRIPT >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> tomcat_dpath = find_tomcat() >>> result = ('tomcat_dpath = %s' % (str(tomcat_dpath),)) >>> print(result) """ fname_list = ['Tomcat', 'tomcat'] if ALLOW_SYSTEM_TOMCAT: # Places for system install of tomcat if ut.WIN32: dpath_list = ['C:/Program Files (x86)', 'C:/Program Files'] else: dpath_list = ['/var/lib', '/usr/share', '/opt', '/lib'] if ut.DARWIN: dpath_list = ['/Library'] + dpath_list else: dpath_list = [] priority_paths = [ # Numberone preference is the CATALINA_HOME directory os.environ.get('CATALINA_HOME', None), # We put tomcat here if we can't find it ut.get_app_resource_dir('ibeis', 'tomcat') ] required_subpaths = [ 'webapps', 'bin', 'bin/catalina.sh', ] return_path = ut.search_candidate_paths(dpath_list, fname_list, priority_paths, required_subpaths, verbose=verbose) tomcat_dpath = return_path print('tomcat_dpath = %r ' % (tomcat_dpath,)) return tomcat_dpath
@ut.tracefunc_xml
[docs]def download_tomcat(): """ Put tomcat into a directory controlled by ibeis CommandLine: # Reset python -c "import utool as ut; ut.delete(ut.unixjoin(ut.get_app_resource_dir('ibeis'), 'tomcat'))" """ print('Grabbing tomcat') # FIXME: need to make a stable link if ut.WIN32: tomcat_binary_url = 'http://mirrors.advancedhosters.com/apache/tomcat/tomcat-8/v8.0.36/bin/apache-tomcat-8.0.36-windows-x86.zip' else: tomcat_binary_url = 'http://mirrors.advancedhosters.com/apache/tomcat/tomcat-8/v8.0.36/bin/apache-tomcat-8.0.36.zip' zip_fpath = ut.grab_file_url(tomcat_binary_url, appname='ibeis') # Download tomcat into the IBEIS resource directory tomcat_dpath = join(dirname(zip_fpath), 'tomcat') if not ut.checkpath(tomcat_dpath, verbose=True): # hack because unzipping is still weird ut.unzip_file(zip_fpath) tomcat_dpath_tmp = splitext(zip_fpath)[0] ut.move(tomcat_dpath_tmp, tomcat_dpath) if ut.checkpath(join(tomcat_dpath, 'bin'), verbose=True): scriptnames = ['catalina.sh', 'startup.sh', 'shutdown.sh'] for fname in scriptnames: fpath = join(tomcat_dpath, 'bin', fname) if not ut.is_file_executable(fpath): print('Adding executable bits to script %r' % (fpath,)) ut.chmod_add_executable(fpath) return tomcat_dpath
@ut.tracefunc_xml
[docs]def find_installed_tomcat(check_unpacked=True, strict=True): """ Asserts that tomcat was properly installed Args: check_unpacked (bool): (default = True) Returns: str: tomcat_dpath CommandLine: python -m ibeis --tmod ibeis.control.manual_wildbook_funcs --exec-find_installed_tomcat python -m ibeis.control.manual_wildbook_funcs --exec-find_installed_tomcat python -m ibeis -tm ibeis.control.manual_wildbook_funcs --exec-find_installed_tomcat python -m ibeis --tf find_installed_tomcat Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> check_unpacked = True >>> strict = False >>> tomcat_dpath = find_installed_tomcat(check_unpacked, strict) >>> result = ('tomcat_dpath = %s' % (str(tomcat_dpath),)) >>> print(result) """ tomcat_dpath = find_tomcat() if tomcat_dpath is None: msg = 'Cannot find tomcat' if strict: raise ImportError(msg) else: print(msg) return None if check_unpacked: import ibeis # Check that webapps was unpacked wb_target = ibeis.const.WILDBOOK_TARGET webapps_dpath = join(tomcat_dpath, 'webapps') unpacked_war_dpath = join(webapps_dpath, wb_target) ut.assertpath(unpacked_war_dpath) return tomcat_dpath
[docs]def find_or_download_tomcat(): r""" Returns: str: tomcat_dpath CommandLine: # Reset python -m ibeis.control.manual_wildbook_funcs --test-reset_local_wildbook python -m ibeis.control.manual_wildbook_funcs --test-find_or_download_tomcat python -m ibeis --tf reset_local_wildbook python -m ibeis --tf find_or_download_tomcat Example: >>> # SCRIPT >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> tomcat_dpath = find_or_download_tomcat() >>> result = ('tomcat_dpath = %s' % (str(tomcat_dpath),)) >>> print(result) """ tomcat_dpath = find_tomcat() if tomcat_dpath is None: tomcat_dpath = download_tomcat() else: ut.assertpath(tomcat_dpath) return tomcat_dpath
[docs]def find_java_jvm(): r""" CommandLine: python -m ibeis.control.manual_wildbook_funcs --test-find_java_jvm Example: >>> # DISABLE_DOCTEST >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> result = find_java_jvm() >>> print(result) """ candidate_path_list = [ #os.environ.get('JAVA_HOME', None), #'/usr/lib/jvm/java-7-openjdk-amd64', ] jvm_fpath = ut.search_candidate_paths(candidate_path_list, verbose=True) ut.assertpath(jvm_fpath, 'IBEIS cannot find Java Runtime Environment') return jvm_fpath
[docs]def find_or_download_wilbook_warfile(): r""" scp jonc@pachy.cs.uic.edu:/var/lib/tomcat/webapps/ibeis.war \ ~/Downloads/pachy_ibeis.war wget http://dev.wildme.org/ibeis_data_dir/ibeis.war """ war_url = 'http://dev.wildme.org/ibeis_data_dir/ibeis.war' war_fpath = ut.grab_file_url(war_url, appname='ibeis') return war_fpath
[docs]def reset_local_wildbook(): r""" CommandLine: python -m ibeis.control.manual_wildbook_funcs --test-reset_local_wildbook Example: >>> # SCRIPT >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> reset_local_wildbook() """ try: shutdown_wildbook_server() except ImportError: pass ut.delete(ut.unixjoin(ut.get_app_resource_dir('ibeis'), 'tomcat'))
@ut.tracefunc_xml
[docs]def install_wildbook(verbose=ut.NOT_QUIET): """ Script to setup wildbook on a unix based system (hopefully eventually this will generalize to win32) CommandLine: # Reset python -m ibeis --tf reset_local_wildbook # Setup python -m ibeis --tf install_wildbook # Startup python -m ibeis --tf startup_wildbook_server --show --exec-mode # Reset python -m ibeis.control.manual_wildbook_funcs --test-reset_local_wildbook # Setup python -m ibeis.control.manual_wildbook_funcs --test-install_wildbook # Startup python -m ibeis.control.manual_wildbook_funcs --test-startup_wildbook_server --show --exec-mode Example: >>> # SCRIPT >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> verbose = True >>> result = install_wildbook() >>> print(result) """ # TODO: allow custom specified tomcat directory try: output = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT) _java_version = output.split('\n')[0] _java_version = _java_version.replace('java version ', '') java_version = _java_version.replace('"', '') print('java_version = %r' % (java_version,)) if not java_version.startswith('1.7'): print('Warning wildbook is only supported for java 1.7') except OSError: output = None if output is None: raise ImportError( 'Cannot find java on this machine. ' 'Please install java: http://www.java.com/en/download/') tomcat_dpath = find_or_download_tomcat() assert tomcat_dpath is not None, 'Could not find tomcat' war_fpath = find_or_download_wilbook_warfile() war_fname = basename(war_fpath) wb_target = splitext(war_fname)[0] # Ensure environment variables #os.environ['JAVA_HOME'] = find_java_jvm() #os.environ['TOMCAT_HOME'] = tomcat_dpath #os.environ['CATALINA_HOME'] = tomcat_dpath # Move the war file to tomcat webapps if not there webapps_dpath = join(tomcat_dpath, 'webapps') deploy_war_fpath = join(webapps_dpath, war_fname) if not ut.checkpath(deploy_war_fpath, verbose=verbose): ut.copy(war_fpath, deploy_war_fpath) # Ensure that the war file has been unpacked unpacked_war_dpath = join(webapps_dpath, wb_target) if not ut.checkpath(unpacked_war_dpath, verbose=verbose): # Need to make sure you start catalina in the same directory otherwise # the derby databsae gets put in in cwd tomcat_startup_dir = get_tomcat_startup_tmpdir() with ut.ChdirContext(tomcat_startup_dir): # Starting and stoping catalina should be sufficient to unpack the # war startup_fpath = join(tomcat_dpath, 'bin', 'startup.sh') shutdown_fpath = join(tomcat_dpath, 'bin', 'shutdown.sh') ut.cmd(ut.quote_single_command(startup_fpath)) print('It is NOT ok if the startup.sh fails\n') # wait for the war to be unpacked for retry_count in range(0, 6): time.sleep(1) if ut.checkpath(unpacked_war_dpath, verbose=True): break else: print('Retrying') # ensure that the server is ruuning import requests print('Checking if we can ping the server') response = requests.get('http://localhost:8080') if response is None or response.status_code != 200: print('There may be an error starting the server') else: print('Seem able to ping the server') # assert tht the war was unpacked ut.assertpath(unpacked_war_dpath, ( 'Wildbook war might have not unpacked correctly. This may ' 'be ok. Try again. If it fails a second time, then there is a ' 'problem.'), verbose=True) # shutdown the server ut.cmd(ut.quote_single_command(shutdown_fpath)) print('It is ok if the shutdown.sh fails') time.sleep(.5) # Make sure permissions are correctly set in wildbook # Comment out the line that requires authentication permission_fpath = join(unpacked_war_dpath, 'WEB-INF/web.xml') ut.assertpath(permission_fpath) permission_text = ut.readfrom(permission_fpath) lines_to_remove = [ # '/ImageSetSetMarkedIndividual = authc, roles[admin]' '/EncounterSetMarkedIndividual = authc, roles[admin]' ] new_permission_text = permission_text[:] for line in lines_to_remove: re.search(re.escape(line), permission_text) prefix = ut.named_field('prefix', '\\s*') suffix = ut.named_field('suffix', '\\s*\n') pattern = ('^' + prefix + re.escape(line) + suffix) match = re.search(pattern, permission_text, flags=re.MULTILINE | re.DOTALL) if match is None: continue newline = '<!--%s -->' % (line,) repl = ut.bref_field('prefix') + newline + ut.bref_field('suffix') new_permission_text = re.sub(pattern, repl, permission_text, flags=re.MULTILINE | re.DOTALL) assert new_permission_text != permission_text, ( 'text should have changed') if new_permission_text != permission_text: print('Need to write new permission texts') ut.writeto(permission_fpath, new_permission_text) else: print('Permission file seems to be ok') print('Wildbook is installed and waiting to be started')
@ut.tracefunc_xml
[docs]def startup_wildbook_server(verbose=ut.NOT_QUIET): r""" Args: verbose (bool): verbosity flag(default = True) CommandLine: python -m ibeis.control.manual_wildbook_funcs --test-startup_wildbook_server python -m ibeis --tf startup_wildbook_server --show Example: >>> # DISABLE_DOCTEST >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> verbose = True >>> wb_url = startup_wildbook_server() >>> ut.quit_if_noshow() >>> ut.get_prefered_browser(PREFERED_BROWSER).open_new_tab(wb_url) """ # TODO: allow custom specified tomcat directory import ibeis tomcat_dpath = find_installed_tomcat() # Ensure environment variables #os.environ['JAVA_HOME'] = find_java_jvm() #os.environ['TOMCAT_HOME'] = tomcat_dpath #os.environ['CATALINA_HOME'] = tomcat_dpath with ut.ChdirContext(get_tomcat_startup_tmpdir()): startup_fpath = join(tomcat_dpath, 'bin', 'startup.sh') ut.cmd(ut.quote_single_command(startup_fpath)) time.sleep(1) wb_url = 'http://localhost:8080/' + ibeis.const.WILDBOOK_TARGET return wb_url
[docs]def shutdown_wildbook_server(verbose=ut.NOT_QUIET): r""" Args: verbose (bool): verbosity flag(default = True) CommandLine: python -m ibeis.control.manual_wildbook_funcs --exec-shutdown_wildbook_server --exec-mode python -m ibeis --tf shutdown_wildbook_server Example: >>> # DISABLE_DOCTEST >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> verbose = True >>> wb_url = shutdown_wildbook_server() >>> ut.quit_if_noshow() >>> ut.get_prefered_browser(PREFERED_BROWSER).open_new_tab(wb_url) """ # TODO: allow custom specified tomcat directory tomcat_dpath = find_installed_tomcat(check_unpacked=False) # Ensure environment variables #os.environ['JAVA_HOME'] = find_java_jvm() #os.environ['TOMCAT_HOME'] = tomcat_dpath #os.environ['CATALINA_HOME'] = tomcat_dpath with ut.ChdirContext(get_tomcat_startup_tmpdir()): shutdown_fpath = join(tomcat_dpath, 'bin', 'shutdown.sh') #ut.cmd(shutdown_fpath) ut.cmd(ut.quote_single_command(shutdown_fpath)) time.sleep(.5)
[docs]def test_wildbook_login(): r""" Helper function to test wildbook login automagically Returns: tuple: (wb_target, tomcat_dpath) CommandLine: python -m ibeis.control.manual_wildbook_funcs --exec-test_wildbook_login python -m ibeis --tf test_wildbook_login Example: >>> # DISABLE_DOCTEST >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> test_wildbook_login() """ # Use selenimum to login to wildbook import ibeis manaul_login = False wb_target = ibeis.const.WILDBOOK_TARGET wb_url = 'http://localhost:8080/' + wb_target if manaul_login: ut.get_prefered_browser(PREFERED_BROWSER).open_new_tab(wb_url) else: driver = ut.grab_selenium_driver(PREFERED_BROWSER) driver.get(wb_url) login_button = driver.find_element_by_partial_link_text('Log in') login_button.click() # Find login elements username_field = driver.find_element_by_name('username') password_field = driver.find_element_by_name('password') submit_login_button = driver.find_element_by_name('submit') rememberMe_button = driver.find_element_by_name('rememberMe') # Execute elements username_field.send_keys('tomcat') password_field.send_keys('tomcat123') rememberMe_button.click() submit_login_button.click() # Accept agreement import selenium.common.exceptions try: accept_aggrement_button = driver.find_element_by_name('acceptUserAgreement') accept_aggrement_button.click() except selenium.common.exceptions.NoSuchElementException: pass # Goto individuals page individuals = driver.find_element_by_partial_link_text('Individuals') individuals.click() view_all = driver.find_element_by_partial_link_text('View All') view_all.click()
[docs]def testdata_wildbook_server(): """ DEPRICATE SeeAlso: ~/local/build_scripts/init_wildbook.sh """ # Very hacky and specific testdata script. #if ut.is_developer(): # tomcat_dpath = join(os.environ['CODE_DIR'], # 'Wildbook/tmp/apache-tomcat-8.0.36') #else: # tomcat_dpath = '/var/lib/tomcat' import ibeis tomcat_dpath = find_installed_tomcat() wb_target = ibeis.const.WILDBOOK_TARGET return wb_target, tomcat_dpath
@register_ibs_method
[docs]def get_wildbook_target(ibs): return ibs.const.WILDBOOK_TARGET
@register_ibs_method
[docs]def get_wildbook_info(ibs, tomcat_dpath=None, wb_target=None): # TODO: Clean this up wildbook_base_url = ibs.get_wildbook_base_url(wb_target) wildbook_tomcat_path = ibs.get_wildbook_tomcat_path(tomcat_dpath, wb_target) # Setup print('Looking for WildBook installation: %r' % ( wildbook_tomcat_path, )) ut.assert_exists(wildbook_tomcat_path, 'Wildbook is not installed on this machine', info=True) return wildbook_base_url, wildbook_tomcat_path
@register_ibs_method
[docs]def get_wildbook_tomcat_path(ibs, tomcat_dpath=None, wb_target=None): DEFAULT_TOMCAT_PATH = find_installed_tomcat() tomcat_dpath = DEFAULT_TOMCAT_PATH if tomcat_dpath is None else tomcat_dpath wb_target = ibs.const.WILDBOOK_TARGET if wb_target is None else wb_target wildbook_tomcat_path = join(tomcat_dpath, 'webapps', wb_target) return wildbook_tomcat_path
@register_ibs_method
[docs]def get_wildbook_base_url(ibs, wb_target=None): wb_target = ibs.const.WILDBOOK_TARGET if wb_target is None else wb_target hostname = '127.0.0.1' wb_port = 8080 wildbook_base_url = 'http://' + str(hostname) + ':' + str(wb_port) + '/' + wb_target return wildbook_base_url
[docs]def submit_wildbook_url(url, payload=None, browse_on_error=True, dryrun=False, timeout=2): """ mirroring the one in IBEISController.py, but with changed functionality """ if dryrun: print('[DRYrun_submit] URL=%r' % (url, )) response = None status = True else: if ut.VERBOSE: print('[submit] URL=%r' % (url, )) try: if payload is None: response = requests.get(url, timeout=timeout) #response = requests.get(url, auth=('tomcat', 'tomcat123')) else: response = requests.post(url, data=payload, timeout=timeout) #r = requests.post(url, data=None, auth=('tomcat', 'tomcat123')) except requests.ConnectionError as ex: ut.printex(ex, 'Could not connect to Wildbook server url=%r' % url) raise else: status = True if response is None or response.status_code != 200: errmsg_list = ([('Wildbook response NOT ok (200)')]) if response is None: errmsg_list.extend([ ('WILDBOOK SERVER RESPONSE = %r' % (response, )), ]) else: errmsg_list.extend([ ('WILDBOOK SERVER STATUS = %r' % (response.status_code,)), ('WILDBOOK SERVER RESPONSE TEXT = %r' % (response.text,)), ]) errmsg = '\n'.join(errmsg_list) print(errmsg) if browse_on_error: ut.get_prefered_browser(PREFERED_BROWSER).open_new_tab(url) raise AssertionError(errmsg) status = False return status, response
@ut.tracefunc_xml
[docs]def update_wildbook_config(ibs, wildbook_tomcat_path, dryrun=False): wildbook_properteis_dpath = join(wildbook_tomcat_path, 'WEB-INF/classes/bundles/') print('[ibs.update_wildbook_config()] Wildbook properties=%r' % ( wildbook_properteis_dpath, )) # The src file is non-standard. It should be remove here as well wildbook_config_fpath_dst = join(wildbook_properteis_dpath, 'commonConfiguration.properties') ut.assert_exists(wildbook_properteis_dpath) # for come reason the .default file is not there, that should be ok though orig_content = ut.read_from(wildbook_config_fpath_dst) content = orig_content content = re.sub('IBEIS_DB_path = .*', 'IBEIS_DB_path = ' + ibs.get_db_core_path(), content) content = re.sub('IBEIS_image_path = .*', 'IBEIS_image_path = ' + ibs.get_imgdir(), content) # Write to the configuration if it is different if orig_content != content: need_sudo = not ut.is_file_writable(wildbook_config_fpath_dst) if need_sudo: quoted_content = '"%s"' % (content, ) print('Attempting to gain sudo access to update wildbook config') command = ['sudo', 'sh', '-c', '\'', 'echo', quoted_content, '>', wildbook_config_fpath_dst, '\''] # ut.cmd(command, sudo=True) command = ' '.join(command) if not dryrun: os.system(command) else: ut.write_to(wildbook_config_fpath_dst, content)
@register_ibs_method @register_api('/api/wildbook/signal_annot_name_changes/', methods=['PUT'])
[docs]def wildbook_signal_annot_name_changes(ibs, aid_list=None, tomcat_dpath=None, wb_target=None, dryrun=False): r""" Args: aid_list (int): list of annotation ids(default = None) tomcat_dpath (None): (default = None) wb_target (None): (default = None) dryrun (bool): (default = False) CommandLine: python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_annot_name_changes:0 --dryrun python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_annot_name_changes:1 --dryrun python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_annot_name_changes:1 python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_annot_name_changes:2 python -m ibeis --tf wildbook_signal_annot_name_changes:0 --dryrun python -m ibeis --tf wildbook_signal_annot_name_changes:1 --dryrun python -m ibeis --tf wildbook_signal_annot_name_changes:1 python -m ibeis --tf wildbook_signal_annot_name_changes:2 Example: >>> # DISABLE_DOCTEST >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb(defaultdb='PZ_MTEST') >>> #gid_list = ibs.get_valid_gids()[0:10] >>> gid_list = ibs.get_valid_gids()[3:5] >>> aid_list = ut.flatten(ibs.get_image_aids(gid_list)) >>> # Test case where some names change, some do not. There are no new names. >>> old_nid_list = ibs.get_annot_name_rowids(aid_list) >>> new_nid_list = ut.list_roll(old_nid_list, 1) >>> ibs.set_annot_name_rowids(aid_list, new_nid_list) >>> dryrun = ut.get_argflag('--dryrun') >>> wb_target, tomcat_dpath = testdata_wildbook_server() >>> result = ibs.wildbook_signal_annot_name_changes(aid_list, tomcat_dpath, wb_target, dryrun) >>> ibs.set_annot_name_rowids(aid_list, old_nid_list) Example: >>> # DISABLE_DOCTEST >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb(defaultdb='PZ_MTEST') >>> #gid_list = ibs.get_valid_gids()[0:10] >>> gid_list = ibs.get_valid_gids()[3:5] >>> aid_list = ut.flatten(ibs.get_image_aids(gid_list)) >>> # Test case where all names change to one known name >>> #old_nid_list = ibs.get_annot_name_rowids(aid_list) >>> #new_nid_list = [old_nid_list[0]] * len(old_nid_list) >>> old_nid_list = [1, 2] >>> new_nid_list = [1, 1] >>> print('old_nid_list = %r' % (old_nid_list,)) >>> print('new_nid_list = %r' % (new_nid_list,)) >>> ibs.set_annot_name_rowids(aid_list, new_nid_list) >>> dryrun = ut.get_argflag('--dryrun') >>> wb_target, tomcat_dpath = testdata_wildbook_server() >>> result = ibs.wildbook_signal_annot_name_changes(aid_list, tomcat_dpath, wb_target, dryrun) >>> # Undo changes here (not undone in wildbook) >>> #ibs.set_annot_name_rowids(aid_list, old_nid_list) Example: >>> # DISABLE_DOCTEST >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb(defaultdb='PZ_MTEST') >>> gid_list = ibs.get_valid_gids()[3:5] >>> aid_list = ut.flatten(ibs.get_image_aids(gid_list)) >>> old_nid_list = [1, 2] >>> ibs.set_annot_name_rowids(aid_list, old_nid_list) >>> # Signal what currently exists (should put them back to normal) >>> dryrun = ut.get_argflag('--dryrun') >>> wb_target, tomcat_dpath = testdata_wildbook_server() >>> result = ibs.wildbook_signal_annot_name_changes(aid_list, tomcat_dpath, wb_target, dryrun) """ print('[ibs.wildbook_signal_imgsetid_list()] signaling any annotation name changes to wildbook') wildbook_base_url, wildbook_tomcat_path = ibs.get_wildbook_info(tomcat_dpath, wb_target) # url_command = 'ImageSetSetMarkedIndividual' url_command = 'EncounterSetMarkedIndividual' BASIC_AUTH = False if BASIC_AUTH: #url_command += '=authcBasicWildbook' username = 'tomcat' password = 'tomcat123' wildbook_base_url = ('http://' + username + ':' + password + '@' + wildbook_base_url.replace('http://', '')) url_args_fmtstr = '&'.join([ 'annotID={annot_uuid!s}', 'individualID={name_text!s}', ]) submit_namchange_url_fmtstr = ( wildbook_base_url + '/' + url_command + '?' + url_args_fmtstr) if aid_list is None: aid_list = ibs.get_valid_aids(is_known=True) # Build URLs to submit annot_uuid_list = ibs.get_annot_uuids(aid_list) annot_name_text_list = ibs.get_annot_name_texts(aid_list) submit_url_list = [ submit_namchange_url_fmtstr.format( annot_uuid=str(annot_uuid), name_text=str(name_text)) for annot_uuid, name_text in zip(annot_uuid_list, annot_name_text_list) ] payload = {} # Submit each URL status_list = [] print('Submitting URL list') print(ut.indentjoin(submit_url_list)) message_list = [] for url in ut.ProgressIter(submit_url_list, lbl='submitting URL', freq=1): print(url) status, response = submit_wildbook_url(url, payload, dryrun=dryrun) #print(ut.dict_str(response.__dict__, truncate=0)) status_list.append(status) try: response_json = response.json() # imageset in this message is a wb-imageset not our ia-imageset #if ut.VERBOSE: print(response_json['message']) message_list.append(str(response_json['message'])) except Exception as ex: print(ut.indentjoin(message_list)) ut.printex(ex, ('Failed getting json from response. ' 'Is there an authentication issue?')) raise assert response_json['success'] print(ut.indentjoin(message_list)) return status_list
@register_ibs_method @register_api('/api/wildbook/signal_imgsetid_list/', methods=['PUT'])
[docs]def wildbook_signal_imgsetid_list(ibs, imgsetid_list=None, set_shipped_flag=True, open_url_on_complete=True, tomcat_dpath=None, wb_target=None, dryrun=False): """ Exports specified imagesets to wildbook. This is a synchronous call. Args: imgsetid_list (list): (default = None) set_shipped_flag (bool): (default = True) open_url_on_complete (bool): (default = True) RESTful: Method: PUT URL: /api/wildbook/signal_imgsetid_list/ Ignore: cd $CODE_DIR/Wildbook/tmp # Reset IBEIS database python -m ibeis.tests.reset_testdbs --reset_mtest python -m ibeis --tf reset_mtest # Reset Wildbook database #python -m ibeis.control.manual_wildbook_funcs --exec-reset_local_wildbook python -m ibeis --tf reset_local_wildbook # Install Wildbook #python -m ibeis.control.manual_wildbook_funcs --test-install_wildbook python -m ibeis --tf install_wildbook # Startup Wildbook #python -m ibeis.control.manual_wildbook_funcs --test-startup_wildbook_server python -m ibeis --tf startup_wildbook_server # Login to wildbook #python -m ibeis.control.manual_wildbook_funcs --exec-test_wildbook_login python -m ibeis --tf test_wildbook_login # Ship ImageSets to wildbook #python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_imgsetid_list python -m ibeis --tf wildbook_signal_imgsetid_list # Change annotations names to a single name #python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_annot_name_changes:1 python -m ibeis --tf wildbook_signal_annot_name_changes:1 # Change annotations names back to normal #python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_annot_name_changes:2 python -m ibeis --tf wildbook_signal_annot_name_changes:2 CommandLine: python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_imgsetid_list python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_imgsetid_list --dryrun python -m ibeis.control.manual_wildbook_funcs --test-wildbook_signal_imgsetid_list --break SeeAlso: ~/local/build_scripts/init_wildbook.sh Example: >>> # DISABLE_DOCTEST >>> from ibeis.control.manual_wildbook_funcs import * # NOQA >>> dryrun = ut.get_argflag('--dryrun') >>> wb_target, tomcat_dpath = testdata_wildbook_server() >>> import ibeis >>> ibs = ibeis.opendb(defaultdb='PZ_MTEST') >>> #gid_list = ibs.get_valid_gids()[0:10] >>> gid_list = ibs.get_valid_gids()[3:5] >>> new_imgsetid = ibs.create_new_imageset_from_images(gid_list) # NOQA >>> print('new imageset uuid = %r' % (ibs.get_imageset_uuid(new_imgsetid),)) >>> print('new imageset text = %r' % (ibs.get_imageset_text(new_imgsetid),)) >>> imgsetid_list = [new_imgsetid] >>> ibs.set_imageset_processed_flags([new_imgsetid], [1]) >>> gid_list = ibs.get_imageset_gids(new_imgsetid) >>> ibs.set_image_reviewed(gid_list, [1] * len(gid_list)) >>> set_shipped_flag = True >>> open_url_on_complete = True >>> result = ibs.wildbook_signal_imgsetid_list(imgsetid_list, set_shipped_flag, open_url_on_complete, tomcat_dpath, wb_target, dryrun) >>> # cleanup >>> #ibs.delete_imagesets(new_imgsetid) >>> print(result) """ def _send(imgsetid, use_config_file=False, dryrun=dryrun): imageset_uuid = ibs.get_imageset_uuid(imgsetid) url = submit_imgsetid_url_fmtstr.format(imageset_uuid=imageset_uuid) print('[_send] URL=%r' % (url, )) smart_xml_fname = ibs.get_imageset_smart_xml_fnames([imgsetid])[0] smart_waypoint_id = ibs.get_imageset_smart_waypoint_ids([imgsetid])[0] if smart_xml_fname is not None and smart_waypoint_id is not None: # Send smart data if availabel print(smart_xml_fname, smart_waypoint_id) smart_xml_fpath = join(ibs.get_smart_patrol_dir(), smart_xml_fname) smart_xml_content_list = open(smart_xml_fpath).readlines() print('[_send] Sending with SMART payload') print('[_send] - patrol: %r (%d lines) waypoint_id: %r' % (smart_xml_fpath, len(smart_xml_content_list), smart_waypoint_id)) smart_xml_content = ''.join(smart_xml_content_list) payload = { 'smart_xml_content': smart_xml_content, 'smart_waypoint_id': smart_waypoint_id, } if not use_config_file: payload.update({ 'IBEIS_DB_path' : ibs.get_db_core_path(), 'IBEIS_image_path' : ibs.get_imgdir(), }) else: payload = None status, response = submit_wildbook_url(url, payload, dryrun=dryrun) return status def _complete(imgsetid): imageset_uuid = ibs.get_imageset_uuid(imgsetid) complete_url_ = complete_url_fmtstr.format( imageset_uuid=imageset_uuid) print('[_complete] URL=%r' % (complete_url_, )) if open_url_on_complete and not dryrun: _browser = ut.get_prefered_browser(PREFERED_BROWSER) _browser.open_new_tab(complete_url_) if imgsetid_list is None: imgsetid_list = ibs.get_valid_imgsetids() # Check to make sure imagesets are ok: for imgsetid in imgsetid_list: # First, check if imageset can be pushed aid_list = ibs.get_imageset_aids(imgsetid) assert len(aid_list) > 0, ( 'ImageSet imgsetid=%r cannot be shipped with0 annots' % (imgsetid,)) unknown_flags = ibs.is_aid_unknown(aid_list) unnamed_aid_list = ut.compress(aid_list, unknown_flags) assert len(unnamed_aid_list) == 0, ( ('ImageSet imgsetid=%r cannot be shipped becuase ' 'annotation(s) %r are not named') % (imgsetid, unnamed_aid_list, )) # Configuration use_config_file = True wildbook_base_url, wildbook_tomcat_path = ibs.get_wildbook_info( tomcat_dpath, wb_target) submit_imgsetid_url_fmtstr = ( wildbook_base_url + # TODO: wildbook should rename their function # '/OccurrenceCreateIBEIS?ibeis_imageset_id={imageset_uuid!s}') '/OccurrenceCreateIBEIS?ibeis_encounter_id={imageset_uuid!s}') complete_url_fmtstr = ( wildbook_base_url + '/occurrence.jsp?number={imageset_uuid!s}') # Call Wildbook url to signal update print('[ibs.wildbook_signal_imgsetid_list] ship imgsetid_list = %r to wildbook' % ( imgsetid_list, )) # With a lock file, modify the configuration with the new settings lock_fpath = join(ibs.get_ibeis_resource_dir(), 'wildbook.lock') with lockfile.LockFile(lock_fpath): # Update the Wildbook configuration to see *THIS* ibeis database if use_config_file: update_wildbook_config(ibs, wildbook_tomcat_path, dryrun) # Check and push 'done' imagesets status_list = [] for imgsetid in imgsetid_list: #Check for nones status = _send(imgsetid, use_config_file=use_config_file, dryrun=dryrun) status_list.append(status) if set_shipped_flag and not dryrun: if status: ibs.set_imageset_shipped_flags([imgsetid], [1]) _complete(imgsetid) else: ibs.set_imageset_shipped_flags([imgsetid], [0]) return status_list
if __name__ == '__main__': """ CommandLine: python -m ibeis.control.manual_wildbook_funcs python -m ibeis.control.manual_wildbook_funcs --allexamples python -m ibeis.control.manual_wildbook_funcs --allexamples --noface --nosrc """ import multiprocessing multiprocessing.freeze_support() # for win32 import utool as ut # NOQA ut.doctest_funcs()