--- loncom/interface/lonfeedback.pm 2001/02/06 14:22:30 1.3 +++ loncom/interface/lonfeedback.pm 2001/02/09 21:53:08 1.7 @@ -9,203 +9,118 @@ # # 3/1/1 Gerd Kortemeyer) # -# 3/1,2/3,2/5,2/6 Gerd Kortemeyer -# +# 3/1,2/3,2/5,2/6,2/8 Gerd Kortemeyer +# 2/9 Guy Albertelli + package Apache::lonfeedback; use strict; use Apache::Constants qw(:common); use Apache::lonmsg(); -sub handler { - my $r = shift; - $r->content_type('text/html'); - $r->send_http_header; - return OK if $r->header_only; - - my $feedurl=$ENV{'form.postdata'}; - $feedurl=~s/^http\:\/\///; - $feedurl=~s/^$ENV{'SERVER_NAME'}//; - $feedurl=~s/^$ENV{'HTTP_HOST'}//; - - if (($feedurl=~/^\/res/) || ($ENV{'request.course.id'})) { -# --------------------------------------------------- Print login screen header - unless ($ENV{'form.sendit'}) { - my $options=''; - if ($feedurl=~/^\/res/) { - $options= - '

Feedback to resource author'; +sub mail_screen { + my ($r,$feedurl,$options) = @_; + $r->print(< + +The LearningOnline Network with CAPA + + - +

Feedback

$feedurl

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

- + +

