Commit 4ec67697 authored by Frédéric Buclin's avatar Frédéric Buclin

Bug 561745: Impossible to uncheck boxes in the Email preferences

r/a=mkanat
parent b4c91ada
...@@ -1471,18 +1471,25 @@ sub wants_mail { ...@@ -1471,18 +1471,25 @@ sub wants_mail {
# Skip DB query if relationship is explicit # Skip DB query if relationship is explicit
return 1 if $relationship == REL_GLOBAL_WATCHER; return 1 if $relationship == REL_GLOBAL_WATCHER;
my $wants_mail = grep { $self->mail_settings->{$relationship}{$_} } @$events;
return $wants_mail ? 1 : 0;
}
sub mail_settings {
my $self = shift;
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
my $wants_mail = if (!defined $self->{'mail_settings'}) {
$dbh->selectrow_array('SELECT 1 my $data =
FROM email_setting $dbh->selectall_arrayref('SELECT relationship, event FROM email_setting
WHERE user_id = ? WHERE user_id = ?', undef, $self->id);
AND relationship = ? my %mail;
AND event IN (' . join(',', @$events) . ') ' . # The hash is of the form $mail{$relationship}{$event} = 1.
$dbh->sql_limit(1), $mail{$_->[0]}{$_->[1]} = 1 foreach @$data;
undef, ($self->id, $relationship));
return defined($wants_mail) ? 1 : 0; $self->{'mail_settings'} = \%mail;
}
return $self->{'mail_settings'};
} }
sub is_mover { sub is_mover {
......
...@@ -77,8 +77,8 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb ...@@ -77,8 +77,8 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb
[% prefname = "email-$constants.REL_ANY-$constants.EVT_FLAG_REQUESTED" %] [% prefname = "email-$constants.REL_ANY-$constants.EVT_FLAG_REQUESTED" %]
<input type="checkbox" name="[% prefname %]" id="[% prefname %]" <input type="checkbox" name="[% prefname %]" id="[% prefname %]"
value="1" value="1"
[% " checked" IF [% " checked"
mail.${constants.REL_ANY}.${constants.EVT_FLAG_REQUESTED} %]> IF user.mail_settings.${constants.REL_ANY}.${constants.EVT_FLAG_REQUESTED} %]>
<label for="[% prefname %]">Email me when someone asks me to set a flag</label> <label for="[% prefname %]">Email me when someone asks me to set a flag</label>
<br> <br>
</td> </td>
...@@ -89,8 +89,8 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb ...@@ -89,8 +89,8 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb
[% prefname = "email-$constants.REL_ANY-$constants.EVT_REQUESTED_FLAG" %] [% prefname = "email-$constants.REL_ANY-$constants.EVT_REQUESTED_FLAG" %]
<input type="checkbox" name="[% prefname %]" id="[% prefname %]" <input type="checkbox" name="[% prefname %]" id="[% prefname %]"
value="1" value="1"
[% " checked" IF [% " checked"
mail.${constants.REL_ANY}.${constants.EVT_REQUESTED_FLAG} %]> IF user.mail_settings.${constants.REL_ANY}.${constants.EVT_REQUESTED_FLAG} %]>
<label for="[% prefname %]">Email me when someone sets a flag I asked for</label> <label for="[% prefname %]">Email me when someone sets a flag I asked for</label>
<br> <br>
</td> </td>
...@@ -197,7 +197,7 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb ...@@ -197,7 +197,7 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb
no_added_removed.contains(relationship.id) no_added_removed.contains(relationship.id)
%] %]
disabled disabled
[% ELSIF mail.${relationship.id}.${event.id} %] [% ELSIF user.mail_settings.${relationship.id}.${event.id} %]
checked checked
[% END %]> [% END %]>
</td> </td>
...@@ -226,7 +226,7 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb ...@@ -226,7 +226,7 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb
<input type="checkbox" <input type="checkbox"
name="neg-email-[% relationship.id %]-[% event.id %]" name="neg-email-[% relationship.id %]-[% event.id %]"
value="1" value="1"
[% " checked" IF NOT mail.${relationship.id}.${event.id} %]> [% " checked" IF NOT user.mail_settings.${relationship.id}.${event.id} %]>
</td> </td>
[% END %] [% END %]
<td> <td>
...@@ -237,23 +237,6 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb ...@@ -237,23 +237,6 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb
</table> </table>
[%# Add hidden form fields for fields not used %]
[% FOREACH event = events %]
[% FOREACH relationship = relationships %]
<input type="hidden"
name="email-[% relationship.id %]-[% event.id %]"
value="[% mail.${relationship.id}.${event.id} ? "1" : "0" %]">
[% END %]
[% END %]
[% FOREACH event = neg_events %]
[% FOREACH relationship = relationships %]
<input type="hidden"
name="neg-email-[% relationship.id %]-[% event.id %]"
value="[% mail.${relationship.id}.${event.id} ? "0" : "1" %]">
[% END %]
[% END %]
<hr> <hr>
<b>User Watching</b> <b>User Watching</b>
......
...@@ -219,21 +219,6 @@ sub DoEmail { ...@@ -219,21 +219,6 @@ sub DoEmail {
@watchers = sort { lc($a) cmp lc($b) } @watchers; @watchers = sort { lc($a) cmp lc($b) } @watchers;
$vars->{'watchers'} = \@watchers; $vars->{'watchers'} = \@watchers;
###########################################################################
# Role-based preferences
###########################################################################
my $sth = $dbh->prepare("SELECT relationship, event " .
"FROM email_setting " .
"WHERE user_id = ?");
$sth->execute($user->id);
my %mail;
while (my ($relationship, $event) = $sth->fetchrow_array()) {
$mail{$relationship}{$event} = 1;
}
$vars->{'mail'} = \%mail;
} }
sub SaveEmail { sub SaveEmail {
...@@ -248,54 +233,64 @@ sub SaveEmail { ...@@ -248,54 +233,64 @@ sub SaveEmail {
########################################################################### ###########################################################################
$dbh->bz_start_transaction(); $dbh->bz_start_transaction();
# Delete all the user's current preferences my $sth_insert = $dbh->prepare('INSERT INTO email_setting
$dbh->do("DELETE FROM email_setting WHERE user_id = ?", undef, $user->id); (user_id, relationship, event) VALUES (?, ?, ?)');
# Repopulate the table - first, with normal events in the my $sth_delete = $dbh->prepare('DELETE FROM email_setting
WHERE user_id = ? AND relationship = ? AND event = ?');
# Load current email preferences into memory before updating them.
my $settings = $user->mail_settings;
# Update the table - first, with normal events in the
# relationship/event matrix. # relationship/event matrix.
# Note: the database holds only "off" email preferences, as can be implied
# from the name of the table - profiles_nomail.
my %relationships = Bugzilla::BugMail::relationships(); my %relationships = Bugzilla::BugMail::relationships();
foreach my $rel (keys %relationships) { foreach my $rel (keys %relationships) {
next if ($rel == REL_QA && !Bugzilla->params->{'useqacontact'});
# Positive events: a ticked box means "send me mail." # Positive events: a ticked box means "send me mail."
foreach my $event (POS_EVENTS) { foreach my $event (POS_EVENTS) {
if (defined($cgi->param("email-$rel-$event")) my $is_set = $cgi->param("email-$rel-$event");
&& $cgi->param("email-$rel-$event") == 1) if ($is_set xor $settings->{$rel}{$event}) {
{ if ($is_set) {
$dbh->do("INSERT INTO email_setting " . $sth_insert->execute($user->id, $rel, $event);
"(user_id, relationship, event) " . }
"VALUES (?, ?, ?)", else {
undef, ($user->id, $rel, $event)); $sth_delete->execute($user->id, $rel, $event);
}
} }
} }
# Negative events: a ticked box means "don't send me mail." # Negative events: a ticked box means "don't send me mail."
foreach my $event (NEG_EVENTS) { foreach my $event (NEG_EVENTS) {
if (!defined($cgi->param("neg-email-$rel-$event")) || my $is_set = $cgi->param("neg-email-$rel-$event");
$cgi->param("neg-email-$rel-$event") != 1) if (!$is_set xor $settings->{$rel}{$event}) {
{ if (!$is_set) {
$dbh->do("INSERT INTO email_setting " . $sth_insert->execute($user->id, $rel, $event);
"(user_id, relationship, event) " . }
"VALUES (?, ?, ?)", else {
undef, ($user->id, $rel, $event)); $sth_delete->execute($user->id, $rel, $event);
}
} }
} }
} }
# Global positive events: a ticked box means "send me mail." # Global positive events: a ticked box means "send me mail."
foreach my $event (GLOBAL_EVENTS) { foreach my $event (GLOBAL_EVENTS) {
if (defined($cgi->param("email-" . REL_ANY . "-$event")) my $is_set = $cgi->param("email-" . REL_ANY . "-$event");
&& $cgi->param("email-" . REL_ANY . "-$event") == 1) if ($is_set xor $settings->{+REL_ANY}{$event}) {
{ if ($is_set) {
$dbh->do("INSERT INTO email_setting " . $sth_insert->execute($user->id, REL_ANY, $event);
"(user_id, relationship, event) " . }
"VALUES (?, ?, ?)", else {
undef, ($user->id, REL_ANY, $event)); $sth_delete->execute($user->id, REL_ANY, $event);
}
} }
} }
$dbh->bz_commit_transaction(); $dbh->bz_commit_transaction();
# We have to clear the cache about email preferences.
delete $user->{'mail_settings'};
########################################################################### ###########################################################################
# User watching # User watching
########################################################################### ###########################################################################
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment