From: <av...@us...> - 2006-04-18 12:20:45
|
Revision: 2918 Author: aveitch Date: 2006-04-18 05:20:27 -0700 (Tue, 18 Apr 2006) ViewCVS: http://svn.sourceforge.net/mailmanager/?rev=2918&view=rev Log Message: ----------- Merged in Richard Cross's UI changes. Modified Paths: -------------- MailManager/branches/RELENG_2_1/www/AccountSettings.zpt MailManager/branches/RELENG_2_1/www/CustomerSettings.zpt MailManager/branches/RELENG_2_1/www/FilterSettings.zpt MailManager/branches/RELENG_2_1/www/GroupSettings.zpt MailManager/branches/RELENG_2_1/www/OptionSettings.zpt MailManager/branches/RELENG_2_1/www/QueueSettings.zpt MailManager/branches/RELENG_2_1/www/SystemSettings.zpt MailManager/branches/RELENG_2_1/www/UserSettings.zpt MailManager/branches/RELENG_2_1/www/index_html.zpt MailManager/branches/RELENG_2_1/www/master.zpt MailManager/branches/RELENG_2_1/www/master_style_css.dtml Modified: MailManager/branches/RELENG_2_1/www/AccountSettings.zpt =================================================================== --- MailManager/branches/RELENG_2_1/www/AccountSettings.zpt 2006-04-18 12:20:05 UTC (rev 2917) +++ MailManager/branches/RELENG_2_1/www/AccountSettings.zpt 2006-04-18 12:20:27 UTC (rev 2918) @@ -68,7 +68,7 @@ <strong tal:content="acc/email">te...@ex...</strong> </td> - <td tal:content="python:here.account(email=acc.email)[0].getAssignmentText()"> + <td tal:content="python:here.account(email=acc.email)[0].getAssignmentText()" nowrap="nowrap"> username/groupname/queuename </td> @@ -78,13 +78,13 @@ </td> <!-- if section == 'list' --> - <td tal:condition="python:section == 'list'"> - <a tal:attributes="href string:editAccountForm?email=${acc/email}" i18n:translate="edit" class="state edit">Edit</a> + <td tal:condition="python:section == 'list'" style="text-align:center"> + <span class="state edit"><a tal:attributes="href string:editAccountForm?email=${acc/email}" i18n:translate="edit">Edit</a></span> </td> <!-- if section == 'remove' --> - <td tal:condition="python:section == 'remove'"> - <a tal:attributes="href string:delAccount?account_id=${acc/email}" i18n:translate="delete" class="state delete">Delete</a> + <td tal:condition="python:section == 'remove'" style="text-align:center"> + <span class="state delete"><a tal:attributes="href string:delAccount?account_id=${acc/email}" i18n:translate="delete" >Delete</a></span> </td> </tr> </tbody> @@ -93,122 +93,204 @@ There are no accounts set up on the system. </p> </div> - <!-- end if section in ('list', 'remove') --> + <!-- end if section in ('list', 'remove') --> - <!-- if section in ('add', 'edit') --> - <form accept-charset="utf-8" class="blockform" action="addOrEditAccount" method="post" tal:condition="python:section in ('add', 'edit')"> - <span tal:define="account python:here.account(email=email)[0]"> - <h2 i18n:translate="add_new_account" tal:condition="python:section == 'add'">Add New Account</h2> - <h2 i18n:translate="edit_account" tal:condition="python:section == 'edit'">Edit Account</h2> - <p> + <!-- if section in ('add', 'edit') --> + <form accept-charset="utf-8" class="blockform" action="addOrEditAccount" method="post" tal:condition="python:section in ('add', 'edit')"> + <h2 i18n:translate="add_new_account" tal:condition="python:section == 'add'">Add New Account</h2> + <h2 i18n:translate="edit_account" tal:condition="python:section == 'edit'">Edit Account</h2> + + <!-- ADD & EDIT --> + <table border="0" cellpadding="0" cellspacing="0"> + <tr> + <td> <label for="email" tal:attributes="class python:test(options.has_key('flag_account_id'), 'error', None)" i18n:translate="email_address">Email Address</label> - <span tal:condition="python:section == 'add'" tal:omit-tag=""> - <input id="email" name="email" size="30" tal:attributes="tabindex tabindex/next; value email" /> - </span> - <span tal:condition="python:section == 'edit'" tal:omit-tag=""> - <input name="email" size="30" tal:attributes="tabindex tabindex/next; value email" type="hidden" /> - <span tal:replace="email">te...@ex...</span> - </span> - </p> - <p> + </td> + + <td tal:condition="python:section == 'add'"> + <input id="email" name="email" size="30" tal:attributes="tabindex tabindex/next; value email" /> + </td> + <td tal:condition="python:section == 'edit'"> + <input name="email" size="30" tal:attributes="tabindex tabindex/next; value email" type="hidden" /> + <span tal:replace="email">te...@ex...</span> + </td> + </tr> + + <tr> + <td> <label for="assign_user" tal:attributes="class python:test(options.has_key('flag_assign'), 'error', None)" i18n:translate="assign_to">Assign to User</label> + </td> + <td> <select tal:attributes="tabindex tabindex/next" id="assign_user" name="assign_user"> <option value="" i18n:translate="none">None</option> <option tal:repeat="user here/listUsers" tal:attributes="value user/username; selected python:test(assign_user == user.username, 'selected', None)" tal:content="user/username">Administrator</option> </select> - </p> - <p> + </td> + </tr> + + <tr> + <td> <label for="assign_group" tal:attributes="class python:test(options.has_key('flag_assign_group'), 'error', None)" i18n:translate="or_group">or Group</label> + </td> + + <td> <select tal:attributes="tabindex tabindex/next" id="assign_group" name="assign_group"> <option value="" i18n:translate="none">None</option> <option tal:repeat="grp here/sql/listGroups" tal:attributes="value grp/group_name; selected python:test(assign_group == grp.group_name, 1, None)" tal:content="grp/group_name">Sales team</option> </select> - </p> - <p> + </td> + </tr> + + <tr> + <td> <label for="assign_queue" tal:attributes="class python:test(options.has_key('flag_assign_queue'), 'error', None)" i18n:translate="or_queue">or Queue</label> + </td> + + <td> <select tal:attributes="tabindex tabindex/next" id="assign_queue" name="assign_queue"> <option value="" i18n:translate="none">None</option> <option tal:repeat="que here/sql/listQueues" tal:attributes="value que/queue_name; selected python:test(assign_queue == que.queue_name, 'selected', None)" tal:content="que/queue_name">Support Queue</option> </select> - </p> + </td> + </tr> - <!-- Give notification option if assigned to either a user or a queue --> - <p> + <tr> + <td> + <!-- Give notification option if assigned to either a user or a queue --> <label i18n:translate="notification">Notification</label> - <span class="indentedonform"> - <input tal:attributes="tabindex tabindex/next; - checked python:test(notify_user, 'checked', None)" - id="notify_user" name="notify_user" type="checkbox" /> - <label for="notify_user" tal:attributes="class python:test(options.has_key('flag_notify_user'), 'error', None)" i18n:translate="notify_assigned">Notify assigned user by email when new messages arrive</label><br /> + </td> - <input tal:attributes="tabindex tabindex/next; - checked python:test(notify_group, 'checked', None)" - id="notify_group" name="notify_group" type="checkbox" /> - <label for="notify_group" tal:attributes="class python:test(options.has_key('flag_notify_group'), 'error', None)" i18n:translate="notify_group">Notify other group members when new messages arrive</label><br /> - </span> - </p> + <td nowrap="nowrap"> + <input tal:attributes="tabindex tabindex/next; + checked python:test(notify_user, 'checked', None)" + id="notify_user" name="notify_user" type="checkbox" /> + <span for="notify_user" tal:attributes="class python:test(options.has_key('flag_notify_user'), 'error', None)" i18n:translate="notify_assigned">Notify assigned user by email when new messages arrive</span><br /><br /> - <h2 i18n:translate="mail_source">Mail Source</h2> + <input tal:attributes="tabindex tabindex/next; + checked python:test(notify_group, 'checked', None)" + id="notify_group" name="notify_group" type="checkbox" /> + <span for="notify_group" tal:attributes="class python:test(options.has_key('flag_notify_group'), 'error', None)" i18n:translate="notify_group">Notify other group members when new messages arrive</span><br /> + </td> + </tr> + </table> + <br /> - <p><label for="routing#1" i18n:translate="routing_1" - tal:attributes="class python:test(options.has_key('flag_get_from_server'), 'error', None)"> - Routing #1 + + <!-- MAIL SOURCE --> + + <h2 i18n:translate="mail_source">Mail Source</h2> + <table border="0" cellpadding="0" cellspacing="0"> + <tr> + <td> + <label for="mail_forwarded" i18n:translate="routing_1" + tal:attributes="class python:test(options.has_key('flag_get_from_server'), 'error', None)"> + Routing #1 </label> + </td> + + <td> <input type="radio" name="routing" id="mail_forwarded" value="forwarded" tal:attributes="tabindex tabindex/next; checked python:test(routing == 'forwarded', 'checked', None)" /> - <strong i18n:translate="mail_forwarded"> - Incoming mail forwarded to Account - </strong> - </p> + <span i18n:translate="mail_forwarded"> + Incoming mail forwarded to Account + </span> + </td> + </tr> - <p><label for="routing#2" i18n:translate="routing_2" - tal:attributes="class python:test(options.has_key('flag_get_from_server'), 'error', None)"> - Routing #2 + <tr> + <td> + <label for="get_from_server" i18n:translate="routing_2" + tal:attributes="class python:test(options.has_key('flag_get_from_server'), 'error', None)"> + Routing #2 </label> + </td> + + <td> <input type="radio" name="routing" id="get_from_server" value="get" tal:attributes="tabindex tabindex/next; checked python:test(routing == 'get', 'checked', None)" /> - <strong i18n:translate="get_from_server"> - Get from server (fill in details below) - </strong> - </p> - <p> + <span i18n:translate="get_from_server"> + Get from server (fill in details below) + </span> + </td> + </tr> + + <tr> + <td> <label for="mail_server" tal:attributes="class python:test(options.has_key('flag_mail_server'), 'error', None)" i18n:translate="mail_server">Mail Server</label> + </td> + + <td> <input id="mail_server" name="mail_server" size="30" tal:attributes="tabindex tabindex/next; value mail_server" /> - </p> - <p> + </td> + </tr> + + <tr> + <td> <label for="mail_username" tal:attributes="class python:test(options.has_key('flag_mail_username'), 'error', None)" i18n:translate="username">Username</label> + </td> + + <td> <input id="mail_username" name="mail_username" size="30" tal:attributes="tabindex tabindex/next; value mail_username" /> - </p> - <p> + </td> + </tr> + + <tr> + <td> <label for="mail_password" tal:attributes="class python:test(options.has_key('flag_mail_password'), 'error', None)" i18n:translate="password">Password</label> + </td> + + <td> <input id="mail_password" name="mail_password" size="30" type="password" tal:attributes="tabindex tabindex/next; value mail_password" /> - </p> - <p> + </td> + </tr> + + <tr> + <td> <label for="server_type" tal:attributes="class python:test(options.has_key('flag_server_type'), 'error', None)" i18n:translate="server_type">Server Type</label> + </td> + + <td> <select tal:attributes="tabindex tabindex/next" id="server_type" name="server_type"> <option tal:attributes="selected python:test(server_type == 'POP3', 'selected', None)" value="POP3">POP3</option> <option tal:attributes="selected python:test(server_type == 'IMAP', 'selected', None)" value="IMAP">IMAP</option> <option tal:attributes="selected python:test(server_type == 'POP3 SSL', 'selected', None)" tal:condition="here/checkPOP3SSL" value="POP3 SSL">POP3 SSL</option> <option tal:attributes="selected python:test(server_type == 'IMAP SSL', 'selected', None)" value="IMAP SSL">IMAP SSL</option> </select> - </p> + </td> + </tr> + </table> + <br /> - <h2 i18n:translate="options">Options</h2> - <p> + + <!-- OPTIONS --> + + <h2 i18n:translate="options">Options</h2> + + <table border="0" cellpadding="0" cellspacing="0"> + <tr> + <td colspan="2"> <span metal:use-macro="container/macros/macros/default_priority"> Default Priority </span> - </p> - <p> + </td> + </tr> + + <tr> + <td colspan="2"> <span metal:use-macro="container/macros/macros/default_template"> Default Template </span> - </p> + </td> + </tr> - <p tal:define="current_categories python:(default_category0, default_category1, default_category2)" - tal:repeat="cat python:here.sql.listCategories(sqv_enabled=here.sql_truevar)"> + <tr tal:define="current_categories python:(default_category0, default_category1, default_category2)" + tal:repeat="cat python:here.sql.listCategories(sqv_enabled=here.sql_truevar)"> + <td> <label tal:attributes="for string:default_category${cat/id}" tal:content="cat/label">Category</label> + </td> + + <td> <select tal:attributes="tabindex tabindex/next; name string:default_category${cat/id}; id string:default_category${cat/id}"> @@ -216,57 +298,84 @@ tal:attributes="selected python:test(item.choice == current_categories[cat.id], 'selected', None)" tal:content="item/choice">Sales lead</option> </select> - </p> + </td> + </tr> - <p> + <tr> + <td> <label for="response_target" i18n:translate="response_target">Response Target</label> - <select tal:attributes="tabindex tabindex/next" id="respose_target" name="response_target"> + </td> + + <td> + <select tal:attributes="tabindex tabindex/next" id="response_target" name="response_target"> <option tal:repeat="seconds here/listResponseTimes" tal:attributes="value seconds; selected python:test(seconds == response_target, 'selected', None)" tal:content="python:here.formatTargetEn(seconds)">3 days</option> </select> - </p> + </td> + </tr> - <p> + <tr> + <td> <label for="auto_reply" tal:attributes="class python:test(options.has_key('flag_auto_reply'), 'error', None)" i18n:translate="auto_reply">Auto Reply</label> + </td> + + <td> <input type="checkbox" id="auto_reply" name="auto_reply" value="checked" tal:attributes="tabindex tabindex/next; checked python:test(auto_reply, 'checked', None)" /> - </p> - <p> + </td> + </tr> + + <tr> + <td> <label for="reply_text" tal:attributes="class python:test(options.has_key('flag_reply_text'), 'error', None)" i18n:translate="auto_reply_text">Text for Auto Reply</label> - <textarea tal:attributes="tabindex tabindex/next" id="reply_text" name="reply_text" rows="6" cols="60" tal:content="reply_text | default">Thank you for your mail. It has been allocated ticket number %T. Please quote this number if you get in touch with us. + </td> - Best regards + <td> + <textarea tal:attributes="tabindex tabindex/next" id="reply_text" name="reply_text" rows="6" cols="50" tal:content="reply_text | default">Thank you for your mail. It has been allocated ticket number %T. Please quote this number if you get in touch with us. - Customer Service Team</textarea> - </p> - <p class="indentedonform" i18n:translate="auto_reply_info"> - (%T will be replaced by the ticket number) - </p> - <p class="indentedonform"> +Best regards + +Customer Service Team</textarea> + + <p i18n:translate="auto_reply_info"> + (%T will be replaced by the ticket number) + </p> + <input type="checkbox" id="html_reply" name="html_reply" value="checked" tal:attributes="tabindex tabindex/next; checked python:test(html_reply, 'checked', None)" /> - <strong tal:attributes="class python:test(options.has_key('flag_html_reply'), 'error', None)" i18n:translate="allow_html_tags_in_auto_reply">Allow HTML tags in auto reply</strong> - </p> - <p class="indentedonform"> + <span tal:attributes="class python:test(options.has_key('flag_html_reply'), 'error', None)" i18n:translate="allow_html_tags_in_auto_reply">Allow HTML tags in auto reply</span><br /> + <input type="checkbox" id="use_signature" name="signature" value="checked" tal:attributes="tabindex tabindex/next; checked python:test(signature, 'checked', None)" /> - <strong tal:attributes="class python:test(options.has_key('flag_use_signature'), 'error', None)" i18n:translate="use_signature_label">Use Signature</strong> - </p> - <p> + <span tal:attributes="class python:test(options.has_key('flag_use_signature'), 'error', None)" i18n:translate="use_signature_label">Use Signature</span> + </td> + </tr> + + <tr> + <td> <label for="signature_text" tal:attributes="class python:test(options.has_key('flag_signature_text'), 'error', None)" i18n:translate="signature_text">Signature Text</label> - <textarea tal:attributes="tabindex tabindex/next" tal:content="signature_text" id="signature_text" name="signature_text" rows="6" cols="60">Some signature text.</textarea> - </p> - <p class="indentedonform"> - <input type="checkbox" id="html_signature" name="html_signature" value="checked" tal:attributes="tabindex tabindex/next; checked python:test(html_signature, 'checked', None)" /> - <strong tal:attributes="class python:test(options.has_key('flag_html_signature'), 'error', None)" i18n:translate="allow_html">Allow HTML tags in signature</strong> - </p> - <p style="text-align:center;"> + </td> + + <td> + <textarea tal:attributes="tabindex tabindex/next" tal:content="signature_text" id="signature_text" name="signature_text" rows="6" cols="50">Some signature text.</textarea> + + <p><input type="checkbox" id="html_signature" name="html_signature" value="checked" tal:attributes="tabindex tabindex/next; checked python:test(html_signature, 'checked', None)" /> + <span tal:attributes="class python:test(options.has_key('flag_html_signature'), 'error', None)" i18n:translate="allow_html">Allow HTML tags in signature</span></p> + </td> + </tr> + + <tr> + <td> </td> + + <td> <input type="hidden" name="section" tal:attributes="tabindex tabindex/next; value section" /> <input tal:attributes="tabindex tabindex/next" value="Save" i18n:attributes="value" type="submit" /> - </p> - </span> - </form> - <!-- end if section in ('add', 'edit') --> + </td> + </tr> + </table> + </form> + <!-- end if section in ('add', 'edit') --> + </div> <!-- end main_content slot --> Modified: MailManager/branches/RELENG_2_1/www/CustomerSettings.zpt =================================================================== --- MailManager/branches/RELENG_2_1/www/CustomerSettings.zpt 2006-04-18 12:20:05 UTC (rev 2917) +++ MailManager/branches/RELENG_2_1/www/CustomerSettings.zpt 2006-04-18 12:20:27 UTC (rev 2918) @@ -19,8 +19,8 @@ <div class="box"> <h2>Options</h2> <ul> - <li tal:attributes="class python:section in ('list', 'edit') and 'current' or 'not-current'" ><a href="CustomerSettings?section=list" i18n:translate="list_customers">List Customers</a></li> - <li tal:attributes="class python:section == 'add' and 'current' or 'not-current'" ><a href="CustomerSettings?section=add" i18n:translate="add_new_customer">Add New Customer</a></li> + <li tal:attributes="class python:section in ('list', 'edit') and 'current' or 'not-current'"><a href="CustomerSettings?section=list" i18n:translate="list_customers">List Customers</a></li> + <li tal:attributes="class python:section == 'add' and 'current' or 'not-current'"><a href="CustomerSettings?section=add" i18n:translate="add_new_customer">Add New Customer</a></li> <li tal:attributes="class python:section in ('remove', 'delete') and 'current' or 'not-current'"><a href="CustomerSettings?section=remove" i18n:translate="remove_customer">Remove Customer</a></li> </ul> </div> @@ -43,10 +43,10 @@ </td> <td tal:content="item/username">Username</td> <td tal:condition="python:section == 'list'"> - <a class="state edit" tal:attributes="href string:CustomerSettings?section=edit&username=${item/username}" i18n:translate="edit">Edit</a> + <span class="state edit"><a tal:attributes="href string:CustomerSettings?section=edit&username=${item/username}" i18n:translate="edit">Edit</a></span> </td> <td tal:condition="python:section == 'remove'"> - <a class="state delete" tal:attributes="href string:delCustomer?username=${item/username}" i18n:translate="delete">Delete</a> + <span class="state delete" ><a tal:attributes="href string:delCustomer?username=${item/username}" i18n:translate="delete">Delete</a></span> </td> </tr> </tbody> @@ -59,40 +59,69 @@ <form accept-charset="utf-8" class="blockform" action="addOrEditCustomer" method="post" tal:condition="python:section in ('add', 'edit')" tal:define="person python:test(section=='edit' and not request.has_key('error'), here.getCustomer(username=request.get('username')), request)"> <h2 tal:condition="python:section == 'add'" i18n:translate="add_new_customer">Add New Customer</h2> <h2 tal:condition="python:section == 'edit'" i18n:translate="edit_customer">Edit Customer</h2> - <p> - <label for="real_name" i18n:translate="full_name_label">Full Name</label> - <input name="real_name" id="real_name" size="30" tal:attributes="tabindex tabindex/next; value person/real_name | nothing" /> - </p> - <p> - <label for="username" i18n:translate="username">Username</label> - <span tal:condition="python:section == 'add'" tal:omit-tag=""> - <input id="username" name="username" size="12" maxlength="12" tal:attributes="tabindex tabindex/next; value request/username | nothing" /> - </span> - <span tal:condition="python:section == 'edit'" tal:omit-tag=""> - <input name="username" type="hidden" tal:attributes="tabindex tabindex/next; value request/username" /> - <span tal:replace="request/username" tal:omit-tag="">admin</span> - </span><span tal:omit-tag="" i18n:translate="max_12_chars">(max 12 characters)</span> - </p> - <p> - <label for="password" i18n:translate="password">Password</label> - <input id="password" name="password" type="password" size="12" maxlength="12" tal:attributes="tabindex tabindex/next; value python:test(section=='edit', 'password', None)" /> - </p> - <p> - <label for="confirm" i18n:translate="confirm_password">Confirm Password</label> - <input id="confirm" name="confirm" type="password" size="12" maxlength="12" tal:attributes="tabindex tabindex/next; value python:test(section == 'edit', 'pconfirm', None)" /> - </p> - <p> - <label for="access:lines" i18n:translate="access_tickets">Access Tickets</label> - <span class="indentedonform"> - <textarea tal:attributes="tabindex tabindex/next" tal:define="access python:here.sql.getCustomerAddresses(sqv_username=request.get('username'))" tal:content="python:'\n'.join([x.access_email for x in access])" id="access:lines" name="access:lines" rows="4" cols="40"> - </textarea><br /> - Customer will only be able to view tickets which have been sent from the above email addresses. Please enter one per line. - </span> - </p> - <p> - <input type="hidden" name="section" tal:attributes="tabindex tabindex/next; value section" /> - <input tal:attributes="tabindex tabindex/next" value="Save" i18n:attributes="value" type="submit" /> - </p> + + <table border="0" cellpadding="0" cellspacing="0"> + <tr> + <td> + <label for="real_name" i18n:translate="full_name_label">Full Name</label> + </td> + <td> + <input name="real_name" id="real_name" size="30" tal:attributes="tabindex tabindex/next; value person/real_name | nothing" /> + </td> + </tr> + + <tr> + <td> + <label for="username" i18n:translate="username">Username</label> + </td> + <td tal:condition="python:section == 'add'"> + <input id="username" name="username" size="12" maxlength="12" tal:attributes="tabindex tabindex/next; value request/username | nothing" /> + <span tal:omit-tag="" i18n:translate="max_12_chars">(max 12 characters)</span> + </td> + <td tal:condition="python:section == 'edit'"> + <input name="username" type="hidden" tal:attributes="tabindex tabindex/next; value request/username" /> + <span tal:replace="request/username">admin</span> + </td> + </tr> + + <tr> + <td> + <label for="password" i18n:translate="password">Password</label> + </td> + <td> + <input id="password" name="password" type="password" size="12" maxlength="12" tal:attributes="tabindex tabindex/next; value python:test(section=='edit', 'password', None)" /> + </td> + </tr> + + <tr> + <td> + <label for="confirm" i18n:translate="confirm_password">Confirm Password</label> + </td> + <td> + <input id="confirm" name="confirm" type="password" size="12" maxlength="12" tal:attributes="tabindex tabindex/next; value python:test(section == 'edit', 'pconfirm', None)" /> + </td> + </tr> + + <tr> + <td> + <label for="access:lines" i18n:translate="access_tickets">Access Tickets</label> + </td> + + <td> + <textarea tal:attributes="tabindex tabindex/next" tal:define="access python:here.sql.getCustomerAddresses(sqv_username=request.get('username'))" tal:content="python:'\n'.join([x.access_email for x in access])" id="access:lines" name="access:lines" rows="4" cols="40"></textarea><br /> + Customer will only be able to view tickets which have been sent from the above email addresses. Please enter one per line. + </td> + </tr> + + <tr> + <td> </td> + <td> + <input type="hidden" name="section" tal:attributes="tabindex tabindex/next; value section" /> + <input tal:attributes="tabindex tabindex/next" value="Save" i18n:attributes="value" type="submit" /> + </td> + </tr> + </table> + </form> <!-- end if section in ('add', 'edit') --> </div> Modified: MailManager/branches/RELENG_2_1/www/FilterSettings.zpt =================================================================== --- MailManager/branches/RELENG_2_1/www/FilterSettings.zpt 2006-04-18 12:20:05 UTC (rev 2917) +++ MailManager/branches/RELENG_2_1/www/FilterSettings.zpt 2006-04-18 12:20:27 UTC (rev 2918) @@ -34,18 +34,17 @@ <div tal:condition="python:section == 'list'"> <table class="settings" summary="Filter list" i18n:attributes="summary filter_list;"> <thead> - <tr> - <th i18n:translate="active_filters">Active Filters</th> - <th i18n:translate="action">Action</th> - </tr> + <tr> + <th i18n:translate="active_filters">Active Filters</th> + <th i18n:translate="action" style="text-align:center; width:70px">Action</th> + </tr> </thead> <tbody> - <!-- For each filter --> + <!-- For each filter --> <tr tal:repeat="item here/sql/listFilters" tal:attributes="class python:test(repeat['item'].odd(),'odd','even')"> <td> <p> <strong i18n:translate="if">If</strong> - "<span tal:replace="item/header_name">To</span>" <strong tal:content="item/header_operator" i18n:translate="is">Is</strong> "<span tal:replace="item/header_value">Text</span>" @@ -84,8 +83,8 @@ </li> </ul> </td> - <td> - <a tal:attributes="href string:deleteFilter?id:int=${item/id}" i18n:translate="delete" class="state delete">Delete</a> + <td style="text-align:center"> + <span class="state delete"><a tal:attributes="href string:deleteFilter?id:int=${item/id}" i18n:translate="delete">Delete</a></span> </td> </tr> <!-- End for each filter --> @@ -100,75 +99,123 @@ <!-- Add section --> <form accept-charset="utf-8" class="blockform" action="addFilter" method="post" tal:condition="python:section == 'add'"> <h2 i18n:translate="add_filter">Add Filter</h2> - <p> - <label for="header_name" tal:attributes="class python:test(request.has_key('flag_header_name'), 'error', None)" i18n:translate="if">If</label> - <select tal:attributes="tabindex tabindex/next" id="header_name" name="header_name"> - <option tal:repeat="item here/filter_headers" tal:attributes="value item/lower" tal:content="item">To</option> - <option value="any header" i18n:translate="any_header">Any Header</option> - <option value="body" i18n:translate="message_body">Message Body</option> - </select> - <select tal:attributes="tabindex tabindex/next" name="header_operator"> - <option i18n:translate="exactly_matches">exactly matches</option> - <option i18n:translate="contains">contains</option> - </select> - <input tal:attributes="tabindex tabindex/next" size="30" name="header_value" /> - </p> - <p><label i18n:translate="then_set">Then set</label></p> - <div class="indentedonform"> - <p> - <label for="assign_user" tal:attributes="class python:test(request.has_key('flag_assign_user'), 'error', None)" i18n:translate="assign_to">Assign to User</label> - <select tal:attributes="tabindex tabindex/next" id="assign_user" name="assign_user"> - <option value="" i18n:translate="default">Default</option> - <option tal:repeat="user here/listUsers" tal:attributes="value user/username" tal:content="user/username">Administrator</option> - </select> - </p> - <p> - <label for="assign_group" tal:attributes="class python:test(request.has_key('flag_assign_group'), 'error', None)" i18n:translate="or">or Group</label> - <select tal:attributes="tabindex tabindex/next" id="assign_group" name="assign_group"> - <option value="" i18n:translate="default">Default</option> - <option tal:repeat="grp here/sql/listGroups" tal:attributes="value grp/group_name" tal:content="grp/group_name">Team</option> - </select> - </p> - <p> - <label for="priority:int" tal:attributes="class python:test(request.has_key('flag_priority:int'), 'error', None)" i18n:translate="priority_label">Priority</label> - <select tal:attributes="tabindex tabindex/next" id="priority:int" name="priority:int"> - <option value="0" i18n:translate="default">Default</option> - <option value="5" i18n:translate="critical">Critical</option> - <option value="4" i18n:translate="high">High</option> - <option value="3" i18n:translate="normal">Normal</option> - <option value="2" i18n:translate="low">Low</option> - <option value="1" i18n:translate="junk">Junk</option> - </select> - </p> - <p tal:repeat="cat python:[i for i in here.sql.listCategories() if i['enabled']]"> - <span tal:omit-tag="" tal:define="catid cat/id"> - <label tal:attributes="for string:category$catid" tal:content="cat/label">Category</label> - <select tal:attributes="tabindex tabindex/next; name string:category$catid; id string:category$catid"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr> + <td> + <label for="header_name" tal:attributes="class python:test(request.has_key('flag_header_name'), 'error', None)" i18n:translate="if">If</label> + </td> + + <td> + <select tal:attributes="tabindex tabindex/next" id="header_name" name="header_name"> + <option tal:repeat="item here/filter_headers" tal:attributes="value item/lower" tal:content="item">To</option> + <option value="any header" i18n:translate="any_header">Any Header</option> + <option value="body" i18n:translate="message_body">Message Body</option> + </select> + </td> + + <td> + <select tal:attributes="tabindex tabindex/next" name="header_operator"> + <option i18n:translate="exactly_matches">exactly matches</option> + <option i18n:translate="contains">contains</option> + </select> + </td> + + <td> + <input tal:attributes="tabindex tabindex/next" size="30" name="header_value" /> + </td> + </tr> + + </table> + + <br /> + + <h2 i18n:translate="then_set">Then set</h2> + + <table border="0" cellpadding="0" cellspacing="0"> + + <tr> + <td> + <label for="assign_user" tal:attributes="class python:test(request.has_key('flag_assign_user') or request.has_key('flag_assign_group'), 'error', None)" i18n:translate="assign_label">Assign</label> + </td> + <td> + <select tal:attributes="tabindex tabindex/next" id="assign_user" name="assign_user"> + <option value="" i18n:translate="none">None</option> + <option tal:repeat="user here/listUsers" tal:attributes="value user/username" tal:content="user/username">Administrator</option> + </select> or + <select tal:attributes="tabindex tabindex/next" id="assign_group" name="assign_group"> + <option value="" i18n:translate="none">None</option> + <option tal:repeat="grp here/sql/listGroups" tal:attributes="value grp/group_name" tal:content="grp/group_name">Sales team</option> + </select> + </td> + </tr> + + <tr> + <td> + <label for="priority:int" tal:attributes="class python:test(request.has_key('flag_priority:int'), 'error', None)" i18n:translate="priority_label">Priority</label> + </td> + + <td> + <select tal:attributes="tabindex tabindex/next" id="priority:int" name="priority:int"> + <option value="0" i18n:translate="default">Default</option> + <option value="5" i18n:translate="critical">Critical</option> + <option value="4" i18n:translate="high">High</option> + <option value="3" i18n:translate="normal">Normal</option> + <option value="2" i18n:translate="low">Low</option> + <option value="1" i18n:translate="junk">Junk</option> + </select> + </td> + </tr> + + <tr tal:repeat="cat python:[i for i in here.sql.listCategories() if i['enabled']]"> + <td> + <label tal:define="catid cat/id" tal:attributes="for string:category$catid" tal:content="cat/label">Category</label> + </td> + + <td> + <select tal:define="catid cat/id" tal:attributes="tabindex tabindex/next; name string:category$catid; id string:category$catid"> <option value="" i18n:translate="default">Default</option> <option tal:repeat="item python:here.sql.listCategoryChoices(sqv_category_id=catid)" tal:attributes="value item/choice" tal:content="item/choice">Sales lead</option> </select> - </span> - </p> - <p> - <label for="response_target" tal:attributes="class python:test(request.has_key('flag_response_target'), 'error', None)" i18n:translate="response_target">Response Target</label> - <select tal:attributes="tabindex tabindex/next" id="response_target" name="response_target"> - <option value="" i18n:translate="default">Default</option> - <option tal:repeat="seconds python:range(3*60*60, 60*60*24 + 1, 3*60*60)" tal:attributes="value seconds" tal:content="python:here.formatTargetEn(seconds)">3 hours</option> - <option tal:repeat="seconds python:range(24*60*60, 31*60*60*24 + 1, 24*60*60)" tal:attributes="value seconds" tal:content="python:here.formatTargetEn(seconds)">3 days</option> - </select> - </p> - <p> - <label for="state" tal:attributes="class python:test(request.has_key('flag_status'), 'error', None)" i18n:translate="mark_as_spam_label">Mark as spam</label> - <select tal:attributes="tabindex tabindex/next" id="state" name="state"> - <option value="Open" i18n:translate="no">No</option> - <option value="Spam" i18n:translate="yes">Yes</option> - </select> - </p> - </div> - <p> - <input tal:attributes="tabindex tabindex/next" type="submit" value="Add" /> - </p> + </td> + </tr> + + + <tr> + <td> + <label for="response_target" tal:attributes="class python:test(request.has_key('flag_response_target'), 'error', None)" i18n:translate="response_target">Response Target</label> + </td> + + <td> + <select tal:attributes="tabindex tabindex/next" id="response_target" name="response_target"> + <option value="" i18n:translate="default">Default</option> + <option tal:repeat="seconds python:range(3*60*60, 60*60*24 + 1, 3*60*60)" tal:attributes="value seconds" tal:content="python:here.formatTargetEn(seconds)">3 hours</option> + <option tal:repeat="seconds python:range(24*60*60, 31*60*60*24 + 1, 24*60*60)" tal:attributes="value seconds" tal:content="python:here.formatTargetEn(seconds)">3 days</option> + </select> + </td> + </tr> + + <tr> + <td> + <label for="state" tal:attributes="class python:test(request.has_key('flag_status'), 'error', None)" i18n:translate="mark_as_spam_label">Mark as spam</label> + </td> + + <td> + <select tal:attributes="tabindex tabindex/next" id="state" name="state"> + <option value="Open" i18n:translate="no">No</option> + <option value="Spam" i18n:translate="yes">Yes</option> + </select> + </td> + </tr> + + <tr> + <td> </td> + <td> + <input tal:attributes="tabindex tabindex/next" type="submit" value="Add" /> + </td> + </tr> + </table> + </form> <!-- End add section --> @@ -178,7 +225,7 @@ <thead> <tr> <th i18n:translate="header">Header</th> - <th i18n:translate="action">Action</th> + <th i18n:translate="action" style="text-align:center; width:70px">Action</th> </tr> </thead> <tbody> @@ -193,8 +240,8 @@ </tr> <tr tal:repeat="item here/filter_headers" tal:attributes="class python:test(repeat['item'].odd(),'odd','even')"> <td tal:content="item">To</td> - <td> - <a tal:attributes="href string:delFilterHeader?header=$item" i18n:attributes="delete" class="state delete">Delete</a> + <td style="text-align:center"> + <span class="state delete"><a tal:attributes="href string:delFilterHeader?header=$item" i18n:attributes="delete">Delete</a></span> </td> </tr> </tbody> Modified: MailManager/branches/RELENG_2_1/www/GroupSettings.zpt =================================================================== --- MailManager/branches/RELENG_2_1/www/GroupSettings.zpt 2006-04-18 12:20:05 UTC (rev 2917) +++ MailManager/branches/RELENG_2_1/www/GroupSettings.zpt 2006-04-18 12:20:27 UTC (rev 2918) @@ -30,13 +30,13 @@ </div> <div metal:fill-slot="main_content" tal:omit-tag=""> - <!-- if section in ('list', 'remove') --> + <!-- if section in ('list', 'remove') --> <table class="settings" summary="Group list" i18n:attributes="summary group_list;" tal:condition="python:section in ('list', 'remove')"> <thead> <tr> - <th i18n:translate="group">Group</th> - <th i18n:translate="users">Users</th> - <th i18n:translate="action">Action</th> + <th i18n:translate="group">Group</th> + <th i18n:translate="users">Users</th> + <th i18n:translate="action" style="text-align:center; width:70px">Action</th> </tr> </thead> <tbody> @@ -50,11 +50,11 @@ <br /> </span> </td> - <td tal:condition="python:section == 'list'"> - <a tal:attributes="href string:GroupSettings?section=edit&group_name=${grp/group_name}" i18n:translate="edit" class="state edit">Edit</a> + <td tal:condition="python:section == 'list'" style="text-align:center"> + <span class="state edit"><a tal:attributes="href string:GroupSettings?section=edit&group_name=${grp/group_name}" i18n:translate="edit">Edit</a></span> </td> - <td tal:condition="python:section == 'remove'"> - <a tal:attributes="href string:GroupSettings?section=delete&group_name=${grp/group_name}" i18n:translate="delete" class="state delete">Delete</a> + <td tal:condition="python:section == 'remove'" style="text-align:center"> + <span class="state delete"><a tal:attributes="href string:GroupSettings?section=delete&group_name=${grp/group_name}" i18n:translate="delete">Delete</a></span> </td> </tr> <tr tal:condition="python:not here.sql.listGroups(sqv_group_name='')"> @@ -64,58 +64,90 @@ </tr> </tbody> </table> - <!-- end if section in ('list', 'remove') --> + <!-- end if section in ('list', 'remove') --> - <!-- if section == 'add' --> + <!-- if section == 'add' --> <form accept-charset="utf-8" class="blockform" action="addGroup" method="post" tal:condition="python:section == 'add'"> <h2 i18n:translate="add_new_group">Add New Group</h2> - <p> - <label for="group_name" tal:attributes="class python:test(flag_group_name, 'error', None)" i18n:translate="group_name">Group Name</label> - <input tal:attributes="tabindex tabindex/next; value group_name" maxlength="128" name="group_name" id="group_name" /> - </p> - <p> - <label i18n:translate="users_field">Users</label> - <span class="indentedonform" tal:repeat="user here/listUsers"> - <input tal:attributes="tabindex tabindex/next; value user/username; id user/username" type="checkbox" name="usernames:list" /> - <label tal:attributes="for user/username" tal:content="user/username">Administrator</label><br /> - </span> - </p> - <p> - <input tal:attributes="tabindex tabindex/next" value="Save" i18n:attributes="value" type="submit" /> - </p> + + <table border="0" cellpadding="0" cellspacing="0"> + <tr> + <td> + <label for="group_name" tal:attributes="class python:test(flag_group_name, 'error', None)" i18n:translate="group_name">Group Name</label> + </td> + + <td> + <input tal:attributes="tabindex tabindex/next; value group_name" maxlength="128" name="group_name" id="group_name" /> + </td> + </tr> + + <tr> + <td> + <label i18n:translate="users_field">Users</label> + </td> + <td> + <span tal:repeat="user here/listUsers"> + <label tal:attributes="for user/username" tal:content="user/username">Administrator</label><input tal:attributes="tabindex tabindex/next; value user/username; id user/username" type="checkbox" name="usernames:list" /><br /> + </span> + </td> + </tr> + + <tr> + <td> </td> + <td> + <input tal:attributes="tabindex tabindex/next" value="Save" i18n:attributes="value" type="submit" /> + </td> + </tr> + </table> + </form> - <!-- end if section == 'add' --> + <!-- end if section == 'add' --> - <!-- if section == 'edit' --> + <!-- if section == 'edit' --> <form accept-charset="utf-8" class="blockform" action="editGroup" method="post" tal:condition="python:section == 'edit'"> <h2 i18n:translate="edit_group">Edit Group</h2> - <p> - <label for="group_name" tal:attributes="class python:test(flag_group_name, 'error', None)" i18n:translate="group_name">Group Name</label> - <input name="group_name" id="group_name" type="hidden" tal:attributes="tabindex tabindex/next; value group_name" /> - <span tal:content="group_name">all</span> - </p> - <p> - <label i18n:translate="users_field">Users</label> - <span class="indentedonform" tal:repeat="user here/listUsers"> - <input tal:define="members python:[m.username for m in here.sql.listGroupMembers(sqv_group_name=group_name)]" tal:attributes="tabindex tabindex/next; id user; value user; checked python:test(user.username in members, 'checked', None)" type="checkbox" name="usernames:list" /> - <label tal:attributes="for user" tal:content="user/username">Administrator</label><br /> - </span> - </p> - <p> - <input tal:attributes="tabindex tabindex/next" value="Save" i18n:attributes="value" type="submit" /> - </p> + <table border="0" cellpadding="0" cellspacing="0"> + <tr> + <td> + <label for="group_name" tal:attributes="class python:test(flag_group_name, 'error', None)" i18n:translate="group_name">Group Name</label> + </td> + <td> + <input name="group_name" id="group_name" type="hidden" tal:attributes="tabindex tabindex/next; value group_name" /> + <span tal:content="group_name">all</span> + </td> + </tr> + + <tr> + <td> + <label i18n:translate="users_field">Users</label> + </td> + <td> + <span tal:repeat="user here/listUsers"> + <label tal:attributes="for user" tal:content="user/username">Administrator</label><input tal:define="members python:[m.username for m in here.sql.listGroupMembers(sqv_group_name=group_name)]" tal:attributes="tabindex tabindex/next; id user; value user; checked python:test(user.username in members, 'checked', None)" type="checkbox" name="usernames:list" /><br /> + </span> + </td> + </tr> + + <tr> + <td> </td> + <td> + <input tal:attributes="tabindex tabindex/next" value="Save" i18n:attributes="value" type="submit" /> + </td> + </tr> + </table> + </form> - <!-- end if section == 'edit' --> + <!-- end if section == 'edit' --> - <!-- if section == 'delete' --> - <div tal:condition="python:section == 'delete'" tal:omit-tag=""> - <div tal:define="constraints python:here.getGroupConstraints(group_name)"> - <form accept-charset="utf-8" class="blockform" action="delGroup" method="post" tal:condition="python:len(constraints) == 0"> - <h2 i18n:translate="remove_group">Remove Group</h2> - <p> - <label i18n:translate="group_name">Group Name</label> - <span tal:replace="group_name">Group Name</span> + <!-- if section == 'delete' --> + <div tal:condition="python:section == 'delete'" tal:omit-tag=""> + <div tal:define="constraints python:here.getGroupConstraints(group_name)"> + <form accept-charset="utf-8" class="blockform" action="delGroup" method="post" tal:condition="python:len(constraints) == 0"> + <h2 i18n:translate="remove_group">Remove Group</h2> + <p> + <label i18n:translate="group_name">Group Name</label> + <span tal:replace="group_name">Group Name</span> </p> <p> <strong i18n:translate="note">Note:</strong> <strong i18n:translate="delete_cannot_be_undone">Delete cannot be undone.</strong> Modified: MailManager/branches/RELENG_2_1/www/OptionSettings.zpt =================================================================== --- MailManager/branches/RELENG_2_1/www/OptionSettings.zpt 2006-04-18 12:20:05 UTC (rev 2917) +++ MailManager/branches/RELENG_2_1/www/OptionSettings.zpt 2006-04-18 12:20:27 UTC (rev 2918) @@ -29,34 +29,60 @@ </div> <div metal:fill-slot="main_content" tal:omit-tag=""> - <!-- if section in ('templates', 'edit') --> + <!-- if section in ('templates', 'edit') --> <form accept-charset="utf-8" class="blockform" action="addOrEditTemplate" method="post" tal:condition="python:section in ('templates', 'edit')"> - <!-- if section == 'templates' --> + <!-- if section == 'templates' --> <div tal:condition="python:section == 'templates'"> <h2 i18n:translate="new_template">New Template</h2> - <p> - <label for="temp_name" tal:attributes="class python:test(request.has_key('flag_temp_name'), 'error', None)" i18n:translate="template_name">Template Name</label> - <input tal:attributes="tabindex tabindex/next; value request/temp_name | nothing" id="temp_name" name="temp_name" size="20" /> - </p> - <p> - <label for="template_body" tal:attributes="class python:test(request.has_key('flag_template_body'), 'error', None)" i18n:translate="template_body" class="hidden">Template Body</label> - <textarea tal:attributes="tabindex tabindex/next" tal:content="request/template_body | nothing" id="template_body" name="template_body" rows="6" cols="50"></textarea> - </p> - <p> - <span class="indentedonform"> - <input tal:attributes="tabindex tabindex/next; checked python:test(request.get('html_template'), 1, None)" type="checkbox" name="html_template" id="html_template_a" /> - <label for="html_template_a" tal:attributes="class python:test(request.has_key('flag_html_template_a'), 'error', None)" i18n:translate="html_template">Allow HTML tags in template</label> - </span> - </p> - <p> - <input type="hidden" name="section" value="templates" /> - <input tal:attributes="tabindex tabindex/next" type="submit" value="Save" i18n:attributes="value" /> - </p> + + <table border="0" cellpadding="0" cellspacing="0"> + <tr> + <td> + <label for="temp_name" tal:attributes="class python:test(request.has_key('flag_temp_name'), 'error', None)" i18n:translate="template_name">Template Name</label> + </td> + + <td> + <input tal:attributes="tabindex tabindex/next; value request/temp_name | nothing" id="temp_name" name="temp_name" size="20" /> + </td> + </tr> + + <tr> + <td> + <label for="template_body" tal:attributes="class python:test(request.has_key('flag_template_body'), 'error', None)" i18n:translate="template_body" class="hidden">Template Body</label> + </td> + + <td> + <textarea tal:attributes="tabindex tabindex/next" tal:content="request/template_body | nothing" id="template_body" name="template_body" rows="6" cols="50"></textarea> + </td> + </tr> + + + <tr> + <td> </td> + <td> + <input tal:attributes="tabindex tabindex/next; checked python:test(request.get('html_template'), 1, None)" type="checkbox" name="html_template" id="html_template_a" /> + <span for="html_template_a" tal:attributes="class python:test(request.has_key('flag_html_template_a'), 'error', None)" i18n:translate="html_template">Allow HTML tags in template</span> + </td> + </tr> + + <tr> + <td> </td> + <td> + <input type="hidden" name="section" value="templates" /> + <input tal:attributes="tabindex tabindex/next" type="submit" value="Save" i18n:attributes="value" /> + </td> + </tr> + </table> + + <br /> + + </div> - <!-- end if section == 'templates' --> + <!-- end if section == 'templates' --> - <!-- if section == 'edit' --> + + <!-- if section == 'edit' --> <div tal:condition="python:section == 'edit'"> <h2 i18n:translate="edit_template">Edit Template</h2> <div tal:define="template python:here.sql.getTemplate(sqv_name=request.get('temp_name'))[0]" omit-tag=""> @@ -81,14 +107,14 @@ <input tal:attributes="tabindex tabindex/next" type="submit" value="Save" i18n:attributes="value" /> </p> </div> - <!-- end if section == 'edit' --> + <!-- end if section == 'edit' --> - <table class="settings" summary="Active Templates" i18n:attributes="summary active_templates;" tal:condition="here/sql/listTemplates"> + <table class="settings" summary="Active Templates" i18n:attributes="summary active_templates;" tal:condition="here/sql/listTemplates" border="0"> <thead> <tr> - <th i18n:translate="active_templates">Active Templates</th> + <th i18n:translate="active_templates" nowrap="nowrap">Active Templates</th> <th i18n:translate="text">Text</th> - <th colspan="2" i18n:translate="action">Action</th> + <th colspan="2" i18n:translate="action" style="text-align:center; width:70px">Action</th> </tr> </thead> <tbody> @@ -97,11 +123,11 @@ <td tal:content="python:test(len(template['body']) > 80, '%s...' % template['body'][:80], template['body'])"> Body </td> - <td> - <a tal:attributes="href string:OptionSettings?section=edit&temp_name=${template/name}" i18n:translate="edit" class="state edit">Edit</a> + <td style="text-align:center"> + <span class="state edit"><a tal:attributes="href string:OptionSettings?section=edit&temp_name=${template/name}" i18n:translate="edit">Edit</a></span> </td> - <td> - <a tal:attributes="href string:deleteTemplate?section=templates&del_temp=${template/name}" i18n:translate="delete" class="state delete">Delete</a> + <td style="text-align:center"> + <span class="state delete"><a tal:attributes="href string:deleteTemplate?section=templates&del_temp=${template/name}" i18n:translate="delete">Delete</a></span> </td> </tr> </tbody> @@ -111,24 +137,41 @@ There are no reply templates set up. </p> </form> - <!-- end if section in ('templates', 'edit') --> + <!-- end if section in ('templates', 'edit') --> - <!-- if section.startswith('category') --> + <!-- if section.startswith('category') --> <form accept-charset="utf-8" class="blockform" action="." method="post" tal:condition="python:section.startswith('category')"> <div tal:define="number python:int(section[8:])" tal:omit-tag=""> <h2 i18n:translate="category_name">Category Name</h2> - <p tal:define="cat python:here.sql.listCategories(sqv_category_id=number)[0]"> - <input name="cat:int" type="hidden" tal:attributes="tabindex tabindex/next; value number" /> - <input name="label" size="30" tal:attributes="tabindex tabindex/next; value cat/label" /> - <input type="radio" id="cat_on" name="on:int" value="1" tal:attributes="tabindex tabindex/next; checked python:test(cat.enabled, 'checked', ... [truncated message content] |