# The LearningOnline Network # Feedback # # (Internal Server Error Handler # # (Login Screen # 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14, # 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer) # # 3/1/1 Gerd Kortemeyer) # # 3/1,2/3,2/5,2/6,2/8 Gerd Kortemeyer # 2/9 Guy Albertelli # 2/10 Gerd Kortemeyer # 2/13 Guy Albertelli # 7/25 Gerd Kortemeyer # 7/26 Guy Albertelli # 7/26,8/10 Gerd Kortemeyer package Apache::lonfeedback; use strict; use Apache::Constants qw(:common); use Apache::lonmsg(); use Apache::loncommon(); sub mail_screen { my ($r,$feedurl,$options) = @_; $r->print(< The LearningOnline Network with CAPA

Feedback

$feedurl

Please check at least one of the following feedback types: $options
My question/comment/feedback:

ENDDOCUMENT } sub fail_redirect { my ($r,$feedurl) = @_; $r->print (<Feedback not sent Sorry, no recipients ... ENDFAILREDIR } sub redirect_back { my ($r,$feedurl,$typestyle,$sendsomething,$status) = @_; $r->print (< Feedback sent $typestyle Sent $sendsomething message(s). $status ENDREDIR } sub no_redirect_back { my ($r,$feedurl) = @_; $r->print (<Feedback not sent ENDNOREDIR if ($feedurl!~/^\/adm\/feedback/) { $r->print(''); } $r->print (< Sorry, no feedback possible on this resource ... ENDNOREDIRTWO } sub screen_header { my ($feedurl) = @_; my $options=''; if (($feedurl=~/^\/res/) && ($feedurl!~/^\/res\/adm/)) { $options= '

Feedback to resource author'; } if ($ENV{'course.'.$ENV{'request.course.id'}.'.question.email'}) { $options.= '
Question about resource content'; } if ($ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'}) { $options.= '
'. 'Question/Comment/Feedback about course content'; } if ($ENV{'course.'.$ENV{'request.course.id'}.'.policy.email'}) { $options.= '
'. 'Question/Comment/Feedback about course policy'; } if ($ENV{'request.course.id'}) { $options.='
'. 'Contribution to course discussion of resource'; } if ($ENV{'request.course.id'}) { $options.='
'. 'Anonymous contribution to course discussion of resource'. ' (name only visible to course faculty)'; } return $options; } sub resource_output { my ($feedurl) = @_; my $usersaw=&Apache::lonnet::ssi($feedurl); $usersaw=~s/\]*\>//gi; $usersaw=~s/\<\/body\>//gi; $usersaw=~s/\//gi; $usersaw=~s/\<\/html\>//gi; $usersaw=~s/\//gi; $usersaw=~s/\<\/head\>//gi; $usersaw=~s/action\s*\=/would_be_action\=/gi; return $usersaw; } sub clear_out_html { my $message=$ENV{'form.comment'}; $message=~s/\/\>\;/g; return $message; } sub assemble_email { my ($feedurl,$message,$prevattempts,$usersaw)=@_; my $email=<<"ENDEMAIL"; Refers to $feedurl $message ENDEMAIL my $citations=<<"ENDCITE";

Previous attempts of student (if applicable)

$prevattempts


Original screen output (if applicable)

$usersaw ENDCITE return ($email,$citations); } sub decide_receiver { my ($feedurl) = @_; my $typestyle=''; my %to=(); if ($ENV{'form.author'}) { $typestyle.='Submitting as Author Feedback
'; $feedurl=~/^\/res\/(\w+)\/(\w+)\//; $to{$2.':'.$1}=1; } if ($ENV{'form.question'}) { $typestyle.='Submitting as Question
'; map { $to{$_}=1; } split(/\,/, $ENV{'course.'.$ENV{'request.course.id'}.'.question.email'}); } if ($ENV{'form.course'}) { $typestyle.='Submitting as Comment
'; map { $to{$_}=1; } split(/\,/, $ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'}); } if ($ENV{'form.policy'}) { $typestyle.='Submitting as Policy Feedback
'; map { $to{$_}=1; } split(/\,/, $ENV{'course.'.$ENV{'request.course.id'}.'.policy.email'}); } return ($typestyle,%to); } sub send_msg { my ($feedurl,$email,$citations,%to)=@_; my $status=''; my $sendsomething=0; map { if ($_) { unless (&Apache::lonmsg::user_normal_msg(split(/\:/,$_), 'Feedback '.$feedurl,$email,$citations) eq 'ok') { $status.='
Error sending message to '.$_.'
'; } else { #$status.='
Message sent to '.$_.'
'; $sendsomething++; } } } keys %to; return ($status,$sendsomething); } sub adddiscuss { my ($symb,$email,$anon)=@_; my $status=''; my %contrib=('message' => $email, 'sendername' => $ENV{'user.name'}, 'senderdomain' => $ENV{'user.domain'}); if ($anon) { $contrib{'anonymous'}='true'; } if (($symb) && ($email)) { $status='Adding to class discussion'.($anon?' (anonymous)':'').': '. &Apache::lonnet::store(\%contrib,$symb,$ENV{'request.course.id'}, $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, $ENV{'course.'.$ENV{'request.course.id'}.'.num'}). '
'; } return $status; } sub handler { my $r = shift; if ($r->header_only) { $r->content_type('text/html'); $r->send_http_header; return OK; } my $feedurl=$ENV{'form.postdata'}; $feedurl=~s/^http\:\/\///; $feedurl=~s/^$ENV{'SERVER_NAME'}//; $feedurl=~s/^$ENV{'HTTP_HOST'}//; my $symb=&Apache::lonnet::symbread($feedurl); my $goahead=1; if ($feedurl=~/\.(problem|exam|quiz|assess|survey|form)$/) { unless ($symb) { $goahead=0; } } if ($goahead) { # Go ahead with feedback, no ambiguous reference $r->content_type('text/html'); $r->send_http_header; if ( ( ($feedurl=~m:^/res:) && ($feedurl!~m:^/res/adm:) ) || ($ENV{'request.course.id'} && ($feedurl!~m:^/adm:)) ) { # --------------------------------------------------- Print login screen header unless ($ENV{'form.sendit'}) { my $options=&screen_header($feedurl); if ($options) { &mail_screen($r,$feedurl,$options); } else { &fail_redirect($r,$feedurl); } } else { # Get previous user input my $prevattempts=&Apache::loncommon::get_previous_attempt( $symb,$ENV{'user.name'},$ENV{'user.domain'}, $ENV{'request.course.id'}); # Get output from resource my $usersaw=&resource_output($feedurl); # Filter HTML out of message (could be nasty) my $message=&clear_out_html; # Assemble email my ($email,$citations)=&assemble_email($feedurl,$message,$prevattempts, $usersaw); # Who gets this? my ($typestyle,%to) = &decide_receiver($feedurl); # Actually send mail my ($status,$numsent)=&send_msg($feedurl,$email,$citations,%to); # Discussion? Store that. if ($ENV{'form.discuss'}) { $typestyle.=&adddiscuss($symb,$message); } if ($ENV{'form.anondiscuss'}) { $typestyle.=&adddiscuss($symb,$message,1); } # Receipt screen and redirect back to where came from &redirect_back($r,$feedurl,$typestyle,$numsent,$status); } } else { # Unable to give feedback &no_redirect_back($r,$feedurl); } } else { # Ambiguous Problem Resource $r->internal_redirect('/adm/ambiguous'); } return OK; } 1; __END__