[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 675 - (download) (as text) (annotate)
Fri Dec 13 21:14:54 2002 UTC (10 years, 5 months ago) by sh002i
File size: 7282 byte(s)
made some improvements to Feedback, added loginStatus escape.
-sam

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

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9