Diff for /loncom/interface/lonsearchcat.pm between versions 1.331.4.16.2.2 and 1.332

version 1.331.4.16.2.2, 2023/12/30 03:56:48 version 1.332, 2012/12/07 18:16:33
Line 52  search (on a server basis) is displayed Line 52  search (on a server basis) is displayed
   
 =head1 Internals  =head1 Internals
   
   =over 4
   
 =cut  =cut
   
 ###############################################################################  ###############################################################################
Line 78  use Apache::lonnavmaps; Line 80  use Apache::lonnavmaps;
 use Apache::lonindexer();  use Apache::lonindexer();
 use Apache::lonwishlist();  use Apache::lonwishlist();
 use LONCAPA;  use LONCAPA;
 use Time::HiRes qw(sleep);  
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 144  sub handler { Line 145  sub handler {
     ##     this once, so the pause indicator is deleted      ##     this once, so the pause indicator is deleted
     ##      ##
     if (exists($env{'form.pause'})) {      if (exists($env{'form.pause'})) {
         sleep(0.1);          sleep(1);
         delete($env{'form.pause'});          delete($env{'form.pause'});
     }      }
     ##      ##
Line 171  sub handler { Line 172  sub handler {
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
   
     my @allowed_searches = ('portfolio');      my @allowed_searches = ('portfolio');
     if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') {      if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {
         push(@allowed_searches,'res');          push(@allowed_searches,'res');
     }       } 
     my $crumb_text = 'Portfolio Search';      my $crumb_text = 'Portfolio Search';
     if (@allowed_searches ==2) {      if (@allowed_searches ==2) {
        $crumb_text = 'Portfolio and Content Library Search';          $crumb_text = 'Portfolio and Catalog Search'; 
     }  
     my $target = '_top';  
     if ((($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) ||  
         (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self'))) {  
         if ($env{'form.phase'} =~ /^(sort|run_search)$/) {  
             $target = '_parent';  
         } else {  
             $target = '_self';  
         }  
     }      }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>'/adm/searchcat?'.         ({href=>'/adm/searchcat?'.
Line 194  sub handler { Line 186  sub handler {
                '&launch='.$env{'form.launch'}.                 '&launch='.$env{'form.launch'}.
                '&mode='.$env{'form.mode'},                 '&mode='.$env{'form.mode'},
               text=>"$crumb_text",                text=>"$crumb_text",
               target=>$target,                target=>'_top',
               bug=>'Searching',});                bug=>'Searching',});
     #      #
     if ($env{'form.phase'} !~ m/(basic|adv|course)_search/) {      if ($env{'form.phase'} !~ m/(basic|adv|course)_search/) {
Line 203  sub handler { Line 195  sub handler {
                 &Apache::lonnet::logthis('lonsearchcat:'.                  &Apache::lonnet::logthis('lonsearchcat:'.
                                          'Unable to recover data from '.                                           'Unable to recover data from '.
                                          $persistent_db_file);                                           $persistent_db_file);
                 my $msg =   my $msg =
                     &mt('We were unable to retrieve data describing your search.').      'We were unable to retrieve data describing your search. '.
                     ' '.&mt('This is a serious error and has been logged.').      'This is a serious error and has been logged. '.
                     '<br />'.      'Please alert your LON-CAPA administrator.';
                     &mt('Please alert your LON-CAPA administrator.');   &Apache::loncommon::simple_error_page($r,'Search Error',
                 &Apache::loncommon::simple_error_page(        $msg);
                     $r,'Search Error',  
                     $msg,  
                     {'no_auto_mt_msg' => 1});  
  return OK;   return OK;
             }              }
         }          }
Line 308  END Line 297  END
     }      }
     #      #
     if ($env{'form.searchmode'} eq 'advanced') {      if ($env{'form.searchmode'} eq 'advanced') {
         my $srchtype = 'Content Library';          my $srchtype = 'Catalog';
         if ($env{'form.area'} eq 'portfolio') {          if ($env{'form.area'} eq 'portfolio') {
             $srchtype = 'Portfolio';              $srchtype = 'Portfolio';
         }          }
Line 332  END Line 321  END
         &display_results($r,$importbutton,$closebutton,$diropendb,          &display_results($r,$importbutton,$closebutton,$diropendb,
                          $env{'form.area'});                           $env{'form.area'});
     } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {      } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {
         my ($query,$customquery,$customshow,$libraries,$pretty_string,$domainsref) =          my ($query,$customquery,$customshow,$libraries,$pretty_string) =
             &get_persistent_data($persistent_db_file,              &get_persistent_data($persistent_db_file,
                  ['query','customquery','customshow',                   ['query','customquery','customshow',
                   'libraries','pretty_string','domains']);                    'libraries','pretty_string']);
         if ($env{'form.phase'} eq 'sort') {          if ($env{'form.phase'} eq 'sort') {
             &print_sort_form($r,$pretty_string,$target);              &print_sort_form($r,$pretty_string);
         } elsif ($env{'form.phase'} eq 'run_search') {          } elsif ($env{'form.phase'} eq 'run_search') {
             &run_search($r,$query,$customquery,$customshow,              &run_search($r,$query,$customquery,$customshow,
                         $libraries,$pretty_string,$env{'form.area'},$domainsref,$target);                          $libraries,$pretty_string,$env{'form.area'});
         }          }
     } elsif(($env{'form.phase'} eq 'basic_search') ||      } elsif(($env{'form.phase'} eq 'basic_search') ||
             ($env{'form.phase'} eq 'adv_search')) {              ($env{'form.phase'} eq 'adv_search')) {
         #          #
         # We are running a search, try to parse it          # We are running a search, try to parse it
         my ($query,$customquery,$customshow,$libraries,$domains) =           my ($query,$customquery,$customshow,$libraries) = 
             (undef,undef,undef,undef,undef);              (undef,undef,undef,undef);
         my $pretty_string;          my $pretty_string;
         if ($env{'form.phase'} eq 'basic_search') {          if ($env{'form.phase'} eq 'basic_search') {
             ($query,$pretty_string,$libraries,$domains) =               ($query,$pretty_string,$libraries) = 
                 &parse_basic_search($r,$closebutton,$hidden_fields);                  &parse_basic_search($r,$closebutton,$hidden_fields);
             return OK if (! defined($query));              return OK if (! defined($query));
             &make_persistent({ basicexp => $env{'form.basicexp'}},              &make_persistent({ basicexp => $env{'form.basicexp'}},
                              $persistent_db_file);                               $persistent_db_file);
         } else {                      # Advanced search          } else {                      # Advanced search
             ($query,$customquery,$customshow,$libraries,$pretty_string,$domains)               ($query,$customquery,$customshow,$libraries,$pretty_string) 
                 = &parse_advanced_search($r,$closebutton,$hidden_fields);                  = &parse_advanced_search($r,$closebutton,$hidden_fields);
             return OK if (! defined($query));              return OK if (! defined($query));
         }          }
Line 364  END Line 353  END
                            customquery => $customquery,                             customquery => $customquery,
                            customshow => $customshow,                             customshow => $customshow,
                            libraries => $libraries,                             libraries => $libraries,
                            pretty_string => $pretty_string,                             pretty_string => $pretty_string },
                            domains => $domains },  
                          $persistent_db_file);                           $persistent_db_file);
         #          #
         # Set up table          # Set up table
