[system] / trunk / webwork2 / lib / WeBWorK / ContentGenerator / Feedback.pm Repository:
ViewVC logotype

View of /trunk/webwork2/lib/WeBWorK/ContentGenerator/Feedback.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1193 - (download) (as text) (annotate)
Tue Jun 17 22:16:57 2003 UTC (9 years, 11 months ago) by malsyned
File size: 8837 byte(s)
(.*)GlobalUser(.*) replaced with \1Merged\2.
-Dennis

    1 ################################################################################
    2 # WeBWorK mod_perl (c) 2000-2002 WeBWorK Project
    3 # $Id$
    4 ################################################################################
    5 
    6 package WeBWorK::ContentGenerator::Feedback;
    7 use base qw(WeBWorK::ContentGenerator);
    8 
    9 =head1 NAME
   10 
   11 WeBWorK::ContentGenerator::Feedback - Send mail to professors.
   12 
   13 =cut
   14 
   15 # *** feedback should be exempt from authentication, so that people can send
   16 # feedback from the login page!
   17 
   18 use strict;
   19 use warnings;
   20 use Data::Dumper;
   21 use CGI qw();
   22 use Mail::Sender;
   23 use Text::Wrap qw(wrap);
   24 
   25 # request paramaters used
   26 #
   27 # user
   28 # key
   29 # module
   30 # set (if from ProblemSet or Problem)
   31 # problem (if from Problem)
   32 # displayMode (if from Problem)
   33 # showOldAnswers (if from Problem)
   34 # showCorrectAnswers (if from Problem)
   35 # showHints (if from Problem)
   36 # showSolutions (if from Problem)
   37 
   38 # state data sent
   39 #
   40 # user object for current user
   41 # permission level of current user
   42 # current session key
   43 # which ContentGenerator module called Feedback?
   44 # set object for current set (if from ProblemSet or Problem)
   45 # problem object for current problem (if from Problem)
   46 # display options (if from Problem)
   47 
   48 sub path {
   49   my ($self, $args) = @_;
   50 
   51   my $ce = $self->{ce};
   52   my $root = $ce->{webworkURLs}->{root};
   53   my $courseName = $ce->{courseName};
   54   return $self->pathMacro($args,
   55     "Home" => "$root",
   56     $courseName => "$root/$courseName",
   57     "Feedback" => "",
   58   );
   59 }
   60 
   61 sub title {
   62   return "Feedback";
   63 }
   64 
   65 sub body {
   66   my $self = shift;
   67   my $r = $self->{r};
   68   my $ce = $self->{ce};
   69   my $db = $self->{db};
   70 
   71   # get form fields
   72   my $key                = $r->param("key");
   73   my $userName           = $r->param("user");
   74   my $module             = $r->param("module");
   75   my $setName            = $r->param("set");
   76   my $problemNumber      = $r->param("problem");
   77   my $displayMode        = $r->param("displayMode");
   78   my $showOldAnswers     = $r->param("showOldAnswers");
   79   my $showCorrectAnswers = $r->param("showCorrectAnswers");
   80   my $showHints          = $r->param("showHints");
   81   my $showSolutions      = $r->param("showSolutions");
   82   my $from               = $r->param("from");
   83   my $feedback           = $r->param("feedback");
   84 
   85   my $permissionLevel = ($userName
   86     ? $db->getPermissionLevel($userName)->permission()
   87     : undef);
   88   my $user = (defined $userName && $userName ne ""
   89     ? $db->getUser($userName)
   90     : undef);
   91   my $set = (defined $setName && $setName ne ""
   92     ? $db->getMergedSet($userName, $setName)
   93     : undef);
   94   my $problem = (defined $setName && $setName ne ""
   95                  && defined $problemNumber && $problemNumber ne ""
   96     ? $db->getMergedProblem($userName, $setName, $problemNumber)
   97     : undef);
   98 
   99     # get some network settings
  100     my $hostname = $r->hostname();
  101     my $port     = $r->get_server_port();
  102     my $remoteIdent = $r->get_remote_logname() || "UNKNOWN";
  103     my $remoteHost = $r->get_remote_host();
  104 
  105     # generate context URL
  106     my $URL;
  107     my $emailableURL;
  108     my $returnURL;
  109     if ($user) {
  110       $URL = "http://$hostname:$port"
  111         . $ce->{webworkURLs}->{root}
  112         . "/" . $ce->{courseName}
  113         . ($set
  114           ? "/".$problem->set_id . ($problem ? "/".$problem->problem_id : "")
  115           : "")
  116         . "/?"
  117         . ($problem
  118           ? "&displayMode=$displayMode"
  119           . "&showOldAnswers=$showOldAnswers"
  120           . "&showCorrectAnswers=$showCorrectAnswers"
  121           . "&showHints=$showHints"
  122           . "&showSolutions=$showSolutions"
  123           : "" );
  124       $emailableURL = $URL . "?effectiveUser=$userName";
  125       $returnURL = $URL . $self->url_authen_args;
  126     } else {
  127       $URL = $emailableURL = "(not available)";
  128       $returnURL = "";
  129     }
  130 
  131   if (defined $r->param("sendFeedback")) {
  132     # get verbosity level
  133     my $verbosity = $ce->{mail}->{feedbackVerbosity};
  134 
  135     # determine the sender of the email
  136     my $sender = ($user && $user->email_address
  137       ? $user->email_address
  138       : $from);
  139 
  140     # determine the recipients of the email
  141     my @recipients;
  142     if (defined $ce->{mail}->{feedbackRecipients}) {
  143       @recipients = @{$ce->{mail}->{feedbackRecipients}};
  144     } else {
  145       # send to all professors and TAs
  146       foreach my $rcptName ($db->listUsers()) {
  147         my $rcptPerm = $db->getPermissionLevel($rcptName);
  148         next unless $rcptPerm;
  149         if ($rcptPerm->permission() == 5 or $rcptPerm->permission() == 10) {
  150           my $rcpt = $db->getUser($rcptName);
  151           if ($rcpt->email_address) {
  152             push @recipients, $rcpt->email_address;
  153           }
  154         }
  155       }
  156     }
  157 
  158     # sanity checks
  159     unless ($sender) {
  160       $self->feedbackForm($user, $returnURL,
  161         "No Sender specified.");
  162       return "";
  163     }
  164     unless (@recipients) {
  165       $self->feedbackForm($user, $returnURL,
  166         "No recipients specified.");
  167       return "";
  168     }
  169 
  170     # get some network settings
  171     my $hostname = $r->hostname();
  172     my $port     = $r->get_server_port();
  173     my $remoteIdent = $r->get_remote_logname() || "UNKNOWN";
  174     my $remoteHost = $r->get_remote_host();
  175 
  176     # generate context URL
  177     my $URL;
  178     if ($user) {
  179       $URL = "http://$hostname:$port"
  180         . $ce->{webworkURLs}->{root}
  181         . "/" . $ce->{courseName}
  182         . ($set
  183           ? "/".$problem->set_id . ($problem ? "/".$problem->problem_id : "")
  184           : "")
  185         . "/" . "?effectiveUser=$userName"
  186         . ($problem
  187           ? "&displayMode=$displayMode"
  188           . "&showOldAnswers=$showOldAnswers"
  189           . "&showCorrectAnswers=$showCorrectAnswers"
  190           . "&showHints=$showHints"
  191           . "&showSolutions=$showSolutions"
  192           : "" );
  193     } else {
  194       $URL = "(not available)";
  195     }
  196 
  197     # bring up a mailer
  198     my $mailer = Mail::Sender->new({
  199       from => $sender,
  200       to => join(",", @recipients),
  201       # *** we might want to have a CE setting for
  202       # "additional recipients"
  203       smtp    => $ce->{mail}->{smtpServer},
  204       subject => "Feedback from the WeBWorK system",
  205       headers => "X-Remote-Host: ".$r->get_remote_host(),
  206     });
  207     unless (ref $mailer) {
  208       $self->feedbackForm($user, $returnURL,
  209         "Failed to create a mailer: $Mail::Sender::Error");
  210       return "";
  211     }
  212     unless (ref $mailer->Open()) {
  213       $self->feedbackForm($user, $returnURL,
  214         "Failed to open the mailer: $Mail::Sender::Error");
  215       return "";
  216     }
  217     my $MAIL = $mailer->GetHandle();
  218 
  219     # print message
  220     print $MAIL
  221       wrap("", "", "This feedback message was automatically",
  222            "generated by the WeBWorK system at",
  223            "$hostname:$port, in response to a request from",
  224            "$remoteIdent\@$remoteHost."), "\n\n";
  225     print $MAIL "Context: $emailableURL\n\n";
  226 
  227     if ($feedback) {
  228       print $MAIL
  229         "***** The feedback message: *****\n\n",
  230         wrap("", "", $feedback), "\n\n";
  231     }
  232     if ($problem and $verbosity >= 1) {
  233       print $MAIL
  234         "***** Data about the problem processor: *****\n\n",
  235 
  236         "Display Mode:         $displayMode\n",
  237         "Show Old Answers?     $showOldAnswers\n",
  238         "Show Correct Answers? $showCorrectAnswers\n",
  239         "Show Hints?           $showHints\n",
  240         "Show Solutions?       $showSolutions\n\n",
  241     }
  242     if ($user and $verbosity >= 1) {
  243       print $MAIL
  244         "***** Data about the user: *****\n\n",
  245         $user->toString(), "\n\n";
  246 
  247     }
  248     if ($problem and $verbosity >= 1) {
  249       print $MAIL
  250         "***** Data about the problem: *****\n\n",
  251         $problem->toString(), "\n\n";
  252 
  253     }
  254     if ($set and $verbosity >= 1) {
  255       print $MAIL
  256         "***** Data about the problem set: *****\n\n",
  257         $set->toString(), "\n\n";
  258 
  259     }
  260     if ($ce and $verbosity >= 2) {
  261       print $MAIL
  262         "***** Data about the environment: *****\n\n",
  263         Dumper($ce), "\n\n";
  264 
  265     }
  266 
  267     # end the message
  268     close $MAIL;
  269 
  270     # print confirmation
  271     print CGI::p("Your message was sent successfully.");
  272     print CGI::p(CGI::a({-href => $returnURL}, "Return to your work"));
  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, $returnURL, $message, $user) = @_;
  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_state_fields($r);
  288   print CGI::p(CGI::b("From:"), " ",
  289     ($user && $user->email_address
  290       ? CGI::tt($user->email_address)
  291       : CGI::textfield("from", "", 40))
  292   );
  293   print CGI::p("Use this form to report to your professor a
  294     problem with the WeBWorK system or an error in a problem
  295     you are attempting. Along with your message, additional
  296     information about the state of the system will be
  297     included.");
  298   print CGI::p(CGI::i($message)) if $message;
  299   print CGI::p(
  300     CGI::b("Feedback:"), CGI::br(),
  301     CGI::textarea("feedback", "", 10, 50),
  302   );
  303   print CGI::submit("sendFeedback", "Send Feedback");
  304   print CGI::end_form();
  305   print CGI::p(CGI::a({-href=>$returnURL}, "Cancel feedback"));
  306 
  307 }
  308 
  309 sub hidden_state_fields($) {
  310   my $self = shift;
  311   my $r = $self->{r};
  312 
  313   print CGI::hidden("$_", $r->param("$_"))
  314     foreach (qw(module set problem displayMode showOldAnswers
  315                 showCorrectAnswers showHints showSolutions));
  316 }
  317 
  318 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9