--- loncom/interface/lonsearchcat.pm 2013/09/01 22:39:39 1.336 +++ loncom/interface/lonsearchcat.pm 2015/06/12 21:11:07 1.345 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.336 2013/09/01 22:39:39 raeburn Exp $ +# $Id: lonsearchcat.pm,v 1.345 2015/06/12 21:11:07 damieng Exp $ # # Copyright Michigan State University Board of Trustees # @@ -52,8 +52,6 @@ search (on a server basis) is displayed =head1 Internals -=over 4 - =cut ############################################################################### @@ -80,6 +78,7 @@ use Apache::lonnavmaps; use Apache::lonindexer(); use Apache::lonwishlist(); use LONCAPA; +use Time::HiRes qw(sleep); ###################################################################### ###################################################################### @@ -145,7 +144,7 @@ sub handler { ## this once, so the pause indicator is deleted ## if (exists($env{'form.pause'})) { - sleep(1); + Time::HiRes::sleep(0.1); delete($env{'form.pause'}); } ## @@ -172,7 +171,7 @@ sub handler { &Apache::lonhtmlcommon::clear_breadcrumbs(); my @allowed_searches = ('portfolio'); - if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) { + if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') { push(@allowed_searches,'res'); } my $crumb_text = 'Portfolio Search'; @@ -195,12 +194,15 @@ sub handler { &Apache::lonnet::logthis('lonsearchcat:'. 'Unable to recover data from '. $persistent_db_file); - my $msg = - 'We were unable to retrieve data describing your search. '. - 'This is a serious error and has been logged. '. - 'Please alert your LON-CAPA administrator.'; - &Apache::loncommon::simple_error_page($r,'Search Error', - $msg); + my $msg = + &mt('We were unable to retrieve data describing your search.'). + ' '.&mt('This is a serious error and has been logged.'). + '
'. + &mt('Please alert your LON-CAPA administrator.'); + &Apache::loncommon::simple_error_page( + $r,'Search Error', + $msg, + {'no_auto_mt_msg' => 1}); return OK; } } @@ -428,8 +430,10 @@ sub hidden_field { ###################################################################### -=pod +=pod +=over 4 + =item &print_basic_search_form() Prints the form for the basic search. Sorry the name is so cryptic. @@ -446,7 +450,7 @@ sub print_basic_search_form { $env{'form.catalogmode'} ne 'import'); my $scrout = &Apache::loncommon::start_page('Content Library').$bread_crumb; # Search form for resource space - if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) { + if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') { $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton); $scrout .= '

'; } @@ -1015,7 +1019,7 @@ This function is the reverse of &make_pe Retrieve persistent data from %persistent_db. Retrieved items will have their values unescaped. If the item is 'domains; then the returned value will be a hash pointer. Otherwise, if the item contains -commas (before unescaping), the returned value will be an array pointer. +commas (before unescaping), the returned value will be an array pointer. =cut @@ -1071,7 +1075,7 @@ Store variables away to the %persistent_ Values will be escaped. Values that are array pointers will have their elements escaped and concatenated in a comma separated string. Values that are hash pointers will have their keys and values escaped and -concatenated in a comma separated string +concatenated in a comma separated string. =cut @@ -2047,17 +2051,15 @@ sub print_sort_form { &Apache::lonnet::logthis(&Apache::lonmysql::get_error()); return; } + # update results + my $newloc = '/adm/searchcat?phase=results&persistent_db_id='. + $env{'form.persistent_db_id'}; my $js =< -// + var frame = parent.resultsframe; + var frameDoc = frame.document; + if (frameDoc.readyState == 'complete') + frame.location = "$newloc"; END @@ -2087,7 +2089,7 @@ END # $result.="\n"; my $revise = &revise_button(); $result.='

' - .&mt('There are [_1] matches to your query.',$total_results) + .&mt('Total of [quant,_1,match,matches] to your query.',$total_results) .' '.$revise.'

