Changeset 57
- Timestamp:
- 03/19/08 18:00:19 (6 months ago)
- Files:
-
- trunk/trac/cgi-bin/trac.cgi (modified) (1 prop)
- trunk/trac/cgi-bin/trac.fcgi (modified) (1 prop)
- trunk/trac/ChangeLog (modified) (2 diffs)
- trunk/trac/contrib/checkwiki.py (modified) (1 prop)
- trunk/trac/contrib/htdigest.py (modified) (1 prop)
- trunk/trac/contrib/htpasswd.py (added)
- trunk/trac/contrib/rpm/makerpm (modified) (1 prop)
- trunk/trac/contrib/trac-post-commit-hook (modified) (1 prop)
- trunk/trac/contrib/workflow/migrate_original_to_basic.py (modified) (1 prop)
- trunk/trac/contrib/workflow/showworkflow (modified) (1 prop)
- trunk/trac/contrib/workflow/workflow_parser.py (modified) (1 prop)
- trunk/trac/RELEASE (modified) (1 diff)
- trunk/trac/sample-plugins/permissions/vulnerability_tickets.py (modified) (2 diffs)
- trunk/trac/setup.py (modified) (1 diff, 1 prop)
- trunk/trac/THANKS (modified) (2 diffs)
- trunk/trac/trac/admin/console.py (modified) (1 prop)
- trunk/trac/trac/admin/web_ui.py (modified) (3 diffs)
- trunk/trac/trac/attachment.py (modified) (3 diffs)
- trunk/trac/trac/db/mysql_backend.py (modified) (2 diffs)
- trunk/trac/trac/db_default.py (modified) (1 diff)
- trunk/trac/trac/htdocs/css/about.css (modified) (1 diff)
- trunk/trac/trac/htdocs/css/report.css (modified) (1 diff)
- trunk/trac/trac/htdocs/css/trac.css (modified) (1 diff)
- trunk/trac/trac/htdocs/js/blame.js (modified) (1 diff)
- trunk/trac/trac/htdocs/js/expand_dir.js (modified) (1 diff)
- trunk/trac/trac/htdocs/js/keyboard_nav.js (added)
- trunk/trac/trac/htdocs/js/noconflict.js (added)
- trunk/trac/trac/htdocs/js/query.js (modified) (1 diff)
- trunk/trac/trac/htdocs/js/trac.js (modified) (1 diff)
- trunk/trac/trac/mimeview/api.py (modified) (1 diff)
- trunk/trac/trac/mimeview/rst.py (modified) (2 diffs)
- trunk/trac/trac/notification.py (modified) (3 diffs)
- trunk/trac/trac/prefs/templates/prefs_datetime.html (modified) (2 diffs)
- trunk/trac/trac/prefs/web_ui.py (modified) (2 diffs)
- trunk/trac/trac/resource.py (modified) (3 diffs)
- trunk/trac/trac/templates/error.html (modified) (3 diffs)
- trunk/trac/trac/templates/layout.html (modified) (2 diffs)
- trunk/trac/trac/templates/theme.html (added)
- trunk/trac/trac/test.py (modified) (1 prop)
- trunk/trac/trac/tests/config.py (modified) (1 diff)
- trunk/trac/trac/ticket/admin.py (modified) (1 diff)
- trunk/trac/trac/ticket/default_workflow.py (modified) (3 diffs)
- trunk/trac/trac/ticket/model.py (modified) (2 diffs)
- trunk/trac/trac/ticket/templates/ticket_notify_email.txt (modified) (1 diff)
- trunk/trac/trac/ticket/web_ui.py (modified) (4 diffs)
- trunk/trac/trac/timeline/web_ui.py (modified) (2 diffs)
- trunk/trac/trac/util/compat.py (modified) (1 diff)
- trunk/trac/trac/util/datefmt.py (modified) (2 diffs)
- trunk/trac/trac/util/__init__.py (modified) (1 diff)
- trunk/trac/trac/versioncontrol/svn_fs.py (modified) (1 diff)
- trunk/trac/trac/versioncontrol/web_ui/browser.py (modified) (5 diffs)
- trunk/trac/trac/versioncontrol/web_ui/util.py (modified) (1 diff)
- trunk/trac/trac/web/cgi_frontend.py (modified) (1 prop)
- trunk/trac/trac/web/chrome.py (modified) (8 diffs)
- trunk/trac/trac/web/fcgi_frontend.py (modified) (1 prop)
- trunk/trac/trac/web/main.py (modified) (2 diffs)
- trunk/trac/trac/web/session.py (modified) (4 diffs)
- trunk/trac/trac/web/standalone.py (modified) (1 prop)
- trunk/trac/trac/web/tests/session.py (modified) (2 diffs)
- trunk/trac/trac/wiki/macros.py (modified) (2 diffs)
- trunk/trac/trac/wiki/parser.py (modified) (2 diffs)
- trunk/trac/trac/wiki/tests/wiki-tests.txt (modified) (1 diff)
- trunk/trac/trac/wiki/web_ui.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/trac/cgi-bin/trac.cgi
- Property svn:executable set to *
trunk/trac/cgi-bin/trac.fcgi
- Property svn:executable set to *
trunk/trac/ChangeLog
r46 r57 1 Trac 0.11b 1 'Genshi' (December 18, 2007)2 http://svn.edgewall.org/repos/trac/tags/trac-0.11b 13 4 Trac 0.11b 1contains a great number of new features, improvements and1 Trac 0.11b2 'Genshi' (March 12, 2008) 2 http://svn.edgewall.org/repos/trac/tags/trac-0.11b2 3 4 Trac 0.11b2 contains a great number of new features, improvements and 5 5 bug fixes. The following list contains only a few highlights: 6 6 … … 17 17 A more complete list of new features can be found in the RELEASE file. 18 18 The complete list of closed tickets can be found here: 19 http://trac.edgewall.org/query?status=closed&milestone=0.10 19 http://trac.edgewall.org/query?status=closed&milestone=0.11 20 21 Trac 0.11b1 'Genshi' (December 18, 2007) 22 http://svn.edgewall.org/repos/trac/tags/trac-0.11b1 23 24 See 0.11b2. 20 25 21 26 Trac 0.10.4 (April 20, 2007) trunk/trac/contrib/checkwiki.py
- Property svn:executable set to *
trunk/trac/contrib/htdigest.py
- Property svn:executable set to *
trunk/trac/contrib/rpm/makerpm
- Property svn:executable set to *
trunk/trac/contrib/trac-post-commit-hook
- Property svn:executable set to *
trunk/trac/contrib/workflow/migrate_original_to_basic.py
- Property svn:executable set to *
trunk/trac/contrib/workflow/showworkflow
- Property svn:executable set to *
trunk/trac/contrib/workflow/workflow_parser.py
- Property svn:executable set to *
trunk/trac/RELEASE
r46 r57 1 Release Notes for Trac 0.11 beta 1Genshi Release1 Release Notes for Trac 0.11 beta2 Genshi Release 2 2 ================================================ 3 December 18, 2007 3 March 12, 2008 4 4 5 5 Highlights trunk/trac/sample-plugins/permissions/vulnerability_tickets.py
r46 r57 2 2 from trac.perm import IPermissionPolicy, IPermissionRequestor 3 3 4 revision = "$Rev: 2$"4 revision = "$Rev: 41 $" 5 5 url = "$URL: /mirror/sample-plugins/permissions/vulnerability_tickets.py $" 6 6 … … 41 41 db = self.env.get_db_cnx() 42 42 cursor = db.cursor() 43 for keywords, summary in cursor.execute("SELECT keywords, summary "44 " FROM ticket WHERE id=%s",45 (resource.id,)):43 cursor.execute("SELECT keywords, summary FROM ticket WHERE id=%s", 44 (resource.id,)) 45 for keywords, summary in cursor: 46 46 fields = ''.join([f for f in (keywords, summary) if f]).lower() 47 47 if 'security' in fields or 'vulnerability' in fields: trunk/trac/setup.py
- Property svn:executable set to *
r46 r57 30 30 url = 'http://trac.edgewall.org/', 31 31 download_url = 'http://trac.edgewall.org/wiki/TracDownload', 32 classifiers = [ 33 'Environment :: Web Environment', 34 'Framework :: Trac', 35 'Intended Audience :: Developers', 36 'License :: OSI Approved :: BSD License', 37 'Operating System :: OS Independent', 38 'Programming Language :: Python', 39 'Topic :: Software Development :: Bug Tracking', 40 'Topic :: Software Development :: Version Control', 41 ], 32 42 33 43 packages = find_packages(exclude=['*.tests']), trunk/trac/THANKS
r46 r57 9 9 * Toni Brkic toni.brkic@switchcore.com 10 10 * Eli Carter eli.carter@commprove.com 11 * Michele Cella 11 12 * Felix Colins felix@keyghost.com 12 13 * Wesley Crucius wcrucius@sandc.com … … 16 17 * Markus Fuchs 17 18 * Eric Gillespie epg@netbsd.org 19 * Daniel Kahn Gillmor 18 20 * Matthew Good trac@matt-good.net 19 21 * Shun-ichi Goto gotoh@taiyo.co.jp trunk/trac/trac/admin/console.py
- Property svn:executable set to *
trunk/trac/trac/admin/web_ui.py
r46 r57 31 31 from trac.util import get_pkginfo, get_module_path 32 32 from trac.util.compat import partial 33 from trac.util.text import to_unicode 33 34 from trac.util.translation import _ 34 35 from trac.web import HTTPNotFound, IRequestHandler … … 396 397 raise TracError(_('No file uploaded')) 397 398 upload = req.args['plugin_file'] 398 if not upload.filename:399 if isinstance(upload, unicode) or not upload.filename: 399 400 raise TracError(_('No file uploaded')) 400 401 plugin_filename = upload.filename.replace('\\', '/').replace(':', '/') … … 481 482 plugin_filename = os.path.basename(dist.location) 482 483 483 description = inspect.getdoc(component)484 description = to_unicode(inspect.getdoc(component)) 484 485 if description: 485 486 description = description.split('.', 1)[0] + '.' trunk/trac/trac/attachment.py
r46 r57 372 372 parent_id = '/'.join(segments[:-1]) 373 373 filename = len(segments) > 1 and segments[-1] 374 if not filename: # if there's a trailing '/', show the list375 return self._render_list(req, parent_realm(id=parent_id))376 374 377 375 parent = parent_realm(id=parent_id) 376 377 # Link the attachment page to parent resource 378 parent_name = get_resource_name(self.env, parent) 379 parent_url = get_resource_url(self.env, parent, req.href) 380 add_link(req, 'up', parent_url, parent_name) 381 add_ctxtnav(req, _('Back to %(parent)s', parent=parent_name), 382 parent_url) 383 384 if action != 'new' and not filename: 385 # there's a trailing '/', show the list 386 return self._render_list(req, parent) 387 378 388 attachment = Attachment(self.env, parent.child('attachment', filename)) 379 380 add_link(req, 'up', get_resource_url(self.env, parent, req.href),381 get_resource_name(self.env, parent))382 389 383 390 if req.method == 'POST': … … 394 401 395 402 add_stylesheet(req, 'common/css/code.css') 396 add_ctxtnav(req, _('Back to %(parent)s',397 parent=get_resource_name(self.env, parent)),398 req.chrome['links']['up'][0]['href'])399 403 return 'attachment.html', data, None 400 404 … … 613 617 } 614 618 615 add_link(req, 'up', get_resource_url(self.env, parent, req.href),616 get_resource_name(self.env, parent))617 618 619 return 'attachment.html', data, None 619 620 620 621 def _render_view(self, req, attachment): 621 622 req.perm(attachment.resource).require('ATTACHMENT_VIEW') 622 req.check_modified(attachment.date) 623 can_delete = 'ATTACHMENT_DELETE' in req.perm(attachment.resource) 624 req.check_modified(attachment.date, str(can_delete)) 623 625 624 626 data = {'mode': 'view', trunk/trac/trac/db/mysql_backend.py
r46 r57 1 # -*- coding: iso8859-1-*-1 # -*- coding: utf-8 -*- 2 2 # 3 3 # Copyright (C) 2005-2006 Edgewall Software … … 177 177 if type == 'int': 178 178 type = 'signed' 179 elif type == 'text': 180 type = 'char' 179 181 return 'CAST(%s AS %s)' % (column, type) 180 182 trunk/trac/trac/db_default.py
r46 r57 281 281 LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority' 282 282 ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'), 283 (CASE status WHEN 'closed' THEN modified ELSE (-1)*p.valueEND) DESC284 """ ),283 (CASE status WHEN 'closed' THEN changetime ELSE (-1) * %s END) DESC 284 """ % db.cast('p.value', 'int')), 285 285 #---------------------------------------------------------------------------- 286 286 ('My Tickets', trunk/trac/trac/htdocs/css/about.css
r46 r57 14 14 padding: 3px; 15 15 } 16 #content.about #config td.value { font-family: monospace; } 17 #content.about #config tr.modified { background: #fee; } 18 #content.about #config tr.modified td.value { font-weight: bold; } 16 #content.about #config tr.modified { background: #ffd; } 17 #content.about #config tr.modified td.value { font-style: italic; } 19 18 #content.about #config td.doc { padding: 3px 1em; } trunk/trac/trac/htdocs/css/report.css
r46 r57 21 21 #query fieldset, #query fieldset input, #query fieldset select { font-size: 11px } 22 22 #query fieldset { margin-top: 1em } 23 #query fieldset.collapsed { border-width: 0 } 23 #query fieldset.collapsed { 24 border-width: 0; 25 margin-bottom: 0pt; 26 padding: 0pt .5em; 27 } 24 28 #query .option, #query .option input, #query .option select { font-size: 11px } 25 29 #query .option { float: left; line-height: 2em; margin: .9em 2.5em 0 .5em; padding: 0 0 .1em } trunk/trac/trac/htdocs/css/trac.css
r46 r57 438 438 table.listing tbody tr.odd { background-color: #f7f7f7 } 439 439 table.listing tbody tr:hover { background: #eed !important } 440 table.listing tbody tr.focus { background: #ddf !important } 440 441 441 442 /* Styles for the page history table trunk/trac/trac/htdocs/js/blame.js
r46 r57 79 79 80 80 // workaround non-clickable "Close" issue in Firefox 81 if ($.browser == 'mozilla')81 if ($.browser.mozilla) 82 82 message.find("div.inlinebuttons").next().css("clear", "right"); 83 83 trunk/trac/trac/htdocs/js/expand_dir.js
r46 r57 1 1 // Enable expanding/folding folders in TracBrowser 2 2 3 var FOLDERID_COUNTER = 0;4 var SUBFOLDER_INDENT = 20;5 6 3 (function($){ 4 var FOLDERID_COUNTER = 0; 5 var SUBFOLDER_INDENT = 20; 7 6 8 7 // enableExpandDir adds the capability to folder rows to be expanded and folded trunk/trac/trac/htdocs/js/query.js
r46 r57 134 134 // Convenience function for creating an <input type="radio"> 135 135 function createRadio(name, value, id) { 136 var input = document.createElement("input"); 137 input.type = "radio"; 138 if (name) input.name = name; 139 if (value) input.value = value; 140 if (id) input.id = id; 141 return input; 136 var str = '<input type="radio"'; 137 if (name) str += ' name="' + name + '"'; 138 if (value) str += ' value="' + value + '"'; 139 if (id) str += ' id="' + id + '"'; 140 str += '/>'; 141 var span = document.createElement('span'); 142 // create radio button with innerHTML to avoid IE mangling it. 143 span.innerHTML = str; 144 return span; 142 145 } 143 146 trunk/trac/trac/htdocs/js/trac.js
r46 r57 1 jQuery.noConflict(); // jQuery is now removed from the $ namespace2 // to use the $ shorthand, use (function($){ ... })(jQuery);3 // and for the onload handler: jQuery(function($){ ... });4 5 1 (function($){ 6 2 trunk/trac/trac/mimeview/api.py
r46 r57 585 585 if not content: 586 586 return '' 587 if not isinstance(context, Context): 588 # backwards compatibility: the first argument used to be the 589 # request prior to 0.11 590 context = Context.from_request(context) 587 591 588 592 # Ensure we have a MIME type for this content trunk/trac/trac/mimeview/rst.py
r46 r57 27 27 from distutils.version import StrictVersion 28 28 import re 29 try: 30 from docutils import nodes 31 from docutils.core import publish_parts 32 from docutils.parsers import rst 33 from docutils import __version__ 34 has_docutils = True 35 except ImportError: 36 has_docutils = False 29 37 30 38 from trac.core import * … … 48 56 49 57 def render(self, context, mimetype, content, filename=None, rev=None): 50 try: 51 from docutils import nodes 52 from docutils.core import publish_parts 53 from docutils.parsers import rst 54 from docutils import __version__ 55 except ImportError: 58 global has_docutils 59 if not has_docutils: 56 60 raise TracError(_('Docutils not found')) 57 61 if StrictVersion(__version__) < StrictVersion('0.3.9'): trunk/trac/trac/notification.py
r46 r57 25 25 from trac.util.text import CRLF 26 26 from trac.util.translation import _ 27 from trac.web.chrome import Chrome28 27 29 28 MAXHEADERLEN = 76 30 29 EMAIL_LOOKALIKE_PATTERN = (r"[a-zA-Z0-9.'=+_-]+" '@' 30 '(?:[a-zA-Z0-9_-]+\.)+[a-zA-Z]{2,4}') 31 31 32 32 class NotificationSystem(Component): … … 118 118 self.db = env.get_db_cnx() 119 119 120 from trac.web.chrome import Chrome 120 121 self.template = Chrome(self.env).load_template(self.template_name, 121 122 method='text') … … 167 168 168 169 def __init__(self, env): 170 global EMAIL_LOOKALIKE_PATTERN 169 171 Notify.__init__(self, env) 170 172 171 addrfmt = r'[\w\d_\.\-\+=]+\@(?:(?:[\w\d\-])+\.)+(?:[\w\d]{2,4})'173 addrfmt = EMAIL_LOOKALIKE_PATTERN 172 174 admit_domains = self.env.config.get('notification', 'admit_domains') 173 175 if admit_domains: trunk/trac/trac/prefs/templates/prefs_datetime.html
r46 r57 12 12 13 13 <div class="field" py:with="session_tzname = settings.session.get('tz'); 14 default_tzname = timezones[len(timezones)/2]; 15 selected_tz = timezone(session_tzname or default_tzname) or timezone(default_tzname) or utc; 16 selected_tzname = '%s' % selected_tz"> 14 selected_tz = timezone(session_tzname) or utc"> 17 15 <label>Time zone: 18 16 <select name="tz"> 19 17 <option>Default time zone</option> 20 18 <option py:for="tzname in timezones" 21 selected="${selected_tzname.startswith('Etc/') and 19 selected="${session_tzname != None and 20 session_tzname.startswith('Etc/') and 22 21 selected_tz == timezone(tzname) or 23 se lected_tzname == tzname or None}">$tzname</option>22 session_tzname == tzname or None}">$tzname</option> 24 23 </select></label> 25 24 <p class="hint">Configuring your time zone will result in all … … 30 29 Example: The current time is <strong>${format_time(now, 'iso8601', tzinfo=utc)}</strong> (UTC). 31 30 <br /> 32 In ${session_tzname and 'your' or ' '} time zone ${selected_tz.tzname(None)}, this would be displayed as33 <strong>${format_time(now, 'iso8601', tzinfo= selected_tz)}</strong>.31 In ${session_tzname and 'your' or 'the Default'} time zone ${session_tzname and ' ' + selected_tz.tzname(None) or ''}, this would be displayed as 32 <strong>${format_time(now, 'iso8601', tzinfo=(session_tzname and selected_tz or localtz))}</strong>. 34 33 </p> 35 34 trunk/trac/trac/prefs/web_ui.py
r46 r57 23 23 from trac.core import * 24 24 from trac.prefs.api import IPreferencePanelProvider 25 from trac.util.datefmt import all_timezones, get_timezone 25 from trac.util.datefmt import all_timezones, get_timezone, localtz 26 26 from trac.util.translation import _ 27 27 from trac.web import HTTPNotFound, IRequestHandler … … 96 96 return 'prefs_%s.html' % (panel or 'general'), { 97 97 'settings': {'session': req.session, 'session_id': req.session.sid}, 98 'timezones': all_timezones, 'timezone': get_timezone 98 'timezones': all_timezones, 'timezone': get_timezone, 99 'localtz': localtz 99 100 } 100 101 trunk/trac/trac/resource.py
r46 r57 105 105 if r.id: 106 106 name += ':' + unicode(r.id) # id can be numerical 107 if r.version :107 if r.version is not None: 108 108 name += '@' + unicode(r.version) 109 109 path.append(name) … … 149 149 "<Resource u'wiki:WikiStart@3'>" 150 150 151 >>> main0 = main3(version=0) 152 >>> repr(main0) 153 "<Resource u'wiki:WikiStart@0'>" 154 151 155 In a copy, if `id` is overriden, then the original `version` value 152 156 will not be reused. … … 160 164 realm = resource_or_realm 161 165 if isinstance(resource_or_realm, Resource): 162 if (id, version, parent) == (False, False, False):166 if id is False and version is False and parent is False: 163 167 return resource_or_realm 164 168 else: # copy and override trunk/trac/trac/templates/error.html
r46 r57 32 32 $("#traceback pre").hide(); 33 33 $("#tbtoggle").parent().show(); 34 34 35 $("#systeminfo").append("<tr><th>jQuery:</th><td>"+$().jquery+"</td></tr>"); 36 $("#systeminfo").before("<p>User Agent: <tt>"+navigator.userAgent+"</tt></p>"); 37 }); 38 /*]]>*/</script> 39 <script type="text/javascript">/*<![CDATA[*/ 40 jQuery(document).ready(function($) { 35 41 var descr = $("#description").text(); 36 42 descr = descr.replace(/==== System Information ====\s+/m, … … 41 47 ); 42 48 $("#description").text(descr); 43 44 $("#systeminfo").append("<tr><th>jQuery:</th><td>"+$().jquery+"</td></tr>");45 $("#systeminfo").before("<p>User Agent: <tt>"+navigator.userAgent+"</tt></p>");46 49 }); 47 50 /*]]>*/</script> … … 54 57 value="${'dev' in trac.version and 'devel' or trac.version}" /> 55 58 <input type="hidden" name="summary" value="$message" /> 56 <textarea name="description" rows="3" cols="10"> 59 <textarea id="description" name="description" rows="3" cols="10"> 60 57 61 ==== How to Reproduce ==== 58 62 trunk/trac/trac/templates/layout.html
r46 r57 35 35 </ul> 36 36 </div> 37 37 38 38 <py:match path="body" once="true"><body> 39 <div id="banner"> 40 <div id="header" py:choose=""> 41 <a py:when="chrome.logo.src" id="logo" href="${chrome.logo.link}"><img 42 src="${chrome.logo.src}" alt="${chrome.logo.alt}" 43 height="${chrome.logo.height or None}" width="${chrome.logo.width or None}" /></a> 44 <h1 py:otherwise=""><a href="${chrome.logo.link}">${project.name}</a></h1> 45 </div> 46 <form id="search" action="${href.search()}" method="get"> 47 <div py:if="'SEARCH_VIEW' in perm"> 48 <label for="proj-search">Search:</label> 49 <input type="text" id="proj-search" name="q" size="18" accesskey="f" value="" /> 50 <input type="submit" value="Search" /> 51 </div> 52 </form> 53 ${navigation('metanav')} 54 </div> 55 ${navigation('mainnav')} 56 57 <div id="main"> 58 <div id="ctxtnav" class="nav"> 59 <h2>Context Navigation</h2> 60 <ul> 61 <li py:for="i, elm in enumerate(chrome.ctxtnav)" class="${i == 0 and 'first ' or None}${i+1 == len(chrome.ctxtnav) and 'last' or None}">$elm</li> 62 </ul> 63 <hr /> 64 </div> 65 <div id="warning" py:if="chrome.warnings" class="system-message"> 66 <py:choose test="len(chrome.warnings)"> 67 <py:when test="1"> 68 <strong>Warning:</strong> ${chrome.warnings[0]} 69 </py:when> 70 <py:otherwise> 71 <strong>Warnings:</strong> 72 <ul><li py:for="w in chrome.warnings">$w</li></ul> 73 </py:otherwise> 74 </py:choose> 75 </div> 76 <div id="notice" py:if="chrome.notices" class="system-message"> 77 <py:choose test="len(chrome.notices)"> 78 <py:when test="1"> 79 <strong>Notice:</strong> ${chrome.notices[0]} 80 </py:when> 81 <py:otherwise> 82 <strong>Notices:</strong> 83 <ul><li py:for="w in chrome.notices">$w</li></ul> 84 </py:otherwise> 85 </py:choose> 86 </div> 87 88 ${select('*|text()')} 89 39 ${select('*|text()')} 40 90 41 <script type="text/javascript" py:if="chrome.late_links"> 91 42 <py:for each="link in chrome.late_links.get('stylesheet')"> 92 $.loadStyleSheet("${link.href}", "${link.title}");43 jQuery.loadStyleSheet("${link.href}", "${link.title}"); 93 44 </py:for> 94 45 </script> … … 106 57 </ul> 107 58 </div> 108 </div> 109 110 <div id="footer" xml:lang="en"><hr/> 111 <a id="tracpowered" href="http://trac.edgewall.org/"><img 112 src="${chrome.htdocs_location}trac_logo_mini.png" height="30" 113 width="107" alt="Trac Powered"/></a> 114 <p class="left"> 115 Powered by <a href="${href.about()}"><strong>Trac ${trac.version}</strong></a><br /> 116 By <a href="http://www.edgewall.org/">Edgewall Software</a>. 117 </p> 118 <p class="right">${chrome.footer}</p> 119 </div> 120 </body></py:match> 121 59 </body></py:match> 60 61 <xi:include href="$chrome.theme"><xi:fallback /></xi:include> 122 62 <xi:include href="site.html"><xi:fallback /></xi:include> 123 63 trunk/trac/trac/test.py
- Property svn:executable set to *
trunk/trac/trac/tests/config.py
r46 r57 212 212 config = self._read() 213 213 self.assertEquals('x', config.get('a', 'option')) 214 time.sleep(1) # needed because of low mtime granularity 214 time.sleep(2) # needed because of low mtime granularity, 215 # especially on fat filesystems 215 216 216 217 self._write(['[a]', 'option = y']) trunk/trac/trac/ticket/admin.py
r46 r57 114 114 in self.env.get_known_users() 115 115 if valid_owner(username)] 116 data['owners'].insert(0, '') 117 data['owners'].sort() 116 118 else: 117 119 data['owners'] = None trunk/trac/trac/ticket/default_workflow.py
r46 r57 216 216 hints = [] 217 217 if 'reset_workflow' in operations: 218 control.append(tag("from invalid state "))218 control.append(tag("from invalid state ")) 219 219 hints.append(_("Current state no longer exists")) 220 220 if 'del_owner' in operations: … … 240 240 hints.append(_("The owner will change")) 241 241 elif len(owners) == 1: 242 control.append(tag('to %s ' % owners[0]))242 control.append(tag('to %s ' % owners[0])) 243 243 hints.append(_("The owner will change to %s") % owners[0]) 244 244 else: … … 272 272 hints.append(_("The resolution will be set")) 273 273 if 'leave_status' in operations: 274 control.append('as ' +ticket['status'])274 control.append('as %s ' % ticket['status']) 275 275 else: 276 276 if status != '*': trunk/trac/trac/ticket/model.py
r46 r57 613 613 raise ResourceNotFound('Milestone %s does not exist.' % name, 614 614 'Invalid Milestone Name') 615 self._from_database(row) 616 617 exists = property(fget=lambda self: self._old_name is not None) 618 is_completed = property(fget=lambda self: self.completed is not None) 619 is_late = property(fget=lambda self: self.due and \ 620 self.due.date() < date.today()) 621 622 def _from_database(self, row): 615 623 name, due, completed, description = row 616 self.name = name624 self.name = self._old_name = name 617 625 self.due = due and datetime.fromtimestamp(int(due), utc) or None 618 626 self.completed = completed and \ 619 627 datetime.fromtimestamp(int(completed), utc) or None 620 628 self.description = description or '' 621 622 exists = property(fget=lambda self: self._old_name is not None)623 is_completed = property(fget=lambda self: self.completed is not None)624 is_late = property(fget=lambda self: self.due and \625 self.due.date() < date.today())626 629 627 630 def delete(self, retarget_to=None, author=None, db=None): … … 702 705 cursor.execute(sql) 703 706 milestones = [] 704 for name,due,completed,descriptionin cursor:707 for row in cursor: 705 708 milestone = Milestone(env) 706 milestone.name = milestone._old_name = name 707 milestone.due = due and datetime.fromtimestamp(int(due), utc) or None 708 if completed: 709 milestone.completed = datetime.fromtimestamp(int(completed), utc) 710 else: 711 milestone.completed = None 712 milestone.description = description or '' 709 milestone._from_database(row) 713 710 milestones.append(milestone) 714 711 def milestone_order(m): trunk/trac/trac/ticket/templates/ticket_notify_email.txt
r46 r57 29 29 -- 30 30 Ticket URL: <$ticket.link> 31 $project.name <${ abs_href()}>31 $project.name <${project.url or abs_href()}> 32 32 $project.descr trunk/trac/trac/ticket/web_ui.py
r46 r57 17 17 import csv 18 18 from datetime import datetime 19 from itertools import chain 19 20 import os 20 21 import pkg_resources … … 179 180 sql, args = search_to_sql(db, ['b.newvalue'], terms) 180 181 sql2, args2 = search_to_sql(db, ['summary', 'keywords', 'description', 181 'reporter', 'cc', 'id'], terms) 182 'reporter', 'cc', 183 db.cast('id', 'text')], terms) 182 184 cursor = db.cursor() 183 185 cursor.execute("SELECT DISTINCT a.summary,a.description,a.reporter, " … … 413 415 'view')) 414 416 415 data = {'ticket': ticket, 'comment': None}416 417 data = self._prepare_data(req, ticket) 417 418 data['comment'] = None … … 1058 1059 value