[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /interface lonfeedback.pm

raeburn raeburn at source.lon-capa.org
Tue Jan 18 20:35:58 EST 2022


raeburn		Wed Jan 19 01:35:58 2022 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/interface	lonfeedback.pm 
  Log:
  - For 2.11
    Backport 1.388, 1.389, 1.390
  
  
-------------- next part --------------
Index: loncom/interface/lonfeedback.pm
diff -u loncom/interface/lonfeedback.pm:1.370.2.5 loncom/interface/lonfeedback.pm:1.370.2.6
--- loncom/interface/lonfeedback.pm:1.370.2.5	Mon Jan  4 03:43:30 2021
+++ loncom/interface/lonfeedback.pm	Wed Jan 19 01:35:58 2022
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Feedback
 #
-# $Id: lonfeedback.pm,v 1.370.2.5 2021/01/04 03:43:30 raeburn Exp $
+# $Id: lonfeedback.pm,v 1.370.2.6 2022/01/19 01:35:58 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2703,29 +2703,46 @@
         $$attachments{'0'}{'filename'} = $attachmenturls;
         $$attachments{'0'}{'0'} = 'n';
     }
-
     return;
 }
 
 sub fail_redirect {
-  my ($r,$feedurl) = @_;
+  my ($r,$feedurl,$delay) = @_;
   if ($feedurl=~/^\/adm\//) { $feedurl.='?register=1' };
   my %lt = &Apache::lonlocal::texthash(
                  'sorr' => 'Sorry, no recipients ...',
   );
   my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
-  $r->print(&Apache::loncommon::start_page('Feedback not sent',undef,
-					   {'redirect'  => [2,$feedurl],
-					    'only_body' => 1,}));
+  my %parms=('only_body'   => 1);
+  if ($delay !~ /^\d+(|\.\d+)$/) {
+      $delay = 2;
+  }
+  if ($env{'form.modal'}) {
+      my $onload = 'document.forms.reldt.submit()';
+      if ($delay) {
+          my $js_delay = int(1000 * $delay);
+          $onload = "setTimeout(function(){
+                     document.forms.reldt.submit();
+                     },$js_delay);";
+      }
+      $parms{'add_entries'}={'onload' => $onload};
+  } else {
+      $parms{'redirect'}=[$delay,$feedurl];
+  }
+  $r->print(&Apache::loncommon::start_page('Feedback not sent',undef,\%parms));
+  my $windowname = 'loncapaclient';
   $r->print(<<ENDFAILREDIR);
 <img align="right" src="$logo" />
 <p class="LC_warning">$lt{'sorr'}</p>
+<form name="reldt" action="$feedurl" target="$windowname">
+</form>
 ENDFAILREDIR
   $r->print(&Apache::loncommon::end_page());
 }
 
 sub redirect_back {
-  my ($r,$feedurl,$typestyle,$sendsomething,$sendposts,$blog,$status,$previous,$sort,$rolefilter,$statusfilter,$sectionpick,$grouppick,$numpicks,$group,$toolarge) = @_;
+  my ($r,$feedurl,$typestyle,$sendsomething,$sendposts,$blog,$status,$previous,$sort,
+      $rolefilter,$statusfilter,$sectionpick,$grouppick,$numpicks,$group,$toolarge,$delay) = @_;
   my $sorttag = '';
   my $roletag = '';
   my $statustag = '';
@@ -2824,10 +2841,20 @@
   &Apache::lonenc::check_encrypt(\$feedurl);
   my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
   my %parms=('only_body'   => 1);
+  if ($delay !~ /^\d+(|\.\d+)$/) {
+      $delay = 0;
+  }
   if ($env{'form.modal'}) {
-      $parms{'add_entries'}={'onLoad' => 'document.forms.reldt.submit()'};
+      my $onload = 'document.forms.reldt.submit()';
+      if ($delay) {
+          my $js_delay = int(1000 * $delay);
+          $onload = "setTimeout(function(){
+                        document.forms.reldt.submit();
+                     },$js_delay);";
+      }
+      $parms{'add_entries'}={'onload' => $onload};
   } else {
-      $parms{'redirect'}=[0,$feedurl];
+      $parms{'redirect'}=[$delay,$feedurl];
   }
   my $start_page=
       &Apache::loncommon::start_page('Feedback sent',undef,\%parms);