' .'

'.&mt('Search: ').$pretty_query_string .'

'; @@ -2225,8 +2227,24 @@ SCRIPT $r->rflush(); } +sub reload_result_frame { + my ($r) = @_; + my $newloc = '/adm/searchcat?phase=results&persistent_db_id='. + $env{'form.persistent_db_id'}; + $r->print(< + var frame = parent.resultsframe; + var frameDoc = frame.document; + if (frameDoc.readyState == 'complete') + frame.location = "$newloc"; + +SCRIPT + + $r->rflush(); +} + { - my $max_time = 300; # seconds for the search to complete + my $max_time = 60; # seconds for the search to complete my $start_time = 0; my $last_time = 0; @@ -2359,7 +2377,7 @@ END my $major = $1; my $minor = $2; if (($major < 2) || (($major == 2) && ($minor < 11))) { - map { $older_library_servers{$_} = 1; } + map { $older_library_servers{$_} = 1; } &Apache::lonnet::machine_ids($library_servers{$key}); } } @@ -2369,7 +2387,7 @@ END foreach my $server (@Servers_to_contact) { my %possdoms; map { $possdoms{$_}=1; } &Apache::lonnet::machine_domains($all_library_servers{$server}); - $domains_by_server{$server} = + $domains_by_server{$server} = join(',',sort(&Apache::lonnet::machine_domains($all_library_servers{$server}))); } } @@ -2407,6 +2425,7 @@ END ## ## Prepare for the big loop. my $hitcountsum; + my $oldhitcountsum; my %matches; my $server; my $status; @@ -2453,7 +2472,7 @@ END &update_status($r, &mt('waiting on [_1]',join(' ',keys(%Server_status)))); } - sleep(1); + Time::HiRes::sleep(0.1); } # # Loop through the servers we have contacted but do not @@ -2529,7 +2548,13 @@ END delete($Server_status{$server}); } last if ($connection->aborted()); - &update_count_status($r,$hitcountsum); + if ($oldhitcountsum < $hitcountsum) { + &update_count_status($r,$hitcountsum); + if ($hitcountsum <= $env{'form.show'}) { + reload_result_frame($r); + } + $oldhitcountsum = $hitcountsum; + } } last if ($connection->aborted()); &update_seconds($r); @@ -2623,6 +2648,8 @@ sub display_results { if ($env{'form.catalogmode'} eq 'import') { if (! tie(%groupsearch_db,'GDBM_File',$diropendb, &GDBM_WRCREAT(),0640)) { + # NOTE: this can happen when a previous request to searchcat?phase=results gets interrupted + # (%groupsearch_db is not untied) $r->print('

'. &mt('Unable to save import results.'). '

'. @@ -2631,6 +2658,10 @@ sub display_results { $r->rflush(); return; } + # untie %groupsearch_db if the connection gets aborted before the end + $r->register_cleanup(sub { + untie %groupsearch_db if (tied(%groupsearch_db)); + }); } ## ## Prepare the table for querying @@ -2772,8 +2803,7 @@ sub display_results { ); if ($total_results == 0) { - $r->print(''. - '

'.&mt('There are currently no results.').'

'. + $r->print('

'.&mt('There are currently no results.').'

'. "". &Apache::loncommon::end_page()); return; @@ -3148,7 +3178,8 @@ SCRIPT my $start_page = &Apache::loncommon::start_page(undef,$js, {'only_body' =>1, - 'add_wishlist' =>1}); + 'add_wishlist' =>1, + 'add_modal' =>1}); my $result=< @@ -3796,7 +3827,7 @@ Cleans the global %groupsearch_db by rem ###################################################################### sub start_fresh_session { delete $groupsearch_db{'mode_catalog'}; - foreach (keys %groupsearch_db) { + foreach (keys(%groupsearch_db)) { if ($_ =~ /^pre_/) { delete $groupsearch_db{$_}; }