Skip to content

Commit 655833f

Browse files
committed
enhanced subject line formatting options for email
1 parent 347a968 commit 655833f

File tree

5 files changed

+53
-31
lines changed

5 files changed

+53
-31
lines changed

conf/defaults.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ $mail{feedbackRecipients} = [
7373
# %% = literal percent sign
7474
#
7575

76-
$mail{feedbackSubjectFormat} = "[WWfeedback] course:%c user:%u set:%s prob:%p sec:%x rec:%r";
76+
$mail{feedbackSubjectFormat} = '[WWfeedback] course:%c user:%u{ set:%s}{ prob:%p}{ sec:%x}{ rec:%r}';
7777

7878
# feedbackVerbosity:
7979
# 0: send only the feedback comment and context link

lib/WeBWorK/ConfigValues.pm

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -829,13 +829,15 @@ sub getConfigValues ($ce) {
829829
x('E-Mail'),
830830
{
831831
var => 'mail{feedbackSubjectFormat}',
832-
doc => x('Format for the subject line in feedback emails'),
832+
doc => x('Format for the subject of feedback emails'),
833833
doc2 => x(
834-
'When students click the <em>Email Instructor</em> button to send feedback, WeBWorK fills in the '
835-
. 'subject line. Here you can set the subject line. In it, you can have various bits of '
836-
. 'information filled in with the following escape sequences.<p><ul><li>%c = course ID</li>'
834+
'<p>When students click the <em>Email Instructor</em> button to send feedback, WeBWorK fills in '
835+
. 'the subject line. Here you can set the subject line. In it, you can have various bits of '
836+
. 'information filled in with the following escape sequences.</p><ul><li>%c = course ID</li>'
837837
. '<li>%u = user ID</li><li>%s = set ID</li><li>%p = problem ID</li><li>%x = section</li>'
838-
. '<li>%r = recitation</li><li>%% = literal percent sign</li></ul>'
838+
. '<li>%r = recitation</li><li>%% = literal percent sign</li></ul><p>If content is between '
839+
. "a brace pair, like '{ rec:%r}', then it will only be included in the subject line if all "
840+
. 'substitutions within the double brace pair are defined and nonempty.'
839841
),
840842
width => 45,
841843
type => 'text'

lib/WeBWorK/ContentGenerator/Feedback.pm

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use Email::Stuffer;
1212
use Try::Tiny;
1313

1414
use WeBWorK::Upload;
15-
use WeBWorK::Utils qw(createEmailSenderTransportSMTP fetchEmailRecipients);
15+
use WeBWorK::Utils qw(createEmailSenderTransportSMTP fetchEmailRecipients formatEmailSubject);
1616

1717
# request paramaters used
1818
#
@@ -108,18 +108,15 @@ sub initialize ($c) {
108108
}
109109
}
110110

111-
my %subject_map = (
112-
'c' => $courseID,
113-
'u' => $user ? $user->user_id : undef,
114-
's' => $set ? $set->set_id : undef,
115-
'p' => $problem ? $problem->problem_id : undef,
116-
'x' => $user ? $user->section : undef,
117-
'r' => $user ? $user->recitation : undef,
118-
'%' => '%',
111+
my $subject = formatEmailSubject(
112+
$ce->{mail}{feedbackSubjectFormat},
113+
$courseID,
114+
$user ? $user->user_id : '',
115+
$set ? $set->set_id : '',
116+
$problem ? $problem->problem_id : '',
117+
$user ? $user->section : '',
118+
$user ? $user->recitation : ''
119119
);
120-
my $chars = join('', keys %subject_map);
121-
my $subject = $ce->{mail}{feedbackSubjectFormat} || 'WeBWorK question from %c: %u set %s/prob %p';
122-
$subject =~ s/%([$chars])/defined $subject_map{$1} ? $subject_map{$1} : ''/eg;
123120

124121
my %data = (
125122
user => $user,

lib/WeBWorK/Utils.pm

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ our @EXPORT_OK = qw(
3030
processEmailMessage
3131
createEmailSenderTransportSMTP
3232
generateURLs
33+
formatEmailSubject
3334
getAssetURL
3435
x
3536
);
@@ -382,6 +383,35 @@ sub generateURLs ($c, %params) {
382383
}
383384
}
384385

386+
sub formatEmailSubject ($formatString, $courseID, $userID, $setID, $problemID, $section, $recitation) {
387+
my %subject_map = (
388+
c => $courseID,
389+
u => $userID,
390+
s => $setID,
391+
p => $problemID,
392+
x => $section,
393+
r => $recitation,
394+
'%' => '%',
395+
);
396+
my $chars = join('', keys %subject_map);
397+
my $subject = $formatString;
398+
# extract the brace pairs
399+
my @braces = $formatString =~ /(\{(?:[^{}]*|(?0))*\})/xg;
400+
if (@braces) {
401+
# for each brace pair, do substitutions, but leave %c etc when variable is empty
402+
my %braces = map { $_ => $_ =~ s/%([$chars])/$subject_map{$1} ne '' ? $subject_map{$1} : "%$1"/egr } @braces;
403+
# if there is an instance of %c, etc, nullify the whole thing
404+
%braces = map { $_ => $braces{$_} =~ /%[$chars]/ ? '' : $braces{$_} } keys %braces;
405+
# remove outer braces
406+
%braces = map { $_ => $braces{$_} =~ s/\{(.*)\}/$1/egr } keys %braces;
407+
my $regex = join('|', keys %braces);
408+
$regex = qr/$regex/;
409+
$subject =~ s/($regex)/$braces{$1}/g;
410+
}
411+
$subject =~ s/%([$chars])/$subject_map{$1} ne '' ? $subject_map{$1} : ''/eg;
412+
return $subject;
413+
}
414+
385415
my $staticWWAssets;
386416
my $staticPGAssets;
387417
my $thirdPartyWWDependencies;

lib/WeBWorK/Utils/ProblemProcessing.pm

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use Try::Tiny;
1313
use Mojo::JSON qw(encode_json decode_json);
1414

1515
use WeBWorK::Debug;
16-
use WeBWorK::Utils qw(encodeAnswers createEmailSenderTransportSMTP);
16+
use WeBWorK::Utils qw(encodeAnswers createEmailSenderTransportSMTP formatEmailSubject);
1717
use WeBWorK::Utils::DateTime qw(before after);
1818
use WeBWorK::Utils::JITAR qw(jitar_id_to_seq jitar_problem_adjusted_status);
1919
use WeBWorK::Utils::Logs qw(writeLog writeCourseLog);
@@ -383,19 +383,12 @@ sub jitar_send_warning_email ($c, $userProblem) {
383383

384384
$problemID = join('.', jitar_id_to_seq($problemID));
385385

386-
my %subject_map = (
387-
'c' => $courseID,
388-
'u' => $userID,
389-
's' => $setID,
390-
'p' => $problemID,
391-
'x' => $user->section,
392-
'r' => $user->recitation,
393-
'%' => '%',
386+
my $subject = formatEmailSubject(
387+
$ce->{mail}{feedbackSubjectFormat},
388+
$courseID, $userID, $setID, $problemID,
389+
$user ? $user->section : '',
390+
$user ? $user->recitation : ''
394391
);
395-
my $chars = join('', keys %subject_map);
396-
my $subject = $ce->{mail}{feedbackSubjectFormat}
397-
|| 'WeBWorK question from %c: %u set %s/prob %p'; # default if not entered
398-
$subject =~ s/%([$chars])/defined $subject_map{$1} ? $subject_map{$1} : ""/eg;
399392

400393
my $full_name = $user->full_name;
401394
my $email_address = $user->email_address;

0 commit comments

Comments
 (0)