@@ -2855,39 +2882,59 @@
 }
 
 sub no_redirect_back {
-  my ($r,$feedurl) = @_;
+  my ($r,$feedurl,$delay) = @_;
   my $nofeed=&mt('Sorry, no feedback possible on this resource ...');
- 
-  my %onload;
-
-  my %body_options = ('only_body'   => 1,
-		      'bgcolor'     => '#FFFFFF',
-		      'add_entries' => \%onload,);
-
-  if ($feedurl !~ m{^/adm/feedback}) { 
-      $body_options{'redirect'} = [2,$feedurl];
+  my $form_for_modal;
+  my %parms=('only_body'   => 1,
+             'bgcolor'     => '#FFFFFF',);
+  if ($delay !~ /^\d+(|\.\d+)$/) {
+      $delay = 0;
+  }
+  if ($env{'form.modal'}) {
+      if (($feedurl !~ m{^/adm/feedback}) && ($feedurl ne '')) {
+          my $onload = 'document.forms.reldt.submit()';
+          if ($delay) {
+              my $js_delay = int(1000 * $delay);
+              $onload = "setTimeout(function(){
+                         document.forms.reldt.submit();
+                         },$js_delay);";
+          }
+          $parms{'add_entries'}={'onload' => $onload};
+          my $windowname = 'loncapaclient';
+          $form_for_modal = <<ENDFORM;
+<form name="reldt" action="$feedurl" target="$windowname">
+</form>
+ENDFORM
+      }
+  } else {
+      if (($feedurl !~ m{^/adm/feedback}) && ($feedurl ne '')) {
+          $parms{'redirect'}=[$delay,$feedurl];
+      }
   }
   my $start_page=
       &Apache::loncommon::start_page('Feedback not sent',undef,
-				     \%body_options);
-				      
+				     \%parms);
+
   my $end_page = &Apache::loncommon::end_page();
 
-  &Apache::lonenc::check_encrypt(\$feedurl);
   my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
   $r->print (<<ENDNOREDIRTWO);
 $start_page
 <img align="right" src="$logo" />
 <b>$nofeed</b>
 <br />
