--- loncom/interface/lonblockingmenu.pm	2016/01/27 03:05:37	1.14.2.2
+++ loncom/interface/lonblockingmenu.pm	2016/10/16 21:49:51	1.19
@@ -2,7 +2,7 @@
 # Routines for configuring blocking of access to collaborative functions, 
 # and specific resources during an exam
 #
-# $Id: lonblockingmenu.pm,v 1.14.2.2 2016/01/27 03:05:37 raeburn Exp $
+# $Id: lonblockingmenu.pm,v 1.19 2016/10/16 21:49:51 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -105,6 +105,19 @@ block (including deletion), or when a ne
 
 =over
 
+=item &get_permission()
+
+Returns information about permission user has to set/modify exam
+blocking events.
+
+Inputs: None
+
+Outputs: 2
+    $readonly - true if modification of blocking events is prohibited.
+
+    $allowed  - true if blocking events information can be shown.
+ 
+
 =item &get_timed_items()
 
 Provides perl data structure with information about timed interval
@@ -222,7 +235,7 @@ Side Effects: &update_released_required(
 Generates web form elements used to display, cancel, or modify 
 existing blocking events. 
 
-Inputs: 7 
+Inputs: 8 
       - $r - Apache request object
 
       - $records - Reference to hash of current blocks
@@ -238,6 +251,9 @@ Inputs: 7
 
       - $blockcount - number of existing blocking events in course
 
+      - $readonly - if true, modification not allowed.
+ 
+
 Output: None
 
 Side Effects: prints web form elements (in a table) for current blocks. 
@@ -422,11 +438,10 @@ sub handler {
 
 # ----------------------------------------------------------- Permissions check
 
-    unless ((&Apache::lonnet::allowed('dcm',$env{'request.course.id'})) ||
-            (&Apache::lonnet::allowed('dcm',$env{'request.course.id'}.
-                                      '/'.$env{'request.course.sec'}))) {
+    my ($readonly,$allowed) = &get_permission();
+    unless ($allowed) {
         $env{'user.error.msg'}=
-     "/adm/setblock:dcm:0:0:Cannot set blocking of communications in a course";
+     "/adm/setblock:dcm:0:0:Cannot view/set blocking of communications in a course";
         return HTTP_NOT_ACCEPTABLE;
     }
 
@@ -471,7 +486,7 @@ sub handler {
             $r->print(&Apache::loncourserespicker::create_picker($navmap,
                                      'examblock','resourceblocks',$crstype,
                                      \%blockedmaps,\%blockedresources,
-                                     $env{'form.block'}));
+                                     $env{'form.block'},'','',undef,$readonly));
         } else {
             $r->print($errormsg);
         }
@@ -480,10 +495,12 @@ sub handler {
 
 # -------------------------- Store changes and retrieve latest block information
     my $storeresult;
-    if ($env{'form.action'} eq 'store') {
-        (my $numchanges,$storeresult) = &blockstore($r,$crstype,$blockcount,\%records);
-        if ($numchanges > 0) {
-            $blockcount = &get_blockdates(\%records);
+    unless ($readonly) {
+        if ($env{'form.action'} eq 'store') {
+            (my $numchanges,$storeresult) = &blockstore($r,$crstype,$blockcount,\%records);
+            if ($numchanges > 0) {
+                $blockcount = &get_blockdates(\%records);
+            }
         }
     }
 
@@ -569,8 +586,10 @@ sub handler {
 
 # ------------------------ Choose between modifying existing block or adding new
     $r->print('<form name="blockform" method="post" action="/adm/setblock?action=store">');
-    if ($blockcount > 0) {
-         $r->print(<<"END");
+    
+    unless ($readonly) { 
+        if ($blockcount > 0) {
+            $r->print(<<"END");
 <div class="LC_left_float">
 <fieldset><legend>$lt{'actt'}</legend>
 <span class="LC_nobreak">
@@ -587,33 +606,62 @@ onclick="toggleAddModify();" />$lt{'addn
 <br clear="all" />
 <div id="showadd" style="display:none">
 END
-    } else {
-        $r->print($lt{'ncbc'}.'<br /><br />'.
-                  '<h4>'.$lt{'addn'}.'</h4>'.
-                  '<input type="hidden" name="blockaction" value="add" />');
+        } else {
+            $r->print($lt{'ncbc'}.'<br /><br />'.
+                      '<h4>'.$lt{'addn'}.'</h4>'.
+                      '<input type="hidden" name="blockaction" value="add" />');
+        }
     }
     my ($navmap,$errormsg) =
         &Apache::loncourserespicker::get_navmap_object($crstype,'examblock');
 
 # --------------------------------------------- Interface for adding a new block
-    &display_addblocker_table($r,$blockcount,\%ltext,\%intervals,
-                              $navmap,$errormsg);
+    if ($readonly) {
+        if (!$blockcount) {
+            $r->print($lt{'ncbc'}.'<br />');
+        }
+    } else {
+        &display_addblocker_table($r,$blockcount,\%ltext,\%intervals,
+                                  $navmap,$errormsg);
+        if ($blockcount > 0) {
+            $r->print('</div>');
+        }
+    }
 
-# ------------------------------------------------- Interface for existig blocks
+# ------------------------------------------------ Interface for existing blocks
     if ($blockcount > 0) {
-        $r->print('</div>');
         &display_blocker_status($r,\%records,\%ltext,\%intervals,
-                                $navmap,$errormsg,$blockcount);
+                                $navmap,$errormsg,$blockcount,$readonly);
     }
-    $r->print(<<"END");
+    unless ($readonly) {
+        $r->print(<<"END");
 <br />
 <input type ="submit" value="$lt{'stor'}" />
-</form>
 END
-    $r->print(&Apache::loncommon::end_page());
+    }
+    $r->print('</form>'.
+              &Apache::loncommon::end_page());
     return OK;
 }
 
+sub get_permission {
+    my %permission;
+    my $allowed = 0;
+    my $readonly = 0;
+    return ($readonly,$allowed) unless ($env{'request.course.id'});
+    if ((&Apache::lonnet::allowed('dcm',$env{'request.course.id'})) ||
+        (&Apache::lonnet::allowed('dcm',$env{'request.course.id'}.'/'.
+                  $env{'request.course.sec'}))) {
+        $allowed = 1;
+    } elsif ((&Apache::lonnet::allowed('vcb',$env{'request.course.id'})) ||
+             (&Apache::lonnet::allowed('vcb',$env{'request.course.id'}.'/'.
+                  $env{'request.course.sec'}))) {
+        $readonly = 1;
+        $allowed = 1;
+    }
+    return ($readonly,$allowed);
+}
+
 sub get_timed_items {
     my ($cdom,$cnum) = @_;
     my ($cid,%intervals);
@@ -975,9 +1023,9 @@ sub check_release_required {
 }
 
 sub display_blocker_status {
-    my ($r,$records,$ltext,$intervals,$navmap,$errormsg,$blockcount) = @_;
+    my ($r,$records,$ltext,$intervals,$navmap,$errormsg,$blockcount,$readonly) = @_;
     my $parmcount = 0;
-    my (%map_url,%resource_symb,%titles,%lookups);
+    my (%map_url,%resource_symb,%titles,%lookups,$disabled);
     &Apache::loncourserespicker::enumerate_course_contents($navmap,\%map_url,\%resource_symb,\%titles,'examblock');
     %{$lookups{'maps'}} = reverse(%map_url);
     %{$lookups{'resources'}} = reverse(%resource_symb);
@@ -987,10 +1035,13 @@ sub display_blocker_status {
         'noch' => 'No change',
     );
     $r->print('<div id="showmodify" style="display:block">'.
-              &Apache::loncommon::start_data_table());
+              &Apache::loncommon::start_data_table().'<tr>');
+    if ($readonly) {
+        $disabled = ' disabled="disabled"';
+    } else {
+        $r->print('<th></th>');
+    }
     $r->print(<<"END");
-  <tr>
-    <th></th>
     <th>$ltext->{'type'}</th>
     <th>$ltext->{'even'}</th>
     <th>$ltext->{'blck'}</th>
@@ -1009,8 +1060,12 @@ END
            &Apache::loncommon::aboutmewrapper(
                            &Apache::loncommon::plainname($setuname,$setudom),
                            $setuname,$setudom);
+        my $state = '';
         $r->print(&Apache::loncommon::start_data_table_row());
-        $r->print(<<"ACT");
+        if ($readonly) {
+            $state = 'disabled';
+        } else {
+            $r->print(<<"ACT");
 
         <td valign="middle"><span class="LC_nobreak"><label>
         <input type="radio" name="action_$parmcount" value="modify" />$lt{'modi'}
@@ -1024,13 +1079,16 @@ END
         </label></span>
         </td>
 ACT
+        }
         my ($start,$end,$startform,$endform); 
         if ($record =~ /^(\d+)____(\d+)$/) {
             ($start,$end) = split(/____/,$record);
             $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.
-                                                             $parmcount,$start,$onchange);
+                                                             $parmcount,$start,$onchange,
+                                                             undef,$state);
             $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.
-                                                           $parmcount,$end,$onchange);
+                                                           $parmcount,$end,$onchange,
+                                                           undef,$state);
             $r->print('<td><fieldset><legend>'.$ltext->{'defs'}.'</legend>'.
                       $ltext->{'star'}.':&nbsp;'.$startform.'<br />'.
                       $ltext->{'endd'}.':&nbsp;&nbsp;'.$endform.'</fieldset></td>');
@@ -1160,18 +1218,18 @@ ACT
                 }
             }
             $r->print(&create_interval_form($intervals,$parmcount,$navmap,$item,$jschg,
-                                            $itemname,$iteminfo).'</fieldset></td>');
+                                            $itemname,$iteminfo,$disabled).'</fieldset></td>');
         }
         $r->print(<<"END");
         <td>
