##// END OF EJS Templates
notifications: restyling email templates #4087
lisaq -
r508:dcd63aa2 default
parent child Browse files
Show More
@@ -3,15 +3,100 b''
3 ## headers we additionally can set for email
3 ## headers we additionally can set for email
4 <%def name="headers()" filter="n,trim"></%def>
4 <%def name="headers()" filter="n,trim"></%def>
5
5
6 ## plain text version of the email. Empty by default
6 <%def name="plaintext_footer()">
7 ${_('This is a notification from RhodeCode. %(instance_url)s') % {'instance_url': instance_url}}
8 </%def>
9
7 <%def name="body_plaintext()" filter="n,trim"></%def>
10 <%def name="body_plaintext()" filter="n,trim"></%def>
8
11
9 ${self.body()}
12 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
13 <html xmlns="http://www.w3.org/1999/xhtml">
14 <head>
15 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
16 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
17 <title>${self.subject()}</title>
18 <style type="text/css">
19 /* Based on The MailChimp Reset INLINE: Yes. */
20 #outlook a {padding:0;} /* Force Outlook to provide a "view in browser" menu link. */
21 body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0;}
22 /* Prevent Webkit and Windows Mobile platforms from changing default font sizes.*/
23 .ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */
24 .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;}
25 /* Forces Hotmail to display normal line spacing. More on that: http://www.emailonacid.com/forum/viewthread/43/ */
26 #backgroundTable {margin:0; padding:0; line-height: 100% !important;}
27 /* End reset */
10
28
29 /* defaults for images*/
30 img {outline:none; text-decoration:none; -ms-interpolation-mode: bicubic;}
31 a img {border:none;}
32 .image_fix {display:block;}
33
34 body {line-height:1.2em;}
35 p {margin: 0 0 20px;}
36 h1, h2, h3, h4, h5, h6 {color:#323232!important;}
37 a {color:#427cc9;text-decoration:none;outline:none;cursor:pointer;}
38 a:focus {outline:none;}
39 a:hover {color: #305b91;}
40 h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {color:#427cc9!important;text-decoration:none!important;}
41 h1 a:active, h2 a:active, h3 a:active, h4 a:active, h5 a:active, h6 a:active {color: #305b91!important;}
42 h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited {color: #305b91!important;}
43 table {font-size:13px;border-collapse:collapse;mso-table-lspace:0pt;mso-table-rspace:0pt;}
44 table td {padding:.65em 1em .65em 0;border-collapse:collapse;vertical-align:top;text-align:left;}
45 input {display:inline;border-radius:2px;border-style:solid;border: 1px solid #dbd9da;padding:.5em;}
46 input:focus {outline: 1px solid #979797}
47 @media only screen and (-webkit-min-device-pixel-ratio: 2) {
48 /* Put your iPhone 4g styles in here */
49 }
11
50
12 <div>
51 /* Android targeting */
13 --
52 @media only screen and (-webkit-device-pixel-ratio:.75){
14 <br/>
53 /* Put CSS for low density (ldpi) Android layouts in here */
15 <br/>
54 }
16 <b>${_('This is a notification from RhodeCode. %(instance_url)s') % {'instance_url': instance_url}}</b>
55 @media only screen and (-webkit-device-pixel-ratio:1){
17 </div>
56 /* Put CSS for medium density (mdpi) Android layouts in here */
57 }
58 @media only screen and (-webkit-device-pixel-ratio:1.5){
59 /* Put CSS for high density (hdpi) Android layouts in here */
60 }
61 /* end Android targeting */
62
63 </style>
64
65 <!-- Targeting Windows Mobile -->
66 <!--[if IEMobile 7]>
67 <style type="text/css">
68
69 </style>
70 <![endif]-->
71
72 <!--[if gte mso 9]>
73 <style>
74 /* Target Outlook 2007 and 2010 */
75 </style>
76 <![endif]-->
77 </head>
78 <body>
79 <!-- Wrapper/Container Table: Use a wrapper table to control the width and the background color consistently of your email. Use this approach instead of setting attributes on the body tag. -->
80 <table cellpadding="0" cellspacing="0" border="0" id="backgroundTable" align="left" style="margin:1%;width:97%;padding:0;font-family:sans-serif;font-weight:100;border:1px solid #dbd9da">
81 <tr>
82 <td valign="top" style="padding:0;">
83 <table cellpadding="0" cellspacing="0" border="0" align="left" width="100%">
84 <tr><td style="width:100%;padding:7px;background-color:#202020" valign="top">
85 <a style="width:100%;height:100%;display:block;color:#eeeeee;text-decoration:none;" href="${instance_url}">
86 ${_('RhodeCode')}
87 % if c.rhodecode_name:
88 - ${c.rhodecode_name}
89 % endif
90 </a>
91 </td></tr>
92 <tr><td style="padding:15px;" valign="top">${self.body()}</td></tr>
93 </table>
94 </td>
95 </tr>
96 </table>
97 <!-- End of wrapper table -->
98 <p><a style="margin-top:15px;margin-left:1%;font-family:sans-serif;font-weight:100;font-size:11px;display:block;color:#666666;text-decoration:none;" href="${instance_url}">
99 ${self.plaintext_footer()}
100 </a></p>
101 </body>
102 </html>
@@ -2,7 +2,7 b''
2 <%inherit file="base.mako"/>
2 <%inherit file="base.mako"/>
3
3
4 <%def name="subject()" filter="n,trim">
4 <%def name="subject()" filter="n,trim">
5 ${_('[mention]') if mention else ''} ${_('%(user)s commented on commit of %(repo_name)s') % {
5 ${_('[mention]') if mention else ''} ${_('%(user)s commented on a commit of %(repo_name)s') % {
6 'user': h.person(user),
6 'user': h.person(user),
7 'repo_name': repo_name
7 'repo_name': repo_name
8 } }
8 } }
@@ -28,30 +28,21 b''
28 ${_('Commit status was changed to')}: *${status_change}*
28 ${_('Commit status was changed to')}: *${status_change}*
29 %endif
29 %endif
30
30
31 ${self.plaintext_footer()}
31 </%def>
32 </%def>
32
33
33
34 <table style="text-align:left;vertical-align:middle;">
35 <tr><td colspan="2" style="width:100%;padding-bottom:15px;border-bottom:1px solid #dbd9da;"><h4><a href="${commit_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">
34 % if comment_file:
36 % if comment_file:
35 <h4>${_('%(user)s commented on a file in commit of %(repo_url)s.') % {'user': h.person(user), 'repo_url': commit_target_repo} |n}</h4>
37 ${_('%(user)s commented on %(comment_file)s on line %(comment_line)s</a> in the %(repo)s repository') % {'user': h.person(user), 'comment_file': comment_file, 'comment_line': comment_line, 'repo': commit_target_repo} |n}</h4>
36 % else:
38 % else:
37 <h4>${_('%(user)s commented on a commit of %(repo_url)s.') % {'user': h.person(user), 'repo_url': commit_target_repo} |n}</h4>
39 ${_('%(user)s commented on a commit</a> in the %(repo)s repository') % {'user': h.person(user), 'repo': commit_target_repo} |n}
38 % endif
40 % endif
39
41 </h4></td></tr>
40 <ul>
42 <tr><td style="padding-right:20px;padding-top:15px;">${_('Commit')}</td><td style="padding-top:15px;"><a href="${commit_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${h.show_id(commit)}</a></td></tr>
41 <li>${_('Comment link')}: <a href="${commit_comment_url}">${commit_comment_url}</a></li>
43 <tr><td style="padding-right:20px;">${_('Description')}</td><td>${h.urlify_commit_message(commit.message, repo_name)}</td></tr>
42 %if comment_file:
44 %if status_change:
43 <li>${_('File: %(comment_file)s on line %(comment_line)s') % {'comment_file': comment_file, 'comment_line': comment_line}}</li>
45 <tr><td style="padding-right:20px;">${_('Status')}<td/>${_('The commit status was changed to')} ${status_change}.</td></tr>
44 %endif
46 %endif
45 <li>${_('Commit')}: ${h.show_id(commit)}</li>
47 <tr><td style="padding-right:20px;">${_('Comment')}</td><td style="line-height:1.2em;">${h.render(comment_body, renderer=renderer_type, mentions=True)}</td></tr>
46 <li>
48 </table> No newline at end of file
47 ${_('Commit Description')}: <p>${h.urlify_commit_message(commit.message, repo_name)}</p>
48 </li>
49 </ul>
50
51 <hr>
52 <p>${h.render(comment_body, renderer=renderer_type, mentions=True)}</p>
53 <hr/>
54
55 %if status_change:
56 <p>${_('Commit status was changed to')}: <b>${status_change}</b></p>
57 %endif
@@ -11,6 +11,6 b''
11 </%def>
11 </%def>
12
12
13 ## BODY GOES BELOW
13 ## BODY GOES BELOW
14 <div style="white-space: pre-wrap">
14 <table style="text-align:left;vertical-align:top;">
15 ${body_plaintext()}
15 <tr><td style="padding-right:20px;padding-top:15px;white-space:pre-wrap">${body}</td></tr>
16 </div> No newline at end of file
16 </table> No newline at end of file
@@ -16,9 +16,16 b' There was a request to reset your passwo'
16 You can continue, and generate new password by clicking following URL:
16 You can continue, and generate new password by clicking following URL:
17 ${password_reset_url}
17 ${password_reset_url}
18
18
19 ${self.plaintext_footer()}
19 </%def>
20 </%def>
20
21
21 ## BODY GOES BELOW
22 ## BODY GOES BELOW
22 <div style="white-space: pre-wrap">
23 <p>
23 ${body_plaintext()}
24 Hello ${user.username},
24 </div> No newline at end of file
25 </p><p>
26 There was a request to reset your password using the email address ${email} on ${h.format_date(date)}
27 <br/>
28 <strong>If you did not request a password reset, please contact your RhodeCode administrator.</strong>
29 </p><p>
30 ${_('<a href="%(url)s">Generate new password here</a>.') % {'url': password_reset_url} |n}
31 </p> No newline at end of file
@@ -9,14 +9,22 b' Your new RhodeCode password'
9 <%def name="body_plaintext()" filter="n,trim">
9 <%def name="body_plaintext()" filter="n,trim">
10 Hi ${user.username},
10 Hi ${user.username},
11
11
12 Below is your new access password for RhodeCode.
12 There was a request to reset your password using the email address ${email} on ${h.format_date(date)}
13
14 *If you didn't do this, please contact your RhodeCode administrator.*
13
15
14 password: ${new_password}
16 You can continue, and generate new password by clicking following URL:
17 ${password_reset_url}
15
18
16 *If you didn't request a new password, please contact your RhodeCode administrator immediately.*
19 ${self.plaintext_footer()}
17 </%def>
20 </%def>
18
21
19 ## BODY GOES BELOW
22 ## BODY GOES BELOW
20 <div style="white-space: pre-wrap">
23 <p>
21 ${body_plaintext()}
24 Hello ${user.username},
22 </div> No newline at end of file
25 </p><p>
26 Below is your new access password for RhodeCode.
27 <br/>
28 <strong>If you didn't request a new password, please contact your RhodeCode administrator.</strong>
29 </p>
30 <p>password: <input value='${new_password}'></pre></p> No newline at end of file
@@ -2,11 +2,11 b''
2 <%inherit file="base.mako"/>
2 <%inherit file="base.mako"/>
3
3
4 <%def name="subject()" filter="n,trim">
4 <%def name="subject()" filter="n,trim">
5 ${_('[mention]') if mention else ''} ${_('%(user)s commented on pull request #%(pr_id)s: "%(pr_title)s"') % {
5 ${_('[mention]') if mention else ''} ${_('%(user)s commented on pull request #%(pr_id)s: "%(pr_title)s"') % {
6 'user': h.person(user),
6 'user': h.person(user),
7 'pr_title': pull_request.title,
7 'pr_title': pull_request.title,
8 'pr_id': pull_request.pull_request_id
8 'pr_id': pull_request.pull_request_id
9 } |n}
9 } |n}
10 </%def>
10 </%def>
11
11
12 <%def name="body_plaintext()" filter="n,trim">
12 <%def name="body_plaintext()" filter="n,trim">
@@ -31,36 +31,30 b''
31 ${_('Pull request was closed with status')}: *${status_change}*
31 ${_('Pull request was closed with status')}: *${status_change}*
32 %endif
32 %endif
33
33
34 ${self.plaintext_footer()}
34 </%def>
35 </%def>
35
36
37 <table style="text-align:left;vertical-align:middle;">
38 <tr><td colspan="2" style="width:100%;padding-bottom:15px;border-bottom:1px solid #dbd9da;"><h4><a href="${pr_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">
36 % if comment_file:
39 % if comment_file:
37 <h4>${_('%(user)s commented on a file on pull request #%(pr_id)s: "%(pr_title)s".') % {
40 ${_('%(user)s commented on %(comment_file)s on pull request #%(pr_id)s: "%(pr_title)s".') % {'user': h.person(user), 'comment_file': comment_file, 'pr_title': pull_request.title, 'pr_id': pull_request.pull_request_id} |n}
38 'user': h.person(user),
41 % elif status_change and not closing_pr:
39 'pr_title': pull_request.title,
42 ${_('%(user)s changed the status of pull request #%(pr_id)s "%(pr_title)s" to %(status)s.') % {'user': h.person(user),'pr_title': pull_request.title,'pr_id': pull_request.pull_request_id, 'status': status_change} |n}
40 'pr_id': pull_request.pull_request_id
43 %elif status_change and closing_pr:
41 } |n}</h4>
44 ${_('%(user)s closed pull request #%(pr_id)s "%(pr_title)s" with status %(status)s.') % {'user': h.person(user),'pr_title': pull_request.title,'pr_id': pull_request.pull_request_id, 'status': status_change} |n}
42 % else:
45 %else:
43 <h4>${_('%(user)s commented on a pull request #%(pr_id)s "%(pr_title)s".') % {
46 ${_('%(user)s commented in pull request #%(pr_id)s "%(pr_title)s".') % {'user': h.person(user),'pr_title': pull_request.title,'pr_id': pull_request.pull_request_id} |n}
44 'user': h.person(user),
45 'pr_title': pull_request.title,
46 'pr_id': pull_request.pull_request_id
47 } |n}</h4>
48 % endif
47 % endif
48 </a></h4></td></tr>
49 <tr><td style="padding-right:20px;padding-top:15px;">${_('Source')}</td><td style="padding-top:15px;"><a style="color:#427cc9;text-decoration:none;cursor:pointer" href="${pr_source_repo_url}">${pr_source_repo.repo_name}</a></td></tr>
50 % if comment_file:
51 <tr><td style="padding-right:20px;">${_('File')}</td><td>${_('%(comment_file)s on line %(comment_line)s') % {'comment_file': comment_file, 'comment_line': comment_line}}</td></tr>
52 %endif
53 %if status_change and not closing_pr:
54 <tr><td style="padding-right:20px;">${_('Status')}</td><td>${_('The commit status was changed to')} ${status_change}</td></tr>
55 %elif status_change and closing_pr:
56 <tr><td style="padding-right:20px;">${_('Status')}</td><td>${_('Pull request was closed with status')}: ${status_change}</td></tr>
57 %endif
58 <tr><td style="padding-right:20px;">${_('Comment')}</td><td style="line-height:1.2em;">${h.render(comment_body, renderer=renderer_type, mentions=True)}</td></tr>
59 </table>
49
60
50 <ul>
51 <li>${_('Comment link')}: <a href="${pr_comment_url}">${pr_comment_url}</a></li>
52 <li>${_('Source repository')}: <a href="${pr_source_repo_url}">${pr_source_repo.repo_name}</a></li>
53 %if comment_file:
54 <li>${_('File: %(comment_file)s on line %(comment_line)s') % {'comment_file': comment_file, 'comment_line': comment_line}}</li>
55 %endif
56 </ul>
57
58 <hr>
59 <p>${h.render(comment_body, renderer=renderer_type, mentions=True)}</p>
60 <hr/>
61
62 %if status_change and not closing_pr:
63 <p>${_('Pull request status was changed to')}: <b>${status_change}</b></p>
64 %elif status_change and closing_pr:
65 <p>${_('Pull request was closed with status')}: <b>${status_change}</b></p>
66 %endif
@@ -29,53 +29,33 b''
29
29
30 * ${_('Description')}:
30 * ${_('Description')}:
31
31
32 ${pull_request.description}
32 ${pull_request.description}
33
33
34
34
35 * ${ungettext('Commit (%(num)s)', 'Commits (%(num)s)', len(pull_request_commits) ) % {'num': len(pull_request_commits)}}:
35 * ${ungettext('Commit (%(num)s)', 'Commits (%(num)s)', len(pull_request_commits) ) % {'num': len(pull_request_commits)}}:
36
36
37 % for commit_id, message in pull_request_commits:
37 % for commit_id, message in pull_request_commits:
38 - ${h.short_id(commit_id)}
38 - ${h.short_id(commit_id)}
39 ${h.chop_at_smart(message, '\n', suffix_if_chopped='...')}
39
40
40 ${h.chop_at_smart(message, '\n', suffix_if_chopped='...')}
41 % endfor
41 % endfor
42
42
43 ${self.plaintext_footer()}
43 </%def>
44 </%def>
44
45
45
46 <table style="text-align:left;vertical-align:middle;">
46 <h4>
47 <tr><td colspan="2" style="width:100%;padding-bottom:15px;border-bottom:1px solid #dbd9da;"><h4><a href="${pull_request_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('%(user)s wants you to review pull request #%(pr_id)s: "%(pr_title)s".') % { 'user': h.person(user), 'pr_title': pull_request.title, 'pr_id': pull_request.pull_request_id } }</a></h4></td></tr>
47 ${_('%(user)s wants you to review pull request #%(pr_id)s: "%(pr_title)s".') % {
48 <tr><td style="padding-right:20px;padding-top:15px;">${_('Title')}</td><td style="padding-top:15px;">${pull_request.title}</td></tr>
48 'user': h.person(user),
49 <tr><td style="padding-right:20px;">${_('Source')}</td><td>${h.literal(_('<pre style="display:inline;border-radius:2px;color:#666666;font-size:12px;background-color:#f9f9f9;padding:.2em;border:1px solid #979797;">%(source_ref_name)s</pre> %(source_ref_type)s of %(source_repo_url)s') % {'source_ref_type': pull_request.source_ref_parts.type,'source_ref_name': pull_request.source_ref_parts.name,'source_repo_url': h.link_to(pull_request_source_repo.repo_name, pull_request_source_repo_url)})}</td></tr>
49 'pr_title': pull_request.title,
50 <tr><td style="padding-right:20px;">${_('Target')}</td><td>${h.literal(_('<pre style="display:inline;border-radius:2px;color:#666666;font-size:12px;background-color:#f9f9f9;padding:.2em;border:1px solid #979797;">%(target_ref_name)s</pre> %(target_ref_type)s of %(target_repo_url)s') % {'target_ref_type': pull_request.target_ref_parts.type,'target_ref_name': pull_request.target_ref_parts.name,'target_repo_url': h.link_to(pull_request_target_repo.repo_name, pull_request_target_repo_url)})}</td></tr>
50 'pr_id': pull_request.pull_request_id
51 <tr><td style="padding-right:20px;">${_('Description')}</td><td style="white-space:pre-wrap">${pull_request.description}</td></tr>
51 } }
52 <tr><td style="padding-right:20px;">${ungettext('%(num)s Commit', '%(num)s Commits', len(pull_request_commits)) % {'num': len(pull_request_commits)}}</td>
52 </h4>
53 <td><ol style="margin:0 0 0 1em;padding:0;text-align:left;">
53
54 % for commit_id, message in pull_request_commits:
54 <p>${h.literal(_('Pull request from %(source_ref_type)s:%(source_ref_name)s of %(repo_url)s into %(target_ref_type)s:%(target_ref_name)s') % {
55 <li style="margin:0 0 1em;"><pre style="margin:0 0 .5em">${h.short_id(commit_id)}</pre>
55 'source_ref_type': pull_request.source_ref_parts.type,
56 ${h.chop_at_smart(message, '\n', suffix_if_chopped='...')}
56 'source_ref_name': pull_request.source_ref_parts.name,
57 </li>
57 'target_ref_type': pull_request.target_ref_parts.type,
58 % endfor
58 'target_ref_name': pull_request.target_ref_parts.name,
59 </ol></td>
59 'repo_url': h.link_to(pull_request_source_repo.repo_name, pull_request_source_repo_url)
60 </tr>
60 })}
61 </table>
61 </p>
62
63 <p>${_('Link')}: ${h.link_to(pull_request_url, pull_request_url)}</p>
64
65 <p><strong>${_('Title')}</strong>: ${pull_request.title}</p>
66 <p>
67 <strong>${_('Description')}:</strong><br/>
68 <span style="white-space: pre-wrap;">${pull_request.description}</span>
69 </p>
70
71 <p>
72 <strong>${ungettext('Commit (%(num)s)', 'Commits (%(num)s)', len(pull_request_commits) ) % {'num': len(pull_request_commits)}}</strong>:
73 <ol>
74 % for commit_id, message in pull_request_commits:
75 <li>
76 <pre>${h.short_id(commit_id)}</pre>
77 ${h.chop_at_smart(message, '\n', suffix_if_chopped='...')}
78 </li>
79 % endfor
80 </ol>
81 </p>
@@ -2,10 +2,9 b''
2 <%inherit file="base.mako"/>
2 <%inherit file="base.mako"/>
3
3
4 <%def name="subject()" filter="n,trim">
4 <%def name="subject()" filter="n,trim">
5 RhodeCode new user registration
5 RhodeCode new user registration: ${user.username}
6 </%def>
6 </%def>
7
7
8 ## plain text version of the email. Empty by default
9 <%def name="body_plaintext()" filter="n,trim">
8 <%def name="body_plaintext()" filter="n,trim">
10
9
11 A new user `${user.username}` has registered on ${h.format_date(date)}
10 A new user `${user.username}` has registered on ${h.format_date(date)}
@@ -14,9 +13,15 b' A new user `${user.username}` has regist'
14 - Full Name: ${user.firstname} ${user.lastname}
13 - Full Name: ${user.firstname} ${user.lastname}
15 - Email: ${user.email}
14 - Email: ${user.email}
16 - Profile link: ${h.url('user_profile', username=user.username, qualified=True)}
15 - Profile link: ${h.url('user_profile', username=user.username, qualified=True)}
16
17 ${self.plaintext_footer()}
17 </%def>
18 </%def>
18
19
19 ## BODY GOES BELOW
20 ## BODY GOES BELOW
20 <div style="white-space: pre-wrap">
21 <table style="text-align:left;vertical-align:middle;">
21 ${body_plaintext()}
22 <tr><td colspan="2" style="width:100%;padding-bottom:15px;border-bottom:1px solid #dbd9da;"><h4><a href="${h.url('user_profile', username=user.username, qualified=True)}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('New user %(user)s has registered on %(date)s') % {'user': user.username, 'date': h.format_date(date)}}</h4></td></tr>
22 </div>
23 <tr><td style="padding-right:20px;padding-top:20px;">${_('Username')}</td><td style="line-height:1;padding-top:20px;"><img style="margin-bottom:-5px;text-align:left;border:1px solid #dbd9da" src="${h.gravatar_url(user.email, 16)}" height="16" width="16">&nbsp;${user.username}</td></tr>
24 <tr><td style="padding-right:20px;">${_('Full Name')}</td><td>${user.firstname} ${user.lastname}</td></tr>
25 <tr><td style="padding-right:20px;">${_('Email')}</td><td>${user.email}</td></tr>
26 <tr><td style="padding-right:20px;">${_('Profile')}</td><td><a href="${h.url('user_profile', username=user.username, qualified=True)}">${h.url('user_profile', username=user.username, qualified=True)}</a></td></tr>
27 </table> No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now