[bugzilla-gnome-org-extensions] initial import



commit daae815a629b0835d9455ff4d06943c6d1f0ecff
Author: Olav Vitters <olav vitters nl>
Date:   Wed Feb 29 10:40:49 2012 +0100

    initial import

 Config.pm                                        |    5 +
 Extension.pm                                     |   29 ++
 lib/Util.pm                                      |  322 ++++++++++++++++++
 template/en/default/global/user.html.tmpl        |   44 +++
 template/en/default/pages/describeuser.html.tmpl |  377 ++++++++++++++++++++++
 5 files changed, 777 insertions(+), 0 deletions(-)
---
diff --git a/Config.pm b/Config.pm
new file mode 100644
index 0000000..5f8a44b
--- /dev/null
+++ b/Config.pm
@@ -0,0 +1,5 @@
+package Bugzilla::Extension::DescribeUser;
+use strict;
+use constant NAME => 'DescribeUser';
+
+__PACKAGE__->NAME;
diff --git a/Extension.pm b/Extension.pm
new file mode 100644
index 0000000..7ec8b5b
--- /dev/null
+++ b/Extension.pm
@@ -0,0 +1,29 @@
+package Bugzilla::Extension::DescribeUser;
+use strict;
+use base qw(Bugzilla::Extension);
+
+use Bugzilla::Extension::DescribeUser::Util qw(page);
+
+our $VERSION = '';
+
+sub page_before_template {
+    my ($self, $args) = @_;
+    
+    Bugzilla::Extension::DescribeUser::Util::page(%{ $args });
+    
+}
+
+sub config_modify_panels {
+    my ($self, $args) = @_;
+
+    my $panels = $args->{panels};
+
+    # Point default of mybugstemplate towards this extension
+    my $query_params = $panels->{'query'}->{params};
+
+    my ($mybugstemplate)   = grep($_->{name} eq 'mybugstemplate', @$query_params);
+
+    $mybugstemplate->{default} = 'page.cgi?id=describeuser.html&login=%userid%'
+}
+
+__PACKAGE__->NAME;
diff --git a/lib/Util.pm b/lib/Util.pm
new file mode 100644
index 0000000..b605b2c
--- /dev/null
+++ b/lib/Util.pm
@@ -0,0 +1,322 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is Olav Vitters.
+# Portions created by Olav Vitters are
+# Copyright (C) 2000 Olav Vitters. All
+# Rights Reserved.
+
+package Bugzilla::Extension::DescribeUser::Util;
+
+use strict;
+use base qw(Exporter);
+
+use Bugzilla;
+use Bugzilla::Constants;
+use Bugzilla::User;
+use Bugzilla::Error;
+use Bugzilla::Util;
+
+our @EXPORT = qw(
+    page
+);
+
+sub page {
+    my %params = @_;
+    my ($vars, $page) = @params{qw(vars page_id)};
+    if ($page =~ /^describeuser\./) {
+        _page_describeuser($vars);
+    }
+}
+
+sub _page_describeuser {
+    my $vars = shift;
+
+    my $cgi = Bugzilla->cgi;
+    my $dbh = Bugzilla->dbh;
+    my $user = Bugzilla->user;
+
+    my $userid = $user->id;
+
+    my $r_userid;
+    my $r_user;
+    my $displayname;
+    my $to_be_conjugation;
+
+    if (defined $cgi->param('login') && (!Bugzilla->user->id || (trim($cgi->param('login')) != 
Bugzilla->user->login))) {
+        $r_userid = login_to_id(trim($cgi->param('login')));
+        if ($r_userid == 0) {
+                ThrowUserError('invalid_username', { name => $cgi->param('login') });
+        }
+        $r_user = Bugzilla::User->new($r_userid);
+        $displayname = $r_user->name || $r_user->login;
+        $to_be_conjugation = 'is';
+    } else {
+        $r_user = Bugzilla->user;
+        $r_userid = Bugzilla->user->id;
+        $displayname = "you";
+        $to_be_conjugation = 'are';
+    }
+
+    $vars->{'userinfo'} = $r_user;
+    $vars->{'displayname'} = $displayname;
+    $vars->{'to_be_conjugation'} = $to_be_conjugation;
+
+    my $sec_join = " LEFT JOIN bug_group_map
+                            ON bug_group_map.bug_id = bugs.bug_id ";
+
+    if ($user->groups) {
+        $sec_join .= "
+                AND bug_group_map.group_id NOT IN (" . $user->groups_as_string . ") ";
+    }
+    $sec_join .= "
+            LEFT JOIN cc
+                   ON cc.bug_id = bugs.bug_id AND cc.who = " . $user->id;
+
+    my $sec_where = "
+        AND bugs.creation_ts IS NOT NULL
+        AND ((bug_group_map.group_id IS NULL)
+             OR (bugs.reporter_accessible = 1 AND bugs.reporter = $userid)
+             OR (bugs.cclist_accessible = 1 AND cc.who IS NOT NULL)
+             OR (bugs.assigned_to = $userid) ";
+
+    if (defined $cgi->param('useqacontact')) {
+        $sec_where .= "
+             OR (bugs.qa_contact = $userid) ";
+    }
+
+    my $sec_where_minus_grouping = $sec_where . ")";
+    $sec_where .= ") " . $dbh->sql_group_by("bugs.bug_id", 'product, bugs.bug_status, bugs.resolution, 
bugs.bug_severity, bugs.short_desc');
+
+    my $comments = $dbh->selectrow_array(
+        "SELECT COUNT(thetext)
+           FROM longdescs
+          WHERE who = ?", undef, $r_userid);
+
+    $vars->{'comments'} = $comments;
+    my $bugs_closed = $dbh->selectrow_array(
+           "SELECT COUNT(bugs.bug_id)
+              FROM bugs
+        INNER JOIN bugs_activity
+                ON bugs.bug_id = bugs_activity.bug_id
+             WHERE bugs.bug_status IN ('RESOLVED','CLOSED','VERIFIED')
+               AND bugs_activity.added IN ('RESOLVED','CLOSED')
+               AND bugs_activity.bug_when =
+                     (SELECT MAX(bug_when)
+                        FROM bugs_activity ba
+                       WHERE ba.added IN ('RESOLVED','CLOSED')
+                         AND ba.removed IN ('UNCONFIRMED','REOPENED',
+                                            'NEW','ASSIGNED','NEEDINFO')
+                         AND ba.bug_id = bugs_activity.bug_id)
+               AND bugs_activity.who = ?", undef, $r_userid);
+
+    $vars->{'bugs_closed'} = $bugs_closed;
+    my $bugs_reported = $dbh->selectrow_array(
+           "SELECT COUNT(DISTINCT bug_id)
+              FROM bugs
+             WHERE bugs.reporter = ?
+               AND NOT (bugs.bug_status = 'RESOLVED' AND 
+                        bugs.resolution IN ('DUPLICATE','INVALID','NOTABUG',
+                                            'NOTGNOME','INCOMPLETE'))",
+           undef, $r_userid);
+    $vars->{'bugs_reported'} = $bugs_reported;
+
+    $vars->{'developed_products'} = developed_products($r_user);
+
+    my $sth;
+    my @patches;
+    # XXX - relies on attachments.status!
+    if ($dbh->bz_column_info('attachments', 'status')) {
+        $sth = $dbh->prepare("
+                SELECT attachments.bug_id, attachments.status as status,
+                       attachments.attach_id, products.name as product,
+                       attachments.description
+                  FROM attachments, bugs, products
+                 WHERE attachments.bug_id = bugs.bug_id
+                   AND bugs.product_id = products.id
+                   AND bugs.bug_status IN ('UNCONFIRMED','NEW','ASSIGNED','REOPENED')
+                   AND attachments.submitter_id = ?
+                   AND attachments.ispatch='1'
+                   AND attachments.isobsolete != '1'
+                   AND attachments.status IN ('accepted-commit_after_freeze',
+                                          'accepted-commit_now', 'needs-work', 'none',
+                                          'rejected', 'reviewed')
+              ORDER BY attachments.status");
+
+        $sth->execute($r_userid);
+        while (my $patch = $sth->fetchrow_hashref) {
+            push(@patches, $patch);
+        }
+    }
+    $vars->{'patches'} = \ patches;
+
+    my @assignedbugs;
+    $sth = $dbh->prepare(
+           "SELECT bugs.bug_id, products.name AS product, bugs.bug_status,
+                   bugs.resolution, bugs.bug_severity, bugs.short_desc
+              FROM bugs
+                   $sec_join
+        INNER JOIN products
+                ON bugs.product_id = products.id
+             WHERE assigned_to = ?
+               AND bug_status IN ('UNCONFIRMED','NEW','ASSIGNED','REOPENED')
+                   $sec_where
+          ORDER BY bug_id DESC");
+
+    $sth->execute($r_userid);
+    while (my $bug = $sth->fetchrow_hashref) {
+        push(@assignedbugs, $bug);
+    }
+    $vars->{'assignedbugs'} = \ assignedbugs;
+
+    my @needinfoassignedbugs;
+    $sth = $dbh->prepare(
+           "SELECT bugs.bug_id, products.name AS product, bugs.bug_status,
+                   bugs.resolution, bugs.bug_severity, bugs.short_desc
+              FROM bugs
+                   $sec_join
+        INNER JOIN products
+                ON bugs.product_id = products.id
+             WHERE assigned_to = ?
+               AND bug_status IN ('NEEDINFO')
+                   $sec_where
+          ORDER BY bug_id DESC");
+
+    $sth->execute($r_userid);
+    while (my $bug = $sth->fetchrow_hashref) {
+        push(@needinfoassignedbugs, $bug);
+    }
+    $vars->{'needinfoassignedbugs'} = \ needinfoassignedbugs;
+
+    my @needinforeporterbugs;
+    $sth = $dbh->prepare(
+           "SELECT bugs.bug_id, products.name AS product, bugs.bug_status,
+                   bugs.resolution, bugs.bug_severity, bugs.short_desc
+              FROM bugs
+                   $sec_join
+        INNER JOIN products
+                ON bugs.product_id = products.id
+             WHERE reporter=?
+               AND bug_status IN ('NEEDINFO')
+                   $sec_where
+          ORDER BY bug_id DESC");
+
+    $sth->execute($r_userid);
+    while (my $bug = $sth->fetchrow_hashref) {
+        push(@needinforeporterbugs, $bug);
+    }
+    $vars->{'needinforeporterbugs'} = \ needinforeporterbugs;
+
+    my @newbugs;
+    $sth = $dbh->prepare(
+           "SELECT bugs.bug_id, products.name AS product, bugs.bug_status,
+                   bugs.resolution, bugs.bug_severity, bugs.short_desc
+              FROM bugs
+                   $sec_join
+        INNER JOIN products
+                ON bugs.product_id = products.id
+             WHERE reporter = ?
+               AND bug_status IN ('UNCONFIRMED','NEW','REOPENED')
+                   $sec_where
+          ORDER BY bug_id DESC");
+
+    $sth->execute($r_userid);
+    while (my $bug = $sth->fetchrow_hashref) {
+        push(@newbugs, $bug);
+    }
+    $vars->{'newbugs'} = \ newbugs;
+
+    my @inprogressbugs;
+    $sth = $dbh->prepare(
+           "SELECT bugs.bug_id, products.name AS product, bugs.bug_status, bugs.resolution, 
bugs.bug_severity, bugs.short_desc
+              FROM bugs
+                   $sec_join
+        INNER JOIN products
+                ON bugs.product_id = products.id
+             WHERE reporter=?
+               AND bug_status = 'ASSIGNED'
+                   $sec_where
+          ORDER BY bug_id DESC");
+
+    $sth->execute($r_userid);
+    while (my $bug = $sth->fetchrow_hashref) {
+        push(@inprogressbugs, $bug);
+    }
+    $vars->{'inprogressbugs'} = \ inprogressbugs;
+
+    my @recentlyclosed;
+    $sth = $dbh->prepare("
+            SELECT bugs.bug_id, products.name AS product, bugs.bug_status, 
+                   bugs.resolution, bugs.bug_severity, bugs.short_desc 
+              FROM bugs
+                   $sec_join
+        INNER JOIN products
+                ON bugs.product_id = products.id
+        INNER JOIN bugs_activity
+                ON bugs.bug_id = bugs_activity.bug_id
+             WHERE bugs.reporter = ?
+               AND bugs_activity.added='RESOLVED'
+               AND (bugs.bug_status='RESOLVED' OR bugs.bug_status = 'VERIFIED' 
+                    OR bugs.bug_status='CLOSED')
+               AND bugs_activity.bug_when >= " . $dbh->sql_date_math('LOCALTIMESTAMP(0)', '-', 7, 'DAY')
+                 . $sec_where);
+
+    $sth->execute($r_userid);
+    while (my $bug = $sth->fetchrow_hashref) {
+        push(@recentlyclosed, $bug);
+    }
+    $vars->{'recentlyclosed'} = \ recentlyclosed;
+
+    if ($user->in_group('editbugs') && $r_user->login =~ ' * gnome\ bugs$') {
+        my $watcher_ids = $dbh->selectcol_arrayref(
+            "SELECT watcher FROM watch WHERE watched = ?",
+            undef, $r_userid);
+
+        my @watchers;
+        foreach my $watcher_id (@$watcher_ids) {
+            my $watcher = new Bugzilla::User($watcher_id);
+            push (@watchers, Bugzilla::User::identity($watcher));
+        }
+
+        @watchers = sort { lc($a) cmp lc($b) } @watchers;
+        $vars->{'watchers'} = \ watchers;
+    }
+
+    # XXX: this is just a temporary measure until points get back in a table, it
+    # can be done here at not cost as numbers are already collected.
+    my $points = log(1 + $comments) / log(10) +
+                 log(1 + $bugs_closed) / log(2) + 
+                 log(1 + $bugs_reported) / log(2);
+    $vars->{'points'} = int($points + 0.5);
+}
+
+sub developed_products {
+    my $self = shift;
+
+    return [] unless $self->id;
+
+    # Get the list of products
+    my $groups = $self->{groups};
+    my $group_membership;
+    foreach my $group (@$groups) {
+         push (@$group_membership,
+               substr($group->name, 0, index($group->name, '_developers')))
+               if $group->name =~ /_developers$/;
+    }
+
+    # return it
+    return $group_membership;
+}
+
+1;
diff --git a/template/en/default/global/user.html.tmpl b/template/en/default/global/user.html.tmpl
new file mode 100644
index 0000000..d27c735
--- /dev/null
+++ b/template/en/default/global/user.html.tmpl
@@ -0,0 +1,44 @@
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Daniel Brooks.
+  # Portions created by the Initial Developer are Copyright (C) 2007
+  # the Initial Developer. All Rights Reserved.
+  #
+  # Contributor(s): 
+  #   Daniel Brooks <db48x db48x net>
+  #   Max Kanat-Alexander <mkanat bugzilla org>
+  #
+  # Modification for the describe-user extension:
+  #  - replace mailto: link by link to the describeuser page
+  #%]
+
+[%# INTERFACE:
+  # who: A Bugzilla::User object that we are going to represent.
+  #%]
+
+<span class="vcard">
+  [% FILTER collapse %]
+    [% IF user.id %]
+      <a href="page.cgi?id=describeuser.html&login=[% who.email FILTER uri %]"
+         title="[% who.identity FILTER html %]">
+    [%- END -%]
+    [% IF who.name %]
+       <span class="fn">[% who.name FILTER html %]</span>
+    [% ELSE %]
+      [% who.login FILTER email FILTER html %]
+    [% END %]
+    [% '</a>' IF user.id %]
+  [% END %]
+</span>
+
+[% Hook.process("end", "global/user.html.tmpl") %]
diff --git a/template/en/default/pages/describeuser.html.tmpl 
b/template/en/default/pages/describeuser.html.tmpl
new file mode 100644
index 0000000..d94da0c
--- /dev/null
+++ b/template/en/default/pages/describeuser.html.tmpl
@@ -0,0 +1,377 @@
+[%# 1 0 bugzilla org %]
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv gerv net>
+  #%]
+
+[%# INTERFACE:
+  # displayname:        displayname for user
+  # to_be_conjugation:  "is" or "are"
+  # comments:           Number of comments user has added to bugs
+  # bugs_closed:        Number of comments user has added to bugs
+  # bugs_reported:      Number of comments user has added to bugs
+  # developed_products: products the user is a developer for
+  #
+  # userinfo: info about the user; contains
+  #   id:                 bugzilla userid
+  #   email:              email address
+  #   points:             points the user has acquired
+  #   products_interests: products the user is interested in
+  #
+  # patches: list of patches; each patch has
+  #   status:      review status of the patch (e.g. 'needs-work')
+  #   attach_id:   attachment id, for attachment.cgi
+  #   bug_id:      bug where patch is filed against
+  #   product:     name of product in which the bug is filed against
+  #   description: patch description
+  # 
+  # assignedbugs:
+  # needinfoassignedbugs:
+  # needinforeporterbugs:
+  # newbugs:
+  # inprogressbugs:
+  # recentlyclosed:
+  # <All provide lists of bugs, with the fields>
+  #   bug_id:       bug id
+  #   product:      product the bug is filed against
+  #   bug_status:   status of the bug
+  #   resolution:   resolution of the bug
+  #   bug_severity: severity of the bug
+  #   short_desc:   summary (short description) of the bug
+ %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[%### Setting up the "Bugzilla User Info for <user>" header ###%]
+  [% linked_name = BLOCK %]
+    [% IF userinfo.id == user.id %]
+      [% showuser = '' %]
+    [% ELSE %]
+      [% showuser = displayname %]
+    [% END %]
+
+    [% IF showuser != '' %]
+      for 
+      [% IF user.in_group('editusers') || user.can_bless %]
+        <a href="editusers.cgi?action=edit&userid=[% userinfo.id 
+                FILTER uri %]">
+      [% END %]
+      [% showuser FILTER html %]
+      [% IF user.in_group('editusers') %]
+        </a>
+      [% END %]
+    [% END %]
+  [% END %]
+
+  [% name_title = BLOCK %]
+    [% linked_name FILTER remove('<[^>]*>') %]
+  [% END %]
+
+[%### Actually handling the header ###%]
+  [% PROCESS global/header.html.tmpl
+    title = "$terms.Bugzilla User Info$name_title"
+    header = "User Info$linked_name"
+    style = "
+  table.figures td { padding-top: 0px; padding-bottom: 0px }
+  table.figures td { margin-top: 0px; margin-bottom: 0px }
+  table.figures tr { margin-top: 0px; margin-bottom: 0px }
+  .blocker { margin-top: 1em; }
+  #body { padding-right: 0px; }
+  h3 { padding-top: 1em; }
+  h3 span { background-color: #babdb6; }
+  ul { padding-left: 1em; padding-top: 0px; padding-bottom: 0px; margin-top: 0px;
+  margin-bottom: 0px; }
+  "
+  %]
+
+[%### The info in the right hand side bar ###%]
+  <div style="position: relative; float: right; -moz-border-radius-topleft: 20px;
+              -webkit-border-top-left-radius: 20px; -webkit-border-bottom-left-radius: 20px;
+              -moz-border-radius-bottomleft: 20px; padding-right: 1em;
+              margin-right: 0px; margin-left: 1ex; background-color: #ffeafd;
+              padding-left: 1em; padding-bottom: 1em; width: 15em;">
+
+  <h3>Basic stats</h3>
+  [% displayname FILTER html %]
+  <ul>
+    <li> added [% comments FILTER html %] comments to [% terms.bugs %].</li>
+    <li> closed [% bugs_closed FILTER html %] [%+ terms.bugs %].</li>
+    <li> reported [% bugs_reported FILTER html %] [%+ terms.bugs %].</li>
+    <li> gathered [% points FILTER html %] points.</li>
+  </ul>
+
+  [% IF developed_products.size > 0 %]
+    <h3>Developer of</h3>
+
+    <ul>
+    [% FOREACH product = developed_products %]
+      <li><a href="browse.cgi?product=[% product.name FILTER uri %]">[% product 
+          FILTER html %]</a></li>
+    [% END %]
+    </ul>
+  [% END %]
+
+  [% IF userinfo.product_interests.size > 0 %]
+    <h3>Interested products</h3>
+
+    <ul>
+    [% FOREACH product = userinfo.product_interests %]
+      <li><a href="browse.cgi?product=[% product.name FILTER uri %]">[% product.name
+           FILTER html %]</a></li>
+    [% END %]
+    </ul>
+  [% END %]
+
+  [% IF watchers && watchers.size > 0 %]
+    <h3>Watchers</h3>
+    
+    <ul>
+    [% FOREACH watcher = watchers %]
+      <li>[% watcher FILTER html %]</li>
+    [% END %]
+    </ul>
+  [% END %]
+
+  <h3>Reports</h3>
+  <ul>
+    <li><a href="[% "buglist.cgi?bug_status=RESOLVED,VERIFIED,CLOSED" _
+                    "&amp;emailreporter1=1&amp;emailtype1=exact&amp;email1=" %]
+                 [% userinfo.email FILTER uri %]">All closed [% terms.bugs %]</a></li>
+    <li><a href="[% "buglist.cgi?emailcc1=1&amp;emailtype1=exact&amp;email1=" %]
+                 [% userinfo.email FILTER uri %]">All [% terms.bugs %] cc'ed</a></li>
+    <li><a href="[% "buglist.cgi?emaillongdesc1=1&amp;emailtype1=exact&amp;" _
+                    "email1=" %]
+                 [% userinfo.email FILTER uri %]">All [% terms.bugs %] commented</a></li>
+  </ul>
+
+  </div>
+
+[%### Bugs ###%]
+  <p>
+    <h3><span>Open Issues: 
+      <a href="
+        [% "buglist.cgi?bug_status=UNCONFIRMED&amp;bug_status=NEW" %]
+        [% "&amp;bug_status=REOPENED&amp;bug_status=ASSIGNED" %]
+        [% "&amp;emailassigned_to1=1&amp;emailtype1=exact&amp;email1=" %]
+        [% userinfo.email FILTER uri %]">
+        <b>Assigned to [% displayname FILTER html %]</b></a> 
+      [% "(the issue has been assigned to" %]
+      [%+ displayname FILTER html %]
+      [%+ "and it is not resolved or closed yet)" %]
+    </span></h3>
+    <table border="0" cellpadding="2" cellspacing="0">
+    [% FOREACH bug = assignedbugs %]
+      <tr class="[%+ IF loop.count() % 2 == 0 %]
+                   [% "bz_row_even" %]
+                 [% ELSE %]
+                   [% "bz_row_odd" %]
+                 [% END %]">
+        <td nowrap="nowrap" style="width: 6ex" align="center">
+          [% %]<a href="[% "show_bug.cgi?id=" %]
+          [% bug.bug_id FILTER uri%]">
+          [% bug.bug_id FILTER html %]</a></td>
+        <td nowrap="nowrap" style="width: 12ex">
+          [% %]<a href="[% "browse.cgi?product=" %]
+          [% bug.product FILTER uri %]">
+          [% bug.product FILTER html %]</a></td>
+        <td nowrap="nowrap" style="width: 4ex" align="center">
+          [% bug.bug_status.truncate(4) FILTER html %]</td>
+        <td nowrap="nowrap" style="width: 3ex" align="center">
+          [% bug.bug_severity.truncate(3) FILTER html %]</td>
+        <td><a href="[% "show_bug.cgi?id=" %]
+          [% bug.bug_id FILTER uri%]">
+          [% bug.short_desc FILTER html %]</a></td>
+      </tr>
+    [% END %]
+    </table>
+  </p>
+
+  <p>
+    <h3><span>Open Issues:
+      <a href="
+        [% "buglist.cgi?bug_status=NEEDINFO&amp;emailreporter1=1&amp;emailtype1=" %]
+        [% "exact&amp;email1=" %] [% userinfo.email FILTER uri %]">
+        <b>Needinfo</b></a>
+      ([% displayname FILTER html %] 
+      [%+ "reported this issue, it requires more information and you should " %]
+      [% "provide it) " %]
+    </span></h3>
+    <table border="0" cellpadding="3" cellspacing="1">
+    [% FOREACH bug = needinforeporterbugs %]
+      <tr class="[%+ IF loop.count() % 2 == 0 %]
+                   [% "bz_row_even" %]
+                 [% ELSE %]
+                   [% "bz_row_odd" %]
+                 [% END %]">
+        <td nowrap="nowrap" style="width: 6ex" align="center">
+          [% %]<a href="show_bug.cgi?id=[% bug.bug_id FILTER uri %]">
+          [% bug.bug_id FILTER html %]</a></td>
+        <td nowrap="nowrap" style="width: 12ex">
+          [% %]<a href="browse.cgi?product=[% bug.product FILTER uri %]">
+          [% bug.product FILTER html %]</a></td>
+        <td nowrap="nowrap" style="width: 4ex" align="center">
+          [% bug.bug_status.truncate(4) FILTER html %]</td>
+        <td nowrap="nowrap" style="width: 3ex" align="center">
+          [% bug.bug_severity.truncate(3) FILTER html %]</td>
+        <td><a href="show_bug.cgi?id=[% bug.bug_id FILTER uri%]">
+          [% bug.short_desc FILTER html %]</a></td>
+      </tr>
+    [% END %]
+    </table>
+  </p>
+
+  <p>
+    <h3><span>Open Issues: 
+      <a href="
+        [% "buglist.cgi?bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;" %]
+        [% "bug_status=REOPENED&amp;emailreporter1=1&amp;emailtype1=exact" %]
+        [% "&amp;email1=" %] [% userinfo.email FILTER uri %]">
+        <b>New</b></a>
+      ([% displayname FILTER html %] 
+      [%+ "reported it but nobody has accepted it yet)" %]
+     </span></h3>
+    <table border="0" cellpadding="3" cellspacing="0">
+    [% FOREACH bug = newbugs %]
+      <tr class="[%+ IF loop.count() % 2 == 0 %]
+                   [% "bz_row_even" %]
+                 [% ELSE %]
+                   [% "bz_row_odd" %]
+                 [% END %]">
+        <td nowrap="nowrap" style="width: 6ex" align="center">
+          [% %]<a href="show_bug.cgi?id=[% bug.bug_id FILTER uri %]">
+          [% bug.bug_id FILTER html %]</a></td>
+        <td nowrap="nowrap" style="width: 12ex" >
+          [% %]<a href="browse.cgi?product=[% bug.product FILTER uri %]">
+          [% bug.product FILTER html %]</a></td>
+        <td nowrap="nowrap" style="width: 4ex" align="center">
+          [% bug.bug_status.truncate(4) FILTER html %]</td>
+        <td nowrap="nowrap" style="width: 3ex" align="center">
+          [% bug.bug_severity.truncate(3) FILTER html %]</td>
+        <td>
+          [% %]<a href="show_bug.cgi?id=[% bug.bug_id FILTER uri%]">
+          [% bug.short_desc FILTER html %]</a></td>
+      </tr>
+    [% END %]
+    </table>
+  </p>
+
+  <p>
+    <h3><span>Open Issues:
+      <a href="
+        [% "buglist.cgi?bug_status=ASSIGNED&amp;emailreporter1=1&amp;" %]
+        [% "emailtype1=exact&amp;email1=" %]
+        [% userinfo.email FILTER uri %]">
+        <b>In progress</b></a>
+      ([% displayname FILTER html %]
+       [%+ "reported it, the developer accepted the issue and is hopefully " %]
+       [% "working on it)" %]
+    </span></h3>
+    <table border="0" cellpadding="3" cellspacing="0">
+    [% FOREACH bug = inprogressbugs %]
+      <tr class="[%+ IF loop.count() % 2 == 0 %]
+                   [% "bz_row_even" %]
+                 [% ELSE %]
+                   [% "bz_row_odd" %]
+                 [% END %]">
+        <td nowrap="nowrap" style="width: 6ex" align="center">
+          [% %]<a href="show_bug.cgi?id=[% bug.bug_id FILTER uri %]">
+          [% bug.bug_id FILTER html %]</a></td>
+        <td nowrap="nowrap" style="width: 12ex">
+          [% %]<a href="browse.cgi?product=[% bug.product FILTER uri %]">
+          [% bug.product FILTER html %]</a></td>
+        <td nowrap="nowrap" style="width: 4ex" align="center">
+          [% bug.bug_status.truncate(4) FILTER html %]</td>
+        <td nowrap="nowrap" style="width: 3ex" align="center">
+          [% bug.bug_severity.truncate(3) FILTER html %]</td>
+        <td>
+          [% %]<a href="show_bug.cgi?id=[% bug.bug_id FILTER uri%]">
+          [% bug.short_desc FILTER html %]</a></td>
+      </tr>
+    [% END %]
+    </table>
+  </p>
+
+  <p>
+    <h3><span>Closed Issues: <b>Recently closed</b></a> ([% displayname FILTER html %] reported it and the 
issue was closed in the last 7 days)</span></h3>
+    <table border="0" cellpadding="3" cellspacing="0">
+    [% FOREACH bug = recentlyclosed %]
+      <tr class="[%+ IF loop.count() % 2 == 0 %]
+                   [% "bz_row_even" %]
+                 [% ELSE %]
+                   [% "bz_row_odd" %]
+                 [% END %]">
+        <td nowrap="nowrap" style="width: 6ex" align="center">
+          [% %]<a href="show_bug.cgi?id=[% bug.bug_id FILTER uri %]">
+          [% bug.bug_id FILTER html %]</a></td>
+        <td nowrap="nowrap" style="width: 12ex">
+          [% %]<a href="browse.cgi?product=[% bug.product FILTER uri %]">
+          [% bug.product FILTER html %]</a></td>
+        <td nowrap="nowrap" style="width: 4ex" align="center">
+          [% bug.resolution.truncate(4) FILTER html %]</td>
+        <td nowrap="nowrap" style="width: 3ex" align="center">
+          [% bug.bug_severity.truncate(3) FILTER html %]</td>
+        <td>
+          [% %]<a href="show_bug.cgi?id=[% bug.bug_id FILTER uri%]">
+          [% bug.short_desc FILTER html %]</a></td>
+      </tr>
+    [% END %]
+    </table>
+  </p>
+
+[%### Patches ###%]
+  [% IF patches.size %]
+    [% status = '' %]
+    [% FOREACH patch = patches %]
+      [% IF patch.status != status %]
+        [% IF status != '' %]
+          [% "\n    </table>\n  </p>\n\n" %]
+        [% END %]
+        [% status = patch.status %]
+        [% "  <p>\n" _
+           "    <h3><span>Patches: " %]
+        [% status.replace('none','unreviewed') FILTER html %]
+        [% "</span></h3>\n" %]
+        [% "    <table border=\"0\" cellpadding=\"2\" cellspacing=\"0\">" %]
+      [% END %]
+      <tr class="[%+ IF loop.count() % 2 == 0 %]
+                   [% "bz_row_even" %]
+                 [% ELSE %]
+                   [% "bz_row_odd" %]
+                 [% END %]">
+        <td><a href="[% "show_bug.cgi?id=" %]
+                     [% patch.bug_id FILTER uri%]">
+                     [% patch.bug_id FILTER html %]</a></td>
+        <td><a href="[% "attachment.cgi?id=" %]
+                     [% patch.attach_id FILTER uri %]
+                     [% "&amp;action=diff" %]">(#
+                     [% patch.attach_id FILTER html %])</a></td>
+        <td nowrap="nowrap" style="width: 12ex">
+          [% %]<a href="[% "browse.cgi?product=" %]
+                        [% patch.product FILTER uri %]
+                        [% "\">" %]
+                        [% patch.product FILTER html %]</a></td>
+        <td><a href="[% "attachment.cgi?id=" %]
+                     [% patch.attach_id FILTER uri %]
+                     [% "&amp;action=diff" %]">
+                     [% patch.description FILTER html %]</a></td>
+      </tr>
+    [% END %]
+    [% "    </table>\n  </p>" %]
+  [% END %]
+
+[% PROCESS global/footer.html.tmpl %]


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]