From ef96ae157223b3309f7703798b32b0b386b2edff Mon Sep 17 00:00:00 2001 From: Byron Jones Date: Tue, 10 Mar 2015 13:07:56 +0800 Subject: Bug 1003701: add the ability for users to prevent review/feedback/needinfo requests --- extensions/Needinfo/Extension.pm | 61 ++++++++++++++++++++++ .../template/en/default/bug/needinfo.html.tmpl | 54 +++++++++++-------- .../hook/account/prefs/account-field.html.tmpl | 25 +++++++++ .../hook/global/setting-descs-settings.none.tmpl | 11 ++++ .../hook/global/user-error-errors.html.tmpl | 4 ++ 5 files changed, 132 insertions(+), 23 deletions(-) create mode 100644 extensions/Needinfo/template/en/default/hook/account/prefs/account-field.html.tmpl create mode 100644 extensions/Needinfo/template/en/default/hook/global/setting-descs-settings.none.tmpl (limited to 'extensions/Needinfo') diff --git a/extensions/Needinfo/Extension.pm b/extensions/Needinfo/Extension.pm index 26bca649e..c03c251b4 100644 --- a/extensions/Needinfo/Extension.pm +++ b/extensions/Needinfo/Extension.pm @@ -14,9 +14,18 @@ use Bugzilla::Error; use Bugzilla::Flag; use Bugzilla::FlagType; use Bugzilla::User; +use Bugzilla::User::Setting; our $VERSION = '0.01'; +BEGIN { + *Bugzilla::User::needinfo_blocked = \&_user_needinfo_blocked; +} + +sub _user_needinfo_blocked { + return $_[0]->settings->{block_needinfo}->{value} eq 'on'; +} + sub install_update_db { my ($self, $args) = @_; my $dbh = Bugzilla->dbh; @@ -47,6 +56,11 @@ sub install_update_db { }); } +sub install_before_final_checks { + my ($self, $args) = @_; + add_setting('block_needinfo', ['on', 'off'], 'off'); +} + # Clear the needinfo? flag if comment is being given by # requestee or someone used the override flag. sub bug_start_of_update { @@ -142,6 +156,7 @@ sub bug_start_of_update { foreach my $requestee (keys %requestees) { my $needinfo_flag = { type_id => $type->id, status => '?' }; if ($requestee ne 'anyone') { + _check_requestee($requestee); $needinfo_flag->{requestee} = $requestee; } push(@new_flags, $needinfo_flag); @@ -166,6 +181,34 @@ sub bug_start_of_update { } } +sub _check_requestee { + my ($requestee) = @_; + my $user = ref($requestee) + ? $requestee + : Bugzilla::User->new({ name => $requestee, cache => 1 }); + if ($user->needinfo_blocked) { + ThrowUserError('needinfo_blocked', { user => $user }); + } +} + +sub object_end_of_create { + my ($self, $args) = @_; + my $object = $args->{object}; + return unless $object->isa('Bugzilla::Flag') + && $object->type->name eq 'needinfo' + && $object->requestee; + _check_requestee($object->requestee); +} + +sub object_end_of_update { + my ($self, $args) = @_; + my $object = $args->{object}; + return unless $object->isa('Bugzilla::Flag') + && $object->type->name eq 'needinfo' + && $object->requestee; + _check_requestee($object->requestee); +} + sub object_before_delete { my ($self, $args) = @_; my $object = $args->{object}; @@ -183,4 +226,22 @@ sub object_before_delete { } } +sub user_preferences { + my ($self, $args) = @_; + return unless + $args->{current_tab} eq 'account' + && $args->{save_changes}; + + my $input = Bugzilla->input_params; + my $dbh = Bugzilla->dbh; + my $settings = Bugzilla->user->settings; + + $dbh->bz_start_transaction(); + my $value = $input->{block_needinfo} ? 'on' : 'off'; + my $setting = Bugzilla::User::Setting->new('block_needinfo'); + $setting->validate_value($value); + $settings->{'block_needinfo'}->set($value); + $dbh->bz_commit_transaction(); +} + __PACKAGE__->NAME; diff --git a/extensions/Needinfo/template/en/default/bug/needinfo.html.tmpl b/extensions/Needinfo/template/en/default/bug/needinfo.html.tmpl index 5edd70f72..7e32509bf 100644 --- a/extensions/Needinfo/template/en/default/bug/needinfo.html.tmpl +++ b/extensions/Needinfo/template/en/default/bug/needinfo.html.tmpl @@ -6,22 +6,24 @@ # defined by the Mozilla Public License, v. 2.0. #%] -[% needinfo_flagtype = "" %] -[% needinfo_flags = [] %] +[% + needinfo_flagtype = ""; + needinfo_flags = []; -[% FOREACH type = bug.flag_types %] - [% IF type.name == 'needinfo' %] - [% needinfo_flagtype = type %] - [% FOREACH flag = type.flags %] - [% IF flag.status == '?' %] - [% needinfo_flags.push(flag) %] - [% END %] - [% END %] - [% LAST IF needinfo_flagtype %] - [% END %] -[% END %] + FOREACH type = bug.flag_types; + IF type.name == 'needinfo'; + needinfo_flagtype = type; + FOREACH flag = type.flags; + IF flag.status == '?'; + needinfo_flags.push(flag); + END; + END; + LAST IF needinfo_flagtype; + END; + END; + + available_mentors = bug.mentors( exclude_needinfo_blocked => 1 ); -[% BLOCK needinfo_comment_div; match = needinfo_flags.last.creation_date.match('^(\d{4})\.(\d{2})\.(\d{2})(.+)$'); date = "$match.0-$match.1-$match.2$match.3"; @@ -131,9 +133,9 @@ identity = '[% bug.qa_contact.realname || bug.qa_contact.login FILTER html FILTER js %]'; } else if (role == 'user') { identity = '[% user.realname || user.login FILTER html FILTER js %]'; - [% FOREACH mentor = bug.mentors %] + [% FOREACH mentor = available_mentors %] } else if (role == '[% mentor.login FILTER js %]') { - identity = '[% mentor.realname || mentor.login FILTER html FILTER js +%] [%+ IF bug.mentors.size > 1 %](mentor)[% END %]'; + identity = '[% mentor.realname || mentor.login FILTER html FILTER js +%] [%+ IF available_mentors.size > 1 %](mentor)[% END %]'; [% END %] } YAHOO.util.Dom.get('needinfo_role_identity').innerHTML = identity; @@ -167,15 +169,21 @@ diff --git a/extensions/Needinfo/template/en/default/hook/account/prefs/account-field.html.tmpl b/extensions/Needinfo/template/en/default/hook/account/prefs/account-field.html.tmpl new file mode 100644 index 000000000..4e0253610 --- /dev/null +++ b/extensions/Needinfo/template/en/default/hook/account/prefs/account-field.html.tmpl @@ -0,0 +1,25 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + + + [%# this section is shared by both the needinfo and review extensions %] + [%# only show the label once %] + [% IF request_blocked_header %] + + [% ELSE %] + [% request_blocked_header = 1 %] + Request blocking: + [% END %] + + + + + diff --git a/extensions/Needinfo/template/en/default/hook/global/setting-descs-settings.none.tmpl b/extensions/Needinfo/template/en/default/hook/global/setting-descs-settings.none.tmpl new file mode 100644 index 000000000..ec435e58b --- /dev/null +++ b/extensions/Needinfo/template/en/default/hook/global/setting-descs-settings.none.tmpl @@ -0,0 +1,11 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[% + setting_descs.block_needinfo = "Block needinfo requests" +%] diff --git a/extensions/Needinfo/template/en/default/hook/global/user-error-errors.html.tmpl b/extensions/Needinfo/template/en/default/hook/global/user-error-errors.html.tmpl index f1241bc61..42d47e928 100644 --- a/extensions/Needinfo/template/en/default/hook/global/user-error-errors.html.tmpl +++ b/extensions/Needinfo/template/en/default/hook/global/user-error-errors.html.tmpl @@ -10,4 +10,8 @@ [% title = 'Needinfo Illegal Change' %] Only the requestee or a user with the required permissions can clear a needinfo flag. +[% ELSIF error == "needinfo_blocked" %] + [% title = "Needinfo Request Blocked" %] + [% user.identity FILTER html %] is not currently accepting "needinfo" + requests. [% END %] -- cgit v1.2.3-24-g4f1b