[LON-CAPA-cvs] cvs: loncom /interface lonwhatsnew.pm

raeburn lon-capa-cvs@mail.lon-capa.org
Mon, 18 Apr 2005 20:35:07 -0000


This is a MIME encoded message

--raeburn1113856507
Content-Type: text/plain

raeburn		Mon Apr 18 16:35:07 2005 EDT

  Modified files:              
    /loncom/interface	lonwhatsnew.pm 
  Log:
  Unread course discussion posts moved to top of column 2.  Display of problems with anomalous average number of attempts and/or degree of difficulty added.  Data extracted from resourcetracker.db for course. Work in progress. 
  
  
--raeburn1113856507
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20050418163507.txt"

Index: loncom/interface/lonwhatsnew.pm
diff -u loncom/interface/lonwhatsnew.pm:1.10 loncom/interface/lonwhatsnew.pm:1.11
--- loncom/interface/lonwhatsnew.pm:1.10	Mon Apr 11 17:51:43 2005
+++ loncom/interface/lonwhatsnew.pm	Mon Apr 18 16:35:07 2005
@@ -1,5 +1,5 @@
 #
-# $Id: lonwhatsnew.pm,v 1.10 2005/04/11 21:51:43 raeburn Exp $
+# $Id: lonwhatsnew.pm,v 1.11 2005/04/18 20:35:07 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -107,7 +107,7 @@
   <input type="submit" value="'.&mt('Change page to:').'" />
    <select name="command">
     <option value="info" '.$selinfo.'">'.&mt('Display Action Items').'</option>
-    <option value="" '.$selconfig.'">'.&mt('Configure Settings').'</option>
+    <option value="config" '.$selconfig.'">'.&mt('Configure Settings').'</option>
    </select>
  </nobr>
 </form>');
@@ -164,11 +164,13 @@
     my %unread = ();
     my %ungraded = ();
     my %bombed = ();
+    my %triggered = ();
     my @newmsgs = ();
     my @critmsgs = ();
     my @newdiscussions = ();
     my @tograde = ();
     my @bombs = ();
+    my @warnings = ();
 
     my $domain=&Apache::loncommon::determinedomain();
     my $function;
@@ -182,7 +184,7 @@
     my $pgbg=&Apache::loncommon::designparm($function.'.pgbg',$domain);
     my $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain);
 
