Skip to content

Commit

Permalink
TODO
Browse files Browse the repository at this point in the history
  • Loading branch information
drgrice1 committed Feb 16, 2025
1 parent 28b21ed commit 3bd145c
Show file tree
Hide file tree
Showing 2 changed files with 188 additions and 122 deletions.
133 changes: 11 additions & 122 deletions lib/WeBWorK/ContentGenerator/Feedback.pm
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use Try::Tiny;
use Text::Wrap qw(wrap);

use WeBWorK::Upload;
use WeBWorK::Utils qw(decodeAnswers createEmailSenderTransportSMTP fetchEmailRecipients);
use WeBWorK::Utils qw(createEmailSenderTransportSMTP fetchEmailRecipients);

# request paramaters used
#
Expand Down Expand Up @@ -137,52 +137,18 @@ sub initialize ($c) {
my $subject = $ce->{mail}{feedbackSubjectFormat} || 'WeBWorK question from %c: %u set %s/prob %p';
$subject =~ s/%([$chars])/defined $subject_map{$1} ? $subject_map{$1} : ''/eg;

# Get info about remote user.
my $remote_host = $c->tx->remote_address || 'UNKNOWN';
my $remote_port = $c->tx->remote_port || 'UNKNOWN';

my $systemURL = $c->url_for('root')->to_abs;

my $msg = sprintf("Message from %s (%s) via WeBWorK at\n%s\n\n", $user->full_name, $user->user_id, $systemURL);
$msg .= "To visit the page from which the user sent feedback, go to:\n$emailableURL\n\n";

if ($feedback) {
$msg .= sprintf("%s (%s) wrote:\n\n\n%s\n\n\n", $user->full_name, $user->user_id, $feedback);
}
if ($problem and $verbosity >= 1) {
$msg .=
qq/***** Data about the problem processor: ***** \n\n/
. 'Display Mode: '
. $c->param('displayMode') . "\n"
. 'Show Old Answers: '
. ($c->param('showOldAnswers') ? 'yes' : 'no') . "\n"
. 'Show Correct Answers: '
. ($c->param('showCorrectAnswers') ? 'yes' : 'no') . "\n"
. 'Show Hints: '
. ($c->param('showHints') ? 'yes' : 'no') . "\n"
. 'Show Solutions: '
. ($c->param('showSolutions') ? 'yes' : 'no') . "\n\n";
}

if ($user && $verbosity >= 1) {
$msg .= "***** Data about the user: *****\n\n";
$msg .= $c->format_user($user) . "\n";
$msg .= "$remote_host:$remote_port\n";
}

if ($problem && $verbosity >= 1) {
$msg .= "***** Data about the problem: *****\n\n";
$msg .= $c->format_userproblem($problem) . "\n";
}
if ($set && $verbosity >= 1) {
$msg .= "***** Data about the homework set: *****\n\n" . $c->format_userset($set) . "\n";
}
if ($ce && $verbosity >= 2) {
$msg .= "***** Data about the environment: *****\n\n" . Dumper($ce) . "\n\n";
}

my $email = Email::Stuffer->to(join(',', @recipients))->subject($subject)->text_body($msg)
->header('X-Remote-Host' => $remote_host);
my $email = Email::Stuffer->to(join(',', @recipients))->subject($subject)->html_body($c->render_to_string(
'ContentGenerator/Feedback/feedback_email',
user => $user,
emailableURL => $emailableURL,
feedback => $feedback,
problem => $problem,
set => $set,
verbosity => $verbosity,
remote_host => $remote_host,
))->header('X-Remote-Host' => $remote_host);
if ($ce->{feedback_sender_email}) {
my $from_name = $user ? $user->full_name : $ce->{generic_sender_name};
$email->from("$from_name <$ce->{feedback_sender_email}>")->reply_to($sender);
Expand Down Expand Up @@ -263,81 +229,4 @@ sub page_title ($c) {
return $c->ce->{feedback_button_name} || $c->maketext('E-mail Instructor');
}

sub format_user ($c, $user) {
my $ce = $c->ce;

my $result = "User ID: " . $user->user_id . "\n";
$result .= "Name: " . $user->full_name . "\n";
$result .= "Email: " . $user->email_address . "\n";
unless ($ce->{blockStudentIDinFeedback}) {
$result .= "Student ID: " . $user->student_id . "\n";
}

my $status_name = $ce->status_abbrev_to_name($user->status);
my $status_string =
defined $status_name
? "$status_name ('" . $user->status . "')"
: $user->status . " (unknown status abbreviation)";
$result .= "Status: $status_string\n";

$result .= "Section: " . $user->section . "\n";
$result .= "Recitation: " . $user->recitation . "\n";
$result .= "Comment: " . $user->comment . "\n";

return $result;
}

sub format_userset ($c, $set) {
my $ce = $c->ce;

my $result = "Set ID: " . $set->set_id . "\n";
$result .= "Set header file: " . $set->set_header . "\n";
$result .= "Hardcopy header file: " . $set->hardcopy_header . "\n";

$result .= "Open date: " . $c->formatDateTime($set->open_date) . "\n";
$result .= "Due date: " . $c->formatDateTime($set->due_date) . "\n";
$result .= "Answer date: " . $c->formatDateTime($set->answer_date) . "\n";
$result .= "Visible: " . ($set->visible ? "yes" : "no") . "\n";
$result .= "Assignment type: " . $set->assignment_type . "\n";
if ($set->assignment_type =~ /gateway/) {
$result .= "Attempts per version: " . $set->assignment_type . "\n";
$result .= "Time interval: " . $set->time_interval . "\n";
$result .= "Versions per interval: " . $set->versions_per_interval . "\n";
$result .= "Version time limit: " . $set->version_time_limit . "\n";
$result .= "Version creation time: " . $c->formatDateTime($set->version_creation_time) . "\n";
$result .= "Problem randorder: " . $set->problem_randorder . "\n";
$result .= "Version last attempt time: " . $set->version_last_attempt_time . "\n";
}

return $result;
}

sub format_userproblem ($c, $problem) {
my $ce = $c->ce;

my $result = "Problem ID: " . $problem->problem_id . "\n";
$result .= "Source file: " . $problem->source_file . "\n";
$result .= "Value: " . $problem->value . "\n";
$result .=
"Max attempts " . ($problem->max_attempts == -1 ? "unlimited" : $problem->max_attempts) . "\n";
$result .= "Random seed: " . $problem->problem_seed . "\n";
$result .= "Status: " . $problem->status . "\n";
$result .= "Attempted: " . ($problem->attempted ? "yes" : "no") . "\n";

my %last_answer = decodeAnswers($problem->last_answer);
if (%last_answer) {
$result .= "Last answer:\n";
foreach my $key (sort keys %last_answer) {
$result .= "\t$key: $last_answer{$key}\n" if $last_answer{$key};
}
} else {
$result .= "Last answer: none\n";
}

$result .= "Number of correct attempts: " . $problem->num_correct . "\n";
$result .= "Number of incorrect attempts: " . $problem->num_incorrect . "\n";

return $result;
}

1;
177 changes: 177 additions & 0 deletions templates/ContentGenerator/Feedback/feedback_email.html.ep
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
% use WeBWorK::Utils qw(decodeAnswers);
%
<html>
<head>
<%= stylesheet begin =%>
.data-table td, .data-table th {
text-align: left;
padding: 0.25rem;
}
.data-table.bordered {
border-collapse: collapse;
}
.data-table.bordered > * > tr > td, .data-table.bordered > * > tr > th {
border: 1px solid black;
}
.data-table.bordered thead tr {
border-bottom-width: 2px;
}
.mb-1 {
margin-bottom: 1rem
}
<% end =%>
</head>
<body>
<p>
Message from <%= $user->full_name %> (<%= $user->user_id %>) via WeBWorK at <%= url_for('root')->to_abs %>
</p>
<p>To visit the page from which the user sent feedback, <%= link_to 'click here' => $emailableURL %>.</p>

% if ($feedback) {
<p><%= $user->full_name %> (<%= $user->user_id %>) wrote:</p>
<div>
% for (split /\n+/, $feedback) {
<p><%= $_ %></p>
% }
</div>
% }
% if ($problem && $verbosity >= 1) {
<table class="data-table bordered mb-1">
<thead>
<tr><th colspan="2">Data about the problem processor</th></tr>
</thead>
<tbody>
<tr>
<th>Display Mode:</th>
<td><%= param('displayMode') %></td>
</tr>
<tr>
<th>Show Old Answers:</th>
<td><%= param('showOldAnswers') ? 'yes' : 'no' %></td>
</tr>
<tr>
<th>Show Correct Answers:</th>
<td><%= param('showCorrectAnswers') ? 'yes' : 'no' %></td>
</tr>
<tr>
<th>Show Hints:</th>
<td><%= param('showHints') ? 'yes' : 'no' %></td>
</tr>
<tr>
<th>Show Solutions:</th>
<td><%= param('showSolutions') ? 'yes' : 'no' %></td>
</tr>
</tbody>
</table>
% }
%
% if ($user && $verbosity >= 1) {
<table class="data-table bordered mb-1">
<thead>
<tr><th colspan="2">Data about the user</th></tr>
</thead>
<tbody>
<tr><th>User ID:</th><td><%= $user->user_id %></td></tr>
<tr><th>Name:</th><td><%= $user->full_name %></td></tr>
<tr><th>Email:</th><td><%= $user->email_address %></td></tr>
% unless ($ce->{blockStudentIDinFeedback}) {
<tr><th>Student ID:</th><td><%= $user->student_id %></td></tr>
% }
% my $status_name = $ce->status_abbrev_to_name($user->status);
%my $status_string =
% defined $status_name
% ? "$status_name ('" . $user->status . q{')}
% : $user->status . ' (unknown status abbreviation)';
<tr><th>Status:</th><td><%= $status_string %></td></tr>
<tr><th>Section:</th><td><%= $user->section %></td></tr>
<tr><th>Recitation:</th><td><%= $user->recitation %></td></tr>
<tr><th>Comment:</th><td><%= $user->comment %></td></tr>
<tr><th>User IP:</th><td><%= $remote_host %>:<%= $c->tx->remote_port || 'UNKNOWN' %></td></tr>
</tbody>
</table>
% }
% if ($problem && $verbosity >= 1) {
<table class="data-table bordered mb-1">
<thead>
<tr><th colspan="2">Data about the problem</th></tr>
</thead>
<tbody>
<tr><th>Problem ID:</th><td><%= $problem->problem_id %></td></tr>
<tr><th>Source file:</th><td><%= $problem->source_file %></td></tr>
<tr><th>Value:</th><td><%= $problem->value %></td></tr>
<tr>
<th>Max attempts</th>
<td><%= $problem->max_attempts == -1 ? 'unlimited' : $problem->max_attempts %></td>
</tr>
<tr><th>Random seed:</th><td><%= $problem->problem_seed %></td></tr>
<tr><th>Status:</th><td><%= $problem->status %></td></tr>
<tr><th>Attempted:</th><td><%= $problem->attempted ? 'yes' : 'no' %></td></tr>
% my %last_answer = decodeAnswers($problem->last_answer);
<tr>
<th>Last answer:</th>
% if (%last_answer) {
<td>
<table class="data-table">
% for my $key (sort keys %last_answer) {
% if ($last_answer{$key}) {
<tr><td><%= $key %>:</td><td><%= $last_answer{$key} %></td></tr>
% }
% }
</table>
</td>
% } else {
<td>none</td>
% }
</tr>
<tr><th>Number of correct attempts:</th><td><%= $problem->num_correct %></td></tr>
<tr><th>Number of incorrect attempts:</th><td><%= $problem->num_incorrect %></td></tr>
</tbody>
</table>
% }
% if ($set && $verbosity >= 1) {
<table class="data-table bordered mb-1">
<thead>
<tr><th colspan="2">Data about the homework set</th></tr>
</thead>
<tbody>
<tr><th>Set ID:</th><td><%= $set->set_id %></td></tr>
<tr><th>Set header file:</th><td><%= $set->set_header %></td></tr>
<tr><th>Hardcopy header file:</th><td><%= $set->hardcopy_header %></td></tr>
<tr><th>Open date:</th><td><%= $c->formatDateTime($set->open_date) %></td></tr>
<tr><th>Due date:</th><td><%= $c->formatDateTime($set->due_date) %></td></tr>
<tr><th>Answer date:</th><td><%= $c->formatDateTime($set->answer_date) %></td></tr>
<tr><th>Visible:</th><td><%= $set->visible ? 'yes' : 'no' %></td></tr>
<tr><th>Assignment type:</th><td><%= $set->assignment_type %></td></tr>
% if ($set->assignment_type =~ /gateway/) {
<tr><th>Attempts per version:</th><td><%= $set->assignment_type %></td></tr>
<tr><th>Time interval:</th><td><%= $set->time_interval %></td></tr>
<tr><th>Versions per interval:</th><td><%= $set->versions_per_interval %></td></tr>
<tr><th>Version time limit:</th><td><%= $set->version_time_limit %></td></tr>
<tr>
<th>Version creation time:</th>
<td><%= $c->formatDateTime($set->version_creation_time) %></td>
</tr>
<tr><th>Problem randorder:</th><td><%= $set->problem_randorder %></td></tr>
<tr><th>Version last attempt time:</th><td><%= $set->version_last_attempt_time %></td></tr>
% }
</tbody>
</table>
% }
% if ($verbosity >= 2) {
<table class="data-table bordered">
<thead>
<tr><th colspan="2">Data about the environment</th></tr>
</thead>
<tbody>
<tr>
<td>
<pre>
<%= dumper($ce) %>
</pre>
</td>
</tr>
</tbody>
</table>
% }
</body>
</html>

0 comments on commit 3bd145c

Please sign in to comment.