Parent Directory
|
Revision Log
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 |