-    &getitems(\%unread,\%ungraded,\%bombed,\@newdiscussions,\@tograde,\@bombs);
+    &getitems(\%unread,\%ungraded,\%bombed,\%triggered,\@newdiscussions,\@tograde,\@bombs,\@warnings,$rowColor1,$rowColor2);
     my ($msgcount,$critmsgcount) = &getmail(\@newmsgs,\@critmsgs);
 
     unless ($env{'request.course.id'}) {
@@ -192,54 +194,13 @@
 
     $r->print('<b>'.$picker.'</b><br /><hr width="100%" /><table border="0" width="100%" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%">');
 
-## UNREAD COURSE DISCUSSION POSTS ##
-    $r->print(<<"END");
-              <table border="0" cellpadding="0" cellspacing="0" bgcolor="#000000" width="100%">
-               <tr><td>
-                <table border="0" cellpadding="1" cellspacing="1" bgcolor="#000000" width="100%">
-                 <tr>
-                  <td bgcolor="$tabbg"><b>Unread course discussion posts:</b></td>
-                 </tr>
-                 <tr>
-                   <td bgcolor="#ffffff">
-                   <table cellpadding="2" cellspacing="0" border="0" width="100%">
-END
-
-    if (@newdiscussions > 0) {
-        $r->print('<tr bgcolor="#cccccc"><td><b><small>Location</small></b></td><td><b><small>Type</small></b><td align="right"><b><small>Number of new posts</small></b></td></tr>');
-#        @newdiscussions = sort { &cmp_title($a,$b) } @newdiscussions;
-        my $rowNum = 0;
-        foreach my $ressymb (@newdiscussions) {
-            my $forum_title = $unread{$ressymb}{'title'};
-            my $type = 'Resource';
-	    my $feedurl=&Apache::lonfeedback::get_feedurl($ressymb);
-            if ($feedurl =~ /bulletinboard/) {
-                $type = 'Bulletin Board';
-            }
-            my $unreadnum = keys(%{$unread{$ressymb}});
-            $unreadnum = $unreadnum - 2;
-            if ($unreadnum > 0) {
-                if ($rowNum %2 == 1) {
-                    $rowColor = $rowColor1;
-                } else {
-                    $rowColor = $rowColor2;
-                }
-                $r->print('<tr bgcolor="'.$rowColor.'"><td><small><a href="'.$feedurl.'?symb='.$unread{$ressymb}{symb}.'">'.$forum_title.':</a>&nbsp;</td><td><small>'.$type.'</small></td><td align="right">'.$unreadnum.'&nbsp;</td></tr>');
-                $rowNum ++;
-            }
-        }
-    } else {
-        $r->print('<tr><td bgcolor="#ffffff"><br><center>&nbsp;<i><b><small>No unread posts in course discussions</small></b></i><br><br></td></tr>');
-    }
-    $r->print('</table></td></tr></table></td></tr></table><br />');
-
 ## UNGRADED ITEMS ##
     $r->print(<<END);
            <table border="0" cellpadding="0" cellspacing="0" bgcolor="#000000" width="100%">
             <tr><td>
              <table border="0" cellpadding="1" cellspacing="1" bgcolor="#000000" width="100%">
               <tr>
-               <td bgcolor="$tabbg"><b>Problems requiring handgrading:</b></td></tr>
+               <td bgcolor="$tabbg"><b>Problems requiring handgrading</b></td></tr>
                   <tr>
                    <td bgcolor="#ffffff">
                      <table cellpadding="2" cellspacing="0" border="0" width="100%">
@@ -296,8 +257,87 @@
     }
     $r->print('</table></td></tr></table></td></tr></table><br />');
 
+# DEGDIFF AND AV. TRIES TRIGGERS
+     $r->print(<<"END");
+           <table border="0" cellpadding="0" cellspacing="0" bgcolor="#000000" width="100%">
+            <tr>
+             <td>
+               <table border="0" cellpadding="1" cellspacing="1" bgcolor="#000000" width="100%">
+               <tr>
+                <td bgcolor="$tabbg"><b>Problems with average attempts > 0 or degree of difficulty > 0</b></td>
+               </tr>
+                <tr>
+                <td bgcolor="#ffffff">
+                 <table width="100%" cellspacing="0" cellpadding="0" border="0">
+END
+     my $warningnum = 0;
+     if (@warnings > 0) {
+#        @warnings = sort { &cmp_title($a,$b) } @warnings;
+        $r->print('<tr bgcolor="#cccccc"><td><b><small>Resource</small></b></td><td align="right"><b><small>Part</small></b><td align="right"><b><small>Num. students</small></b></td><td align="right"><b><small>Av. Attempts</small></b></td><td align="right"><b><small>Deg. Diff</small></b></td></tr>');
+        foreach my $res (@warnings) {
+            if ($warningnum %2 == 1) {
+                 $rowColor = $rowColor1;
+            } else {
+                $rowColor = $rowColor2;
+            }
+            my ($map,$id,$url)=&Apache::lonnet::decode_symb($res);
+            my $linkurl=&Apache::lonnet::clutter($url);
+            my $rowspan;
+            if ($triggered{$res}{numparts} > 1) {
+                $rowspan = 'rowspan="'.$triggered{$res}{numparts}.'"';
+            }
+            $linkurl .= '?symb='.&Apache::lonnet::escape($res);
+            $r->print('<tr bgcolor="'.$rowColor.'"><td '.$rowspan.'><a href="'.$linkurl.'"><small>'.$triggered{$res}{title}.'</small></a></td>'.$triggered{$res}{text});
+            $warningnum ++;
+        }
+    } else {
+        $r->print('<tr><td bgcolor="#ffffff"><br /><center><b><i><small>No problems with av. attempts or degree of difficulty above thresholds</small></i></b></center><br /></td></tr>');
+    }
+    $r->print('</table></td></tr></table></td></tr></table><br />');
+
     $r->print('</td><td width="5%">&nbsp;</td><td align="left" valign="top" width-"50%">');
 
+## UNREAD COURSE DISCUSSION POSTS ##
+    $r->print(<<"END");
+              <table border="0" cellpadding="0" cellspacing="0" bgcolor="#000000" width="100%">
+               <tr><td>
+                <table border="0" cellpadding="1" cellspacing="1" bgcolor="#000000" width="100%">
+                 <tr>
+                  <td bgcolor="$tabbg"><b>Unread course discussion posts</b></td>
+                 </tr>
+                 <tr>
+                   <td bgcolor="#ffffff">
+                   <table cellpadding="2" cellspacing="0" border="0" width="100%">
+END
+                                                                                  
+    if (@newdiscussions > 0) {
+        $r->print('<tr bgcolor="#cccccc"><td><b><small>Location</small></b></td><td><b><small>Type</small></b><td align="right"><b><small>Number of new posts</small></b></td></tr>');
+#        @newdiscussions = sort { &cmp_title($a,$b) } @newdiscussions;
+        my $rowNum = 0;
+        foreach my $ressymb (@newdiscussions) {
+            my $forum_title = $unread{$ressymb}{'title'};
+            my $type = 'Resource';
+            my $feedurl=&Apache::lonfeedback::get_feedurl($ressymb);
+            if ($feedurl =~ /bulletinboard/) {
+                $type = 'Bulletin Board';
+            }
+            my $unreadnum = keys(%{$unread{$ressymb}});
+            $unreadnum = $unreadnum - 2;
+            if ($unreadnum > 0) {
+                if ($rowNum %2 == 1) {
+                    $rowColor = $rowColor1;
+                } else {
+                    $rowColor = $rowColor2;
+                }
+                $r->print('<tr bgcolor="'.$rowColor.'"><td><small><a href="'.$feedurl.'?symb='.$unread{$ressymb}{symb}.'">'.$forum_title.'</a>&nbsp;</td><td><small>'.$type.'</small></td><td align="right">'.$unreadnum.'&nbsp;</td></tr>');
+                $rowNum ++;
+            }
+        }
+    } else {
+        $r->print('<tr><td bgcolor="#ffffff"><br><center>&nbsp;<i><b><small>No unread posts in course discussions</small></b></i><br><br></td></tr>');
+    }
+    $r->print('</table></td></tr></table></td></tr></table><br />');
+
 ## MESSAGES ##
     $r->print(<<END);
            <table border="0" cellpadding="0" cellspacing="0" bgcolor="#000000" width="100%">
@@ -371,8 +411,20 @@
     $r->print('</td></tr></table>');
 }
 
