[system] / branches / rel-2-0-patches / webwork2 / lib / WeBWorK / ContentGenerator / Feedback.pm Repository:
ViewVC logotype

View of /branches/rel-2-0-patches/webwork2/lib/WeBWorK/ContentGenerator/Feedback.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2706 - (download) (as text) (annotate)
Wed Sep 1 01:57:22 2004 UTC (8 years, 8 months ago) by gage
File size: 9730 byte(s)
There were at least a few potential recipients whose permission
leve was not defined.
I added an extra check that prevents anyone with a 0 or blank permission
level from receiving feedback.
The actual level of recipients is defined in a constant at the top of
Feedback.pm

This addresses issues raised while fixing bug #653

    1 ################################################################################
    2 # WeBWorK Online Homework Delivery System
    3 # Copyright © 2000-2003 The WeBWorK Project, http://openwebwork.sf.net/
    4 # $CVSHeader: webwork-modperl/lib/WeBWorK/ContentGenerator/Feedback.pm,v 1.22 2004/07/12 00:49:04 jj Exp $
    5 #
    6 # This program is free software; you can redistribute it and/or modify it under
    7 # the terms of either: (a) the GNU General Public License as published by the
    8 # Free Software Foundation; either version 2, or (at your option) any later
    9 # version, or (b) the "Artistic License" which comes with this package.
   10 #
   11 # This program is distributed in the hope that it will be useful, but WITHOUT
   12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   13 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
   14 # Artistic License for more details.
   15 ################################################################################
   16 
   17 package WeBWorK::ContentGenerator::Feedback;
   18 use base qw(WeBWorK::ContentGenerator);
   19 
   20 =head1 NAME
   21 
   22 WeBWorK::ContentGenerator::Feedback - Send mail to professors.
   23 
   24 =cut
   25 
   26 # *** feedback should be exempt from authentication, so that people can send
   27 # feedback from the login page!
   28 
   29 use strict;
   30 use warnings;
   31 use Data::Dumper;
   32 use CGI::Pretty qw();
   33 use Mail::Sender;
   34 use Text::Wrap qw(wrap);
   35 use constant PERMISION_TO_RECEIVE_EMAIL   => 5;
   36 # request paramaters used
   37 #
   38 # user
   39 # key
   40 # module
   41 # set (if from ProblemSet or Problem)
   42 # problem (if from Problem)
   43 # displayMode (if from Problem)
   44 # showOldAnswers (if from Problem)
   45 # showCorrectAnswers (if from Problem)
   46 # showHints (if from Problem)
   47 # showSolutions (if from Problem)
   48 
   49 # state data sent
   50 #
   51 # user object for current user
   52 # permission level of current user
   53 # current session key
   54 # which ContentGenerator module called Feedback?
   55 # set object for current set (if from ProblemSet or Problem)
   56 # problem object for current problem (if from Problem)
   57 # display options (if from Problem)
   58 
   59 sub body {
   60   my ($self) = @_;
   61   my $r = $self->r;
   62   my $ce = $r->ce;
   63   my $db = $r->db;
   64 
   65   # get form fields
   66   my $key                = $r->param("key");
   67   my $userName           = $r->param("user");
   68   my $module             = $r->param("module");
   69   my $setName            = $r->param("set");
   70   my $problemNumber      = $r->param("problem");
   71   my $displayMode        = $r->param("displayMode");
   72   my $showOldAnswers     = $r->param("showOldAnswers");
   73   my $showCorrectAnswers = $r->param("showCorrectAnswers");
   74   my $showHints          = $r->param("showHints");
   75   my $showSolutions      = $r->param("showSolutions");
   76   my $from               = $r->param("from");
   77   my $feedback           = $r->param("feedback");
   78 
   79   my ($user, $set, $problem);
   80   $user = $db->getUser($userName) # checked
   81     if defined $userName and $userName ne "";
   82   if (defined $user) {
   83     $set = $db->getMergedSet($userName, $setName) # checked
   84       if defined $setName and $setName ne "";
   85     $problem = $db->getMergedProblem($userName, $setName, $problemNumber) # checked
   86       if defined $set and defined $problemNumber && $problemNumber ne "";
   87   } else {
   88     $set = $db->getGlobalSet($setName) # checked
   89       if defined $setName and $setName ne "";
   90     $problem = $db->getGlobalProblem($setName, $problemNumber) # checked
   91       if defined $set and defined $problemNumber && $problemNumber ne "";
   92   }
   93 
   94   # get some network settings
   95   my $hostname = $r->hostname();
   96   my $port     = $r->get_server_port();
   97   my $remoteIdent = $r->get_remote_logname() || "UNKNOWN";
   98   my $remoteHost = $r->get_remote_host();
   99 
  100   # generate context URLs
  101   my $emailableURL;
  102   my $returnURL;
  103   if ($user) {
  104     my $modulePath;
  105     my @args;
  106     if ($set) {
  107       if ($problem) {
  108         $modulePath = $r->urlpath->newFromModule("WeBWorK::ContentGenerator::Problem",
  109           courseID => $r->urlpath->arg("courseID"),
  110           setID => $set->set_id,
  111           problemID => $problem->problem_id,
  112         );
  113         @args = qw/displayMode showOldAnswers showCorrectAnswers showHints showSolutions/;
  114       } else {
  115         $modulePath = $r->urlpath->newFromModule("WeBWorK::ContentGenerator::ProblemSet",
  116           courseID => $r->urlpath->arg("courseID"),
  117           setID => $set->set_id,
  118         );
  119         @args = ();
  120       }
  121     } else {
  122       $modulePath = $r->urlpath->newFromModule("WeBWorK::ContentGenerator::ProblemSets",
  123         courseID => $r->urlpath->arg("courseID"),
  124       );
  125       @args = ();
  126     }
  127     my $URL;
  128     if($port == 443) { # for secure servers
  129       $URL = "https://$hostname";
  130     } else {
  131       $URL = "http://$hostname:$port"; # FIXME: there should probably be an option for adding this stuff in systemLink()
  132     }
  133     $emailableURL = $URL . $self->systemLink($modulePath,
  134       authen => 0,
  135       params => [ "effectiveUser", @args ],
  136     );
  137     $returnURL = $URL . $self->systemLink($modulePath,
  138       authen => 1,
  139       params => [ @args ],
  140     );
  141   } else {
  142     $emailableURL = "(not available)";
  143     $returnURL = "";
  144   }
  145 
  146   if (defined $r->param("sendFeedback")) {
  147     # get verbosity level
  148     my $verbosity = $ce->{mail}->{feedbackVerbosity};
  149 
  150     # determine the sender of the email
  151     my $sender = ($user && $user->email_address
  152       ? $user->email_address
  153       : $from);
  154 
  155     # determine the recipients of the email
  156     my @recipients;
  157     if (defined $ce->{mail}->{feedbackRecipients}) {
  158       @recipients = @{$ce->{mail}->{feedbackRecipients}};
  159     } else {
  160       # send to all professors and TAs
  161       foreach my $rcptName ($db->listUsers()) {
  162         my $rcptPerm = $db->getPermissionLevel($rcptName); # checked
  163         next unless ref($rcptPerm);
  164         # we check to make sure that the permission is not 0 or a blank
  165         # this is a hack to handle some cases where the permission level
  166         # id snot defined to be a number
  167         if ($rcptPerm->permission() and $rcptPerm->permission() >= PERMISION_TO_RECEIVE_EMAIL) {
  168           my $rcpt = $db->getUser($rcptName); # checked
  169           if ($rcpt and $rcpt->email_address) {
  170             push @recipients, $rcpt->email_address;
  171           }
  172         }
  173       }
  174     }
  175 
  176     # sanity checks
  177     unless ($sender) {
  178       $self->feedbackForm($user, $returnURL,
  179         "No Sender specified.");
  180       return "";
  181     }
  182     unless (@recipients) {
  183       $self->feedbackForm($user, $returnURL,
  184         "No recipients specified.");
  185       return "";
  186     }
  187     unless ($feedback) {
  188       $self->feedbackForm($user, $returnURL,
  189         "Message was blank.");
  190       return "";
  191     }
  192 
  193     # bring up a mailer
  194     my $mailer = Mail::Sender->new({
  195       from => $sender,
  196       to => join(",", @recipients),
  197       # *** we might want to have a CE setting for
  198       # "additional recipients"
  199       smtp    => $ce->{mail}->{smtpServer},
  200       subject => "WeBWorK feedback: ".$user->first_name." ".$user->last_name.
  201                       (   ( defined($setName) && defined($problemNumber) ) ?
  202                                " set$setName/prob$problemNumber" : ""
  203                       ),
  204       headers => "X-Remote-Host: ".$r->get_remote_host(),
  205     });
  206     unless (ref $mailer) {
  207       $self->feedbackForm($user, $returnURL,
  208         "Failed to create a mailer: $Mail::Sender::Error");
  209       return "";
  210     }
  211     unless (ref $mailer->Open()) {
  212       $self->feedbackForm($user, $returnURL,
  213         "Failed to open the mailer: $Mail::Sender::Error");
  214       return "";
  215     }
  216     my $MAIL = $mailer->GetHandle();
  217 
  218     # print message
  219     print $MAIL
  220       wrap("", "", "This feedback message was automatically",
  221            "generated by the WeBWorK system at",
  222            "$hostname:$port, in response to a request from",
  223            "$remoteIdent\@$remoteHost."), "\n\n";
  224     print $MAIL "Context: $emailableURL\n\n";
  225 
  226     if ($feedback) {
  227       print $MAIL
  228         "***** The feedback message: *****\n\n",
  229         wrap("", "", $feedback), "\n\n";
  230     }
  231     if ($problem and $verbosity >= 1) {
  232       print $MAIL
  233         "***** Data about the problem processor: *****\n\n",
  234 
  235         "Display Mode:         $displayMode\n",
  236         "Show Old Answers?     $showOldAnswers\n",
  237         "Show Correct Answers? $showCorrectAnswers\n",
  238         "Show Hints?           $showHints\n",
  239         "Show Solutions?       $showSolutions\n\n",
  240     }
  241     if ($user and $verbosity >= 1) {
  242       print $MAIL
  243         "***** Data about the user: *****\n\n",
  244         $user->toString(), "\n\n";
  245 
  246     }
  247     if ($problem and $verbosity >= 1) {
  248       print $MAIL
  249         "***** Data about the problem: *****\n\n",
  250         $problem->toString(), "\n\n";
  251 
  252     }
  253     if ($set and $verbosity >= 1) {
  254       print $MAIL
  255         "***** Data about the problem set: *****\n\n",
  256         $set->toString(), "\n\n";
  257 
  258     }
  259     if ($ce and $verbosity >= 2) {
  260       print $MAIL
  261         "***** Data about the environment: *****\n\n",
  262         Dumper($ce), "\n\n";
  263 
  264     }
  265 
  266     # end the message
  267     close $MAIL;
  268 
  269     # print confirmation
  270     print CGI::p("Your message was sent successfully.");
  271     print CGI::p(CGI::a({-href => $returnURL}, "Return to your work"));
  272     print CGI::pre(wrap("", "", $feedback));
  273   } else {
  274     # just print the feedback form, with no message
  275     $self->feedbackForm($user, $returnURL, "");
  276   }
  277 
  278   return "";
  279 }
  280 
  281 sub feedbackForm {
  282   my ($self, $user, $returnURL, $message) = @_;
  283   my $r = $self->r;
  284 
  285   print CGI::start_form(-method=>"POST", -action=>$r->uri);
  286   print $self->hidden_authen_fields;
  287   print $self->hidden_fields(qw(
  288     module set problem displayMode showOldAnswers showCorrectAnswers
  289     showHints showSolutions
  290   ));
  291   print CGI::p(CGI::b("From:"), " ",
  292     ($user && $user->email_address
  293       ? CGI::tt($user->email_address)
  294       : CGI::textfield("from", "", 40))
  295   );
  296   print CGI::p("Use this form to report to your professor a
  297     problem with the WeBWorK system or an error in a problem
  298     you are attempting. Along with your message, additional
  299     information about the state of the system will be
  300     included.");
  301   print CGI::p(CGI::i($message)) if $message;
  302   print CGI::p(
  303     CGI::b("Feedback:"), CGI::br(),
  304     CGI::textarea("feedback", "", 20, 80),
  305   );
  306   print CGI::submit("sendFeedback", "Send Feedback");
  307   print CGI::end_form();
  308   print CGI::p(CGI::a({-href=>$returnURL}, "Cancel Feedback"));
  309 }
  310 
  311 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9