Ticket #1038: natural_order_sort_for_milestones.2.diff
| File natural_order_sort_for_milestones.2.diff, 4.3 KB (added by cboos, 3 years ago) |
|---|
-
trac/ticket/roadmap.py
2 2 # 3 3 # Copyright (C) 2004-2005 Edgewall Software 4 4 # Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 5 # Copyright (C) 2006 Christian Boos <cboos@neuf.fr> 5 6 # All rights reserved. 6 7 # 7 8 # This software is licensed as described in the file COPYING, which … … 15 16 # Author: Christopher Lenz <cmlenz@gmx.de> 16 17 17 18 import re 19 import sys 18 20 from time import localtime, strftime, time 19 21 20 22 from trac import __version__ 21 23 from trac.core import * 22 24 from trac.perm import IPermissionRequestor 23 25 from trac.util import escape, format_date, format_datetime, parse_date, \ 24 pretty_timedelta, shorten_line, unescape, CRLF, Markup 26 pretty_timedelta, shorten_line, unescape, CRLF, Markup, \ 27 natural_order 25 28 from trac.ticket import Milestone, Ticket, TicketSystem 26 29 from trac.Timeline import ITimelineEventProvider 27 30 from trac.web import IRequestHandler … … 150 153 req.hdf['roadmap.showall'] = showall 151 154 152 155 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 req.hdf['roadmap.milestones'] = milestones 156 milestones = [m for m in Milestone.select(self.env, showall)] 157 milestones.sort(lambda a, b: 158 cmp(a.completed or sys.maxint, 159 b.completed or sys.maxint) or \ 160 cmp(a.due or sys.maxint, b.due or sys.maxint) or \ 161 natural_order(a.name, b.name)) 162 milestones = [milestone_to_hdf(self.env, db, req, m) 163 for m in milestones] 164 req.hdf['roadmap.milestones'] = milestones 158 165 159 166 for idx,milestone in enumerate(milestones): 160 167 milestone_name = unescape(milestone['name']) # Kludge -
trac/versioncontrol/web_ui/browser.py
31 31 32 32 CHUNK_SIZE = 4096 33 33 34 DIGITS = re.compile(r'[0-9]+')35 def _natural_order(x, y):36 """Comparison function for natural order sorting based on37 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/214202."""38 nx = ny = 039 while True:40 a = DIGITS.search(x, nx)41 b = DIGITS.search(y, ny)42 if None in (a, b):43 return cmp(x[nx:], y[ny:])44 r = (cmp(x[nx:a.start()], y[ny:b.start()]) or45 cmp(int(x[a.start():a.end()]), int(y[b.start():b.end()])))46 if r:47 return r48 nx, ny = a.end(), b.end()49 34 50 51 35 class BrowserModule(Component): 52 36 53 37 implements(INavigationContributor, IPermissionRequestor, IRequestHandler, … … 157 141 elif order == 'size': 158 142 return neg * cmp(a['content_length'], b['content_length']) 159 143 else: 160 return neg * _natural_order(a['name'].lower(),161 b['name'].lower())144 return neg * util.natural_order(a['name'].lower(), 145 b['name'].lower()) 162 146 info.sort(cmp_func) 163 147 164 148 req.hdf['browser.items'] = info -
trac/util.py
260 260 shortline = text[:i]+' ...' 261 261 return shortline 262 262 263 DIGITS = re.compile(r'[0-9]+') 264 def natural_order(x, y): 265 """Comparison function for natural order sorting based on 266 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/214202.""" 267 nx = ny = 0 268 while True: 269 a = DIGITS.search(x, nx) 270 b = DIGITS.search(y, ny) 271 if None in (a, b): 272 return cmp(x[nx:], y[ny:]) 273 r = (cmp(x[nx:a.start()], y[ny:b.start()]) or 274 cmp(int(x[a.start():a.end()]), int(y[b.start():b.end()]))) 275 if r: 276 return r 277 nx, ny = a.end(), b.end() 278 263 279 def hex_entropy(bytes=32): 264 280 import md5 265 281 import random
