Parent Directory
|
Revision Log
(.*)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 |