+$form_for_modal
 $end_page
 ENDNOREDIRTWO
 }
 
 sub screen_header {
     my ($feedurl,$symb,$group) = @_;
-    my $crscontent = &mt('Question/Comment/Feedback about course content');
-    my $crspolicy = &mt('Question/Comment/Feedback about course policy');
+    my %default = &Apache::lonlocal::texthash (
+                    question => 'Question about resource content',
+                    comment => 'Question/Comment/Feedback about course content',
+                    policy => 'Question/Comment/Feedback about course policy',
+                  );
     my $contribdisc = &mt('Contribution to course discussion of resource');
     my $anoncontrib = &mt('Anonymous contribution to course discussion of resource');
     my $namevis = &mt('name only visible to course faculty');
@@ -2895,8 +2942,8 @@
     if ($env{'request.course.id'}) {
         $crstype = &Apache::loncommon::course_type();
         if ($crstype eq 'Community') {
-            $crscontent = &mt('Question/Comment/Feedback about community content');
-            $crspolicy = &mt('Question/Comment/Feedback about community policy');
+            $default{'comment'} = &mt('Question/Comment/Feedback about community content');
+            $default{'policy'} = &mt('Question/Comment/Feedback about community policy');
             $contribdisc = &mt('Contribution to community discussion of resource');
             $anoncontrib = &mt('Anonymous contribution to community discussion of resource');
             $namevis = &mt('name only visible to community facilitators');
@@ -2904,56 +2951,78 @@
     }
     my $msgoptions='';
     my $discussoptions='';
+    my $checkradio = '';
+    my $blockblog;
+    my (%fdbkoptions,%discoptions);
     unless (($env{'form.replydisc'}) || ($env{'form.editdisc'})) {
-	if (($feedurl=~/^\/res\//) && ($feedurl!~/^\/res\/adm/) && ($env{'user.adv'})) {
-	    $msgoptions= 
-		'<label><input type="radio" name="discuss" value="author" /> '.
-		&mt('Feedback to resource author').'</label><br />';
-	}
-        my %optionhash=();
-        foreach my $type ('question','comment','policy') {
-	    $optionhash{$type}=$env{'course.'.$env{'request.course.id'}.'.'.$type.'.email.text'};
-	}
-	if (&feedback_available(1)) {
-	    $msgoptions.=
-		'<label><input type="radio" name="discuss" value="question" /> '.
-		($optionhash{'question'}?$optionhash{'question'}:&mt('Question about resource content')).'</label><br />';
-	}
-	if (&feedback_available(0,1)) {
-	    $msgoptions.=
-		'<label><input type="radio" name="discuss" value="course" /> '.
-		($optionhash{'comment'}?$optionhash{'comment'}:$crscontent).
-		'</label><br />';
-	}
-	if (&feedback_available(0,0,1)) {
-	    $msgoptions.=
-		'<label><input type="radio" name="discuss" value="policy" /> '.
-		($optionhash{'policy'}?$optionhash{'policy'}:$crspolicy).
-		'</label><br />';
-	}
+        if (($feedurl=~/^\/res\//) && ($feedurl!~/^\/res\/adm/) && ($env{'user.adv'})) {
+            $fdbkoptions{'author'} = 1;
+        }
+        if (&feedback_available(1)) {
+            $fdbkoptions{'question'} = 1;
+        }
+        if (&feedback_available(0,1)) {
+            $fdbkoptions{'course'} = 1;
+        }
+        if (&feedback_available(0,0,1)) {
+            $fdbkoptions{'policy'} = 1;
+        }
     }
     if (($env{'request.course.id'}) && (!$env{'form.sendmessageonly'})) {
         my ($blocked,$blocktext) = &Apache::loncommon::blocking_status('boards');
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         my $realsymb = &get_realsymb($symb);
-        if (!$blocked && &discussion_open(undef,$realsymb) && 
-	    (&Apache::lonnet::allowed('pch',
-				      $env{'request.course.id'}.
-				      ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) || 
+        if (!$blocked && &discussion_open(undef,$realsymb) &&
+            (&Apache::lonnet::allowed('pch',
+                                      $env{'request.course.id'}.
+                                      ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) || 
             (($group ne '') && ($symb =~ m{^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$}) && (&check_group_priv($group,'pgd') eq 'ok')))) {
-	    $discussoptions='<label><input type="radio" name="discuss" value="nonanon" checked="checked" /> '.
-		$contribdisc.
-	        '</label><br /><label><input type="radio" name="discuss" value="anon" /> '.
-		$anoncontrib.
-		' <i>('.$namevis.')</i></label> '.
-		'<a href="/adm/preferences?action=changescreenname">'.&mt('Change Screenname').'</a>';
-            my $blockblog = &Apache::loncommon::blocking_status('blogs');
-            if (!$blockblog) {
-                $discussoptions.= &add_blog_checkbox($crstype);
+            $discoptions{'nonanon'} = 1;
+            $discoptions{'anon'} = 1;
+            $blockblog = &Apache::loncommon::blocking_status('blogs');
+        }
+    }
+    my $total = scalar(keys(%fdbkoptions)) + scalar(keys(%discoptions));
+    return if (!$total);
+    if ($total == 1) {
+        $checkradio = ' checked="checked"';
+    }
+    if (keys(%fdbkoptions)) {
+        if ($fdbkoptions{'author'}) {
+            $msgoptions =
+                '<label><input type="radio" name="discuss" value="author"'.$checkradio.' /> '.
+                &mt('Feedback to resource author').'</label><br />';
+        }
+        foreach my $item ('question','comment','policy') {
+            my $type = $item;
+            if ($item eq 'comment') {
+                $type = 'course';
+            }
+            my $optionhash=$env{'course.'.$env{'request.course.id'}.'.'.$item.'.email.text'};
+            if ($fdbkoptions{$type}) {
+                $msgoptions .=
+                    '<label><input type="radio" name="discuss" value="'.$type.'"'.$checkradio.' />'.
+                    ($optionhash?$optionhash:$default{$item}).'</label><br />';
             }
         }
     }
+    if (keys(%discoptions)) {
+        if ($discoptions{'nonanon'}) {
+            $discussoptions='<label><input type="radio" name="discuss" value="nonanon" checked="checked" /> '.
+                            $contribdisc.
+                            '</label>';
+        }
+        if ($discoptions{'anon'}) {
+            $discussoptions .= '<br /><label><input type="radio" name="discuss" value="anon"'.$checkradio.' /> '.
+                               $anoncontrib.
+                               ' <i>('.$namevis.')</i></label> '.
+                               '<a href="/adm/preferences?action=changescreenname">'.&mt('Change Screenname').'</a>';
+        }
+        if (!$blockblog) {
+            $discussoptions.= &add_blog_checkbox($crstype);
+        }
+    }
     if ($msgoptions) {
         $msgoptions='<tr><th><img src="'.&Apache::loncommon::lonhttpdurl('/res/adm/pages/feedback.png').'" />'
                    .'<br />'.&mt('Send Feedback').'<br />'.&Apache::lonhtmlcommon::coursepreflink(&mt('Feedback Settings'),'feedback').'</th>'.
@@ -3039,9 +3108,17 @@
 }
 
 sub send_msg {
-    my ($title,$feedurl,$email,$citations,$attachmenturl,$symb,%to)=@_;
+    my ($title,$feedurl,$email,$citations,$attachmenturl,$symb,$clientip,%to)=@_;
     my $status='';
     my $sendsomething=0;
+    my $delay;
+    my $senthide;
+    my %setters;
+    my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) =
+        &Apache::loncommon::blockcheck(\%setters,'com',$clientip);
+    if ($by_ip) {
+        $senthide = 1;
+    }
     my $restitle = &get_resource_title($symb,$feedurl);
     if ($title=~/^Error/) { $title=&mt('Feedback').': '.$title; }
     unless ($title=~/\w/) { $title=&mt('Feedback'); }
@@ -3055,7 +3132,8 @@
 	    } else {
 		unless (&Apache::lonmsg::user_normal_msg($user,$domain,
 							 $title.' ['.$restitle.']',$email,$citations,$feedurl,
-							 $attachmenturl,undef,undef,$symb,$restitle)=~/ok/) {
+							 $attachmenturl,undef,undef,$symb,$restitle,undef,
+                                                         undef,undef,undef,$senthide)=~/ok/) {
 		    $status.='<br />'.&mt('Error sending message to').' '.$key.'<br />';
 		} else {
 		    $sendsomething++;
@@ -3063,6 +3141,24 @@
 	    }
 	}
     }
+    if ($sendsomething && $senthide) {
+        if ($by_ip) {
+            my $showdom = &Apache::lonnet::domain($blockdom);
+            if ($showdom eq '') {
+                $showdom = $blockdom;
+            }
+            $delay = 4;
+            $status.='<br />'.&mt("Message content of feedback you send to instructor(s) from your current IP address: [_1] will be unavailable in your 'Sent' folder.",$clientip).
+                     '<ul><li>'.
+                     &mt('This does not affect delivery of feedback to your instructor(s).').
+                     '</li><li>'.
+                     &mt('Note: some types of communication functionality are blocked for certain IP address(es).').
+                     '</li><li>'.
+                     &mt('This restriction was set by an administrator in the [_1] LON-CAPA domain.',
+                         $showdom).
+                     '</li></ul><br />';
+        }
+    }
 
 # Records of number of feedback messages are kept under the "symb" called "_feedback"
 # There are two entries within the framework of a course:
@@ -3080,7 +3176,7 @@
 	    }
         }
     }
-    return ($status,$sendsomething);
+    return ($status,$sendsomething,$delay);
 }
 
 # Routine to get the complete feedback records