ENDDOCUMENT -} else { -# -# Get previous user input -# - my $symb=&Apache::lonnet::symbread($feedurl); - my $prevattempts=''; - if ($symb) { - my $answer=&Apache::lonnet::reply( - "restore:".$ENV{'user.domain'}.':'.$ENV{'user.name'}.':'. - $ENV{'request.course.id'}.':'. - &Apache::lonnet::escape($symb), - $ENV{'user.home'}); - my %returnhash=(); - map { - my ($name,$value)=split(/\=/,$_); - $returnhash{&Apache::lonnet::unescape($name)}= - &Apache::lonnet::unescape($value); - } split(/\&/,$answer); - my %lasthash=(); - my $version; - for ($version=1;$version<=$returnhash{'version'};$version++) { - map { - $lasthash{$_}=$returnhash{$version.':'.$_}; - } split(/\:/,$returnhash{$version.':keys'}); - } - $prevattempts=''; - map { - $prevattempts.=''; - } keys %lasthash; - for ($version=1;$version<=$returnhash{'version'};$version++) { - $prevattempts.=''; - map { - $prevattempts.=''; - } keys %lasthash; - } - $prevattempts.=''; - map { - $prevattempts.=''; - } keys %lasthash; - $prevattempts.='
History'.$_.'
Attempt '.$version.''.$returnhash{$version.':'.$_}.'
Current'.$lasthash{$_}.'
'; - } -# -# Get output from resource -# - 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; -# -# Filter HTML out of message (could be nasty) -# - my $message=$ENV{'form.comment'}; - $message=~s/\/\>\;/g; +} -# -# Assemble email -# - my $email=<<"ENDEMAIL"; -Refers to $feedurl -
-

Message

-
-$message
-
-
-

Previous attempts of student (if applicable)

-$prevattempts -


-

Original screen output (if applicable)

-$usersaw -ENDEMAIL -# -# Who gets this? -# - my %to=(); - if ($ENV{'form.author'}) { - $feedurl=~/^\/res\/(\w+)\/(\w+)\//; - $to{$2.':'.$1}=1; - } - if ($ENV{'form.question'}) { - map { - $to{$_}=1; - } split(/\,/, - $ENV{'course.'.$ENV{'request.course.id'}.'.question.email'}); - } - if ($ENV{'form.comment'}) { - map { - $to{$_}=1; - } split(/\,/, - $ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'}); - } - if ($ENV{'form.policy'}) { - map { - $to{$_}=1; - } split(/\,/, - $ENV{'course.'.$ENV{'request.course.id'}.'.policy.email'}); - } -# -# Actually send mail -# - my $status=''; - map { - if ($_) { - unless ( - &Apache::lonmsg::user_normal_msg(split(/\:/,$_),'Feedback '.$feedurl, - $email) eq 'ok') { - $status.='
Error sending message to '.$_.'
'; - } - } - } keys %to; -# -# Receipt screen and redirect back to where came from -# - print (<print (<Feedback not sent + + + + + +Sorry, no recipients ... + + +ENDFAILREDIR +} + +sub redirect_back { + my ($r,$feedurl,$typestyle,$sendsomething,$status) = @_; + $r->print (< Feedback sent - + + -Feedback sent ... +$typestyle +Sent $sendsomething message(s). $status ENDREDIR } -} else { - print (<print (<Feedback not sent - + +ENDNOREDIR + + if ($feedurl ne '/adm/feedback') { + $r->print(''); + } + + $r->print (< @@ -214,7 +129,215 @@ Sorry, no feedback possible on this reso ENDNOREDIR } - return OK; + +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'; + } + return $options; +} + +sub get_previous_attempt { + my ($feedurl)=@_; + my $symb=&Apache::lonnet::symbread($feedurl); + my $prevattempts=''; + if ($symb) { + my $answer=&Apache::lonnet::reply( + "restore:".$ENV{'user.domain'}.':'.$ENV{'user.name'}.':'. + $ENV{'request.course.id'}.':'. + &Apache::lonnet::escape($symb), + $ENV{'user.home'}); + my %returnhash=(); + map { + my ($name,$value)=split(/\=/,$_); + $returnhash{&Apache::lonnet::unescape($name)}= + &Apache::lonnet::unescape($value); + } split(/\&/,$answer); + my %lasthash=(); + my $version; + for ($version=1;$version<=$returnhash{'version'};$version++) { + map { + $lasthash{$_}=$returnhash{$version.':'.$_}; + } split(/\:/,$returnhash{$version.':keys'}); + } + $prevattempts=''; + map { + $prevattempts.=''; + } keys %lasthash; + for ($version=1;$version<=$returnhash{'version'};$version++) { + $prevattempts.=''; + map { + $prevattempts.=''; + } keys %lasthash; + } + $prevattempts.=''; + map { + $prevattempts.=''; + } keys %lasthash; + $prevattempts.='
History'.$_.'
Attempt '.$version.''.$returnhash{$version.':'.$_}.'
Current'.$lasthash{$_}.'
'; + } +} + +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.='Author Feedback
'; + $feedurl=~/^\/res\/(\w+)\/(\w+)\//; + $to{$2.':'.$1}=1; + } + if ($ENV{'form.question'}) { + $typestyle.='Question
'; + map { + $to{$_}=1; + } split(/\,/, + $ENV{'course.'.$ENV{'request.course.id'}.'.question.email'}); + } + if ($ENV{'form.course'}) { + $typestyle.='Comment
'; + map { + $to{$_}=1; + } split(/\,/, + $ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'}); + } + if ($ENV{'form.policy'}) { + $typestyle.='Policy
'; + 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 handler { + my $r = shift; + $r->content_type('text/html'); + $r->send_http_header; + return OK if $r->header_only; + + my $feedurl=$ENV{'form.postdata'}; + $feedurl=~s/^http\:\/\///; + $feedurl=~s/^$ENV{'SERVER_NAME'}//; + $feedurl=~s/^$ENV{'HTTP_HOST'}//; + + 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=&get_previous_attempt($feedurl); + +# 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); + +# Receipt screen and redirect back to where came from + &redirect_back($r,$feedurl,$typestyle,$status,$numsent); + + } + } else { +# Unable to give feedback + &no_redirect_back($r,$feedurl); + } + return OK; } 1;