[LON-CAPA-cvs] cvs: loncom /homework outputtags.pm

foxr lon-capa-cvs@mail.lon-capa.org
Tue, 11 Oct 2005 10:48:25 -0000


foxr		Tue Oct 11 06:48:25 2005 EDT

  Modified files:              
    /loncom/homework	outputtags.pm 
  Log:
  Correct start_displayduedate to support mutipart problems with different duedates
  for the separate parts.  Attempt to only show additional part duedates if they
  differ from the previous duedate.  I think this is not yet 100% correct for the
  case where there's a problem duedate, a part without an explicit duedate and
  then a part with an explicit duedate same as the problem duedate... more testing
  required.
  
  
Index: loncom/homework/outputtags.pm
diff -u loncom/homework/outputtags.pm:1.38 loncom/homework/outputtags.pm:1.39
--- loncom/homework/outputtags.pm:1.38	Thu Apr  7 02:56:22 2005
+++ loncom/homework/outputtags.pm	Tue Oct 11 06:48:23 2005
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # tags that create controlled output
 #
-# $Id: outputtags.pm,v 1.38 2005/04/07 06:56:22 albertel Exp $
+# $Id: outputtags.pm,v 1.39 2005/10/11 10:48:23 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -40,36 +40,54 @@
     %Apache::outputtags::showonce=();
 }
 
+
 sub start_displayduedate {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $result;
+
+    # Different parts can have different due dates... so we keep a list
+    # of the parts for which we've displayed the duedate:
+
     if (exists($Apache::outputtags::showonce{'displayduedate'})) {
-	return '';
-    } else {
-	$Apache::outputtags::showonce{'displayduedate'}=1;
+	if (grep(/^\Q$Apache::inputtags::part\E$/,
+		 @{$Apache::outputtags::showonce{'displayduedate'}})) {
+	    return '';
+	}
     }
+    push (@{$Apache::outputtags::showonce{'displayduedate'}},
+	  $Apache::inputtags::part);
+
     my $status=$Apache::inputtags::status['-1'];
     &Apache::lonxml::debug("got a $status in duedatebox");
     my $style = &Apache::lonxml::get_param('style',$parstack,$safeeval);
     if (($status =~ /CAN.*_ANSWER/) && ($target eq 'web')) {
-#	my $format = &Apache::lonxml::get_param('format',$parstack,$safeeval);
-#	if ($format eq '') {
-#	    &Apache::lonxml::debug("using default format");
-#	    $format="%c";
-#	}
 	my $id = $Apache::inputtags::part;
 	my $date = &Apache::lonnet::EXT("resource.$id.duedate");
 	&Apache::lonxml::debug("duedatebox found $date for $id");
-	if (lc($style) !~ 'plain') { 
-	    $result ='<table border="on"><tr><td>Due '.
-		&Apache::lonnavmaps::timeToHumanString($date).
-		'</td></tr></table>';
-	} else {
-	    $result=&mt('Due').' '.&Apache::lonnavmaps::timeToHumanString($date);
+
+	# Only show the due date if the current date is 
+	# different from due date of the previous part.  I think
+	# this is probably the best way to avoid due date clutter.
+
+       	my $showduedate = 1;
+	my $part_count  = scalar(@{$Apache::outputtags::showonce{'displayduedate'}});
+	if ($part_count > 1) {
+	    my $prev_part_id = $Apache::outputtags::showonce{'displayduedate'}->[$part_count-2];
+	    my $prev_due_date = &Apache::lonnet::EXT("resource.$prev_part_id.duedate");
+	    if ($prev_due_date == $date) {
+		$showduedate = 0;
+	    }
+	}
+
+	if ($showduedate) {
+	    if (lc($style) !~ 'plain') { 
+		$result ='<table border="on"><tr><td>Due '.
+		    &Apache::lonnavmaps::timeToHumanString($date).
+		    '</td></tr></table>';
+	    } else {
+		$result=&mt('Due').' '.&Apache::lonnavmaps::timeToHumanString($date);
+	    }
 	}
-#        } else {
-#	    $result ='<table border="on"><tr><td>No due date set.</td></tr></table>';
-#	}
     } elsif ( $target eq 'edit' ) {
 	$result=&Apache::edit::tag_start($target,$token);
 	$result.='</td></tr>';