Changeset 3526

Show
Ignore:
Timestamp:
04/17/08 14:15:01 (5 months ago)
Author:
asmodai
Message:

Add changes deletion by kkckkc.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ticketdeleteplugin/0.11/ticketdelete/templates/ticketdelete_admin.html

    r3339 r3526  
    4848                <tr> 
    4949                  <td><input type="checkbox" name="dontcare" value="dontcare" id="checkbox_${change}" checked="${change.checked or None}" /></td> 
    50                   <td colspan="3"><b>Change at ${change.prettytime} by ${change.author}</b></td> 
     50                  <td colspan="3"><b>Change at ${ticketdelete.changes[change].prettytime} by ${ticketdelete.changes[change].author}</b></td> 
    5151                  <td><input type="submit" name="delete_${change}" value="Delete change" /></td> 
    5252                  <tr> 
    53                     <py:for each="field in change.fields"> 
     53                    <py:for each="field in ticketdelete.changes[change].fields"> 
    5454                      <tr> 
    55                         <td><input type="checkbox" id="checkbox${field}_${change}" name="mdelete" value="${field}_${change}" checked="${change.checked or None}" /></td> 
     55                        <td><input type="checkbox" id="checkbox${field}_${change}" name="mdelete" value="${field}_${change}" checked="${ticketdelete.changes[change].checked or None}" /></td> 
    5656                        <td>${field}</td> 
    57                         <py:choose test="name(field)"> 
    58                           <td py:when="comment" colspan="2">${field.new}</td> 
    59  
    60                           <py:otherwise> 
    61                             <td>${field.old}</td> 
    62                             <td>${field.new}</td> 
    63                           </py:otherwise> 
    64                         </py:choose> 
     57                        <td>${ticketdelete.changes[change].fields[field].old}</td> 
     58                        <td>${ticketdelete.changes[change].fields[field].new}</td> 
    6559                        <td><input type="submit" name="delete${field}_${change}" value="Delete field" /></td> 
    6660                      </tr> 
  • ticketdeleteplugin/0.11/ticketdelete/web_ui.py

    r3339 r3526  
    99from trac.web.chrome import ITemplateProvider, add_script, add_stylesheet 
    1010from trac.util import sorted 
     11from trac.util.datefmt import to_datetime, utc, to_timestamp 
    1112 
    1213import re 
    1314import traceback 
    1415import pprint 
    15 from time import strftime, localtime 
     16from time import strftime, localtime, mktime 
     17from datetime import datetime 
    1618 
    1719__all__ = ['TicketDeletePlugin'] 
     
    6769                    if t: 
    6870                        data['href'] = req.href('admin', cat, page, path_info) 
    69                         try: 
    70                             deletions = None 
    71                             if "multidelete" in req.args: 
    72                                 deletions = [x.split('_') for x in req.args.getlist('mdelete')] 
    73                                 deletions.sort(lambda a,b: cmp(b[1],a[1])) 
    74                             else: 
    75                                 buttons = [x[6:] for x in req.args.keys() if x.startswith('delete')] 
    76                                 deletions = [buttons[0].split('_')] 
    77                             if deletions: 
    78                                 for field, ts in deletions: 
    79                                     #field, ts = button.split('_') 
    80                                     ts = int(ts) 
     71                         
     72                        deletions = None 
     73                        if "multidelete" in req.args: 
     74                            deletions = [x.split('_') for x in req.args.getlist('mdelete')] 
     75                            deletions.sort(lambda a,b: cmp(b[1],a[1])) 
     76                        else: 
     77                            buttons = [x[6:] for x in req.args.keys() if x.startswith('delete')] 
     78                            deletions = [buttons[0].split('_')] 
     79                             
     80                        if deletions: 
     81                            for field, ts in deletions: 
     82                                if ts != '': 
    8183                                    self.log.debug('TicketDelete: Deleting change to ticket %s at %s (%s)'%(t.id,ts,field)) 
    8284                                    self._delete_change(t.id, ts, field) 
    83                                     data['message'] = "Change to ticket #%s at %s has been modified" % (t.id, strftime('%a, %d %b %Y %H:%M:%S',localtime(ts))
     85                                    data['message'] = "Change to ticket #%s at %s has been modified" % (t.id, ts
    8486                                    data['redir'] = 0 
    85                         except ValueError, e: 
    86                             self.log.debug("TicketDelete: Error is %s"%e) 
    87                             self.log.debug("TicketDelete: args = '%s'"%req.args.items()) 
    88                             data['message'] = "Timestamp '%s' not valid" % req.args.get('ts')                     
    8987                     
    9088                 
     
    10098                    ticket_data = {} 
    10199                    for time, author, field, oldvalue, newvalue, perm in t.get_changelog(): 
    102                         c_data = ticket_data.setdefault(str(time), {}) 
     100                        c_data = ticket_data.setdefault(to_timestamp(time), {}) 
    103101                        c_data.setdefault('fields', {})[field] = {'old': oldvalue, 'new': newvalue} 
    104102                        c_data['author'] = author 
    105103                        # FIXME: The datetime handling is not working - enable 
    106104                        # for traceback 
    107                         c_data['prettytime'] = strftime('%a, %d %b %Y %H:%M:%S',localtime(time)) 
     105                        c_data['prettytime'] = strftime('%a, %d %b %Y %H:%M:%S',time.timetuple()) 
    108106                     
    109                     # Remove all attachment changes                     
    110                     for k, v in ticket_data.items(): 
    111                         if 'attachment' in v.get('fields', {}): 
    112                             del ticket_data[k] 
    113                              
    114107                    # Check the boxes next to change number `selected` 
    115108                    time_list = list(sorted(ticket_data.iterkeys())) 
     
    189182        if field: 
    190183            if field == 'attachment': 
    191                 pass # Better handling still pending 
     184                cursor.execute("DELETE FROM attachment WHERE type = 'ticket' AND id = %s AND time = %s", (id, ts)) 
    192185            else: 
    193186                custom_fields = [f['name'] for f in ticket.fields if f.get('custom')] 
     
    200193                cursor.execute("DELETE FROM ticket_change WHERE ticket = %s AND time = %s AND field = %s", (id, ts, field)) 
    201194        else: 
    202             for _, _, field, _, _, _ in ticket.get_changelog(ts): 
     195            for _, _, field, _, _, _ in ticket.get_changelog(to_datetime(int(ts), utc)): 
    203196                self._delete_change(id, ts, field) 
    204197