Line 439  sub hidden_field { Line 427  sub hidden_field {
   
 ######################################################################  ######################################################################
   
 =pod  =pod 
   
 =over 4  
   
 =item &print_basic_search_form()   =item &print_basic_search_form() 
   
Line 459  sub print_basic_search_form { Line 445  sub print_basic_search_form {
     $env{'form.catalogmode'} ne 'import');      $env{'form.catalogmode'} ne 'import');
     my $scrout = &Apache::loncommon::start_page('Content Library').$bread_crumb;      my $scrout = &Apache::loncommon::start_page('Content Library').$bread_crumb;
 # Search form for resource space   # Search form for resource space 
     if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') {      if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {
         $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton);          $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton);
         $scrout .= '<hr /><br />';          $scrout .= '<hr /><br />';
     }      }
Line 474  sub setup_basic_search { Line 460  sub setup_basic_search {
     my ($r,$area,$hidden_fields,$closebutton) = @_;      my ($r,$area,$hidden_fields,$closebutton) = @_;
     # Define interface components      # Define interface components
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                               res => 'Content Library Search',                                res => 'LON-CAPA Catalog Search',
                               portfolio => 'Portfolio Search',                                portfolio => 'Portfolio Search',
     );      );
     my ($userelatedwords,$onlysearchdomain,$inclext,$adv_search_link,$scrout);      my ($userelatedwords,$onlysearchdomain,$inclext,$adv_search_link,$scrout);