@@ -3891,8 +3987,9 @@
           my $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0];
           my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);
           my $feedurl=&Apache::lonnet::clutter($url);
-          &redirect_back($r,$feedurl,&mt('Editing not permitted').'<br />',                     '0','0','','',$env{'form.previous'},undef,undef,undef,
-                    undef,undef,undef,$group);
+          &redirect_back($r,$feedurl,&mt('Editing not permitted').'<br />',
+                         '0','0','','',$env{'form.previous'},undef,undef,undef,
+                         undef,undef,undef,$group);
           return OK;
       }
   } 
@@ -4099,7 +4196,7 @@
       unless (($seehidden) || (&editing_allowed($env{'form.hide'},$group))) {
           &redirect_back($r,$feedurl,&mt('Hiding not permitted').'<br />',
                          '0','0','','',$env{'form.previous'},'','','','',
-                         undef,undef,$group,);
+                         undef,undef,$group);
           return OK;
       }
 
@@ -4531,6 +4628,12 @@
 	  $r->internal_redirect('/adm/ambiguous');
 	  return OK;
       }
+      if ($feedurl eq '') {
+          &Apache::loncommon::content_type($r,'text/html');
+          $r->send_http_header;
+          &no_redirect_back($r);
+          return OK;
+      }
 # Go ahead with feedback, no ambiguous reference
       unless (
 	  (
@@ -4545,7 +4648,7 @@
 	  $r->send_http_header;
 # Unable to give feedback
           &Apache::lonenc::check_encrypt(\$feedurl);
-	  &no_redirect_back($r,$feedurl);
+	  &no_redirect_back($r,$feedurl,2);
 	  return OK;
       }
 # --------------------------------------------------- Print login screen header
@@ -4565,7 +4668,7 @@
 	  if ($options) {
 	      &mail_screen($r,$feedurl,$options,$symb,$attachmax{'text'});
 	  } else {
-	      &fail_redirect($r,$feedurl);
+	      &fail_redirect($r,$feedurl,2);
 	  }
 	  return OK;
       }