-         <input type="text" name="title_$parmcount" size="15" value="$title" onfocus="$jschg" />
+         <input type="text" name="title_$parmcount" size="15" value="$title" onfocus="$jschg" $disabled />
          <input type="hidden" name="key_$parmcount" value="$blockid" />
          <br />
          <br />
          $ltext->{'setb'}: $settername
         </td>
 END
-        $r->print('<td>'.&blocker_checkboxes($parmcount,$blocks,$jschg,\%lookups).'</td>'.
+        $r->print('<td>'.&blocker_checkboxes($parmcount,$blocks,$jschg,\%lookups,$disabled).'</td>'.
                   &Apache::loncommon::end_data_table_row());
         $parmcount++;
     }
@@ -1261,7 +1319,7 @@ END
 }
 
 sub blocker_checkboxes {
-    my ($parmcount,$blocks,$jschg,$lookups) = @_;
+    my ($parmcount,$blocks,$jschg,$lookups,$disabled) = @_;
     my ($typeorder,$types) = &blocktype_text();
     my $numinrow = 2;
     my %currdocs;
@@ -1328,7 +1386,7 @@ sub blocker_checkboxes {
         } 
         $output .= '<span class="LC_nobreak"><label>'."\n".
                    '<input type="checkbox" id="'.$item.'" name="'.$item.'"'.
-                   $blockstatus.$clickaction.' value="1" />'.
+                   $blockstatus.$clickaction.' value="1"'.$disabled.' />'.
                    $types->{$block}.'</label></span>'."\n";
         if ($block eq 'docs') {
             if ($blockstatus ne '') {
@@ -1347,7 +1405,7 @@ sub blocker_checkboxes {
 }
 
 sub create_interval_form {
-    my ($intervals,$parmcount,$navmap,$currkey,$jschg,$itemname,$iteminfo) = @_;
+    my ($intervals,$parmcount,$navmap,$currkey,$jschg,$itemname,$iteminfo,$disabled) = @_;
     return unless ((ref($intervals) eq 'HASH') && (ref($navmap)));
     my $intervalform;
     if (keys(%{$intervals}) > 0) {
@@ -1360,7 +1418,7 @@ sub create_interval_form {
                     $clickaction = ' onclick="'.$jschg.'"';
                 }
                 $intervalform .= '<label><input type="radio" name="firstaccess_'.$parmcount.
-                                 '" value="course"'.$checked.$clickaction.' />';
+                                 '" value="course"'.$checked.$clickaction.$disabled.' />';
                 if ($currkey eq 'course') {
                     $intervalform .= $itemname;
                 } else {
@@ -1385,7 +1443,7 @@ sub create_interval_form {
                             }
                             $intervalform .= '<label><input type="radio" name="firstaccess_'.$parmcount.
                                              '" value="'.&HTML::Entities::encode($map,'"<>&').'"'.
-                                             $checked.$clickaction.' />';
+                                             $checked.$clickaction.$disabled.' />';
                             if ($currkey eq $map) {
                                 $intervalform .= $itemname.'</label>'.$iteminfo;
                             } else {
@@ -1426,7 +1484,7 @@ sub create_interval_form {
                             }
                             $intervalform .= '<label><input type="radio" name="firstaccess_'.$parmcount.
                                              '" value="'.&HTML::Entities::encode($resource,'"<>&').'"'.
-                                             $checked.$clickaction.' />';
+                                             $checked.$clickaction.$disabled.' />';
                             if ($currkey eq $resource) {
                                 $intervalform .= $itemname.'</label>'.$iteminfo;
                             } else {
@@ -1456,7 +1514,7 @@ sub create_interval_form {
         if ($currkey ne '') {
             $intervalform = '<input type="radio" name="firstaccess_'.$parmcount.
                             '" checked="checked" value="'.
-                            &HTML::Entities::encode($currkey,'"<>&').' />'.
+                            &HTML::Entities::encode($currkey,'"<>&').'"'.$disabled.' />'.
                             $itemname.'<br />';
         } else {
             $intervalform = &mt('No timed items defined.').' '.