Line 488  sub setup_basic_search { Line 474  sub setup_basic_search {
                      .&mt('use related words')                       .&mt('use related words')
                      .'</label>';                       .'</label>';
   
     my $anydom = 1;  
     if ($area eq 'res') {  
         unless (&Apache::lonnet::allowed('bre','/res/') eq 'F') {  
             $anydom = 0;  
         }  
     }  
     my $singledom;  
     my ($disabled,$checked);  
     if ($anydom) {  
        $singledom = $r->dir_config('lonDefDomain');  
        if ($env{'form.domains'} eq $singledom) {  
            $checked = 1;  
        }  
     } else {  
        $singledom = $env{'user.domain'};  
        $disabled = ' disabled="disabled"';  
        $checked = 1;  
     }  
     $onlysearchdomain = '<label>'      $onlysearchdomain = '<label>'
                        .&Apache::lonhtmlcommon::checkbox(                         .&Apache::lonhtmlcommon::checkbox(
                            'domains',$checked,                             'domains',
                            $singledom,$disabled)                             $env{'form.domains'},
                              $r->dir_config('lonDefDomain'))
                        .' '                         .' '
                        .&mt('only search domain [_1]'                         .&mt('only search domain [_1]'
                                ,'<b>'.$singledom.'</b>')                                 ,'<b>'.$r->dir_config('lonDefDomain').'</b>')
                        .'</label>';                         .'</label>';
   
     $adv_search_link = '<a href="/adm/searchcat?'.      $adv_search_link = '<a href="/adm/searchcat?'.
Line 599  sub print_advanced_search_form{ Line 568  sub print_advanced_search_form{
 $closebutton  $closebutton
 </p>  </p>
 END  END
     my $srchtype = 'Content Library';      my $srchtype = 'Catalog';
     my $jscript;      my $jscript;
     if ($env{'form.area'} eq 'portfolio') {      if ($env{'form.area'} eq 'portfolio') {
         $srchtype = 'Portfolio';          $srchtype = 'Portfolio';
Line 687  function additional_metadata() { Line 656  function additional_metadata() {
                    $env{'form.category'})                     $env{'form.category'})
               .&Apache::lonhtmlcommon::row_closure();                .&Apache::lonhtmlcommon::row_closure();
   
     my $anydomain = 1;      $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield(&mt('Domains')))
     if ($env{'form.area'} ne 'portfolio') {                .&Apache::loncommon::domain_select('domains',
         unless (&Apache::lonnet::allowed('bre','/res/')) {                     $env{'form.domains'},1)
             $anydomain = 0;                .&Apache::lonhtmlcommon::row_closure();
         }  
     }  
   
     $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield(&mt('Domains')));  
     if ($anydomain) {  
         $scrout .= &Apache::loncommon::domain_select('domains',  
                    $env{'form.domains'},1);  
     } else {  
         $scrout .= &Apache::loncommon::select_dom_form($env{'user.domain'},  
                                                        'domains','','','',[$env{'user.domain'}],'',1);  
     }  
     $scrout .= &Apache::lonhtmlcommon::row_closure();  
   
     # Misc metadata      # Misc metadata
     if ($env{'form.area'} ne 'portfolio') {      if ($env{'form.area'} ne 'portfolio') {
Line 1055  Outputs: array of values.  Returns undef Line 1012  Outputs: array of values.  Returns undef
   
 This function is the reverse of &make_persistent();  This function is the reverse of &make_persistent();
 Retrieve persistent data from %persistent_db.  Retrieved items will have their  Retrieve persistent data from %persistent_db.  Retrieved items will have their
 values unescaped.  If the item is 'domains; then the returned  values unescaped.  If the item contains commas (before unescaping), the
 value will be a hash pointer.  Otherwise, if the item contains  returned value will be an array pointer. 
 commas (before unescaping), the returned value will be an array pointer.  
   
 =cut  =cut
   
Line 1075  sub get_persistent_data { Line 1031  sub get_persistent_data {
             push @Values, undef;              push @Values, undef;
             next;              next;
         }          }
         if ($name eq 'domains') {          my @values = map { 
             my %valueshash;              &unescape($_);
             my @items= map { &unescape($_); } split(',',$persistent_db{$name});          } split(',',$persistent_db{$name});
             foreach my $item (@items) {          if (@values <= 1) {
                 if ($item =~ /=/) {              push @Values,$values[0];
                     my ($key,$val) = map { &unescape($_); } split(/=/,$item);  
                     $valueshash{$key} = $val;  
                 }  
             }  
             push(@Values,\%valueshash);  
         } else {          } else {
             my @values = map {               push @Values,\@values;
                 &unescape($_);  
             } split(',',$persistent_db{$name});  
             if (@values <= 1) {  
                 push @Values,$values[0];  
             } else {  
                 push @Values,\@values;  
             }  
         }          }
     }      }
     untie (%persistent_db);      untie (%persistent_db);
Line 1111  Inputs: Hash of values to save, filename Line 1055  Inputs: Hash of values to save, filename
   
 Store variables away to the %persistent_db.  Store variables away to the %persistent_db.
 Values will be escaped.  Values that are array pointers will have their  Values will be escaped.  Values that are array pointers will have their
 elements escaped and concatenated in a comma separated string. Values   elements escaped and concatenated in a comma separated string.  
 that are hash pointers will have their keys and values escaped and   
 concatenated in a comma separated string.  
   
 =cut  =cut
   
Line 1125  sub make_persistent { Line 1067  sub make_persistent {
     return undef if (! tie(%persistent_db,'GDBM_File',      return undef if (! tie(%persistent_db,'GDBM_File',
                            $filename,&GDBM_WRCREAT(),0640));                             $filename,&GDBM_WRCREAT(),0640));
     foreach my $name (keys(%save)) {      foreach my $name (keys(%save)) {
         my @values=();          my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
         if (ref($save{$name}) eq 'ARRAY') {          # We handle array references, but not recursively.
             @values = @{$save{$name}};  
         } elsif (ref($save{$name}) eq 'HASH') {  
             foreach my $key (%{$save{$name}}) {  
                 push(@values,&escape($key).'='.&escape($save{$name}{$key}));  
             }  
         } else {  
             @values = $save{$name};  
         }  
         # We handle array and hash references, but not recursively.  
         my $store = join(',', map { &escape($_); } @values );          my $store = join(',', map { &escape($_); } @values );
         $persistent_db{$name} = $store;          $persistent_db{$name} = $store;
     }      }
Line 1452  sub parse_advanced_search { Line 1385  sub parse_advanced_search {
     ##      ##
     ## Deal with restrictions to given domains      ## Deal with restrictions to given domains
     ##       ## 
     my ($libraries_to_query,$pretty_domains_string,$domains_to_query) =       my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
         &parse_domain_restrictions();  
     if ($pretty_domains_string) {      if ($pretty_domains_string) {
        $pretty_search_string .= $pretty_domains_string."<br />\n";         $pretty_search_string .= $pretty_domains_string."<br />\n";
     }      }
Line 1469  sub parse_advanced_search { Line 1401  sub parse_advanced_search {
     }      }
     #&Apache::lonnet::logthis('advanced query = '.$/.$query);      #&Apache::lonnet::logthis('advanced query = '.$/.$query);
     return ($query,$customquery,$customshow,$libraries_to_query,      return ($query,$customquery,$customshow,$libraries_to_query,
             $pretty_search_string,$domains_to_query);              $pretty_search_string);
 }  }
   
 sub parse_domain_restrictions {  sub parse_domain_restrictions {
     my $libraries_to_query = undef;      my $libraries_to_query = undef;
     my $domains_to_query = undef;  
     # $env{'form.domains'} can be either a scalar or an array reference.      # $env{'form.domains'} can be either a scalar or an array reference.
     # We need an array.      # We need an array.
     if (! exists($env{'form.domains'}) || $env{'form.domains'} eq '') {      if (! exists($env{'form.domains'}) || $env{'form.domains'} eq '') {
Line 1498  sub parse_domain_restrictions { Line 1429  sub parse_domain_restrictions {
         foreach (sort @allowed_domains) {          foreach (sort @allowed_domains) {
             $pretty_domains_string .= "<b>".$_."</b> ";              $pretty_domains_string .= "<b>".$_."</b> ";
         }          }
  my %library_servers = &Apache::lonnet::get_unique_servers(\@allowed_domains,   my %servers = &Apache::lonnet::get_unique_servers(\@allowed_domains,
                   'library');     'library');
         my (%older_library_servers,%okdoms,%domains_for_id);  
         map { $okdoms{$_} = 1; } @allowed_domains;  
         foreach my $key (keys(%library_servers)) {  
             if (&Apache::lonnet::get_server_loncaparev('',$key) =~ /^\'?(\d+)\.(\d+)/) {  
                 my $major = $1;  
                 my $minor = $2;  
                 if (($major < 2) || (($major == 2) && ($minor < 11))) {  
                     map { $older_library_servers{$_} = 1; }  
                         &Apache::lonnet::machine_ids($library_servers{$key});  
                 } else {  
                     my %possdoms;  
                     map { $possdoms{$_}=1 if ($okdoms{$_}); }  
                         &Apache::lonnet::machine_domains($library_servers{$key});  
                     $domains_for_id{$key} = join(',',sort(keys(%possdoms)));  
                 }  
             }  
         }  
         my %servers = (%library_servers,%older_library_servers);  
  $libraries_to_query = [keys(%servers)];   $libraries_to_query = [keys(%servers)];
         $domains_to_query = \%domains_for_id;  
     }      }
     return ($libraries_to_query,      return ($libraries_to_query,
             $pretty_domains_string,              $pretty_domains_string);
             $domains_to_query);  
 }  }
   
 ######################################################################  ######################################################################
Line 1552  sub parse_basic_search { Line 1463  sub parse_basic_search {
  $env{"form.$_"}=&unescape($env{"form.$_"});   $env{"form.$_"}=&unescape($env{"form.$_"});
  $env{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;   $env{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
     }      }
     my ($libraries_to_query,$pretty_domains_string,$domains_to_query) =       my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
         &parse_domain_restrictions();  
     #      #
     # Check to see if enough of a query is filled in      # Check to see if enough of a query is filled in
     my $search_string = $env{'form.basicexp'};      my $search_string = $env{'form.basicexp'};
Line 1599  sub parse_basic_search { Line 1509  sub parse_basic_search {
     $pretty_search_string =~ s:^<br /> and ::;      $pretty_search_string =~ s:^<br /> and ::;
     &Apache::lonnet::logthis('simple search final query = '.$/.$final_query);      &Apache::lonnet::logthis('simple search final query = '.$/.$final_query);
     return ($final_query,$pretty_search_string,      return ($final_query,$pretty_search_string,
             $libraries_to_query,$domains_to_query);              $libraries_to_query);
 }  }
   
   
Line 1871  sub build_date_queries { Line 1781  sub build_date_queries {
     if ((defined($cafter)  && ! defined($cbefore)) ||      if ((defined($cafter)  && ! defined($cbefore)) ||
         (defined($cbefore) && ! defined($cafter))) {          (defined($cbefore) && ! defined($cafter))) {
         # This is bad, so let them know          # This is bad, so let them know
         $error = &mt('Incorrect entry for the creation date. '.          $error = &mt('Incorrect entry for the creation date.  '.
                     'You must specify both the beginning and ending dates.');                      'You must specify both the beginning and ending dates.');
     }      }
     if (! defined($error) &&       if (! defined($error) && 
         ((defined($mafter)  && ! defined($mbefore)) ||          ((defined($mafter)  && ! defined($mbefore)) ||
         (defined($mbefore) && ! defined($mafter)))) {          (defined($mbefore) && ! defined($mafter)))) {
         # This is also bad, so let them know          # This is also bad, so let them know
         $error = &mt('Incorrect entry for the last revision date. '.          $error = &mt('Incorrect entry for the last revision date.  '.
                      'You must specify both the beginning and ending dates.');                       'You must specify both the beginning and ending dates.');
     }      }
     if (! defined($error)) {      if (! defined($error)) {
Line 1890  sub build_date_queries { Line 1800  sub build_date_queries {
             my (undef,undef,undef,$cbday,$cbmon,$cbyear) = localtime($cbefore);              my (undef,undef,undef,$cbday,$cbmon,$cbyear) = localtime($cbefore);
             # Correct for year being relative to 1900              # Correct for year being relative to 1900
             $cayear+=1900; $cbyear+=1900;              $cayear+=1900; $cbyear+=1900;
             # Correct month; localtime gives month 0..11 but MySQL expects 1..12  
             $camon++; $cbmon++;  
             my $cquery=              my $cquery=
                 '(creationdate BETWEEN '.                  '(creationdate BETWEEN '.
                 "'".$cayear.'-'.$camon.'-'.$caday."'".                  "'".$cayear.'-'.$camon.'-'.$caday."'".
Line 1910  sub build_date_queries { Line 1818  sub build_date_queries {
             my (undef,undef,undef,$mbday,$mbmon,$mbyear) = localtime($mbefore);              my (undef,undef,undef,$mbday,$mbmon,$mbyear) = localtime($mbefore);
             # Correct for year being relative to 1900              # Correct for year being relative to 1900
             $mayear+=1900; $mbyear+=1900;              $mayear+=1900; $mbyear+=1900;
             # Correct month; localtime gives month 0..11 but MySQL expects 1..12  
             $mamon++; $mbmon++;  
             my $mquery=              my $mquery=
                 '(lastrevisiondate BETWEEN '.                  '(lastrevisiondate BETWEEN '.
                 "'".$mayear.'-'.$mamon.'-'.$maday."'".                  "'".$mayear.'-'.$mamon.'-'.$maday."'".
Line 1954  sub copyright_check { Line 1860  sub copyright_check {
     my (undef,undef,$resdom,$resname) = split('/',      my (undef,undef,$resdom,$resname) = split('/',
                                               $Metadata->{'url'});                                                $Metadata->{'url'});
     # Check for priv      # Check for priv
     if ($Metadata->{'copyright'} eq 'priv') {      if (($Metadata->{'copyright'} eq 'priv') && 
         unless (($env{'user.name'} eq $resname) &&          (($env{'user.name'} ne $resname) &&
                 ($env{'user.domain'} eq $resdom)) {           ($env{'user.domain'} ne $resdom))) {
             return 0;          return 0;
         }  
     }      }
     # Check for domain      # Check for domain
     if (($Metadata->{'copyright'} eq 'domain') &&      if (($Metadata->{'copyright'} eq 'domain') &&
Line 1996  sub ensure_db_and_table { Line 1901  sub ensure_db_and_table {
     ## Sanity check the table id.      ## Sanity check the table id.
     ##      ##
     if (! defined($table) || $table eq '' || $table =~ /\D/ ) {      if (! defined($table) || $table eq '' || $table =~ /\D/ ) {
         $r->print(&Apache::loncommon::start_page('Error')          $r->print(&Apache::loncommon::start_page(&mt('Error'))
   . '<p>table: |'.$table.'|</p>' # SB
                  .'<p class="LC_error">'                   .'<p class="LC_error">'
                  .&mt('Unable to retrieve search results. '                   .&mt('Unable to retrieve search results. '
                      .'Unable to determine the table results were saved in.')                       .'Unable to determine the table results were saved in.')
                  .'</p>'  
                  . '<p>'.&mt('Internal info:').'</p>'  
                  .'<pre>'.$table.'</pre>'  
                  .&Apache::loncommon::end_page()                   .&Apache::loncommon::end_page()
         );          );
         return undef;          return undef;
Line 2061  a link to change the search query. Line 1964  a link to change the search query.
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub print_sort_form {  sub print_sort_form {
     my ($r,$pretty_query_string,$target) = @_;      my ($r,$pretty_query_string) = @_;
   
     ##      ##
     my %SortableFields=&Apache::lonlocal::texthash(       my %SortableFields=&Apache::lonlocal::texthash( 
Line 2108  sub print_sort_form { Line 2011  sub print_sort_form {
 </script>  </script>
 END  END
   
     my $args;      my $start_page = &Apache::loncommon::start_page('Results',$js);
     if ($target eq '_parent') {  
         $args = {'links_target' => $target};  
     }  
     my $start_page = &Apache::loncommon::start_page('Results',undef,$args);  
     my $breadcrumbs=      my $breadcrumbs=
         &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',          &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',
     $env{'form.catalogmode'} ne 'import',      $env{'form.catalogmode'} ne 'import');
                                             '','','','','','',$target);  
   
     my $result = <<END;      my $result = <<END;
 $start_page  $start_page
 $breadcrumbs  $breadcrumbs
 <form name="statusform" action="" method="post" target="$target">  <form name="statusform" action="" method="post" target="_top">
 <input type="hidden" name="catalogmode" value="import" />  <input type="hidden" name="catalogmode" value="import" />
 <input type="hidden" name="acts" value="" />  <input type="hidden" name="acts" value="" />
 END  END
Line 2139  END Line 2037  END
 #    $result.="</select>\n";  #    $result.="</select>\n";
     my $revise = &revise_button();      my $revise = &revise_button();
     $result.='<p>'      $result.='<p>'
             .&mt('Total of [quant,_1,match,matches] to your query.',$total_results)              .&mt('There are [_1] matches to your query.',$total_results)
             .' '.$revise.'</p>'              .' '.$revise.'</p>'
             .'<p>'.&mt('Search: ').$pretty_query_string              .'<p>'.&mt('Search: ').$pretty_query_string
             .'</p></form>';              .'</p></form>';
Line 2277  SCRIPT Line 2175  SCRIPT
     $r->rflush();      $r->rflush();
 }  }
   
 sub reload_result_frame {  
     my ($r) = @_;  
     my $newloc = '/adm/searchcat?phase=results&persistent_db_id='.  
         $env{'form.persistent_db_id'};  
     $r->print(<<SCRIPT);  
 <script type="text/javascript">  
     parent.update_results("$newloc");  
 </script>  
 SCRIPT  
   
     $r->rflush();  
 }  
   
 {  {
     my $max_time  = 60;  # seconds for the search to complete      my $max_time  = 300;  # seconds for the search to complete
     my $start_time = 0;      my $start_time = 0;
     my $last_time = 0;      my $last_time = 0;
   
Line 2372  results into MySQL. Line 2257  results into MySQL.
 ######################################################################  ######################################################################
 sub run_search {  sub run_search {
     my ($r,$query,$customquery,$customshow,$serverlist,      my ($r,$query,$customquery,$customshow,$serverlist,
         $pretty_string,$area,$domainsref,$target) = @_;          $pretty_string,$area) = @_;
     my $tabletype = 'metadata';      my $tabletype = 'metadata';
     if ($area eq 'portfolio') {      if ($area eq 'portfolio') {
         $tabletype = 'portfolio_search';          $tabletype = 'portfolio_search';
Line 2381  sub run_search { Line 2266  sub run_search {
     #      #
     # Print run_search header      # Print run_search header
     #      #
     my $args;      my $start_page = &Apache::loncommon::start_page('Search Status',undef);
     if ($target eq '_parent') {  
         $args = {'links_target' => $target};  
     }  
     my $start_page = &Apache::loncommon::start_page('Search Status',undef,$args);  
     my $breadcrumbs =      my $breadcrumbs =
  &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',   &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',
     $env{'form.catalogmode'} ne 'import',      $env{'form.catalogmode'} ne 'import');
                                             '','','','','','',$target);  
     $r->print(<<END);      $r->print(<<END);
 $start_page  $start_page
 $breadcrumbs  $breadcrumbs
Line 2409  END Line 2289  END
     $r->rflush();      $r->rflush();
     #      #
     # Determine the servers we need to contact.      # Determine the servers we need to contact.
     my (@Servers_to_contact,%domains_by_server);      my @Servers_to_contact;
     if (defined($serverlist)) {      if (defined($serverlist)) {
         if (ref($serverlist) eq 'ARRAY') {          if (ref($serverlist) eq 'ARRAY') {
             @Servers_to_contact = @$serverlist;              @Servers_to_contact = @$serverlist;
         } else {          } else {
             @Servers_to_contact = ($serverlist);              @Servers_to_contact = ($serverlist);
         }          }
         if (ref($domainsref) eq 'HASH') {  
             foreach my $server (@Servers_to_contact) {  
                 $domains_by_server{$server} = $domainsref->{$server};  
             }  
         }  
     } else {      } else {
  my %library_servers = &Apache::lonnet::unique_library();   my %all_library_servers = &Apache::lonnet::unique_library();
         my (%all_library_servers, %older_library_servers);  
         foreach my $key (keys(%library_servers)) {  
             if (&Apache::lonnet::get_server_loncaparev('',$key) =~ /^\'?(\d+)\.(\d+)/) {  
                 my $major = $1;  
                 my $minor = $2;  
                 if (($major < 2) || (($major == 2) && ($minor < 11))) {  
                     map { $older_library_servers{$_} = 1; }  
                         &Apache::lonnet::machine_ids($library_servers{$key});  
                 }  
             }  
         }  
         %all_library_servers = (%library_servers,%older_library_servers);  
         @Servers_to_contact = sort(keys(%all_library_servers));          @Servers_to_contact = sort(keys(%all_library_servers));
         foreach my $server (@Servers_to_contact) {  
             my %possdoms;  
             map { $possdoms{$_}=1;  } &Apache::lonnet::machine_domains($all_library_servers{$server});  
             $domains_by_server{$server} =  
                 join(',',sort(&Apache::lonnet::machine_domains($all_library_servers{$server})));  
         }  
     }      }
     my %Server_status;      my %Server_status;
     #      #
Line 2477  END Line 2334  END
     ##      ##
     ## Prepare for the big loop.      ## Prepare for the big loop.
     my $hitcountsum;      my $hitcountsum;
     my $oldhitcountsum;  
     my $displaycount;  
     my %matches;      my %matches;
     my $server;       my $server; 
     my $status;      my $status;
Line 2513  END Line 2368  END
             my $server = shift(@Servers_to_contact);              my $server = shift(@Servers_to_contact);
             &update_status($r,&mt('contacting [_1]',$server));              &update_status($r,&mt('contacting [_1]',$server));
             my $reply=&Apache::lonnet::metadata_query($query,$customquery,              my $reply=&Apache::lonnet::metadata_query($query,$customquery,
                                                       $customshow,[$server],\%domains_by_server);                                                        $customshow,[$server]);
             ($server) = keys(%$reply);              ($server) = keys(%$reply);
             $Server_status{$server} = $reply->{$server};              $Server_status{$server} = $reply->{$server};
         } else {          } else {
Line 2525  END Line 2380  END
                 &update_status($r,                  &update_status($r,
                        &mt('waiting on [_1]',join(' ',keys(%Server_status))));                         &mt('waiting on [_1]',join(' ',keys(%Server_status))));
             }              }
             sleep(0.1);               sleep(1)
         }          }
         #          #
         # Loop through the servers we have contacted but do not          # Loop through the servers we have contacted but do not
Line 2578  END Line 2433  END
   
                     if ($area eq 'portfolio') {                      if ($area eq 'portfolio') {
                         next if (defined($matches{$Fields{'url'}}));                          next if (defined($matches{$Fields{'url'}}));
                         # Skip unless access control set to public or passphrase-protected                          # Skip if inaccessible
                         next unless (($Fields{'scope'} eq 'public') || ($Fields{'scope'} eq 'guest'));                          next if (!&Apache::lonnet::portfolio_access($Fields{'url'}));
                         $matches{$Fields{'url'}} = 1;                           $matches{$Fields{'url'}} = 1; 
                     }                      }
                     #                      #
Line 2601  END Line 2456  END
                 delete($Server_status{$server});                  delete($Server_status{$server});
             }              }
             last if ($connection->aborted());              last if ($connection->aborted());
             if ($oldhitcountsum < $hitcountsum) {              &update_count_status($r,$hitcountsum);
                 &update_count_status($r,$hitcountsum);  
                 if (($hitcountsum <= $env{'form.show'}) ||  
                     (!$displaycount && $hitcountsum)) {  
                     reload_result_frame($r);  
                     $displaycount = $hitcountsum;  
                 }  
                 $oldhitcountsum = $hitcountsum;  
             }  
         }          }
         last if ($connection->aborted());          last if ($connection->aborted());
         &update_seconds($r);          &update_seconds($r);
Line 2703  sub display_results { Line 2550  sub display_results {
     if ($env{'form.catalogmode'} eq 'import') {      if ($env{'form.catalogmode'} eq 'import') {
         if (! tie(%groupsearch_db,'GDBM_File',$diropendb,          if (! tie(%groupsearch_db,'GDBM_File',$diropendb,
                   &GDBM_WRCREAT(),0640)) {                    &GDBM_WRCREAT(),0640)) {
             # NOTE: this can happen when a previous request to searchcat?phase=results gets interrupted  
             # (%groupsearch_db is not untied)  
             $r->print('<p class="LC_error">'.              $r->print('<p class="LC_error">'.
               &mt('Unable to save import results.').                &mt('Unable to save import results.').
               '</p>'.                '</p>'.
Line 2712  sub display_results { Line 2557  sub display_results {
       &Apache::loncommon::end_page());        &Apache::loncommon::end_page());
             $r->rflush();              $r->rflush();
             return;              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      ## Prepare the table for querying
Line 2858  sub display_results { Line 2699  sub display_results {
     );      );
   
     if ($total_results == 0) {      if ($total_results == 0) {
         $r->print('<p class="LC_info">'.&mt('There are currently no results.').'</p>'.          $r->print('<meta HTTP-EQUIV="Refresh" CONTENT="2" />'.
                     '<p class="LC_info">'.&mt('There are currently no results.').'</p>'.
                   "</form>".                    "</form>".
   &Apache::loncommon::end_page());    &Apache::loncommon::end_page());
         return;          return;
Line 3231  SCRIPT Line 3073  SCRIPT
 </script>  </script>
 SCRIPT  SCRIPT
   
     $js.=<<SCRIPT;  
 <script type="text/javascript">  
     \$(document).ready(function() {  
         parent.done_loading_results();  
     });  
 </script>  
 SCRIPT  
   
     my $start_page  = &Apache::loncommon::start_page(undef,$js,      my $start_page  = &Apache::loncommon::start_page(undef,$js,
      {'only_body' =>1,       {'only_body' =>1,
                                                       'add_wishlist' =>1,                                                        'add_wishlist' =>1});
                                                       'add_modal' =>1});  
     my $result=<<END;      my $result=<<END;
 $start_page  $start_page
 <form name="results" method="post" action="/adm/searchcat">  <form name="results" method="post" action="/adm/searchcat">
Line 3272  sub print_frames_interface { Line 3105  sub print_frames_interface {
 // <![CDATA[  // <![CDATA[
 var targetwin = opener;  var targetwin = opener;
 var queue = '';  var queue = '';
   
 var loading_results = true;  
 var need_reloading = false;  
 var new_location;  
 function update_results(newloc) {  
     if (loading_results) {  
         need_reloading = true;  
         new_location = newloc;  
     } else {  
         loading_results = true;  
         resultsframe.location = newloc;  
     }  
 }  
 function done_loading_results() {  
     loading_results = false;  
     if (need_reloading) {  
         need_reloading = false;  
         update_results(new_location);  
     }  
 }  
 // ]]>  // ]]>
 </script>  </script>
 JS  JS
Line 3404  sub detailed_citation_view { Line 3217  sub detailed_citation_view {
         '<b>'.$prefix.          '<b>'.$prefix.
         '<img src="'.&Apache::loncommon::icon($values{'url'}).'" alt="" />'.'&nbsp;'.          '<img src="'.&Apache::loncommon::icon($values{'url'}).'" alt="" />'.'&nbsp;'.
         '<a href="'.$jumpurl.'?inhibitmenu=yes" '.          '<a href="'.$jumpurl.'?inhibitmenu=yes" '.
         'target="preview" onclick="openMyModal(this.href, 500, 500, \'yes\');return false;">'.$values{'title'}."</a></b>\n".          'target="preview">'.$values{'title'}."</a></b>\n".
         &display_tools($values{'title'}, $jumpurl).          &display_tools($values{'title'}, $jumpurl).
         "<p>\n".          "<p>\n".
         '<b>'.$values{'author'}.'</b>,'.          '<b>'.$values{'author'}.'</b>,'.
Line 3537  sub summary_view { Line 3350  sub summary_view {
     my $link = '<br />'.&display_url($jumpurl,1).'<br />';      my $link = '<br />'.&display_url($jumpurl,1).'<br />';
     $result .=      $result .=
         '<a href="'.$jumpurl.'?inhibitmenu=yes"'.          '<a href="'.$jumpurl.'?inhibitmenu=yes"'.
         ' target="preview" onclick="openMyModal(this.href, 500, 500, \'yes\');return false;">'.$values{'title'}.'</a>'.          ' target="preview">'.$values{'title'}.'</a>'.
         &display_tools($values{'title'}, $jumpurl).<<END;          &display_tools($values{'title'}, $jumpurl).<<END;
 <br />  <br />
 $link<br />  $link<br />
Line 3583  sub compact_view { Line 3396  sub compact_view {
     }      }
     $jumpurl = &HTML::Entities::encode($jumpurl,'<>&"');      $jumpurl = &HTML::Entities::encode($jumpurl,'<>&"');
     $result.=' <span class="LC_nobreak">'.      $result.=' <span class="LC_nobreak">'.
  '<a href="'.$jumpurl.'?inhibitmenu=yes" target="preview" onclick="openMyModal(this.href, 500, 500, \'yes\');return false;">'.   '<a href="'.$jumpurl.'?inhibitmenu=yes" target="preview">'.
         &HTML::Entities::encode($values{'title'},'<>&"').'</a></span> '.          &HTML::Entities::encode($values{'title'},'<>&"').'</a></span> '.
         &display_tools($values{'title'}, $jumpurl).          &display_tools($values{'title'}, $jumpurl).
  $link.' <b>'.$values{'author'}.'</b> ('.$values{'domain'}.')';   $link.' <b>'.$values{'author'}.'</b> ('.$values{'domain'}.')';
Line 3599  sub display_url { Line 3412  sub display_url {
     } elsif ($url=~m{^(http://|/uploaded/)}) {      } elsif ($url=~m{^(http://|/uploaded/)}) {
  $link='<span class="LC_filename">'.$url.'</span>';   $link='<span class="LC_filename">'.$url.'</span>';
     } else {      } else {
         # replace the links to open in a new window  
         # (because the search opens in a new window, it gets  
         # confusing when the links open a tab in the  
         # parent window; ideally we should not force windows)  
         my $onclick = " onclick=\"window.open(this.href, '_blank', 'toolbar=1,location=1,menubar=0');return false;\"";  
         $link=&Apache::lonhtmlcommon::crumbs(          $link=&Apache::lonhtmlcommon::crumbs(
                   $url,                    $url,
                   'preview',                    'preview',
                   '',                    '',
                   '',                    (($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),
                   $skiplast,$onclick).' ';                    $skiplast).' ';
     }      }
     return $link;      return $link;
 }  }
Line 3915  Cleans the global %groupsearch_db by rem Line 3723  Cleans the global %groupsearch_db by rem
 ######################################################################  ######################################################################
 sub start_fresh_session {  sub start_fresh_session {
     delete $groupsearch_db{'mode_catalog'};      delete $groupsearch_db{'mode_catalog'};
     foreach (keys(%groupsearch_db)) {      foreach (keys %groupsearch_db) {
         if ($_ =~ /^pre_/) {          if ($_ =~ /^pre_/) {
             delete $groupsearch_db{$_};              delete $groupsearch_db{$_};
         }          }
Line 3933  sub cleanup { Line 3741  sub cleanup {
   &Apache::lonnet::logthis('Failed cleanup searchcat: groupsearch_db');    &Apache::lonnet::logthis('Failed cleanup searchcat: groupsearch_db');
         }          }
     }      }
       &untiehash();
     &Apache::lonmysql::disconnect_from_db();      &Apache::lonmysql::disconnect_from_db();
     return OK;      return OK;
 }  }

Removed from v.1.331.4.16.2.2  
changed lines
  Added in v.1.332


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>