@@ -27,7 +27,7 @@ use Email::Stuffer;
27
27
use Try::Tiny;
28
28
29
29
use WeBWorK::Upload;
30
- use WeBWorK::Utils qw( createEmailSenderTransportSMTP fetchEmailRecipients) ;
30
+ use WeBWorK::Utils qw( decodeAnswers createEmailSenderTransportSMTP fetchEmailRecipients) ;
31
31
32
32
# request paramaters used
33
33
#
@@ -136,7 +136,49 @@ sub initialize ($c) {
136
136
my $subject = $ce -> {mail }{feedbackSubjectFormat } || ' WeBWorK question from %c: %u set %s/prob %p' ;
137
137
$subject =~ s / %([$chars])/ defined $subject_map {$1 } ? $subject_map {$1 } : ''/ eg ;
138
138
139
+ # Get info about remote user.
139
140
my $remote_host = $c -> tx-> remote_address || ' UNKNOWN' ;
141
+ my $remote_port = $c -> tx-> remote_port || ' UNKNOWN' ;
142
+
143
+ my $systemURL = $c -> url_for(' root' )-> to_abs;
144
+
145
+ my $msg = sprintf (" Message from %s (%s ) via WeBWorK at\n %s \n\n " , $user -> full_name, $user -> user_id, $systemURL );
146
+ $msg .= " To visit the page from which the user sent feedback, go to:\n $emailableURL \n\n " ;
147
+
148
+ if ($feedback ) {
149
+ $msg .= sprintf (" %s (%s ) wrote:\n\n\n %s \n\n\n " , $user -> full_name, $user -> user_id, $feedback );
150
+ }
151
+ if ($problem and $verbosity >= 1) {
152
+ $msg .=
153
+ qq/ ***** Data about the problem processor: ***** \n\n /
154
+ . ' Display Mode: '
155
+ . $c -> param(' displayMode' ) . " \n "
156
+ . ' Show Old Answers: '
157
+ . ($c -> param(' showOldAnswers' ) ? ' yes' : ' no' ) . " \n "
158
+ . ' Show Correct Answers: '
159
+ . ($c -> param(' showCorrectAnswers' ) ? ' yes' : ' no' ) . " \n "
160
+ . ' Show Hints: '
161
+ . ($c -> param(' showHints' ) ? ' yes' : ' no' ) . " \n "
162
+ . ' Show Solutions: '
163
+ . ($c -> param(' showSolutions' ) ? ' yes' : ' no' ) . " \n\n " ;
164
+ }
165
+
166
+ if ($user && $verbosity >= 1) {
167
+ $msg .= " ***** Data about the user: *****\n\n " ;
168
+ $msg .= $c -> format_user($user ) . " \n " ;
169
+ $msg .= " $remote_host :$remote_port \n " ;
170
+ }
171
+
172
+ if ($problem && $verbosity >= 1) {
173
+ $msg .= " ***** Data about the problem: *****\n\n " ;
174
+ $msg .= $c -> format_userproblem($problem ) . " \n " ;
175
+ }
176
+ if ($set && $verbosity >= 1) {
177
+ $msg .= " ***** Data about the homework set: *****\n\n " . $c -> format_userset($set ) . " \n " ;
178
+ }
179
+ if ($ce && $verbosity >= 2) {
180
+ $msg .= " ***** Data about the environment: *****\n\n " . Dumper($ce ) . " \n\n " ;
181
+ }
140
182
141
183
my $email = Email::Stuffer-> to(join (' ,' , @recipients ))-> subject($subject )-> html_body($c -> render_to_string(
142
184
' ContentGenerator/Feedback/feedback_email' ,
@@ -147,7 +189,7 @@ sub initialize ($c) {
147
189
set => $set ,
148
190
verbosity => $verbosity ,
149
191
remote_host => $remote_host ,
150
- ))-> header(' X-Remote-Host' => $remote_host );
192
+ ))-> text_body( $msg ) -> header(' X-Remote-Host' => $remote_host );
151
193
if ($ce -> {feedback_sender_email }) {
152
194
my $from_name = $user ? $user -> full_name : $ce -> {generic_sender_name };
153
195
$email -> from(" $from_name <$ce ->{feedback_sender_email}>" )-> reply_to($sender );
@@ -228,4 +270,81 @@ sub page_title ($c) {
228
270
return $c -> ce-> {feedback_button_name } || $c -> maketext(' E-mail Instructor' );
229
271
}
230
272
273
+ sub format_user ($c , $user ) {
274
+ my $ce = $c -> ce;
275
+
276
+ my $result = " User ID: " . $user -> user_id . " \n " ;
277
+ $result .= " Name: " . $user -> full_name . " \n " ;
278
+ $result .= " Email: " . $user -> email_address . " \n " ;
279
+ unless ($ce -> {blockStudentIDinFeedback }) {
280
+ $result .= " Student ID: " . $user -> student_id . " \n " ;
281
+ }
282
+
283
+ my $status_name = $ce -> status_abbrev_to_name($user -> status);
284
+ my $status_string =
285
+ defined $status_name
286
+ ? " $status_name ('" . $user -> status . " ')"
287
+ : $user -> status . " (unknown status abbreviation)" ;
288
+ $result .= " Status: $status_string \n " ;
289
+
290
+ $result .= " Section: " . $user -> section . " \n " ;
291
+ $result .= " Recitation: " . $user -> recitation . " \n " ;
292
+ $result .= " Comment: " . $user -> comment . " \n " ;
293
+
294
+ return $result ;
295
+ }
296
+
297
+ sub format_userset ($c , $set ) {
298
+ my $ce = $c -> ce;
299
+
300
+ my $result = " Set ID: " . $set -> set_id . " \n " ;
301
+ $result .= " Set header file: " . $set -> set_header . " \n " ;
302
+ $result .= " Hardcopy header file: " . $set -> hardcopy_header . " \n " ;
303
+
304
+ $result .= " Open date: " . $c -> formatDateTime($set -> open_date) . " \n " ;
305
+ $result .= " Due date: " . $c -> formatDateTime($set -> due_date) . " \n " ;
306
+ $result .= " Answer date: " . $c -> formatDateTime($set -> answer_date) . " \n " ;
307
+ $result .= " Visible: " . ($set -> visible ? " yes" : " no" ) . " \n " ;
308
+ $result .= " Assignment type: " . $set -> assignment_type . " \n " ;
309
+ if ($set -> assignment_type =~ / gateway/ ) {
310
+ $result .= " Attempts per version: " . $set -> assignment_type . " \n " ;
311
+ $result .= " Time interval: " . $set -> time_interval . " \n " ;
312
+ $result .= " Versions per interval: " . $set -> versions_per_interval . " \n " ;
313
+ $result .= " Version time limit: " . $set -> version_time_limit . " \n " ;
314
+ $result .= " Version creation time: " . $c -> formatDateTime($set -> version_creation_time) . " \n " ;
315
+ $result .= " Problem randorder: " . $set -> problem_randorder . " \n " ;
316
+ $result .= " Version last attempt time: " . $set -> version_last_attempt_time . " \n " ;
317
+ }
318
+
319
+ return $result ;
320
+ }
321
+
322
+ sub format_userproblem ($c , $problem ) {
323
+ my $ce = $c -> ce;
324
+
325
+ my $result = " Problem ID: " . $problem -> problem_id . " \n " ;
326
+ $result .= " Source file: " . $problem -> source_file . " \n " ;
327
+ $result .= " Value: " . $problem -> value . " \n " ;
328
+ $result .=
329
+ " Max attempts " . ($problem -> max_attempts == -1 ? " unlimited" : $problem -> max_attempts) . " \n " ;
330
+ $result .= " Random seed: " . $problem -> problem_seed . " \n " ;
331
+ $result .= " Status: " . $problem -> status . " \n " ;
332
+ $result .= " Attempted: " . ($problem -> attempted ? " yes" : " no" ) . " \n " ;
333
+
334
+ my %last_answer = decodeAnswers($problem -> last_answer);
335
+ if (%last_answer ) {
336
+ $result .= " Last answer:\n " ;
337
+ foreach my $key (sort keys %last_answer ) {
338
+ $result .= " \t $key : $last_answer {$key }\n " if $last_answer {$key };
339
+ }
340
+ } else {
341
+ $result .= " Last answer: none\n " ;
342
+ }
343
+
344
+ $result .= " Number of correct attempts: " . $problem -> num_correct . " \n " ;
345
+ $result .= " Number of incorrect attempts: " . $problem -> num_incorrect . " \n " ;
346
+
347
+ return $result ;
348
+ }
349
+
231
350
1;
0 commit comments