From a6c5ec6f935a9bd17e99f5b3190b1af9eb350018 Mon Sep 17 00:00:00 2001 From: David Lawrence Date: Thu, 3 Sep 2015 03:59:39 +0000 Subject: Bug 1196508: Intern Request Metric Dashboard --- extensions/BMO/lib/Reports/Internship.pm | 119 +++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 extensions/BMO/lib/Reports/Internship.pm (limited to 'extensions/BMO/lib') diff --git a/extensions/BMO/lib/Reports/Internship.pm b/extensions/BMO/lib/Reports/Internship.pm new file mode 100644 index 000000000..cad403d09 --- /dev/null +++ b/extensions/BMO/lib/Reports/Internship.pm @@ -0,0 +1,119 @@ +# 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. + +package Bugzilla::Extension::BMO::Reports::Internship; +use strict; +use warnings; + +use Bugzilla::Error; +use Bugzilla::Bug; +use Bugzilla::Product; +use Bugzilla::Component; + +sub report { + my ($vars) = @_; + my $user = Bugzilla->user; + + $user->in_group('hr') + || ThrowUserError('auth_failure', { group => 'hr', + action => 'run', + object => 'internship_dashboard' }); + + my $product = Bugzilla::Product->check({ name => 'Recruiting', cache => 1 }); + my $component = Bugzilla::Component->new({ product => $product, name => 'Intern', cache => 1 }); + + # find all open internship bugs + my $bugs = Bugzilla::Bug->match({ + product_id => $product->id, + component_id => $component->id, + resolution => '', + }); + + # filter bugs based on visibility and re-bless + $user->visible_bugs($bugs); + $bugs = [ + map { bless($_, 'InternshipBug') } + grep { $user->can_see_bug($_->id) } + @$bugs + ]; + + $vars->{bugs} = $bugs; +} + +1; + +package InternshipBug; +use strict; +use warnings; + +use base qw(Bugzilla::Bug); + +use Bugzilla::Comment; +use Bugzilla::Util qw(trim); + +sub _extract { + my ($self) = @_; + return if exists $self->{internship_data}; + $self->{internship_data} = {}; + + # we only need the first comment + my $comment = Bugzilla::Comment->match({ + bug_id => $self->id, + LIMIT => 1, + })->[0]->body; + + # extract just what we need + # changing the comment will break this + + if ($comment =~ /Hiring Manager:\s+(.+)\nTeam:\n/s) { + $self->{internship_data}->{hiring_manager} = trim($1); + } + if ($comment =~ /\nVP Authority:\s+(.+)\nProduct Line:\n/s) { + $self->{internship_data}->{scvp} = trim($1); + } + if ($comment =~ /\nProduct Line:\s+(.+)\nLevel 1/s) { + $self->{internship_data}->{product_line} = trim($1); + } + if ($comment =~ /\nBusiness Need:\s+(.+)\nPotential Project:\n/s) { + $self->{internship_data}->{business_need} = trim($1); + } + if ($comment =~ /\nName:\s+(.+)$/s) { + $self->{internship_data}->{intern_name} = trim($1); + } +} + +sub hiring_manager { + my ($self) = @_; + $self->_extract(); + return $self->{internship_data}->{hiring_manager}; +} + +sub scvp { + my ($self) = @_; + $self->_extract(); + return $self->{internship_data}->{scvp}; +} + +sub business_need { + my ($self) = @_; + $self->_extract(); + return $self->{internship_data}->{business_need}; +} + +sub product_line { + my ($self) = @_; + $self->_extract(); + return $self->{internship_data}->{product_line}; +} + +sub intern_name { + my ($self) = @_; + $self->_extract(); + return $self->{internship_data}->{intern_name}; +} + +1; -- cgit v1.2.3-24-g4f1b