version 1.331.4.10, 2014/02/23 22:16:20
|
version 1.334, 2013/02/06 17:56:38
|
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 170 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'; |
Line 193 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 322 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); |
&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); |
$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 354 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 429 sub hidden_field {
|
Line 427 sub hidden_field {
|
|
|
###################################################################### |
###################################################################### |
|
|
=pod |
=pod |
|
|
=over 4 |
|
|
|
=item &print_basic_search_form() |
=item &print_basic_search_form() |
|
|
Line 449 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 1016 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 1036 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 1072 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 1086 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 1413 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 1430 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 1459 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 1513 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 1560 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 2090 END
|
Line 2039 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 2310 results into MySQL.
|
Line 2259 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) = @_; |
$pretty_string,$area) = @_; |
my $tabletype = 'metadata'; |
my $tabletype = 'metadata'; |
if ($area eq 'portfolio') { |
if ($area eq 'portfolio') { |
$tabletype = 'portfolio_search'; |
$tabletype = 'portfolio_search'; |
Line 2342 END
|
Line 2291 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 2444 END
|
Line 2370 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 3151 SCRIPT
|
Line 3077 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 3818 sub cleanup {
|
Line 3743 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; |
} |
} |