[LON-CAPA-cvs] cvs: loncom /interface lonsearchcat.pm
matthew
lon-capa-cvs@mail.lon-capa.org
Fri, 23 Apr 2004 17:52:55 -0000
This is a MIME encoded message
--matthew1082742775
Content-Type: text/plain
matthew Fri Apr 23 13:52:55 2004 EDT
Modified files:
/loncom/interface lonsearchcat.pm
Log:
Checked every current advanced search form and ensured the mysql query is
generated properly. Reworked handling of date queries.
--matthew1082742775
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20040423135255.txt"
Index: loncom/interface/lonsearchcat.pm
diff -u loncom/interface/lonsearchcat.pm:1.215 loncom/interface/lonsearchcat.pm:1.216
--- loncom/interface/lonsearchcat.pm:1.215 Thu Apr 22 16:05:18 2004
+++ loncom/interface/lonsearchcat.pm Fri Apr 23 13:52:55 2004
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Search Catalog
#
-# $Id: lonsearchcat.pm,v 1.215 2004/04/22 20:05:18 matthew Exp $
+# $Id: lonsearchcat.pm,v 1.216 2004/04/23 17:52:55 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -736,18 +736,54 @@
&Apache::loncommon::domain_select('domains',
$ENV{'form.domains'},1).
'</td></tr>'.$/;
- $scrout .= "</table>\n<br />\n<table>\n";
- my %dates=&Apache::lonlocal::texthash
- ('creationdatestart' => 'Creation Date After',
- 'creationdateend' => 'Creation Date Before',
- 'lastrevisiondatestart' => 'Last Revision Date After',
- 'lastrevisiondateend' => 'Last Revision Date Before');
- foreach my $field (sort keys %dates) {
- $scrout.='<tr>'.
- '<td align="right">'.&titlefield($dates{$field}).'</td><td>'.
- &Apache::lonhtmlcommon::date_setter('advsearch',$field,0,'',1).
- '</td></tr>'.$/;
- }
+ $scrout .= "</table>\n<br />";
+ #
+ # Creation/Modification date limits
+ $scrout .= "\n<table>\n";
+ my $cafter =
+ &Apache::lonhtmlcommon::date_setter('advsearch', # formname
+ 'creationdate1', # fieldname
+ 0, # current value
+ '', # special
+ 1, # includeempty
+ '', # state
+ 1, # no_hh_mm_ss
+ );
+ my $cbefore =
+ &Apache::lonhtmlcommon::date_setter('advsearch', # formname
+ 'creationdate2', # fieldname
+ 0, # current value
+ '', # special
+ 1, # includeempty
+ '', # state
+ 1, # no_hh_mm_ss
+ );
+ $scrout .= &mt('<tr><td align="right">Created between</td>'.
+ '<td>[_1]</td></tr>'.
+ '<tr><td align="right">and </td>'.
+ '<td>[_2]</td></tr>',$cafter,$cbefore);
+ my $lafter =
+ &Apache::lonhtmlcommon::date_setter('advsearch',
+ 'revisiondate1',
+ 0, # current value
+ '', # special
+ 1, # includeempty
+ '', # state
+ 1, # no_hh_mm_ss
+ );
+ my $lbefore =
+ &Apache::lonhtmlcommon::date_setter('advsearch',
+ 'revisiondate2',
+ 0, # current value
+ '', # special
+ 1, # includeempty
+ '', # state
+ 1, # no_hh_mm_ss
+ );
+ $scrout .= &mt('<tr><td align="right">Last modified between </td>'.
+ '<td>[_1]</td></tr>'.
+ '<tr><td align="right">and</td>'.
+ '<td>[_2]</td></tr>',$lafter,$lbefore);
$scrout.="</table>\n";
$scrout.=<<ENDDOCUMENT;
$advanced_buttons
@@ -1045,38 +1081,45 @@
######################################################################
sub parse_advanced_search {
my ($r,$closebutton,$hidden_fields)=@_;
+ my @BasicFields = ('title','author','subject','keywords','url','version',
+ 'notes','abstract','extension','language','owner',
+# 'custommetadata','customshow',
+ 'modifyinguser','standards','mime');
+
my $fillflag=0;
my $pretty_search_string = "<br />\n";
# Clean up fields for safety
- for my $field ('title','author','subject','keywords','url','version',
- 'creationdatestart_month','creationdatestart_day',
+ for my $field (@BasicFields,
+ 'creationdatestart_month','creationdatestart_day',
'creationdatestart_year','creationdateend_month',
'creationdateend_day','creationdateend_year',
'lastrevisiondatestart_month','lastrevisiondatestart_day',
'lastrevisiondatestart_year','lastrevisiondateend_month',
- 'lastrevisiondateend_day','lastrevisiondateend_year',
- 'notes','abstract','extension','language','owner',
- 'custommetadata','customshow','category') {
- $ENV{"form.$field"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
+ 'lastrevisiondateend_day','lastrevisiondateend_year') {
+ $ENV{'form.'.$field}=~s/[^\w\/\s\(\)\=\-\"\']//g;
}
foreach ('mode','form','element') {
# is this required? Hmmm.
- next unless (exists($ENV{"form.$_"}));
- $ENV{"form.$_"}=&Apache::lonnet::unescape($ENV{"form.$_"});
- $ENV{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
+ next if (! exists($ENV{'form.'.$_}));
+ $ENV{'form.'.$_}=&Apache::lonnet::unescape($ENV{'form.'.$_});
+ $ENV{'form.'.$_}=~s/[^\w\/\s\(\)\=\-\"\']//g;
}
# Preprocess the category form element.
$ENV{'form.category'} = 'any' if (! defined($ENV{'form.category'}) ||
ref($ENV{'form.category'}));
#
# Check to see if enough information was filled in
- for my $field ('title','author','subject','keywords','url','version',
- 'notes','abstract','category','extension','language',
- 'owner','custommetadata') {
- if (&filled($ENV{"form.$field"})) {
+ for my $field (@BasicFields) {
+ if (&filled($ENV{'form.'.$field})) {
$fillflag++;
}
}
+ for my $field ('lowestgradelevel','highestgradelevel') {
+ if ( $ENV{'form.'.$field} =~ /^\d+$/ &&
+ $ENV{'form.'.$field} > 0) {
+ $fillflag++;
+ }
+ }
if (! $fillflag) {
&output_blank_field_error($r,$closebutton,
'phase=disp_adv',$hidden_fields);
@@ -1087,8 +1130,7 @@
my @queries;
my $font = '<font color="#800000" face="helvetica">';
# Evaluate logical expression AND/OR/NOT phrase fields.
- foreach my $field ('title','author','subject','notes','abstract','url',
- 'keywords','version','owner','standards') {
+ foreach my $field (@BasicFields) {
if ($ENV{'form.'.$field}) {
my $searchphrase = $ENV{'form.'.$field};
$pretty_search_string .= $font."$field</font> contains <b>".
@@ -1120,11 +1162,6 @@
$searchphrase = join(' OR ',@extensions);
}
}
- if (exists($ENV{'form.extension'}) && $ENV{'form.extension'} !~ /^\s*$/) {
- $searchphrase .= ' OR ' if (defined($searchphrase));
- my @extensions = split(/,/,$ENV{'form.extension'});
- $searchphrase .= join(' OR ',@extensions);
- }
if (defined($searchphrase)) {
push @queries,&build_SQL_query('mime',$searchphrase);
$pretty_search_string .=$font.'mime</font> contains <b>'.
@@ -1132,6 +1169,22 @@
}
#
# Evaluate option lists
+ if ($ENV{'form.lowestgradelevel'} &&
+ $ENV{'form.lowestgradelevel'} ne '0' &&
+ $ENV{'form.lowestgradelevel'} =~ /^\d+$/) {
+ push(@queries,
+ '(lowestgradelevel>='.$ENV{'form.lowestgradelevel'}.')');
+ $pretty_search_string.="lowestgradelevel>=".
+ $ENV{'form.lowestgradelevel'}."<br />\n";
+ }
+ if ($ENV{'form.highestgradelevel'} &&
+ $ENV{'form.highestgradelevel'} ne '0' &&
+ $ENV{'form.highestgradelevel'} =~ /^\d+$/) {
+ push(@queries,
+ '(highestgradelevel<='.$ENV{'form.highestgradelevel'}.')');
+ $pretty_search_string.="highestgradelevel<=".
+ $ENV{'form.highestgradelevel'}."<br />\n";
+ }
if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {
push @queries,"(language like \"$ENV{'form.language'}\")";
$pretty_search_string.=$font."language</font>= ".
@@ -1146,27 +1199,32 @@
}
#
# Evaluate date windows
- my $datequery=&build_date_queries(
- $ENV{'form.creationdatestart_month'},
- $ENV{'form.creationdatestart_day'},
- $ENV{'form.creationdatestart_year'},
- $ENV{'form.creationdateend_month'},
- $ENV{'form.creationdateend_day'},
- $ENV{'form.creationdateend_year'},
- $ENV{'form.lastrevisiondatestart_month'},
- $ENV{'form.lastrevisiondatestart_day'},
- $ENV{'form.lastrevisiondatestart_year'},
- $ENV{'form.lastrevisiondateend_month'},
- $ENV{'form.lastrevisiondateend_day'},
- $ENV{'form.lastrevisiondateend_year'},
- );
- # Test to see if date windows are legitimate
- if ($datequery=~/^Incorrect/) {
- &output_date_error($r,$datequery,$closebutton,$hidden_fields);
- return ;
- } elsif ($datequery) {
+ my $cafter =
+ &Apache::lonhtmlcommon::get_date_from_form('creationdate1');
+ my $cbefore =
+ &Apache::lonhtmlcommon::get_date_from_form('creationdate2');
+ if ($cafter > $cbefore) {
+ my $tmp = $cafter;
+ $cafter = $cbefore;
+ $cbefore = $tmp;
+ }
+ my $mafter =
+ &Apache::lonhtmlcommon::get_date_from_form('revisiondate1');
+ my $mbefore =
+ &Apache::lonhtmlcommon::get_date_from_form('revisiondate2');
+ if ($mafter > $mbefore) {
+ my $tmp = $mafter;
+ $mafter = $mbefore;
+ $mbefore = $tmp;
+ }
+ my ($datequery,$error,$prettydate)=&build_date_queries($cafter,$cbefore,
+ $mafter,$mbefore);
+ if (defined($error)) {
+ &output_date_error($r,$error,$closebutton,$hidden_fields);
+ } elsif (defined($datequery)) {
# Here is where you would set up pretty_search_string to output
# date query information.
+ $pretty_search_string .= '<br />'.$prettydate.'<br />';
push @queries,$datequery;
}
#
@@ -1200,8 +1258,7 @@
$pretty_search_string .= $pretty_domains_string."<br />\n";
#
if (@queries) {
- $query=join(" AND ",@queries);
- $query="select * from metadata where $query";
+ $query="select * from metadata where ".join(" AND ",@queries);
} elsif ($customquery) {
$query = '';
}
@@ -1459,51 +1516,73 @@
######################################################################
######################################################################
sub build_date_queries {
- my ($cmonth1,$cday1,$cyear1,$cmonth2,$cday2,$cyear2,
- $lmonth1,$lday1,$lyear1,$lmonth2,$lday2,$lyear2)=@_;
- my @queries;
- if ($cmonth1 or $cday1 or $cyear1 or $cmonth2 or $cday2 or $cyear2) {
- unless ($cmonth1 and $cday1 and $cyear1 and
- $cmonth2 and $cday2 and $cyear2) {
- return "Incorrect entry for the creation date. You must specify ".
- "a starting month, day, and year and an ending month, ".
- "day, and year.";
- }
- my $cnumeric1=sprintf("%d%2d%2d",$cyear1,$cmonth1,$cday1);
- $cnumeric1+=0;
- my $cnumeric2=sprintf("%d%2d%2d",$cyear2,$cmonth2,$cday2);
- $cnumeric2+=0;
- if ($cnumeric1>$cnumeric2) {
- return "Incorrect entry for the creation date. The starting ".
- "date must occur before the ending date.";
- }
- my $cquery="(creationdate BETWEEN '$cyear1-$cmonth1-$cday1' AND '".
- "$cyear2-$cmonth2-$cday2 23:59:59')";
- push @queries,$cquery;
- }
- if ($lmonth1 or $lday1 or $lyear1 or $lmonth2 or $lday2 or $lyear2) {
- unless ($lmonth1 and $lday1 and $lyear1 and
- $lmonth2 and $lday2 and $lyear2) {
- return "Incorrect entry for the last revision date. You must ".
- "specify a starting month, day, and year and an ending ".
- "month, day, and year.";
- }
- my $lnumeric1=sprintf("%d%2d%2d",$lyear1,$lmonth1,$lday1);
- $lnumeric1+=0;
- my $lnumeric2=sprintf("%d%2d%2d",$lyear2,$lmonth2,$lday2);
- $lnumeric2+=0;
- if ($lnumeric1>$lnumeric2) {
- return "Incorrect entry for the last revision date. The ".
- "starting date must occur before the ending date.";
- }
- my $lquery="(lastrevisiondate BETWEEN '$lyear1-$lmonth1-$lday1' AND '".
- "$lyear2-$lmonth2-$lday2 23:59:59')";
- push @queries,$lquery;
+ my ($cafter,$cbefore,$mafter,$mbefore) = @_;
+ my ($result,$error,$pretty_string);
+ #
+ # Verify the input
+ if (! defined($cafter) && ! defined($cbefore) &&
+ ! defined($mafter) && ! defined($mbefore)) {
+ # This is an okay situation, so return undef for the error
+ return (undef,undef,undef);
+ }
+ if ((defined($cafter) && ! defined($cbefore)) ||
+ (defined($cbefore) && ! defined($cafter))) {
+ # This is bad, so let them know
+ $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. '.
+ 'You must specify both the beginning and ending dates.');
}
- if (@queries) {
- return join(" AND ",@queries);
+ if (! defined($error)) {
+ #
+ # Build the queries
+ my @queries;
+ if (defined($cbefore) && defined($cafter)) {
+ my (undef,undef,undef,$caday,$camon,$cayear) = localtime($cafter);
+ my (undef,undef,undef,$cbday,$cbmon,$cbyear) = localtime($cbefore);
+ # Correct for year being relative to 1900
+ $cayear+=1900; $cbyear+=1900;
+ my $cquery=
+ '(creationdate BETWEEN '.
+ "'".$cayear.'-'.$camon.'-'.$caday."'".
+ ' AND '.
+ "'".$cbyear.'-'.$cbmon.'-'.$cbday." 23:59:59')";
+ $pretty_string .= '<br />' if (defined($pretty_string));
+ $pretty_string .=
+ &mt('created between [_1] and [_2]',
+ &Apache::lonlocal::locallocaltime($cafter),
+ &Apache::lonlocal::locallocaltime($cbefore+24*60*60-1));
+ push(@queries,$cquery);
+ $pretty_string =~ s/ 00:00:00//g;
+ }
+ if (defined($mbefore) && defined($mafter)) {
+ my (undef,undef,undef,$maday,$mamon,$mayear) = localtime($mafter);
+ my (undef,undef,undef,$mbday,$mbmon,$mbyear) = localtime($mbefore);
+ # Correct for year being relative to 1900
+ $mayear+=1900; $mbyear+=1900;
+ my $mquery=
+ '(lastrevisiondate BETWEEN '.
+ "'".$mayear.'-'.$mamon.'-'.$maday."'".
+ ' AND '.
+ "'".$mbyear.'-'.$mbmon.'-'.$mbday." 23:59:59')";
+ push(@queries,$mquery);
+ $pretty_string .= '<br />' if (defined($pretty_string));
+ $pretty_string .=
+ &mt('last revised between [_1] and [_2]',
+ &Apache::lonlocal::locallocaltime($mafter),
+ &Apache::lonlocal::locallocaltime($mbefore+24*60*60-1));
+ $pretty_string =~ s/ 00:00:00//g;
+ }
+ if (@queries) {
+ $result .= join(" AND ",@queries);
+ }
}
- return '';
+ return ($result,$error,$pretty_string);
}
######################################################################
--matthew1082742775--