--- loncom/interface/lonsearchcat.pm 2006/06/29 19:25:40 1.272 +++ loncom/interface/lonsearchcat.pm 2006/09/26 15:24:18 1.276 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.272 2006/06/29 19:25:40 www Exp $ +# $Id: lonsearchcat.pm,v 1.276 2006/09/26 15:24:18 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -139,7 +139,7 @@ sub handler { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['catalogmode','launch','acts','mode','form','element','pause', 'phase','persistent_db_id','table','start','show', - 'cleargroupsort','titleelement']); + 'cleargroupsort','titleelement','area']); ## ## The following is a trick - we wait a few seconds if asked to so ## the daemon running the search can get ahead of the daemon @@ -249,6 +249,9 @@ sub handler { if (exists($env{'form.mode'})) { $hidden_fields .= &hidden_field('mode'); } + if (exists($env{'form.area'})) { + $hidden_fields .= &hidden_field('area'); + } ## ## Configure dynamic components of interface ## @@ -318,7 +321,8 @@ END } elsif ($env{'form.phase'} eq 'disp_adv') { &print_advanced_search_form($r,$closebutton,$hidden_fields); } elsif ($env{'form.phase'} eq 'results') { - &display_results($r,$importbutton,$closebutton,$diropendb); + &display_results($r,$importbutton,$closebutton,$diropendb, + $env{'form.area'}); } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) { my ($query,$customquery,$customshow,$libraries,$pretty_string) = &get_persistent_data($persistent_db_file, @@ -328,7 +332,7 @@ END &print_sort_form($r,$pretty_string); } elsif ($env{'form.phase'} eq 'run_search') { &run_search($r,$query,$customquery,$customshow, - $libraries,$pretty_string); + $libraries,$pretty_string,$env{'form.area'}); } } elsif ($env{'form.phase'} eq 'course_search') { &course_search($r); @@ -358,7 +362,7 @@ END $persistent_db_file); # # Set up table - if (! defined(&create_results_table())) { + if (! defined(&create_results_table($env{'form.area'}))) { my $errorstring=&Apache::lonmysql::get_error(); &Apache::lonnet::logthis('lonsearchcat.pm: Unable to create '. 'needed table. lonmysql error:'. @@ -665,68 +669,13 @@ sub print_basic_search_form { &Apache::lonhtmlcommon::breadcrumbs('Searching','Search_Basic', $env{'form.catalogmode'} ne 'import'); my $scrout = &Apache::loncommon::start_page('Search').$bread_crumb; +# Search form for resource space if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) { - # Define interface components - my $userelatedwords= ''; - my $onlysearchdomain=''; - my $inclext= ''; - my $adv_search_link = - ''.&mt('Advanced Search').''; - # - $scrout.='
'; + $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton); + $scrout .= ''.&mt('Minimum').' | '. - ''.&mt('Maximum').' | |
'. - &titlefield(&mt($statistic->{'description'})). - ' | '. - ''. - ' | '. - ''. - ' |
'.&mt('Minimum').' | '. - ''.&mt('Maximum').' | |
'. - &titlefield(&mt($evaluation->{'description'})). - ' | '. - ''. - ' | '. - ''. - ' |
'. + &mt('Field Name').' | '.''. + &mt('Field Value(s)').' | |
'.&mt('1: '). + ' | '. + ' | '. + '|
'.&mt('Custom metadata [_1]: ',$num). + ' | '. + ' | '. + '|
'. + ''. + ' |
'. + &mt('Minimum').' | '.''. + &mt('Maximum').' | |
'. + &titlefield(&mt($statistic->{'description'})). + ' | '. + ' | '. + ' |
'. + &mt('Minimum').' | '.''. + &mt('Maximum').' | |
'. + &titlefield(&mt($evaluation->{'description'})). + ' | '. + ''. + ' | '. + ' |
There are $total_results matches to your query. $revise
-Search:$pretty_query_string +Search: $pretty_query_string
END @@ -2173,7 +2251,7 @@ my @Fullindicies; Creates the table of search results by calling lonmysql. Stores the table id in $env{'form.table'} -Inputs: none. +Inputs: search area - either res or portfolio Returns: the identifier of the table on success, undef on error. @@ -2182,8 +2260,9 @@ Returns: the identifier of the table on ###################################################################### ###################################################################### sub set_up_table_structure { + my ($tabletype) = @_; my ($datatypes,$fullindicies) = - &LONCAPA::lonmetadata::describe_metadata_storage(); + &LONCAPA::lonmetadata::describe_metadata_storage($tabletype); # Copy the table description before modifying it... @Datatypes = @{$datatypes}; unshift(@Datatypes,{name => 'id', @@ -2196,7 +2275,12 @@ sub set_up_table_structure { } sub create_results_table { - &set_up_table_structure(); + my ($area) = @_; + if ($area eq 'portfolio') { + &set_up_table_structure('portfolio_search'); + } else { + &set_up_table_structure('metadata'); + } my $table = &Apache::lonmysql::create_table ( { columns => \@Datatypes, FULLTEXT => [{'columns' => \@Fullindicies},], @@ -2328,8 +2412,12 @@ results into MySQL. ###################################################################### ###################################################################### sub run_search { - my ($r,$query,$customquery,$customshow,$serverlist,$pretty_string) = @_; - + my ($r,$query,$customquery,$customshow,$serverlist, + $pretty_string,$area) = @_; + my $tabletype = 'metadata'; + if ($area eq 'portfolio') { + $tabletype = 'portfolio_search'; + } my $connection = $r->connection; # # Print run_search header @@ -2404,6 +2492,7 @@ END ## ## Prepare for the big loop. my $hitcountsum; + my %matches; my $server; my $status; my $revise = &revise_button(); @@ -2458,7 +2547,7 @@ END delete ($Server_status{$server}); next; } - $status=~s|/||g; + $status=~s|/||g; my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$status; if (-e $datafile && ! -e "$datafile.end") { &update_status($r,&mt('Receiving results from [_1]',$server)); @@ -2487,7 +2576,7 @@ END next if (! $result); # # Parse the result. - my %Fields = &parse_raw_result($result,$server); + my %Fields = &parse_raw_result($result,$server,$tabletype); $Fields{'hostname'} = $server; # # Skip if external and we did not want that @@ -2495,6 +2584,12 @@ END # Skip based on copyright next if (! ©right_check(\%Fields)); + if ($area eq 'portfolio') { + next if (defined($matches{$Fields{'url'}})); + # Skip if inaccessible + next if (!&Apache::lonnet::portfolio_access($Fields{'url'})); + $matches{$Fields{'url'}} = 1; + } # # Store the result in the mysql database my $result = &Apache::lonmysql::store_row($table,\%Fields); @@ -2581,7 +2676,7 @@ Prints the results out for selection and ###################################################################### ###################################################################### sub display_results { - my ($r,$importbutton,$closebutton,$diropendb) = @_; + my ($r,$importbutton,$closebutton,$diropendb,$area) = @_; my $connection = $r->connection; $r->print(&search_results_header($importbutton,$closebutton)); ## @@ -2651,7 +2746,8 @@ sub display_results { $r->print(&hidden_field('table'). &hidden_field('phase'). &hidden_field('persistent_db_id'). - &hidden_field('start') + &hidden_field('start'). + &hidden_field('area') ); # # Build sorting selector @@ -2672,6 +2768,16 @@ sub display_results { {key =>'lowestgradelevel'}, {key =>'highestgradelevel'}, {key =>'standards',desc=>'Standards'}, + ); + if ($area eq 'portfolio') { + push(@fields, + ( + {key => 'scope'}, + {key => 'keynum'}, + )); + } else { + push(@fields, + ( {key =>'count',desc=>'Number of accesses'}, {key =>'stdno',desc=>'Students Attempting'}, {key =>'avetries',desc=>'Average Number of Tries'}, @@ -2682,7 +2788,8 @@ sub display_results { {key =>'correct',desc=>'Evaluation: Material is Correct'}, {key =>'helpful',desc=>'Evaluation: Material is Helpful'}, {key =>'depth',desc=>'Evaluation: Material has Depth'}, - ); + )); + } my %fieldnames = &Apache::lonmeta::fieldnames(); my @field_order; foreach my $field_data (@fields) { @@ -2699,7 +2806,13 @@ sub display_results { my %sort_fields = map {$_->{'key'},$_->{'desc'}} @fields; $sort_fields{'select_form_order'} = \@field_order; $env{'form.sortorder'} = 'desc' if (! exists($env{'form.sortorder'})); - $env{'form.sortfield'} = 'count' if (! exists($env{'form.sortfield'})); + if (! exists($env{'form.sortfield'})) { + if ($area eq 'portfolio') { + $env{'form.sortfield'} = 'owner'; + } else { + $env{'form.sortfield'} = 'count'; + } + } if (! exists($env{'form.sortorder'})) { if ($env{'form.sortfield'}=~/^(count|stdno|disc|clear|technical|correct|helpful)$/) { $env{'form.sortorder'}='desc'; @@ -2763,12 +2876,16 @@ sub display_results { my @Results = &Apache::lonmysql::get_rows($table,$sort_command); ## ## Loop through the results and output them. + my $tabletype = 'metadata'; + if ($area eq 'portfolio') { + $tabletype = 'portfolio_search'; + } foreach my $row (@Results) { if ($connection->aborted()) { &cleanup(); return; } - my %Fields = %{&parse_row(@$row)}; + my %Fields = %{&parse_row($tabletype,@$row)}; my $output="\n"; if (! defined($Fields{'title'}) || $Fields{'title'} eq '') { $Fields{'title'} = 'Untitled'; @@ -2852,10 +2969,10 @@ Parse a row returned from the database. ###################################################################### ###################################################################### sub parse_row { - my @Row = @_; + my ($tabletype,@Row) = @_; my %Fields; if (! scalar(@Datatypes)) { - &set_up_table_structure(); + &set_up_table_structure($tabletype); } for (my $i=0;$i<=$#Row;$i++) { $Fields{$Datatypes[$i]->{'name'}}=&unescape($Row[$i]); @@ -2891,12 +3008,13 @@ The 'title' field is set to "Untitled" i ########################################################### ########################################################### sub parse_raw_result { - my ($result,$hostname) = @_; + my ($result,$hostname,$tabletype) = @_; # conclude from self to others regarding fields my %Fields=&LONCAPA::lonmetadata::metadata_col_to_hash - (map { + ($tabletype, + map { &unescape($_); - } (split(/\,/,$result)) ); + } (split(/\,/,$result)) ); return %Fields; } @@ -3197,11 +3315,11 @@ sub detailed_citation_view { my ($prefix,%values) = @_; my $result; my $jumpurl=$values{'url'}; - $jumpurl=~s/^\/ext\//http\:\/\//; + $jumpurl=~s|^/ext/|http://|; $result .= ''.$prefix. ''.' '. ''.$values{'title'}."\n"; + 'target="preview">'.$values{'title'}."\n"; $result .= "
\n";
$result .= ''.$values{'author'}.','.
' '.$values{'owner'}.'
';
@@ -3268,9 +3386,9 @@ sub detailed_citation_view {
$result .= ''.&mt($field->{'translate'}).'';
foreach my $item (split(',',$values{$field->{'name'}})){
$result .=
- &Apache::lonhtmlcommon::crumbs($item,
- (($env{'form.catalogmode'} eq 'import')?'_top':'preview'),
- '/res',
+ &Apache::lonhtmlcommon::crumbs(&Apache::lonnet::clutter($item),
+ 'preview',
+ '',
(($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),2,0,1);
}
} elsif (exists($field->{'format'}) && $field->{'format'} ne ''){
@@ -3279,11 +3397,15 @@ sub detailed_citation_view {
$values{$field->{'name'}}))."
\n";
} else {
if ($field->{'special'} eq 'url link') {
- $result.=
+ if ($jumpurl=~/^http\:\/\//) {
+ $result.=''.$jumpurl.'';
+ } else {
+ $result .=
&Apache::lonhtmlcommon::crumbs($jumpurl,
- (($env{'form.catalogmode'} eq 'import')?'_top':'preview'),
+ 'preview',
'',
(($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),3,0,1);
+ }
} else {
$result.= &mt($field->{'translate'},
$values{$field->{'name'}});
@@ -3339,15 +3461,19 @@ sub summary_view {
$result .= ' '.$tmp.' ';
}
my $jumpurl=$values{'url'};
- $jumpurl=~s/^\/ext\//http\:\/\//;
- my $link=&Apache::lonhtmlcommon::crumbs($jumpurl,
- (($env{'form.catalogmode'} eq 'import')?'':'preview'),
+ my $link;
+ if ($jumpurl=~m|^/ext/|) {
+ $jumpurl=~s|^/ext/|http://|;
+ $link='
'.$jumpurl.'';
+ } else {
+ $link=&Apache::lonhtmlcommon::crumbs($jumpurl,
+ 'preview',
'',
(($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),2,0,1);
-
+ }
$result.=<
$values{'copyrighttag'}
$values{'extrashow'}
@@ -3380,11 +3506,16 @@ sub summary_preview {
sub compact_view {
my ($prefix,%values) = @_;
my $jumpurl=$values{'url'};
- $jumpurl=~s/^\/ext\//http\:\/\//;
- my $link=&Apache::lonhtmlcommon::crumbs($jumpurl,
- (($env{'form.catalogmode'} eq 'import')?'_top':'preview'),
+ my $link;
+ if ($jumpurl=~m|^/ext/|) {
+ $jumpurl=~s|^/ext/|http://|;
+ $link=''.$jumpurl.'';
+ } else {
+ $link=&Apache::lonhtmlcommon::crumbs($jumpurl,
+ 'preview',
'',
(($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),1,1,1).' ';
+ }
my $result =
$prefix.'';
if (exists($env{'form.sortfield'}) &&
@@ -3393,7 +3524,7 @@ sub compact_view {
if (! defined($tmp)) { $tmp = 'undefined'; }
$result .= ' '.$tmp.' ';
}
- $result.=' '.
+ $result.=' '.
$values{'title'}.''.(' 'x2).$link.
''.$values{'author'}.' ('.$values{'domain'}.')
';
return $result;
@@ -3416,14 +3547,14 @@ sub fielded_format_view {
my $icon=&Apache::loncommon::icon($values{'url'});
my %Translated = &Apache::lonmeta::fieldnames();
my $jumpurl=$values{'url'};
- $jumpurl=~s/^\/ext\//http\:\/\//;
+ $jumpurl=~s|^/ext/|http://|;
my $result=<