annotate examples/trac/trac/ticket/api.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2003-2006 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2003-2005 Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 # Author: Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 import re
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 from trac.config import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 from trac.core import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 from trac.perm import IPermissionRequestor, PermissionSystem
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 from trac.Search import ISearchSource, search_to_sql, shorten_result
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 from trac.util.text import shorten_line
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 from trac.util.markup import html, Markup
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 from trac.wiki import IWikiSyntaxProvider, Formatter
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 class ITicketChangeListener(Interface):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 """Extension point interface for components that require notification when
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 tickets are created, modified, or deleted."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 def ticket_created(ticket):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 """Called when a ticket is created."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 def ticket_changed(ticket, comment, old_values):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 """Called when a ticket is modified.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 `old_values` is a dictionary containing the previous values of the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 fields that have changed.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 def ticket_deleted(ticket):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 """Called when a ticket is deleted."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 class ITicketManipulator(Interface):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 """Miscellaneous manipulation of ticket workflow features."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 def prepare_ticket(req, ticket, fields, actions):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 """Not currently called, but should be provided for future
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 compatibility."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 def validate_ticket(req, ticket):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 """Validate a ticket after it's been populated from user input.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 Must return a list of `(field, message)` tuples, one for each problem
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 detected. `field` can be `None` to indicate an overall problem with the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58 ticket. Therefore, a return value of `[]` means everything is OK."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 class TicketSystem(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 implements(IPermissionRequestor, IWikiSyntaxProvider, ISearchSource)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 change_listeners = ExtensionPoint(ITicketChangeListener)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 restrict_owner = BoolOption('ticket', 'restrict_owner', 'false',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 """Make the owner field of tickets use a drop-down menu. See
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 [wiki:TracTickets#AssigntoasDropDownList AssignToAsDropDownList]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 (''since 0.9'').""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 # Public API
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 def get_available_actions(self, ticket, perm_):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 """Returns the actions that can be performed on the ticket."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 actions = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 'new': ['leave', 'resolve', 'reassign', 'accept'],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 'assigned': ['leave', 'resolve', 'reassign' ],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 'reopened': ['leave', 'resolve', 'reassign' ],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 'closed': ['leave', 'reopen']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 perms = {'resolve': 'TICKET_MODIFY', 'reassign': 'TICKET_MODIFY',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 'accept': 'TICKET_MODIFY', 'reopen': 'TICKET_CREATE'}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 return [action for action in actions.get(ticket['status'], ['leave'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 if action not in perms or perm_.has_permission(perms[action])]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 def get_ticket_fields(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 """Returns the list of fields available for tickets."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 from trac.ticket import model
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 fields = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 # Basic text fields
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 for name in ('summary', 'reporter'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95 field = {'name': name, 'type': 'text', 'label': name.title()}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 fields.append(field)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 # Owner field, can be text or drop-down depending on configuration
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 field = {'name': 'owner', 'label': 'Owner'}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 if self.restrict_owner:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 field['type'] = 'select'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 users = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 perm = PermissionSystem(self.env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 for username, name, email in self.env.get_known_users(db):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 if perm.get_user_permissions(username).get('TICKET_MODIFY'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 users.append(username)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 field['options'] = users
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 field['optional'] = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 field['type'] = 'text'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 fields.append(field)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 # Description
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 fields.append({'name': 'description', 'type': 'textarea',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 'label': 'Description'})
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 # Default select and radio fields
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 selects = [('type', model.Type), ('status', model.Status),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 ('priority', model.Priority), ('milestone', model.Milestone),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 ('component', model.Component), ('version', model.Version),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 ('severity', model.Severity), ('resolution', model.Resolution)]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122 for name, cls in selects:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 options = [val.name for val in cls.select(self.env, db=db)]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 if not options:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 # Fields without possible values are treated as if they didn't
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 # exist
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 field = {'name': name, 'type': 'select', 'label': name.title(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 'value': self.config.get('ticket', 'default_' + name),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 'options': options}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 if name in ('status', 'resolution'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 field['type'] = 'radio'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 elif name in ('milestone', 'version'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134 field['optional'] = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 fields.append(field)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 # Advanced text fields
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 for name in ('keywords', 'cc', ):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139 field = {'name': name, 'type': 'text', 'label': name.title()}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 fields.append(field)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 for field in self.get_custom_fields():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 if field['name'] in [f['name'] for f in fields]:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 self.log.warning('Duplicate field name "%s" (ignoring)',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 field['name'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 if not re.match('^[a-zA-Z][a-zA-Z0-9_]+$', field['name']):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 self.log.warning('Invalid name for custom field: "%s" '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 '(ignoring)', field['name'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 field['custom'] = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 fields.append(field)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 return fields
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 def get_custom_fields(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 fields = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 config = self.config['ticket-custom']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 for name in [option for option, value in config.options()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 if '.' not in option]:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 field = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 'name': name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 'type': config.get(name),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 'order': config.getint(name + '.order', 0),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 'label': config.get(name + '.label') or name.capitalize(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 'value': config.get(name + '.value', '')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 if field['type'] == 'select' or field['type'] == 'radio':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 field['options'] = config.getlist(name + '.options', sep='|')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170 elif field['type'] == 'textarea':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 field['width'] = config.getint(name + '.cols')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 field['height'] = config.getint(name + '.rows')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 fields.append(field)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175 fields.sort(lambda x, y: cmp(x['order'], y['order']))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 return fields
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 # IPermissionRequestor methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180 def get_permission_actions(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 return ['TICKET_APPEND', 'TICKET_CREATE', 'TICKET_CHGPROP',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182 'TICKET_VIEW',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 ('TICKET_MODIFY', ['TICKET_APPEND', 'TICKET_CHGPROP']),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184 ('TICKET_ADMIN', ['TICKET_CREATE', 'TICKET_MODIFY',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 'TICKET_VIEW'])]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187 # IWikiSyntaxProvider methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 def get_link_resolvers(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 return [('bug', self._format_link),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191 ('ticket', self._format_link),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 ('comment', self._format_comment_link)]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194 def get_wiki_syntax(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 yield (
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 # matches #... but not &#... (HTML entity)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 r"!?(?<!&)#"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198 # optional intertrac shorthand #T... + digits
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 r"(?P<it_ticket>%s)\d+" % Formatter.INTERTRAC_SCHEME,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200 lambda x, y, z: self._format_link(x, 'ticket', y[1:], y, z))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 def _format_link(self, formatter, ns, target, label, fullmatch=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203 intertrac = formatter.shorthand_intertrac_helper(ns, target, label,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 fullmatch)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 if intertrac:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 return intertrac
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 cursor = formatter.db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209 cursor.execute("SELECT summary,status FROM ticket WHERE id=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 (str(int(target)),))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 row = cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 if row:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213 return html.A(label, class_='%s ticket' % row[1],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 title=shorten_line(row[0]) + ' (%s)' % row[1],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 href=formatter.href.ticket(target))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216 except ValueError:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217 pass
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218 return html.A(label, class_='missing ticket', rel='nofollow',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219 href=formatter.href.ticket(target))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221 def _format_comment_link(self, formatter, ns, target, label):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222 type, id, cnum = 'ticket', '1', 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223 href = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224 if ':' in target:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225 elts = target.split(':')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226 if len(elts) == 3:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227 type, id, cnum = elts
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228 href = formatter.href(type, id)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 # FIXME: the formatter should know which object the text being
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231 # formatted belongs to
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 if formatter.req:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233 path_info = formatter.req.path_info.strip('/').split('/', 2)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234 if len(path_info) == 2:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235 type, id = path_info[:2]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 href = formatter.href(type, id)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237 cnum = target
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238 if href:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239 return html.A(label, href="%s#comment:%s" % (href, cnum),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240 title="Comment %s for %s:%s" % (cnum, type, id))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242 return label
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
243
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
244 # ISearchSource methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
245
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
246 def get_search_filters(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
247 if req.perm.has_permission('TICKET_VIEW'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
248 yield ('ticket', 'Tickets')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
249
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
250 def get_search_results(self, req, terms, filters):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
251 if not 'ticket' in filters:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
252 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
253 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
254 sql, args = search_to_sql(db, ['b.newvalue'], terms)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
255 sql2, args2 = search_to_sql(db, ['summary', 'keywords', 'description',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
256 'reporter', 'cc'], terms)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
257 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
258 cursor.execute("SELECT DISTINCT a.summary,a.description,a.reporter, "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
259 "a.keywords,a.id,a.time,a.status FROM ticket a "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
260 "LEFT JOIN ticket_change b ON a.id = b.ticket "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
261 "WHERE (b.field='comment' AND %s ) OR %s" % (sql, sql2),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
262 args + args2)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
263 for summary, desc, author, keywords, tid, date, status in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
264 ticket = '#%d: ' % tid
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
265 if status == 'closed':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
266 ticket = Markup('<span style="text-decoration: line-through">'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
267 '#%s</span>: ', tid)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
268 yield (req.href.ticket(tid),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
269 ticket + shorten_line(summary),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
270 date, author, shorten_result(desc, terms))
Copyright (C) 2012-2017 Edgewall Software