[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--