@@ -4631,9 +4734,10 @@
       my ($typestyle,%to) = &Apache::lonmsg::decide_receiver($feedurl);
 
 # Actually send mail
-      my ($status,$numsent)=&send_msg(&clear_out_html($env{'form.subject'}),
-				      $feedurl,$email,$citations,
-				      $attachmenturl,$usersymb,%to);
+      my $clientip = &Apache::lonnet::get_requestor_ip($r);
+      my ($status,$numsent,$delay)=&send_msg(&clear_out_html($env{'form.subject'}),
+				             $feedurl,$email,$citations,
+				             $attachmenturl,$usersymb,$clientip,%to);
 
 # Discussion? Store that.
       my $numpost=0;
@@ -4664,7 +4768,8 @@
       }
 	  
 # Receipt screen and redirect back to where came from
-      &redirect_back($r,$feedurl,$typestyle,$numsent,$numpost,$blog,$status,$env{'form.previous'},undef,undef,undef,undef,undef,undef,$group,$toolarge);
+      &redirect_back($r,$feedurl,$typestyle,$numsent,$numpost,$blog,$status,$env{'form.previous'},
+                     undef,undef,undef,undef,undef,undef,$group,$toolarge,$delay);
   }
   return OK;
 }


More information about the LON-CAPA-cvs mailing list