--- loncom/interface/lonsearchcat.pm 2011/12/09 01:04:27 1.331
+++ loncom/interface/lonsearchcat.pm 2013/09/02 00:20:07 1.331.4.7
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Search Catalog
#
-# $Id: lonsearchcat.pm,v 1.331 2011/12/09 01:04:27 www Exp $
+# $Id: lonsearchcat.pm,v 1.331.4.7 2013/09/02 00:20:07 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -321,31 +321,31 @@ END
&display_results($r,$importbutton,$closebutton,$diropendb,
$env{'form.area'});
} elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {
- my ($query,$customquery,$customshow,$libraries,$pretty_string) =
+ my ($query,$customquery,$customshow,$libraries,$pretty_string,$domainsref) =
&get_persistent_data($persistent_db_file,
['query','customquery','customshow',
- 'libraries','pretty_string']);
+ 'libraries','pretty_string','domains']);
if ($env{'form.phase'} eq 'sort') {
&print_sort_form($r,$pretty_string);
} elsif ($env{'form.phase'} eq 'run_search') {
&run_search($r,$query,$customquery,$customshow,
- $libraries,$pretty_string,$env{'form.area'});
+ $libraries,$pretty_string,$env{'form.area'},$domainsref);
}
} elsif(($env{'form.phase'} eq 'basic_search') ||
($env{'form.phase'} eq 'adv_search')) {
#
# We are running a search, try to parse it
- my ($query,$customquery,$customshow,$libraries) =
- (undef,undef,undef,undef);
+ my ($query,$customquery,$customshow,$libraries,$domains) =
+ (undef,undef,undef,undef,undef);
my $pretty_string;
if ($env{'form.phase'} eq 'basic_search') {
- ($query,$pretty_string,$libraries) =
+ ($query,$pretty_string,$libraries,$domains) =
&parse_basic_search($r,$closebutton,$hidden_fields);
return OK if (! defined($query));
&make_persistent({ basicexp => $env{'form.basicexp'}},
$persistent_db_file);
} else { # Advanced search
- ($query,$customquery,$customshow,$libraries,$pretty_string)
+ ($query,$customquery,$customshow,$libraries,$pretty_string,$domains)
= &parse_advanced_search($r,$closebutton,$hidden_fields);
return OK if (! defined($query));
}
@@ -353,7 +353,8 @@ END
customquery => $customquery,
customshow => $customshow,
libraries => $libraries,
- pretty_string => $pretty_string },
+ pretty_string => $pretty_string,
+ domains => $domains },
$persistent_db_file);
#
# Set up table
@@ -1012,8 +1013,9 @@ Outputs: array of values. Returns undef
This function is the reverse of &make_persistent();
Retrieve persistent data from %persistent_db. Retrieved items will have their
-values unescaped. If the item contains commas (before unescaping), the
-returned value will be an array pointer.
+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.
=cut
@@ -1031,13 +1033,25 @@ sub get_persistent_data {
push @Values, undef;
next;
}
- my @values = map {
- &unescape($_);
- } split(',',$persistent_db{$name});
- if (@values <= 1) {
- push @Values,$values[0];
+ if ($name eq 'domains') {
+ my %valueshash;
+ my @items= map { &unescape($_); } split(',',$persistent_db{$name});
+ foreach my $item (@items) {
+ if ($item =~ /=/) {
+ my ($key,$val) = map { &unescape($_); } split(/=/,$item);
+ $valueshash{$key} = $val;
+ }
+ }
+ push(@Values,\%valueshash);
} else {
- push @Values,\@values;
+ my @values = map {
+ &unescape($_);
+ } split(',',$persistent_db{$name});
+ if (@values <= 1) {
+ push @Values,$values[0];
+ } else {
+ push @Values,\@values;
+ }
}
}
untie (%persistent_db);
@@ -1055,7 +1069,9 @@ Inputs: Hash of values to save, filename
Store variables away to the %persistent_db.
Values will be escaped. Values that are array pointers will have their
-elements escaped and concatenated in a comma separated string.
+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.
=cut
@@ -1067,8 +1083,17 @@ sub make_persistent {
return undef if (! tie(%persistent_db,'GDBM_File',
$filename,&GDBM_WRCREAT(),0640));
foreach my $name (keys(%save)) {
- my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
- # We handle array references, but not recursively.
+ my @values=();
+ if (ref($save{$name}) eq 'ARRAY') {
+ @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 );
$persistent_db{$name} = $store;
}
@@ -1385,7 +1410,8 @@ sub parse_advanced_search {
##
## Deal with restrictions to given domains
##
- my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
+ my ($libraries_to_query,$pretty_domains_string,$domains_to_query) =
+ &parse_domain_restrictions();
if ($pretty_domains_string) {
$pretty_search_string .= $pretty_domains_string."
\n";
}
@@ -1401,11 +1427,12 @@ sub parse_advanced_search {
}
#&Apache::lonnet::logthis('advanced query = '.$/.$query);
return ($query,$customquery,$customshow,$libraries_to_query,
- $pretty_search_string);
+ $pretty_search_string,$domains_to_query);
}
sub parse_domain_restrictions {
my $libraries_to_query = undef;
+ my $domains_to_query = undef;
# $env{'form.domains'} can be either a scalar or an array reference.
# We need an array.
if (! exists($env{'form.domains'}) || $env{'form.domains'} eq '') {
@@ -1429,12 +1456,32 @@ sub parse_domain_restrictions {
foreach (sort @allowed_domains) {
$pretty_domains_string .= "".$_." ";
}
- my %servers = &Apache::lonnet::get_unique_servers(\@allowed_domains,
- 'library');
+ my %library_servers = &Apache::lonnet::get_unique_servers(\@allowed_domains,
+ '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)];
+ $domains_to_query = \%domains_for_id;
}
return ($libraries_to_query,
- $pretty_domains_string);
+ $pretty_domains_string,
+ $domains_to_query);
}
######################################################################
@@ -1463,7 +1510,8 @@ sub parse_basic_search {
$env{"form.$_"}=&unescape($env{"form.$_"});
$env{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
}
- my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
+ my ($libraries_to_query,$pretty_domains_string,$domains_to_query) =
+ &parse_domain_restrictions();
#
# Check to see if enough of a query is filled in
my $search_string = $env{'form.basicexp'};
@@ -1509,7 +1557,7 @@ sub parse_basic_search {
$pretty_search_string =~ s:^
and ::;
&Apache::lonnet::logthis('simple search final query = '.$/.$final_query);
return ($final_query,$pretty_search_string,
- $libraries_to_query);
+ $libraries_to_query,$domains_to_query);
}
@@ -1781,14 +1829,14 @@ sub build_date_queries {
if ((defined($cafter) && ! defined($cbefore)) ||
(defined($cbefore) && ! defined($cafter))) {
# 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.');
}
if (! defined($error) &&
((defined($mafter) && ! defined($mbefore)) ||
(defined($mbefore) && ! defined($mafter)))) {
# 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.');
}
if (! defined($error)) {
@@ -1901,11 +1949,13 @@ sub ensure_db_and_table {
## Sanity check the table id.
##
if (! defined($table) || $table eq '' || $table =~ /\D/ ) {
- $r->print(&Apache::loncommon::start_page(&mt('Error'))
-. '
table: |'.$table.'|
' # SB + $r->print(&Apache::loncommon::start_page('Error') .'' .&mt('Unable to retrieve search results. ' .'Unable to determine the table results were saved in.') + .'
' + . ''.&mt('Internal info:').'
' + .''.$table.'' .&Apache::loncommon::end_page() ); return undef; @@ -1915,9 +1965,12 @@ sub ensure_db_and_table { ## my $connection_result = &Apache::lonmysql::connect_to_db(); if (!defined($connection_result)) { - $r->print("Unable to connect to the MySQL database where your results". - " are saved.". - &Apache::loncommon::end_page()); + $r->print( + '
' + .&mt('Unable to connect to the MySQL database where your results are saved.') + .'
' + .&Apache::loncommon::end_page() + ); &Apache::lonnet::logthis("lonsearchcat: unable to get lonmysql to". " connect to database."); &Apache::lonnet::logthis(&Apache::lonmysql::get_error()); @@ -1925,13 +1978,20 @@ sub ensure_db_and_table { } my $table_check = &Apache::lonmysql::check_table($table); if (! defined($table_check)) { - $r->print("A MySQL error has occurred.". - &Apache::loncommon::end_page()); + $r->print( + '' + .&mt('A MySQL error has occurred.') + .'
' + .&Apache::loncommon::end_page()); &Apache::lonnet::logthis("lonmysql was unable to determine the status". " of table ".$table); return undef; } elsif (! $table_check) { - $r->print("The table of results could not be found."); + $r->print( + '' + .&mt('The table of results could not be found.') + .'
' + ); &Apache::lonnet::logthis("The user requested a table, ".$table. ", that could not be found."); return undef; @@ -2027,7 +2087,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 .'
'; @@ -2247,7 +2307,7 @@ results into MySQL. ###################################################################### sub run_search { my ($r,$query,$customquery,$customshow,$serverlist, - $pretty_string,$area) = @_; + $pretty_string,$area,$domainsref) = @_; my $tabletype = 'metadata'; if ($area eq 'portfolio') { $tabletype = 'portfolio_search'; @@ -2279,16 +2339,39 @@ END $r->rflush(); # # Determine the servers we need to contact. - my @Servers_to_contact; + my (@Servers_to_contact,%domains_by_server); if (defined($serverlist)) { if (ref($serverlist) eq 'ARRAY') { @Servers_to_contact = @$serverlist; } else { @Servers_to_contact = ($serverlist); } + if (ref($domainsref) eq 'HASH') { + foreach my $server (@Servers_to_contact) { + $domains_by_server{$server} = $domainsref->{$server}; + } + } } else { - my %all_library_servers = &Apache::lonnet::unique_library(); + my %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)); + 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; # @@ -2358,7 +2441,7 @@ END my $server = shift(@Servers_to_contact); &update_status($r,&mt('contacting [_1]',$server)); my $reply=&Apache::lonnet::metadata_query($query,$customquery, - $customshow,[$server]); + $customshow,[$server],\%domains_by_server); ($server) = keys(%$reply); $Server_status{$server} = $reply->{$server}; } else { @@ -3157,6 +3240,28 @@ sub evalfields { ###################################################################### ###################################################################### +sub display_tools { + my ($title, $jumpurl) = @_; + my $result; + # Metadata + $result.= + &Apache::loncommon::modal_link( + $jumpurl.'.meta?inhibitmenu=yes', + '', + 500,500,'_blank',undef,&mt('Metadata')); + # Stored Links + $result.= + ' '. + ''; + return $result; +} + +###################################################################### +###################################################################### + =pod =item Metadata Viewing Functions @@ -3181,16 +3286,14 @@ sub detailed_citation_view { my $result; my $jumpurl=$values{'url'}; $jumpurl=~s|^/ext/|http://|; - $result .= ''.$prefix. + $result .= + ''.$prefix. ''.' '. ''.$values{'title'}."\n". - ''. - ''; - $result .= "\n"; - $result .= ''.$values{'author'}.','. + &display_tools($values{'title'}, $jumpurl). + "
\n".
+ ''.$values{'author'}.','.
' '.$values{'owner'}.'
';
foreach my $field
(
@@ -3318,16 +3421,10 @@ sub summary_view {
my $jumpurl=$values{'url'};
$jumpurl=~s|^/ext/|http://|;
my $link = '
'.&display_url($jumpurl,1).'
';
-
- my $titleWL = &mt('Set link to wishlist');
- $result.=<
$values{'author'}, $values{'owner'} -- $values{'lastrevisiondate'}
@@ -3374,11 +3471,7 @@ sub compact_view {
$result.=' '.
''.
&HTML::Entities::encode($values{'title'},'<>&"').' '.
- ''.
- ''.
- ''.
+ &display_tools($values{'title'}, $jumpurl).
$link.' '.$values{'author'}.' ('.$values{'domain'}.')';
return $result;
}
@@ -3420,20 +3513,16 @@ sub fielded_format_view {
my $jumpurl=$values{'url'};
$jumpurl=~s|^/ext/|http://|;
- my $titleWL = ('Set link to wishlist');
my $result=<