Index: ticketdelete/web_ui.py =================================================================== --- ticketdelete/web_ui.py (revision 2849) +++ ticketdelete/web_ui.py (working copy) @@ -5,16 +5,17 @@ from trac.core import * from trac.web.api import IRequestFilter from trac.web.chrome import ITemplateProvider, add_script, add_stylesheet -from webadmin.web_ui import IAdminPageProvider +from trac.admin.api import IAdminPanelProvider import re, traceback, pprint from time import strftime, localtime +from trac.ticket.model import Ticket __all__ = ['TicketDeletePlugin'] class TicketDeletePlugin(Component): """A small ticket deletion plugin.""" - implements(ITemplateProvider, IAdminPageProvider, IRequestFilter) + implements(ITemplateProvider, IAdminPanelProvider, IRequestFilter) # IRequestFilter methods def pre_process_request(self, req, handler): @@ -27,39 +28,41 @@ add_stylesheet(req, 'ticketdelete/ticketdelete.css') return template, content_type - # IAdminPageProvider methods - def get_admin_pages(self, req): + # IAdminPanelProvider methods + def get_admin_panels(self, req): if req.perm.has_permission('TICKET_ADMIN'): yield ('ticket', 'Ticket System', 'delete', 'Delete') yield ('ticket', 'Ticket System', 'comments', 'Delete Changes') - def process_admin_request(self, req, cat, page, path_info): + def render_admin_panel(self, req, cat, page, path_info): req.perm.assert_permission('TICKET_ADMIN') data = {} + ticketdelete = {} - data['ticketdelete.href'] = req.href('admin', cat, page) - data['ticketdelete.page'] = page - data['ticketdelete.redir'] = 1 + ticketdelete['href'] = req.href('admin', cat, page) + ticketdelete['page'] = page + ticketdelete['redir'] = 1 + data['ticketdelete'] = ticketdelete if req.method == 'POST': if page == 'delete': if 'ticketid' in req.args and 'ticketid2' in req.args: if req.args.get('ticketid') == req.args.get('ticketid2'): - t = self._validate(req, req.args.get('ticketid')) + t, ticketdelete = self._validate(req, req.args.get('ticketid'), ticketdelete) if t: self._delete_ticket(t.id) - data['ticketdelete.message'] = "Ticket #%s has been deleted." % t.id + ticketdelete['message'] = "Ticket #%s has been deleted." % t.id else: - data['ticketdelete.message'] = "The two IDs did not match. Please try again." + ticketdelete['message'] = "The two IDs did not match. Please try again." elif page == 'comments': if 'ticketid' in req.args: req.redirect(req.href.admin(cat, page, req.args.get('ticketid'))) else: - t = self._validate(req, path_info) + t, ticketdelete = self._validate(req, path_info, ticketdelete) if t: - data['ticketdelete.href'] = req.href('admin', cat, page, path_info) + ticketdelete['href'] = req.href('admin', cat, page, path_info) try: deletions = None if "multidelete" in req.args: @@ -74,16 +77,16 @@ ts = int(ts) self.log.debug('TicketDelete: Deleting change to ticket %s at %s (%s)'%(t.id,ts,field)) self._delete_change(t.id, ts, field) - data['ticketdelete.message'] = "Change to ticket #%s at %s has been modified" % (t.id, strftime('%a, %d %b %Y %H:%M:%S',localtime(ts))) - data['ticketdelete.redir'] = 0 + ticketdelete['message'] = "Change to ticket #%s at %s has been modified" % (t.id, strftime('%a, %d %b %Y %H:%M:%S',localtime(ts))) + ticketdelete['redir'] = 0 except ValueError, e: self.log.debug("TicketDelete: Error is %s"%e) self.log.debug("TicketDelete: args = '%s'"%req.args.items()) - data['ticketdelete.message'] = "Timestamp '%s' not valid" % req.args.get('ts') + ticketdelete['message'] = "Timestamp '%s' not valid" % req.args.get('ts') if path_info: - t = self._validate(req, path_info) + t, ticketdelete = self._validate(req, path_info, ticketdelete) if t: if page == 'comments': try: @@ -96,7 +99,7 @@ data = ticket_data.setdefault(str(time), {}) data.setdefault('fields', {})[field] = {'old': oldvalue, 'new': newvalue} data['author'] = author - data['prettytime'] = strftime('%a, %d %b %Y %H:%M:%S',localtime(time)) + #data['prettytime'] = strftime('%a, %d %b %Y %H:%M:%S',localtime(0.10)) # Remove all attachment changes for k, v in ticket_data.items(): @@ -107,11 +110,13 @@ time_list = list(sorted(ticket_data.iterkeys())) if selected is not None and selected < len(time_list): ticket_data[time_list[selected]]['checked'] = True - data['ticketdelete.changes'] = ticket_data + ticketdelete['changes'] = [] + for time in time_list: + ticketdelete['changes'].append(ticket_data[time]) elif page == 'delete': - data['ticketdelete.id'] = t.id + ticketdelete['id'] = t.id - return 'ticketdelete_admin.html', data, None + return 'ticketdelete_admin.html', data # ITemplateProvider methods def get_templates_dirs(self): @@ -145,17 +150,17 @@ else: return (0,0) - def _validate(self, req, arg): + def _validate(self, req, arg, ticketdelete): """Validate that arg is a string containing a valid ticket ID.""" try: id = int(arg) t = Ticket(self.env, id) - return t + return t, ticketdelete except TracError: - data['ticketdelete.message'] = "Ticket #%s not found. Please try again." % id + ticketdelete['message'] = "Ticket #%s not found. Please try again." % id except ValueError: - data['ticketdelete.message'] = "Ticket ID '%s' is not valid. Please try again." % arg - return False + ticketdelete['message'] = "Ticket ID '%s' is not valid. Please try again." % arg + return False, ticketdelete def _delete_ticket(self, id): Index: ticketdelete/htdocs/ticketdelete.js =================================================================== --- ticketdelete/htdocs/ticketdelete.js (revision 2849) +++ ticketdelete/htdocs/ticketdelete.js (working copy) @@ -7,7 +7,10 @@ } else { $('#ticket table.properties').after('
${ticketdelete.message}