def render_editor(self, id=None): if not id: milestone = {'name': '', 'date': '', 'descr': ''} self.req.hdf.setValue('title', 'New Milestone') self.req.hdf.setValue('milestone.mode', 'new') else: milestone = self.get_milestone(id) self.req.hdf.setValue('title', 'Milestone %s' % milestone['name']) self.req.hdf.setValue('milestone.mode', 'edit') add_to_hdf(milestone, self.req.hdf, 'milestone')
def _render_editor(self, constraints, order, desc): self.req.hdf.setValue('title', 'Custom Query') util.add_to_hdf(constraints, self.req.hdf, 'query.constraints') self.req.hdf.setValue('query.order', order or 'priority') if desc: self.req.hdf.setValue('query.desc', '1') def add_options(field, constraints, prefix, cursor, sql): options = [] check = constraints.has_key(field) cursor.execute(sql) while 1: row = cursor.fetchone() if not row: break option = {'name': row[0]} if check and (row[0] in constraints[field]): option['selected'] = 1 options.append(option) util.add_to_hdf(options, self.req.hdf, prefix + field) if check: del constraints[field] cursor = self.db.cursor() add_options( 'status', constraints, 'query.options.', cursor, "SELECT name FROM enum WHERE type='status' ORDER BY value") add_options( 'resolution', constraints, 'query.options.', cursor, "SELECT name FROM enum WHERE type='resolution' ORDER BY value") add_options('component', constraints, 'query.options.', cursor, "SELECT name FROM component ORDER BY name") add_options('milestone', constraints, 'query.options.', cursor, "SELECT name FROM milestone ORDER BY name") add_options('version', constraints, 'query.options.', cursor, "SELECT name FROM version ORDER BY name") add_options( 'priority', constraints, 'query.options.', cursor, "SELECT name FROM enum WHERE type='priority' ORDER BY value") add_options( 'severity', constraints, 'query.options.', cursor, "SELECT name FROM enum WHERE type='severity' ORDER BY value") custom_fields = get_custom_fields(self.env) for custom in custom_fields: if custom['type'] == 'select' or custom['type'] == 'radio': check = constraints.has_key(custom['name']) options = filter(None, custom['options']) for i in range(len(options)): options[i] = {'name': options[i]} if check and (options[i]['name'] in constraints[custom['name']]): options[i]['selected'] = 1 custom['options'] = options util.add_to_hdf(custom_fields, self.req.hdf, 'query.custom')
def run(self): core.populate_hdf(self.req.hdf, self.env, self.db, self.req) self.req.hdf.setValue('trac.active_module', self._name) if self.args.has_key('format'): disp = getattr(self, 'display_' + self.args.get('format')) else: disp = self.display self.add_default_links() try: self.render() add_to_hdf(self.links, self.req.hdf, 'links') disp() except core.RedirectException: pass
def add_options(field, constraints, prefix, cursor, sql): options = [] check = constraints.has_key(field) cursor.execute(sql) while 1: row = cursor.fetchone() if not row: break option = {'name': row[0]} if check and (row[0] in constraints[field]): option['selected'] = 1 options.append(option) util.add_to_hdf(options, self.req.hdf, prefix + field) if check: del constraints[field]
def _write_block(self, prefix, dtype, old=None, new=None): self.hdf.setValue(prefix + '.type', dtype) self.hdf.setValue(prefix + '.base.offset', str(self.offset_base)) self.hdf.setValue(prefix + '.changed.offset', str(self.offset_changed)) if dtype == 'mod' and len(old) == len(new) == 1: self._write_line(prefix, old[0], new[0]) return if old: add_to_hdf([self._escape(line) for line in old], self.hdf, prefix + '.base.lines') self.offset_base += len(old) if new: add_to_hdf([self._escape(line) for line in new], self.hdf, prefix + '.changed.lines') self.offset_changed += len(new)
def render_confirm(self, id): milestone = self.get_milestone(id) self.req.hdf.setValue('title', 'Milestone %s' % milestone['name']) self.req.hdf.setValue('milestone.mode', 'delete') add_to_hdf(milestone, self.req.hdf, 'milestone') cursor = self.db.cursor() cursor.execute("SELECT name FROM milestone " "WHERE name != '' ORDER BY name") milestones = [] milestone_no = 0 while 1: row = cursor.fetchone() if not row: break self.req.hdf.setValue('milestones.%d' % milestone_no, row['name']) milestone_no += 1 cursor.close()
def render(self): self.perm.assert_permission(perm.TICKET_CREATE) if self.args.has_key('create'): self.create_ticket() ticket = Ticket() ticket.populate(self.args) ticket.setdefault('component', self.env.get_config('ticket', 'default_component')) ticket.setdefault('milestone', self.env.get_config('ticket', 'default_milestone')) ticket.setdefault('priority', self.env.get_config('ticket', 'default_priority')) ticket.setdefault('severity', self.env.get_config('ticket', 'default_severity')) ticket.setdefault('version', self.env.get_config('ticket', 'default_version')) ticket.setdefault('reporter', util.get_reporter_id(self.req)) if ticket.has_key('description'): self.req.hdf.setValue( 'newticket.description_preview', wiki_to_html(ticket['description'], self.req.hdf, self.env, self.db)) self.req.hdf.setValue('title', 'New Ticket') evals = util.mydict( zip(ticket.keys(), map(lambda x: util.escape(x), ticket.values()))) util.add_to_hdf(evals, self.req.hdf, 'newticket') util.sql_to_hdf(self.db, 'SELECT name FROM component ORDER BY name', self.req.hdf, 'newticket.components') util.sql_to_hdf(self.db, 'SELECT name FROM milestone ORDER BY name', self.req.hdf, 'newticket.milestones') util.sql_to_hdf(self.db, 'SELECT name FROM version ORDER BY name', self.req.hdf, 'newticket.versions') insert_custom_fields(self.env, self.req.hdf, ticket)
def render_view(self, id): if self.perm.has_permission(perm.MILESTONE_DELETE): self.req.hdf.setValue('milestone.href.delete', self.env.href.milestone(id, 'delete')) if self.perm.has_permission(perm.MILESTONE_MODIFY): self.req.hdf.setValue('milestone.href.edit', self.env.href.milestone(id, 'edit')) milestone = self.get_milestone(id) self.req.hdf.setValue('title', 'Milestone %s' % milestone['name']) self.req.hdf.setValue('milestone.mode', 'view') add_to_hdf(milestone, self.req.hdf, 'milestone') available_groups = [ 'component', 'version', 'severity', 'priority', 'owner' ] available_groups += [ f['name'] for f in get_custom_fields(self.env) if f['type'] == 'select' or f['type'] == 'radio' ] add_to_hdf(available_groups, self.req.hdf, 'milestone.stats.available_groups') by = self.args.get('by', 'component') self.req.hdf.setValue('milestone.stats.grouped_by', by) tickets = get_tickets_for_milestone(self.env, self.db, id, by) stats = calc_ticket_stats(tickets) add_to_hdf(stats, self.req.hdf, 'milestone.stats') queries = get_query_links(self.env, milestone['name']) add_to_hdf(queries, self.req.hdf, 'milestone.queries') showempty = self.args.has_key('showempty') if showempty: self.req.hdf.setValue('milestone.stats.show_empty', '1') groups = self.get_groups(by) group_no = 0 for group in groups: group_tickets = [t for t in tickets if t[by] == group] if not showempty and not group_tickets: continue prefix = 'milestone.stats.groups.%s' % group_no self.req.hdf.setValue('%s.name' % prefix, group) percent_total = 0 if len(tickets) > 0: percent_total = float(len(group_tickets)) / float(len(tickets)) self.req.hdf.setValue('%s.percent_total' % prefix, str(percent_total * 100)) stats = calc_ticket_stats(group_tickets) add_to_hdf(stats, self.req.hdf, prefix) queries = get_query_links(self.env, milestone['name'], by, group) add_to_hdf(queries, self.req.hdf, '%s.queries' % prefix) group_no += 1
def insert_ticket_data(self, hdf, id, ticket, reporter_id): """Insert ticket data into the hdf""" evals = util.mydict( zip(ticket.keys(), map(lambda x: util.escape(x), ticket.values()))) util.add_to_hdf(evals, self.req.hdf, 'ticket') util.sql_to_hdf(self.db, 'SELECT name FROM component ORDER BY name', self.req.hdf, 'ticket.components') util.sql_to_hdf(self.db, 'SELECT name FROM milestone ORDER BY name', self.req.hdf, 'ticket.milestones') util.sql_to_hdf(self.db, 'SELECT name FROM version ORDER BY name', self.req.hdf, 'ticket.versions') util.sql_to_hdf( self.db, "SELECT name FROM enum WHERE type='resolution'" " ORDER BY value", self.req.hdf, 'enums.resolution') util.hdf_add_if_missing(self.req.hdf, 'ticket.components', ticket['component']) util.hdf_add_if_missing(self.req.hdf, 'ticket.milestones', ticket['milestone']) util.hdf_add_if_missing(self.req.hdf, 'ticket.versions', ticket['version']) util.hdf_add_if_missing(self.req.hdf, 'enums.priority', ticket['priority']) util.hdf_add_if_missing(self.req.hdf, 'enums.severity', ticket['severity']) util.hdf_add_if_missing(self.req.hdf, 'enums.resolution', 'fixed') self.req.hdf.setValue('ticket.reporter_id', util.escape(reporter_id)) self.req.hdf.setValue('title', '#%d (%s)' % (id, ticket['summary'])) self.req.hdf.setValue( 'ticket.description.formatted', wiki_to_html(ticket['description'], self.req.hdf, self.env, self.db)) self.req.hdf.setValue( 'ticket.opened', time.strftime('%c', time.localtime(int(ticket['time'])))) changelog = ticket.get_changelog(self.db) curr_author = None curr_date = 0 comment = None idx = 0 for date, author, field, old, new in changelog: hdf.setValue('ticket.changes.%d.date' % idx, time.strftime('%c', time.localtime(date))) hdf.setValue('ticket.changes.%d.time' % idx, str(date)) hdf.setValue('ticket.changes.%d.author' % idx, util.escape(author)) hdf.setValue('ticket.changes.%d.field' % idx, field) hdf.setValue('ticket.changes.%d.old' % idx, util.escape(old)) if field == 'comment': hdf.setValue( 'ticket.changes.%d.new' % idx, wiki_to_html(new, self.req.hdf, self.env, self.db)) else: hdf.setValue('ticket.changes.%d.new' % idx, util.escape(new)) idx = idx + 1 insert_custom_fields(self.env, hdf, ticket) # List attached files self.env.get_attachments_hdf(self.db, 'ticket', str(id), self.req.hdf, 'ticket.attachments')
def _render_results(self, constraints, order, desc): self.req.hdf.setValue('title', 'Custom Query') self.req.hdf.setValue( 'query.edit_href', self.env.href.query(constraints, order, desc, action='edit')) # FIXME: the user should be able to configure which columns should # be displayed headers = ['id', 'summary', 'status', 'component', 'owner'] cols = headers if not 'priority' in cols: cols.append('priority') if order != 'id' and not order in Ticket.std_fields: # order by priority by default order = 'priority' for i in range(len(headers)): self.req.hdf.setValue('query.headers.%d.name' % i, headers[i]) if headers[i] == order: self.req.hdf.setValue( 'query.headers.%d.href' % i, self.env.href.query(constraints, order, not desc)) self.req.hdf.setValue('query.headers.%d.order' % i, desc and 'desc' or 'asc') else: self.req.hdf.setValue( 'query.headers.%d.href' % i, self.env.href.query(constraints, headers[i])) sql = [] sql.append("SELECT " + ", ".join(headers)) custom_fields = [f['name'] for f in get_custom_fields(self.env)] for k in [k for k in constraints.keys() if k in custom_fields]: sql.append(", %s.value AS %s" % (k, k)) sql.append(" FROM ticket") for k in [k for k in constraints.keys() if k in custom_fields]: sql.append(" LEFT OUTER JOIN ticket_custom AS %s ON " \ "(id=%s.ticket AND %s.name='%s')" % (k, k, k, k)) for col in [ c for c in ['status', 'resolution', 'priority', 'severity'] if c in cols ]: sql.append(" INNER JOIN (SELECT name AS %s_name, value AS %s_value " \ "FROM enum WHERE type='%s')" \ " ON %s_name=%s" % (col, col, col, col, col)) clauses = [] for k, v in constraints.items(): if len(v) > 1: inlist = ["'" + util.sql_escape(item) + "'" for item in v] clauses.append("%s IN (%s)" % (k, ",".join(inlist))) elif k in ['keywords', 'cc']: clauses.append("%s LIKE '%%%s%%'" % (k, util.sql_escape(v[0]))) else: clauses.append("%s='%s'" % (k, util.sql_escape(v[0]))) if clauses: sql.append(" WHERE " + " AND ".join(clauses)) if order in ['status', 'resolution', 'priority', 'severity']: sql.append(" ORDER BY %s_value" % order) else: sql.append(" ORDER BY " + order) if desc: sql.append(" DESC") sql = "".join(sql) self.log.debug("SQL Query: %s" % sql) results = self.get_results(sql) util.add_to_hdf(results, self.req.hdf, 'query.results')
def render(self): self.perm.assert_permission(perm.ROADMAP_VIEW) self.req.hdf.setValue('title', 'Roadmap') if self.perm.has_permission(perm.MILESTONE_CREATE): self.req.hdf.setValue('roadmap.href.newmilestone', self.env.href.milestone(None, 'new')) icalhref = '?format=ics' show = self.args.get('show', 'current') if show == 'all': icalhref += '&show=all' self.req.hdf.setValue('roadmap.href.list', self.env.href.roadmap()) query = "SELECT name, time, descr FROM milestone " \ "WHERE name != '' " \ "ORDER BY (IFNULL(time, 0) = 0) ASC, time ASC, name" else: self.req.hdf.setValue('roadmap.showall', '1') self.req.hdf.setValue('roadmap.href.list', self.env.href.roadmap('all')) query = "SELECT name, time, descr FROM milestone " \ "WHERE name != '' " \ "AND (time IS NULL OR time = 0 OR time > %d) " \ "ORDER BY (IFNULL(time, 0) = 0) ASC, time ASC, name" % time() if self.req.authname and self.req.authname != 'anonymous': icalhref += '&user='******'alternate', icalhref, 'iCalendar', 'text/calendar', 'ics') cursor = self.db.cursor() cursor.execute(query) self.milestones = [] while 1: row = cursor.fetchone() if not row: break milestone = { 'name': row['name'], 'href': self.env.href.milestone(row['name']), 'time': row['time'] and int(row['time']) } descr = row['descr'] if descr: milestone['descr'] = wiki_to_html(descr, self.req.hdf, self.env, self.db) milestone['descr_text'] = descr if milestone['time'] > 0: milestone['date'] = strftime('%x', localtime(milestone['time'])) self.milestones.append(milestone) cursor.close() add_to_hdf(self.milestones, self.req.hdf, 'roadmap.milestones') milestone_no = 0 for milestone in self.milestones: tickets = Milestone.get_tickets_for_milestone(self.env, self.db, milestone['name'], 'owner') stats = Milestone.calc_ticket_stats(tickets) add_to_hdf(stats, self.req.hdf, 'roadmap.milestones.%d.stats' % int(milestone_no)) queries = Milestone.get_query_links(self.env, milestone['name']) add_to_hdf(queries, self.req.hdf, 'roadmap.milestones.%d.queries' % int(milestone_no)) milestone['tickets'] = tickets milestone_no += 1