+#-------------------------------
+# display_config_box
+#
+# Display the action items
+#
+#-------------------------------
+                                                                                
+sub display_config_box() {
+    my ($r,$picker) = @_;
+    $r->print('<b>'.$picker.'</b><br /><hr width="100%" /><table border="0" width="100%" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%">');
+}
+
 sub getitems {
-    my ($unread,$ungraded,$bombed,$newdiscussions,$tograde,$bombs) = @_;
+    my ($unread,$ungraded,$bombed,$triggered,$newdiscussions,$tograde,$bombs,$warnings,$rowColor1,$rowColor2) = @_;
     my $navmap = Apache::lonnavmaps::navmap->new();
     my @allres=$navmap->retrieveResources();
     my %discussiontime = &Apache::lonnet::dump('discussiontimes',
@@ -383,6 +435,13 @@
     my @discussions = ();
     my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();
 
+    my %resourcetracker =  &Apache::lonnet::dump('nohist_resourcetracker',
+               $env{'course.'.$env{'request.course.id'}.'.domain'},
+               $env{'course.'.$env{'request.course.id'}.'.num'});
+
+    my $diffcheck = 0;
+    my $triescheck = 0;
+    my $warningnum = 0;
     foreach my $key (keys(%lastread)) {
         my $newkey = $key;
         $newkey =~ s/_lastread$//;
@@ -394,6 +453,8 @@
         my $symb = $resource->symb();
         %{$$bombed{$symb}} = ();
         %{$$ungraded{$symb}} = ();
+        %{$$triggered{$symb}} = ();
+        $$triggered{$symb}{numparts} = 0;
         my $title = $resource->compTitle();
         my $ressymb = $resource->wrap_symb();
 # Check for unread discussion postings
@@ -462,8 +523,68 @@
             $$bombed{$symb}{errorlink} = $errorlink;
             push(@{$bombs}, $symb);
         }
+# Compile maxtries and degree of difficulty for problem parts
+        my @parts = @{$resource->parts()};
+        my %stats = ();
+        my $warning = 0;
+        my $rowColor;
+        foreach (@parts) {
+            %{$stats{$_}} = ();
+            my ($attempts,$users,$corrects,$degdiff,$av_attempts);
+            if (exists($resourcetracker{$symb.'_'.$_.'_attempts'})) {
+                $attempts = $resourcetracker{$symb.'_'.$_.'_attempts'};
+            }
+            if (exists($resourcetracker{$symb.'_'.$_.'_users'})) {
+                $users = $resourcetracker{$symb.'_'.$_.'_users'};
+            }
+            if (exists($resourcetracker{$symb.'_'.$_.'_correct'})) {
+                $corrects = $resourcetracker{$symb.'_'.$_.'_correct'};
+            }
+            if ($attempts > 0) {
+                $degdiff =  1 - ($corrects/$attempts);
+                $degdiff = sprintf("%.2f",$degdiff);
+            }
+            if ($users > 0) {
+                $av_attempts = $attempts/$users;
+            }
+            if (($degdiff ne '' && $degdiff >= $diffcheck) || ($av_attempts ne '' && $av_attempts >= $triescheck)) {
+                $stats{$_}{degdiff} = $degdiff;
+                $stats{$_}{attempts} = $av_attempts;
+                $stats{$_}{users} = $users;
+                $warning = 1;
+            }
+        }
+        if ($warning) {
+            if ($warningnum %2 == 1) {
+                $rowColor = $rowColor1;
+            } else {
+                $rowColor = $rowColor2;
+            }
+            $$triggered{$symb}{title} = $resource->title;
+            foreach (@parts) {
+                if (exists($stats{$_}{users})) {
+                    if ($$triggered{$symb}{numparts}) {
+                        $$triggered{$symb}{text} .= '<tr bgcolor="'.$rowColor.'">'."\n";
+                    }
+                    if (@parts > 1) {
+                        $$triggered{$symb}{text} .= '
+                         <td align="right"><small>part - '.$_.'<small></td>';
+                    } else {
+                        $$triggered{$symb}{text} .= '
+                         <td align="right"><small>single part</small></td>';
+                    }
+                    $$triggered{$symb}{text} .= '
+                         <td align="right"><small>'.$stats{$_}{users}.'</small></td>
+                         <td align="right"><small>'.$stats{$_}{attempts}.'</small></td>
+                         <td align="right"><small>'.$stats{$_}{degdiff}.'</small></td>
+                        </tr>';
+                    $$triggered{$symb}{numparts} ++;
+                }
+            }
+            push(@{$warnings},$symb);
+            $warningnum ++;
+        }
     }
-# Compile maxtries and degree of difficulty.
 }
 
 sub getmail {

--raeburn1113856507--