def ticket_deleted(self, tkt): db = self.env.get_db_cnx() links = TicketLinks(self.env, tkt, db) links.blocking = set() links.blocked_by = set() links.save('trac', 'Ticket #%s deleted' % tkt.id, when=None, db=db) db.commit()
def ticket_changed(self, tkt, comment, author, old_values): db = self.env.get_db_cnx() links = TicketLinks(self.env, tkt, db) links.blocking = set(self.NUMBERS_RE.findall(tkt['blocking'] or '')) links.blocked_by = set(self.NUMBERS_RE.findall(tkt['blockedby'] or '')) links.save(author, comment, tkt.time_changed, db) db.commit()
def validate_ticket(self, req, ticket): db = self.env.get_db_cnx() cursor = db.cursor() id = unicode(ticket.id) links = TicketLinks(self.env, ticket, db) links.blocking = extract_ticket_ids(ticket['blocking'] or '') links.blocked_by = extract_ticket_ids(ticket['blockedby'] or '') # Check that ticket does not have itself as a blocker if id in links.blocking | links.blocked_by: yield 'blocked_by', 'This ticket is blocking itself' return # Check that there aren't any blocked_by in blocking or their parents blocking = links.blocking.copy() while len(blocking) > 0: if len(links.blocked_by & blocking) > 0: yield 'blocked_by', 'This ticket has circular dependencies' return new_blocking = set() for link in blocking: tmp_tkt = Ticket(self.env, link) new_blocking |= TicketLinks(self.env, tmp_tkt, db).blocking blocking = new_blocking for field in ('blocking', 'blockedby'): try: ids = self.NUMBERS_RE.findall(ticket[field] or '') for id in ids[:]: cursor.execute('SELECT id FROM ticket WHERE id=%s', (id,)) row = cursor.fetchone() if row is None: ids.remove(id) ticket[field] = ', '.join(sorted(ids, key=lambda x: int(x))) except Exception, e: self.log.debug('TicketRelations: Error parsing %s "%s": %s', field, ticket[field], e) yield field, 'Not a valid list of ticket IDs'
def _prepare_links(self, tkt, db): links = TicketLinks(self.env, tkt, db) links.blocking = set(int(n) for n in self.NUMBERS_RE.findall(tkt['blocking'] or '')) links.blocked_by = set(int(n) for n in self.NUMBERS_RE.findall(tkt['blockedby'] or '')) return links