annotate examples/trac/trac/ticket/model.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-2006 Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 # Copyright (C) 2006 Christian Boos <cboos@neuf.fr>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 # Author: Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18 # Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 import time
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 import sys
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 import re
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 from trac.core import TracError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 from trac.ticket import TicketSystem
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 from trac.util import sorted, embedded_numbers
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 __all__ = ['Ticket', 'Type', 'Status', 'Resolution', 'Priority', 'Severity',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 'Component', 'Milestone', 'Version']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 class Ticket(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34 def __init__(self, env, tkt_id=None, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 self.env = env
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 self.fields = TicketSystem(self.env).get_ticket_fields()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 self.values = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 if tkt_id:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 self._fetch_ticket(tkt_id, db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 self._init_defaults(db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 self.id = self.time_created = self.time_changed = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 self._old = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 def _get_db(self, db):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 return db or self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 def _get_db_for_write(self, db):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 if db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 return (db, False)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 return (self.env.get_db_cnx(), True)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 exists = property(fget=lambda self: self.id is not None)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 def _init_defaults(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 for field in self.fields:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58 default = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 if not field.get('custom'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 default = self.env.config.get('ticket',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 'default_' + field['name'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 default = field.get('value')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 options = field.get('options')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 if default and options and default not in options:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 default_idx = int(default)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 if default_idx > len(options):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 raise ValueError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 default = options[default_idx]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 except ValueError:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 self.env.log.warning('Invalid default value for '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 'custom field "%s"'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 % field['name'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 if default:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 self.values.setdefault(field['name'], default)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 def _fetch_ticket(self, tkt_id, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 db = self._get_db(db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 # Fetch the standard ticket fields
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 std_fields = [f['name'] for f in self.fields if not f.get('custom')]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 cursor.execute("SELECT %s,time,changetime FROM ticket WHERE id=%%s"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 % ','.join(std_fields), (tkt_id,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 row = cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 if not row:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 raise TracError('Ticket %d does not exist.' % tkt_id,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 'Invalid Ticket Number')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 self.id = tkt_id
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 for i in range(len(std_fields)):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 self.values[std_fields[i]] = row[i] or ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 self.time_created = row[len(std_fields)]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95 self.time_changed = row[len(std_fields) + 1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 # Fetch custom fields if available
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 custom_fields = [f['name'] for f in self.fields if f.get('custom')]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 cursor.execute("SELECT name,value FROM ticket_custom WHERE ticket=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 (tkt_id,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 for name, value in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 if name in custom_fields:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 self.values[name] = value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 def __getitem__(self, name):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 return self.values[name]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 def __setitem__(self, name, value):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 """Log ticket modifications so the table ticket_change can be updated"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 if self.values.has_key(name) and self.values[name] == value:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112 if not self._old.has_key(name): # Changed field
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 self._old[name] = self.values.get(name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 elif self._old[name] == value: # Change of field reverted
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 del self._old[name]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 if value:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 field = [field for field in self.fields if field['name'] == name]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 if field and field[0].get('type') != 'textarea':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 value = value.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 self.values[name] = value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122 def populate(self, values):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 """Populate the ticket with 'suitable' values from a dictionary"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 field_names = [f['name'] for f in self.fields]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 for name in [name for name in values.keys() if name in field_names]:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 self[name] = values.get(name, '')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 # We have to do an extra trick to catch unchecked checkboxes
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 for name in [name for name in values.keys() if name[9:] in field_names
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 and name.startswith('checkbox_')]:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 if not values.has_key(name[9:]):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 self[name[9:]] = '0'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134 def insert(self, when=0, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 """Add ticket to database"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 assert not self.exists, 'Cannot insert an existing ticket'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 db, handle_ta = self._get_db_for_write(db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139 # Add a timestamp
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 if not when:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141 when = int(time.time())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 self.time_created = self.time_changed = when
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146 # The owner field defaults to the component owner
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 if self.values.get('component') and not self.values.get('owner'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 component = Component(self.env, self['component'], db=db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 if component.owner:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 self['owner'] = component.owner
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 except TracError, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153 # Assume that no such component exists
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 pass
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 # Insert ticket record
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 std_fields = [f['name'] for f in self.fields if not f.get('custom')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 and self.values.has_key(f['name'])]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 cursor.execute("INSERT INTO ticket (%s,time,changetime) VALUES (%s)"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 % (','.join(std_fields),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 ','.join(['%s'] * (len(std_fields) + 2))),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 [self[name] for name in std_fields] +
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 [self.time_created, self.time_changed])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 tkt_id = db.get_last_id(cursor, 'ticket')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 # Insert custom fields
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 custom_fields = [f['name'] for f in self.fields if f.get('custom')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 and self.values.has_key(f['name'])]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 if custom_fields:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170 cursor.executemany("INSERT INTO ticket_custom (ticket,name,value) "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 "VALUES (%s,%s,%s)", [(tkt_id, name, self[name])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 for name in custom_fields])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 self.id = tkt_id
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 self._old = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180 for listener in TicketSystem(self.env).change_listeners:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 listener.ticket_created(self)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 return self.id
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 def save_changes(self, author, comment, when=0, db=None, cnum=''):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187 Store ticket changes in the database. The ticket must already exist in
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188 the database.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 assert self.exists, 'Cannot update a new ticket'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 if not self._old and not comment:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 return # Not modified
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 db, handle_ta = self._get_db_for_write(db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 when = int(when or time.time())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 if self.values.has_key('component'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200 # If the component is changed on a 'new' ticket then owner field
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201 # is updated accordingly. (#623).
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 if self.values.get('status') == 'new' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203 and self._old.has_key('component') \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 and not self._old.has_key('owner'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 old_comp = Component(self.env, self._old['component'], db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 old_owner = old_comp.owner or ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 current_owner = self.values.get('owner') or ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209 if old_owner == current_owner:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 new_comp = Component(self.env, self['component'], db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 self['owner'] = new_comp.owner
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 except TracError, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213 # If the old component has been removed from the database we
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 # just leave the owner as is.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 pass
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217 # Fix up cc list separators and remove duplicates
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218 if self.values.has_key('cc'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219 cclist = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220 for cc in re.split(r'[;,\s]+', self.values['cc']):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221 if cc not in cclist:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222 cclist.append(cc)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223 self.values['cc'] = ', '.join(cclist)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225 custom_fields = [f['name'] for f in self.fields if f.get('custom')]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226 for name in self._old.keys():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227 if name in custom_fields:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228 cursor.execute("SELECT * FROM ticket_custom "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229 "WHERE ticket=%s and name=%s", (self.id, name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 if cursor.fetchone():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231 cursor.execute("UPDATE ticket_custom SET value=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 "WHERE ticket=%s AND name=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233 (self[name], self.id, name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235 cursor.execute("INSERT INTO ticket_custom (ticket,name,"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 "value) VALUES(%s,%s,%s)",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237 (self.id, name, self[name]))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239 cursor.execute("UPDATE ticket SET %s=%%s WHERE id=%%s" % name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240 (self[name], self.id))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241 cursor.execute("INSERT INTO ticket_change "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242 "(ticket,time,author,field,oldvalue,newvalue) "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
243 "VALUES (%s, %s, %s, %s, %s, %s)",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
244 (self.id, when, author, name, self._old[name],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
245 self[name]))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
246 # always save comment, even if empty (numbering support for timeline)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
247 cursor.execute("INSERT INTO ticket_change "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
248 "(ticket,time,author,field,oldvalue,newvalue) "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
249 "VALUES (%s,%s,%s,'comment',%s,%s)",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
250 (self.id, when, author, cnum, comment))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
251
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
252 cursor.execute("UPDATE ticket SET changetime=%s WHERE id=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
253 (when, self.id))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
254
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
255 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
256 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
257 self._old = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
258 self.time_changed = when
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
259
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
260 for listener in TicketSystem(self.env).change_listeners:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
261 listener.ticket_changed(self, comment, self._old)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
262
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
263 def get_changelog(self, when=0, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
264 """Return the changelog as a list of tuples of the form
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
265 (time, author, field, oldvalue, newvalue, permanent).
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
266
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
267 While the other tuple elements are quite self-explanatory,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
268 the `permanent` flag is used to distinguish collateral changes
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
269 that are not yet immutable (like attachments, currently).
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
270 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
271 db = self._get_db(db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
272 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
273 if when:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
274 cursor.execute("SELECT time,author,field,oldvalue,newvalue,1 "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
275 "FROM ticket_change WHERE ticket=%s AND time=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
276 "UNION "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
277 "SELECT time,author,'attachment',null,filename,0 "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
278 "FROM attachment WHERE id=%s AND time=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
279 "UNION "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
280 "SELECT time,author,'comment',null,description,0 "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
281 "FROM attachment WHERE id=%s AND time=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
282 "ORDER BY time",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
283 (self.id, when, str(self.id), when, self.id, when))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
284 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
285 cursor.execute("SELECT time,author,field,oldvalue,newvalue,1 "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
286 "FROM ticket_change WHERE ticket=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
287 "UNION "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
288 "SELECT time,author,'attachment',null,filename,0 "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
289 "FROM attachment WHERE id=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
290 "UNION "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
291 "SELECT time,author,'comment',null,description,0 "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
292 "FROM attachment WHERE id=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
293 "ORDER BY time", (self.id, str(self.id), self.id))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
294 log = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
295 for t, author, field, oldvalue, newvalue, permanent in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
296 log.append((int(t), author, field, oldvalue or '', newvalue or '',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
297 permanent))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
298 return log
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
299
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
300 def delete(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
301 db, handle_ta = self._get_db_for_write(db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
302 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
303 cursor.execute("DELETE FROM ticket WHERE id=%s", (self.id,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
304 cursor.execute("DELETE FROM ticket_change WHERE ticket=%s", (self.id,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
305 cursor.execute("DELETE FROM attachment "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
306 " WHERE type='ticket' and id=%s", (self.id,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
307 cursor.execute("DELETE FROM ticket_custom WHERE ticket=%s", (self.id,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
308
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
309 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
310 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
311
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
312 for listener in TicketSystem(self.env).change_listeners:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
313 listener.ticket_deleted(self)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
314
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
315
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
316 class AbstractEnum(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
317 type = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
318 ticket_col = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
319
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
320 def __init__(self, env, name=None, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
321 if not self.ticket_col:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
322 self.ticket_col = self.type
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
323 self.env = env
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
324 if name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
325 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
326 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
327 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
328 cursor.execute("SELECT value FROM enum WHERE type=%s AND name=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
329 (self.type, name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
330 row = cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
331 if not row:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
332 raise TracError, '%s %s does not exist.' % (self.type, name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
333 self.value = self._old_value = row[0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
334 self.name = self._old_name = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
335 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
336 self.value = self._old_value = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
337 self.name = self._old_name = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
338
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
339 exists = property(fget=lambda self: self._old_value is not None)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
340
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
341 def delete(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
342 assert self.exists, 'Cannot deleting non-existent %s' % self.type
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
343 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
344 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
345 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
346 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
347 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
348
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
349 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
350 self.env.log.info('Deleting %s %s' % (self.type, self.name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
351 cursor.execute("DELETE FROM enum WHERE type=%s AND value=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
352 (self.type, self._old_value))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
353
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
354 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
355 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
356 self.value = self._old_value = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
357 self.name = self._old_name = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
358
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
359 def insert(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
360 assert not self.exists, 'Cannot insert existing %s' % self.type
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
361 assert self.name, 'Cannot create %s with no name' % self.type
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
362 self.name = self.name.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
363 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
364 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
365 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
366 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
367 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
368
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
369 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
370 self.env.log.debug("Creating new %s '%s'" % (self.type, self.name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
371 if not self.value:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
372 cursor.execute(("SELECT COALESCE(MAX(%s),0) FROM enum "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
373 "WHERE type=%%s") % db.cast('value', 'int'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
374 (self.type,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
375 self.value = int(float(cursor.fetchone()[0])) + 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
376 cursor.execute("INSERT INTO enum (type,name,value) VALUES (%s,%s,%s)",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
377 (self.type, self.name, self.value))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
378
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
379 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
380 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
381 self._old_name = self.name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
382 self._old_value = self.value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
383
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
384 def update(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
385 assert self.exists, 'Cannot update non-existent %s' % self.type
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
386 assert self.name, 'Cannot update %s with no name' % self.type
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
387 self.name = self.name.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
388 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
389 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
390 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
391 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
392 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
393
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
394 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
395 self.env.log.info('Updating %s "%s"' % (self.type, self.name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
396 cursor.execute("UPDATE enum SET name=%s,value=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
397 "WHERE type=%s AND name=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
398 (self.name, self.value, self.type, self._old_name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
399 if self.name != self._old_name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
400 # Update tickets
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
401 cursor.execute("UPDATE ticket SET %s=%%s WHERE %s=%%s" %
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
402 (self.ticket_col, self.ticket_col),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
403 (self.name, self._old_name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
404
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
405 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
406 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
407 self._old_name = self.name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
408 self._old_value = self.value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
409
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
410 def select(cls, env, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
411 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
412 db = env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
413 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
414 cursor.execute("SELECT name,value FROM enum WHERE type=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
415 "ORDER BY value", (cls.type,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
416 for name, value in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
417 obj = cls(env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
418 obj.name = obj._old_name = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
419 obj.value = obj._old_value = value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
420 yield obj
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
421 select = classmethod(select)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
422
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
423
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
424 class Type(AbstractEnum):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
425 type = 'ticket_type'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
426 ticket_col = 'type'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
427
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
428
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
429 class Status(AbstractEnum):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
430 type = 'status'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
431
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
432
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
433 class Resolution(AbstractEnum):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
434 type = 'resolution'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
435
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
436
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
437 class Priority(AbstractEnum):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
438 type = 'priority'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
439
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
440
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
441 class Severity(AbstractEnum):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
442 type = 'severity'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
443
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
444
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
445 class Component(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
446
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
447 def __init__(self, env, name=None, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
448 self.env = env
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
449 if name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
450 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
451 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
452 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
453 cursor.execute("SELECT owner,description FROM component "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
454 "WHERE name=%s", (name,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
455 row = cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
456 if not row:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
457 raise TracError, 'Component %s does not exist.' % name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
458 self.name = self._old_name = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
459 self.owner = row[0] or None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
460 self.description = row[1] or ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
461 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
462 self.name = self._old_name = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
463 self.owner = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
464 self.description = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
465
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
466 exists = property(fget=lambda self: self._old_name is not None)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
467
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
468 def delete(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
469 assert self.exists, 'Cannot deleting non-existent component'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
470 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
471 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
472 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
473 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
474 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
475
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
476 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
477 self.env.log.info('Deleting component %s' % self.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
478 cursor.execute("DELETE FROM component WHERE name=%s", (self.name,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
479
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
480 self.name = self._old_name = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
481
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
482 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
483 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
484
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
485 def insert(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
486 assert not self.exists, 'Cannot insert existing component'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
487 assert self.name, 'Cannot create component with no name'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
488 self.name = self.name.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
489 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
490 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
491 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
492 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
493 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
494
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
495 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
496 self.env.log.debug("Creating new component '%s'" % self.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
497 cursor.execute("INSERT INTO component (name,owner,description) "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
498 "VALUES (%s,%s,%s)",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
499 (self.name, self.owner, self.description))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
500
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
501 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
502 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
503
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
504 def update(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
505 assert self.exists, 'Cannot update non-existent component'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
506 assert self.name, 'Cannot update component with no name'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
507 self.name = self.name.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
508 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
509 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
510 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
511 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
512 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
513
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
514 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
515 self.env.log.info('Updating component "%s"' % self.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
516 cursor.execute("UPDATE component SET name=%s,owner=%s,description=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
517 "WHERE name=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
518 (self.name, self.owner, self.description,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
519 self._old_name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
520 if self.name != self._old_name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
521 # Update tickets
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
522 cursor.execute("UPDATE ticket SET component=%s WHERE component=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
523 (self.name, self._old_name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
524 self._old_name = self.name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
525
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
526 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
527 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
528
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
529 def select(cls, env, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
530 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
531 db = env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
532 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
533 cursor.execute("SELECT name,owner,description FROM component "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
534 "ORDER BY name")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
535 for name, owner, description in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
536 component = cls(env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
537 component.name = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
538 component.owner = owner or None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
539 component.description = description or ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
540 yield component
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
541 select = classmethod(select)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
542
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
543
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
544 class Milestone(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
545
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
546 def __init__(self, env, name=None, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
547 self.env = env
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
548 if name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
549 self._fetch(name, db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
550 self._old_name = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
551 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
552 self.name = self._old_name = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
553 self.due = self.completed = 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
554 self.description = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
555
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
556 def _fetch(self, name, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
557 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
558 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
559 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
560 cursor.execute("SELECT name,due,completed,description "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
561 "FROM milestone WHERE name=%s", (name,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
562 row = cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
563 if not row:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
564 raise TracError('Milestone %s does not exist.' % name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
565 'Invalid Milestone Name')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
566 self.name = row[0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
567 self.due = row[1] and int(row[1]) or 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
568 self.completed = row[2] and int(row[2]) or 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
569 self.description = row[3] or ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
570
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
571 exists = property(fget=lambda self: self._old_name is not None)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
572 is_completed = property(fget=lambda self: self.completed != 0)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
573 is_late = property(fget=lambda self: self.due and \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
574 self.due < time.time() - 86400)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
575
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
576 def delete(self, retarget_to=None, author=None, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
577 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
578 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
579 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
580 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
581 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
582
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
583 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
584 self.env.log.info('Deleting milestone %s' % self.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
585 cursor.execute("DELETE FROM milestone WHERE name=%s", (self.name,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
586
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
587 # Retarget/reset tickets associated with this milestone
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
588 now = time.time()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
589 cursor.execute("SELECT id FROM ticket WHERE milestone=%s", (self.name,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
590 tkt_ids = [int(row[0]) for row in cursor]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
591 for tkt_id in tkt_ids:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
592 ticket = Ticket(self.env, tkt_id, db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
593 ticket['milestone'] = retarget_to
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
594 ticket.save_changes(author, 'Milestone %s deleted' % self.name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
595 now, db=db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
596
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
597 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
598 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
599
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
600 def insert(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
601 assert self.name, 'Cannot create milestone with no name'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
602 self.name = self.name.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
603 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
604 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
605 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
606 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
607 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
608
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
609 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
610 self.env.log.debug("Creating new milestone '%s'" % self.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
611 cursor.execute("INSERT INTO milestone (name,due,completed,description) "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
612 "VALUES (%s,%s,%s,%s)",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
613 (self.name, self.due, self.completed, self.description))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
614
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
615 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
616 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
617
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
618 def update(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
619 assert self.name, 'Cannot update milestone with no name'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
620 self.name = self.name.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
621 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
622 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
623 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
624 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
625 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
626
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
627 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
628 self.env.log.info('Updating milestone "%s"' % self.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
629 cursor.execute("UPDATE milestone SET name=%s,due=%s,"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
630 "completed=%s,description=%s WHERE name=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
631 (self.name, self.due, self.completed, self.description,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
632 self._old_name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
633 self.env.log.info('Updating milestone field of all tickets '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
634 'associated with milestone "%s"' % self.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
635 cursor.execute("UPDATE ticket SET milestone=%s WHERE milestone=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
636 (self.name, self._old_name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
637 self._old_name = self.name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
638
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
639 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
640 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
641
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
642 def select(cls, env, include_completed=True, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
643 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
644 db = env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
645 sql = "SELECT name,due,completed,description FROM milestone "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
646 if not include_completed:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
647 sql += "WHERE COALESCE(completed,0)=0 "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
648 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
649 cursor.execute(sql)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
650 milestones = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
651 for name,due,completed,description in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
652 milestone = Milestone(env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
653 milestone.name = milestone._old_name = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
654 milestone.due = due and int(due) or 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
655 milestone.completed = completed and int(completed) or 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
656 milestone.description = description or ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
657 milestones.append(milestone)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
658 def milestone_order(m):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
659 return (m.completed or sys.maxint,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
660 m.due or sys.maxint,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
661 embedded_numbers(m.name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
662 return sorted(milestones, key=milestone_order)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
663 select = classmethod(select)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
664
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
665
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
666 class Version(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
667
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
668 def __init__(self, env, name=None, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
669 self.env = env
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
670 if name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
671 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
672 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
673 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
674 cursor.execute("SELECT time,description FROM version "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
675 "WHERE name=%s", (name,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
676 row = cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
677 if not row:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
678 raise TracError, 'Version %s does not exist.' % name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
679 self.name = self._old_name = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
680 self.time = row[0] and int(row[0]) or None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
681 self.description = row[1] or ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
682 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
683 self.name = self._old_name = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
684 self.time = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
685 self.description = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
686
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
687 exists = property(fget=lambda self: self._old_name is not None)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
688
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
689 def delete(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
690 assert self.exists, 'Cannot deleting non-existent version'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
691 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
692 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
693 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
694 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
695 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
696
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
697 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
698 self.env.log.info('Deleting version %s' % self.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
699 cursor.execute("DELETE FROM version WHERE name=%s", (self.name,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
700
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
701 self.name = self._old_name = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
702
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
703 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
704 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
705
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
706 def insert(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
707 assert not self.exists, 'Cannot insert existing version'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
708 assert self.name, 'Cannot create version with no name'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
709 self.name = self.name.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
710 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
711 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
712 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
713 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
714 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
715
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
716 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
717 self.env.log.debug("Creating new version '%s'" % self.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
718 cursor.execute("INSERT INTO version (name,time,description) "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
719 "VALUES (%s,%s,%s)",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
720 (self.name, self.time, self.description))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
721
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
722 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
723 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
724
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
725 def update(self, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
726 assert self.exists, 'Cannot update non-existent version'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
727 assert self.name, 'Cannot update version with no name'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
728 self.name = self.name.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
729 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
730 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
731 handle_ta = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
732 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
733 handle_ta = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
734
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
735 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
736 self.env.log.info('Updating version "%s"' % self.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
737 cursor.execute("UPDATE version SET name=%s,time=%s,description=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
738 "WHERE name=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
739 (self.name, self.time, self.description,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
740 self._old_name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
741 if self.name != self._old_name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
742 # Update tickets
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
743 cursor.execute("UPDATE ticket SET version=%s WHERE version=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
744 (self.name, self._old_name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
745 self._old_name = self.name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
746
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
747 if handle_ta:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
748 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
749
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
750 def select(cls, env, db=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
751 if not db:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
752 db = env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
753 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
754 cursor.execute("SELECT name,time,description FROM version")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
755 versions = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
756 for name, time, description in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
757 version = cls(env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
758 version.name = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
759 version.time = time and int(time) or None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
760 version.description = description or ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
761 versions.append(version)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
762 def version_order(v):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
763 return (v.time or sys.maxint, embedded_numbers(v.name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
764 return sorted(versions, key=version_order, reverse=True)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
765 select = classmethod(select)
Copyright (C) 2012-2017 Edgewall Software