Edgewall Software

Ticket #1038: milestone_sort_dsu.diff

File milestone_sort_dsu.diff, 3.4 KB (added by mgood, 3 years ago)

sort milestones using DSU idiom

  • trac/ticket/roadmap.py

    === trac/ticket/roadmap.py
    ==================================================================
     
    22# 
    33# Copyright (C) 2004-2005 Edgewall Software 
    44# Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 
     5# Copyright (C) 2006 Matthew Good <trac@matt-good.net> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    1314# history and logs, available at http://projects.edgewall.com/trac/. 
    1415# 
    1516# Author: Christopher Lenz <cmlenz@gmx.de> 
     17#         Matthew Good <trac@matt-good.net> 
    1618 
    1719import re 
     20import sys 
    1821from time import localtime, strftime, time 
    1922 
    2023from trac import __version__ 
    2124from trac.core import * 
    2225from trac.perm import IPermissionRequestor 
    2326from trac.util import escape, format_date, format_datetime, parse_date, \ 
    24                       pretty_timedelta, shorten_line, unescape, CRLF, Markup 
     27                      pretty_timedelta, shorten_line, unescape, CRLF, Markup, \ 
     28                      embedded_numbers, sorted 
    2529from trac.ticket import Milestone, Ticket, TicketSystem 
    2630from trac.Timeline import ITimelineEventProvider 
    2731from trac.web import IRequestHandler 
     
    150154        req.hdf['roadmap.showall'] = showall 
    151155 
    152156        db = self.env.get_db_cnx() 
    153         milestones = [] 
    154         for idx, milestone in enumerate(Milestone.select(self.env, showall)): 
    155             hdf = milestone_to_hdf(self.env, db, req, milestone) 
    156             milestones.append(hdf) 
     157        def milestone_order(m): 
     158            return (m.completed or sys.maxint, 
     159                    m.due or sys.maxint, 
     160                    embedded_numbers(m.name)) 
     161        milestones = sorted(Milestone.select(self.env, showall), 
     162                            key=milestone_order) 
     163        milestones = [milestone_to_hdf(self.env, db, req, m) 
     164                      for m in milestones] 
    157165        req.hdf['roadmap.milestones'] = milestones 
    158166 
    159167        for idx,milestone in enumerate(milestones): 
  • trac/util.py

    === trac/util.py
    ==================================================================
     
    22# 
    33# Copyright (C) 2003-2004 Edgewall Software 
    44# Copyright (C) 2003-2004 Jonas Borgstr�jonas@edgewall.com> 
     5# Copyright (C) 2006 Matthew Good <trac@matt-good.net> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    1314# history and logs, available at http://projects.edgewall.com/trac/. 
    1415# 
    1516# Author: Jonas Borgstr�jonas@edgewall.com> 
     17#         Matthew Good <trac@matt-good.net> 
    1618 
    1719import cgi 
    1820import md5 
     
    2830 
    2931CRLF = '\r\n' 
    3032 
     33try: 
     34    sorted 
     35except NameError: 
     36    def sorted(iterable, key): 
     37        """Partial implementation of the "sorted" function from Python 2.4""" 
     38        lst = [(key(i), i) for i in iterable] 
     39        lst.sort() 
     40        return [i for __, i in lst] 
    3141 
    3242class Markup(str): 
    3343    """Marks a string as being safe for inclusion in XML output without needing 
     
    260270            shortline = text[:i]+' ...' 
    261271    return shortline 
    262272 
     273DIGITS = re.compile(r'(\d+)') 
     274def embedded_numbers(s): 
     275    """Comparison function for natural order sorting based on 
     276    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/214202.""" 
     277    pieces = DIGITS.split(s) 
     278    pieces[1::2] = map(int, pieces[1::2]) 
     279    return pieces 
     280 
    263281def hex_entropy(bytes=32): 
    264282    import md5 
    265283    import random