Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
bugzilla
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
etersoft
bugzilla
Commits
71320dae
Commit
71320dae
authored
Oct 03, 2010
by
Guy Pyrzak
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Bug 65477: Send HTML bugmail
r=mkanat, a=mkanat
parent
22c14482
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
269 additions
and
60 deletions
+269
-60
BugMail.pm
Bugzilla/BugMail.pm
+44
-14
Template.pm
Bugzilla/Template.pm
+5
-1
bugmail-common.txt.html
template/en/default/email/bugmail-common.txt.html
+39
-0
bugmail-header.txt.tmpl
template/en/default/email/bugmail-header.txt.tmpl
+47
-0
bugmail.html.tmpl
template/en/default/email/bugmail.html.tmpl
+127
-0
bugmail.txt.tmpl
template/en/default/email/bugmail.txt.tmpl
+7
-45
No files found.
Bugzilla/BugMail.pm
View file @
71320dae
...
@@ -29,6 +29,7 @@
...
@@ -29,6 +29,7 @@
# Byron Jones <bugzilla@glob.com.au>
# Byron Jones <bugzilla@glob.com.au>
# Reed Loden <reed@reedloden.com>
# Reed Loden <reed@reedloden.com>
# Frédéric Buclin <LpSolit@gmail.com>
# Frédéric Buclin <LpSolit@gmail.com>
# Guy Pyrzak <guy.pyrzak@gmail.com>
use
strict
;
use
strict
;
...
@@ -83,10 +84,9 @@ sub Send {
...
@@ -83,10 +84,9 @@ sub Send {
# can 'have' a role, if the person in that role has changed, or people are
# can 'have' a role, if the person in that role has changed, or people are
# watching.
# watching.
my
@assignees
=
(
$bug
->
assigned_to
);
my
@assignees
=
(
$bug
->
assigned_to
);
my
@qa_contacts
=
(
$bug
->
qa_contact
);
my
@qa_contacts
=
$bug
->
qa_contact
||
(
);
my
@ccs
=
@
{
$bug
->
cc_users
};
my
@ccs
=
@
{
$bug
->
cc_users
};
# Include the people passed in as being in particular roles.
# Include the people passed in as being in particular roles.
# This can include people who used to hold those roles.
# This can include people who used to hold those roles.
# At this point, we don't care if there are duplicates in these arrays.
# At this point, we don't care if there are duplicates in these arrays.
...
@@ -104,6 +104,7 @@ sub Send {
...
@@ -104,6 +104,7 @@ sub Send {
push
(
@ccs
,
Bugzilla::
User
->
check
(
$cc
));
push
(
@ccs
,
Bugzilla::
User
->
check
(
$cc
));
}
}
}
}
my
%
user_cache
=
map
{
$_
->
id
=>
$_
}
(
@assignees
,
@qa_contacts
,
@ccs
);
my
@diffs
;
my
@diffs
;
if
(
!
$start
)
{
if
(
!
$start
)
{
...
@@ -123,7 +124,7 @@ sub Send {
...
@@ -123,7 +124,7 @@ sub Send {
blocker
=>
$params
->
{
blocker
}
});
blocker
=>
$params
->
{
blocker
}
});
}
}
else
{
else
{
push
(
@diffs
,
_get_diffs
(
$bug
,
$end
));
push
(
@diffs
,
_get_diffs
(
$bug
,
$end
,
\%
user_cache
));
}
}
my
$comments
=
$bug
->
comments
({
after
=>
$start
,
to
=>
$end
});
my
$comments
=
$bug
->
comments
({
after
=>
$start
,
to
=>
$end
});
...
@@ -220,7 +221,8 @@ sub Send {
...
@@ -220,7 +221,8 @@ sub Send {
foreach
my
$user_id
(
keys
%
recipients
)
{
foreach
my
$user_id
(
keys
%
recipients
)
{
my
%
rels_which_want
;
my
%
rels_which_want
;
my
$sent_mail
=
0
;
my
$sent_mail
=
0
;
my
$user
=
new
Bugzilla::
User
(
$user_id
);
$user_cache
{
$user_id
}
||=
new
Bugzilla::
User
(
$user_id
);
my
$user
=
$user_cache
{
$user_id
};
# Deleted users must be excluded.
# Deleted users must be excluded.
next
unless
$user
;
next
unless
$user
;
...
@@ -353,19 +355,47 @@ sub sendMail {
...
@@ -353,19 +355,47 @@ sub sendMail {
new_comments
=>
\
@send_comments
,
new_comments
=>
\
@send_comments
,
threadingmarker
=>
build_thread_marker
(
$bug
->
id
,
$user
->
id
,
!
$bug
->
lastdiffed
),
threadingmarker
=>
build_thread_marker
(
$bug
->
id
,
$user
->
id
,
!
$bug
->
lastdiffed
),
};
};
my
$msg
=
_generate_bugmail
(
$user
,
$vars
);
MessageToMTA
(
$msg
);
return
1
;
}
my
$msg
;
sub
_generate_bugmail
{
my
(
$user
,
$vars
)
=
@_
;
my
$template
=
Bugzilla
->
template_inner
(
$user
->
settings
->
{
'lang'
}
->
{
'value'
});
my
$template
=
Bugzilla
->
template_inner
(
$user
->
settings
->
{
'lang'
}
->
{
'value'
});
$template
->
process
(
"email/newchangedmail.txt.tmpl"
,
$vars
,
\
$msg
)
my
(
$msg_text
,
$msg_html
,
$msg_header
);
||
ThrowTemplateError
(
$template
->
error
());
MessageToMTA
(
$msg
);
$template
->
process
(
"email/bugmail-header.txt.tmpl"
,
$vars
,
\
$msg_header
)
||
ThrowTemplateError
(
$template
->
error
());
$template
->
process
(
"email/bugmail.txt.tmpl"
,
$vars
,
\
$msg_text
)
||
ThrowTemplateError
(
$template
->
error
());
$template
->
process
(
"email/bugmail.html.tmpl"
,
$vars
,
\
$msg_html
)
||
ThrowTemplateError
(
$template
->
error
());
return
1
;
my
@parts
=
(
Email::
MIME
->
create
(
attributes
=>
{
content_type
=>
"text/plain"
,
},
body
=>
$msg_text
,
),
Email::
MIME
->
create
(
attributes
=>
{
content_type
=>
"text/html"
,
},
body
=>
$msg_html
,
),
);
my
$email
=
new
Email::
MIME
(
$msg_header
);
$email
->
parts_set
(
\
@parts
);
$email
->
content_type_set
(
'multipart/alternative'
);
return
$email
;
}
}
sub
_get_diffs
{
sub
_get_diffs
{
my
(
$bug
,
$end
)
=
@_
;
my
(
$bug
,
$end
,
$user_cache
)
=
@_
;
my
$dbh
=
Bugzilla
->
dbh
;
my
$dbh
=
Bugzilla
->
dbh
;
my
@args
=
(
$bug
->
id
);
my
@args
=
(
$bug
->
id
);
...
@@ -377,20 +407,20 @@ sub _get_diffs {
...
@@ -377,20 +407,20 @@ sub _get_diffs {
}
}
my
$diffs
=
$dbh
->
selectall_arrayref
(
my
$diffs
=
$dbh
->
selectall_arrayref
(
"SELECT
profiles.login_name, profiles.realname,
fielddefs.name AS field_name,
"SELECT fielddefs.name AS field_name,
bugs_activity.bug_when, bugs_activity.removed AS old,
bugs_activity.bug_when, bugs_activity.removed AS old,
bugs_activity.added AS new, bugs_activity.attach_id,
bugs_activity.added AS new, bugs_activity.attach_id,
bugs_activity.comment_id
bugs_activity.comment_id
, bugs_activity.who
FROM bugs_activity
FROM bugs_activity
INNER JOIN fielddefs
INNER JOIN fielddefs
ON fielddefs.id = bugs_activity.fieldid
ON fielddefs.id = bugs_activity.fieldid
INNER JOIN profiles
ON profiles.userid = bugs_activity.who
WHERE bugs_activity.bug_id = ?
WHERE bugs_activity.bug_id = ?
$when_restriction
$when_restriction
ORDER BY bugs_activity.bug_when"
,
{
Slice
=>
{}},
@args
);
ORDER BY bugs_activity.bug_when"
,
{
Slice
=>
{}},
@args
);
foreach
my
$diff
(
@$diffs
)
{
foreach
my
$diff
(
@$diffs
)
{
$user_cache
->
{
$diff
->
{
who
}}
||=
new
Bugzilla::
User
(
$diff
->
{
who
});
$diff
->
{
who
}
=
$user_cache
->
{
$diff
->
{
who
}};
if
(
$diff
->
{
attach_id
})
{
if
(
$diff
->
{
attach_id
})
{
$diff
->
{
isprivate
}
=
$dbh
->
selectrow_array
(
$diff
->
{
isprivate
}
=
$dbh
->
selectrow_array
(
'SELECT isprivate FROM attachments WHERE attach_id = ?'
,
'SELECT isprivate FROM attachments WHERE attach_id = ?'
,
...
...
Bugzilla/Template.pm
View file @
71320dae
...
@@ -348,8 +348,12 @@ sub get_bug_link {
...
@@ -348,8 +348,12 @@ sub get_bug_link {
}
}
# Prevent code injection in the title.
# Prevent code injection in the title.
$title
=
html_quote
(
clean_text
(
$title
));
$title
=
html_quote
(
clean_text
(
$title
));
my
$linkval
=
"show_bug.cgi?id="
.
$bug
->
id
;
my
$linkval
=
"show_bug.cgi?id="
.
$bug
->
id
;
if
(
$options
->
{
full_url
})
{
$linkval
=
correct_urlbase
()
.
$linkval
;
}
if
(
defined
$options
->
{
comment_num
})
{
if
(
defined
$options
->
{
comment_num
})
{
$linkval
.=
"#c"
.
$options
->
{
comment_num
};
$linkval
.=
"#c"
.
$options
->
{
comment_num
};
}
}
...
...
template/en/default/email/bugmail-common.txt.html
0 → 100644
View file @
71320dae
[%# 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 Guy Pyrzak
# Portions created by the Initial Developer are Copyright (C) 2010 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s): Guy Pyrzak
<guy
.
pyrzak
@
gmail
.
com
>
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% field_label = field_descs.${change.field_name} %]
[% old_value = display_value(change.field_name, change.old) %]
[% new_value = display_value(change.field_name, change.new) %]
[% IF change.field_name == "estimated_time" || change.field_name == "remaining_time" %]
[% old_value = old_value FILTER format('%.2f') %]
[% new_value = new_value FILTER format('%.2f') %]
[% END %]
[% IF change.attach_id %]
[% field_label = field_label.replace('^(Attachment )?', "Attachment #${change.attach_id} ") %]
[% END %]
[% IF change.field_name == 'longdescs.isprivate' %]
[% field_label = field_label.replace('^(Comment )?', "Comment #${change.num} ") %]
[% END %]
\ No newline at end of file
template/en/default/email/bugmail-header.txt.tmpl
0 → 100644
View file @
71320dae
[%# 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): André Batosti <batosti@async.com.br>
# Frédéric Buclin <LpSolit@gmail.com>
# Guy Pyrzak <guy.pyrzak@gmail.com>
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS "global/reason-descs.none.tmpl" %]
[% isnew = bug.lastdiffed ? 0 : 1 %]
From: [% Param('mailfrom') %]
To: [% to_user.email %]
Subject: [[% terms.Bug %] [%+ bug.id %]] [% 'New: ' IF isnew %][%+ bug.short_desc %]
Date: [% delta_ts || bug.delta_ts FILTER time("%a, %d %b %Y %T %z", to_user.timezone) %]
X-Bugzilla-Reason: [% reasonsheader %]
X-Bugzilla-Type: [% isnew ? 'new' : 'changed' %]
X-Bugzilla-Watch-Reason: [% reasonswatchheader %]
[% IF Param('useclassification') %]
X-Bugzilla-Classification: [% bug.classification %]
[% END %]
X-Bugzilla-Product: [% bug.product %]
X-Bugzilla-Component: [% bug.component %]
X-Bugzilla-Keywords: [% bug.keywords %]
X-Bugzilla-Severity: [% bug.bug_severity %]
X-Bugzilla-Who: [% changer.login %]
X-Bugzilla-Status: [% bug.bug_status %]
X-Bugzilla-Priority: [% bug.priority %]
X-Bugzilla-Assigned-To: [% bug.assigned_to.login %]
X-Bugzilla-Target-Milestone: [% bug.target_milestone %]
X-Bugzilla-Changed-Fields: [% changedfields.join(" ") %]
[%+ threadingmarker %]
template/en/default/email/bugmail.html.tmpl
0 → 100644
View file @
71320dae
[%# 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 Guy Pyrzak
# Portions created by the Initial Developer are Copyright (C) 2010 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s): Guy Pyrzak
<guy
.
pyrzak
@
gmail
.
com
>
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS "global/reason-descs.none.tmpl" %]
[% isnew = bug.lastdiffed ? 0 : 1 %]
<html>
<head>
<base
href=
"[% %]"
/>
</head>
<body>
[% PROCESS generate_diffs %]
<p>
[% FOREACH comment = new_comments.reverse %]
<div>
[% IF comment.count %]
<b>
[% "Comment # ${comment.count}" FILTER bug_link( bug,
{comment_num => comment.count, full_url => 1}) FILTER none %]
from [% INCLUDE global/user.html.tmpl who = comment.author %]
</b>
[% END %]
<pre>
[% comment.body_full({ wrap => 1 }) FILTER html %]
</pre>
</div>
[% END %]
</p>
<p>
<a
href=
"[% urlbase FILTER html %]userprefs.cgi?tab=email"
>
Configure [% terms.bug %]mail
</a>
</p>
<span>
You are receiving this mail because:
</span>
<ul>
[% FOREACH reason = reasons %]
[% IF reason_descs.$reason %]
<li>
[% reason_descs.$reason FILTER html %]
</li>
[% END %]
[% END %]
[% FOREACH reason = reasons_watch %]
[% IF watch_reason_descs.$reason %]
<li>
[% watch_reason_descs.$reason FILTER html %]
</li>
[% END %]
[% END %]
</ul>
</body>
</html>
[% BLOCK generate_diffs %]
[% "${terms.Bug} ${bug.id}" FILTER bug_link(bug, full_url => 1) FILTER none %]
[% last_changer = "" %]
<table
border=
"1"
cellspacing=
"0"
cellpadding=
"2"
>
[% FOREACH change = diffs %]
[% IF !isnew
&&
change.who.login != last_changer %]
[% last_changer = change.who.login %]
[% IF change.blocker %]
<tr>
<td
colspan=
"3"
>
[% "${terms.Bug} ${bug.id}" FILTER bug_link(bug, full_url => 1) FILTER none %] depends
on [% "${terms.bug} ${change.blocker.id}"
FILTER bug_link(change.blocker, full_url => 1) FILTER none %],
which changed state.
</td>
</tr>
[% ELSE %]
<tr>
<td
colspan=
"3"
>
[% INCLUDE global/user.html.tmpl who = change.who %]
changed:
</td>
</tr>
[% END %]
<tr>
<th>
What
</th>
<th>
Removed
</th>
<th>
Added
</th>
</tr>
[% END %]
[% PROCESS "email/bugmail-common.txt.html" %]
[% IF isnew %]
<tr>
<th>
[% field_label FILTER html %]
</th>
<td>
[% new_value FILTER html %]
</td>
</tr>
[% ELSE %]
<tr>
<td
style=
"text-align:right;"
>
[% field_label FILTER html %]
</td>
<td>
[% IF old_value %]
[% old_value FILTER html %]
[% ELSE %]
[% END%]
</td>
<td>
[% IF new_value %]
[% new_value FILTER html %]
[% ELSE %]
[% END%]
</td>
</tr>
[% END %]
[% END %]
</table>
[% END %]
\ No newline at end of file
template/en/default/email/
newchanged
mail.txt.tmpl
→
template/en/default/email/
bug
mail.txt.tmpl
View file @
71320dae
...
@@ -17,6 +17,7 @@
...
@@ -17,6 +17,7 @@
#
#
# Contributor(s): André Batosti <batosti@async.com.br>
# Contributor(s): André Batosti <batosti@async.com.br>
# Frédéric Buclin <LpSolit@gmail.com>
# Frédéric Buclin <LpSolit@gmail.com>
# Guy Pyrzak <guy.pyrzak@gmail.com>
#%]
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS "global/field-descs.none.tmpl" %]
...
@@ -24,28 +25,6 @@
...
@@ -24,28 +25,6 @@
[% isnew = bug.lastdiffed ? 0 : 1 %]
[% isnew = bug.lastdiffed ? 0 : 1 %]
From: [% Param('mailfrom') %]
To: [% to_user.email %]
Subject: [[% terms.Bug %] [%+ bug.id %]] [% 'New: ' IF isnew %][%+ bug.short_desc %]
Date: [% delta_ts || bug.delta_ts FILTER time("%a, %d %b %Y %T %z", to_user.timezone) %]
X-Bugzilla-Reason: [% reasonsheader %]
X-Bugzilla-Type: [% isnew ? 'new' : 'changed' %]
X-Bugzilla-Watch-Reason: [% reasonswatchheader %]
[% IF Param('useclassification') %]
X-Bugzilla-Classification: [% bug.classification %]
[% END %]
X-Bugzilla-Product: [% bug.product %]
X-Bugzilla-Component: [% bug.component %]
X-Bugzilla-Keywords: [% bug.keywords %]
X-Bugzilla-Severity: [% bug.bug_severity %]
X-Bugzilla-Who: [% changer.login %]
X-Bugzilla-Status: [% bug.bug_status %]
X-Bugzilla-Priority: [% bug.priority %]
X-Bugzilla-Assigned-To: [% bug.assigned_to.login %]
X-Bugzilla-Target-Milestone: [% bug.target_milestone %]
X-Bugzilla-Changed-Fields: [% changedfields.join(" ") %]
[%+ threadingmarker %]
[%+ PROCESS generate_diffs -%]
[%+ PROCESS generate_diffs -%]
[% FOREACH comment = new_comments %]
[% FOREACH comment = new_comments %]
...
@@ -74,42 +53,25 @@ Configure [% terms.bug %]mail: [% urlbase %]userprefs.cgi?tab=email
...
@@ -74,42 +53,25 @@ Configure [% terms.bug %]mail: [% urlbase %]userprefs.cgi?tab=email
[%+ last_changer = "" %]
[%+ last_changer = "" %]
[% FOREACH change = diffs %]
[% FOREACH change = diffs %]
[% IF !isnew && change.
login_name
!= last_changer %]
[% IF !isnew && change.
who.login
!= last_changer %]
[% last_changer = change.
login_name
%]
[% last_changer = change.
who.login
%]
[% IF change.blocker %]
[% IF change.blocker %]
[% terms.Bug %] [%+ bug.id %] depends on [% terms.bug %] [%+ change.blocker.id %], which changed state.
[% terms.Bug %] [%+ bug.id %] depends on [% terms.bug %] [%+ change.blocker.id %], which changed state.
[%+ terms.Bug %] [%+ change.blocker.id %] Summary: [% change.blocker.short_desc %]
[%+ terms.Bug %] [%+ change.blocker.id %] Summary: [% change.blocker.short_desc %]
[%+ urlbase %]show_bug.cgi?id=[% change.blocker.id %]
[%+ urlbase %]show_bug.cgi?id=[% change.blocker.id %]
[% ELSE %]
[% ELSE %]
[%~ IF change.
real
name %]
[%~ IF change.
who.
name %]
[% change.
realname _ " <" _ change.login_name
_ ">" %]
[% change.
who.name _ " <" _ change.who.login
_ ">" %]
[% ELSE %]
[% ELSE %]
[% change.
login_name
%]
[% change.
who.login
%]
[% END %] changed:
[% END %] changed:
[% END %]
[% END %]
What |Removed |Added
What |Removed |Added
----------------------------------------------------------------------------
----------------------------------------------------------------------------
[%+ END %][%# End of IF. This indentation is intentional! ~%]
[%+ END %][%# End of IF. This indentation is intentional! ~%]
[% PROCESS "email/bugmail-common.txt.html"%]
[% field_label = field_descs.${change.field_name} %]
[% old_value = display_value(change.field_name, change.old) %]
[% new_value = display_value(change.field_name, change.new) %]
[%~ IF change.field_name == "estimated_time" || change.field_name == "remaining_time" %]
[% old_value = old_value FILTER format('%.2f') %]
[% new_value = new_value FILTER format('%.2f') %]
[% END %]
[%~ IF change.attach_id %]
[% field_label = field_label.replace('^(Attachment )?', "Attachment #${change.attach_id} ") %]
[% END %]
[%~ IF change.field_name == 'longdescs.isprivate' %]
[% field_label = field_label.replace('^(Comment )?', "Comment #${change.num} ") %]
[% END %]
[%~ IF isnew %]
[%~ IF isnew %]
[% format_columns(2, field_label _ ":", new_value) -%]
[% format_columns(2, field_label _ ":", new_value) -%]
[% ELSE %]
[% ELSE %]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment