def get_timeline_events(self, req, start, stop, filters): if 'ticket_details' in filters: db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute( "SELECT tc.time,tc.ticket,t.type,tc.field, " " tc.oldvalue,tc.newvalue,tc.author,t.summary " "FROM ticket_change tc" " INNER JOIN ticket t ON t.id = tc.ticket " "AND tc.time>=%s AND tc.time<=%s ORDER BY tc.time" % (start, stop)) previous_update = None updates = [] ticket_change = False for time, id, type, field, oldvalue, newvalue, author, summary in cursor: if not previous_update or (time, id, author) != previous_update[:3]: if previous_update and not ticket_change: updates.append( (previous_update, field_changes, comment)) ticket_change = False field_changes = [] comment = '' previous_update = (time, id, author, type, summary) if field == 'comment': comment = newvalue elif field == 'status' and newvalue in ['reopened', 'closed']: ticket_change = True else: field_changes.append(field) if previous_update and not ticket_change: updates.append((previous_update, field_changes, comment)) absurls = req.args.get('format') == 'rss' # Kludge for (t, id, author, type, summary), field_changes, comment in updates: if absurls: href = self.env.abs_href.ticket(id) else: href = self.env.href.ticket(id) title = util.Markup( 'Ticket <em title="%s">#%s</em> (%s) ' 'updated by %s', summary, id, type, author) message = util.Markup() if len(field_changes) > 0: message = util.Markup(', '.join(field_changes) + \ ' changed.<br />') message += wiki_to_oneliner(comment, self.env, db, shorten=True, absurls=absurls) yield 'editedticket', href, title, t, author, message
def get_timeline_events(self, req, start, stop, filters): if 'changeset' in filters: format = req.args.get('format') show_files = int( self.config.get('timeline', 'changeset_show_files')) db = self.env.get_db_cnx() repos = self.env.get_repository() authzperm = SubversionAuthorizer(self.env, req.authname) rev = repos.youngest_rev while rev: if not authzperm.has_permission_for_changeset(rev): rev = repos.previous_rev(rev) continue chgset = repos.get_changeset(rev) if chgset.date < start: return if chgset.date < stop: message = chgset.message or '--' if format == 'rss': title = util.Markup('Changeset <em>[%s]</em>: %s', chgset.rev, util.shorten_line(message)) href = self.env.abs_href.changeset(chgset.rev) message = wiki_to_html(message, self.env, req, db, absurls=True) else: title = util.Markup('Changeset <em>[%s]</em> by %s', chgset.rev, chgset.author) href = self.env.href.changeset(chgset.rev) message = wiki_to_oneliner(message, self.env, db, shorten=True) if show_files: files = [] for chg in chgset.get_changes(): if show_files > 0 and len(files) >= show_files: files.append('...') break files.append('<span class="%s">%s</span>' % (chg[2], util.escape(chg[0]))) message = '<span class="changes">' + ', '.join(files) +\ '</span>: ' + message yield 'changeset', href, title, chgset.date, chgset.author,\ util.Markup(message) rev = repos.previous_rev(rev)
def _fetch_file(self, id): cursor = self.db.cursor() cursor.execute( "SELECT id, release, name, notes, sort, timestamp, architecture " "FROM downloader_file " "WHERE id = %s", (id, )) record = cursor.fetchone() if not record: raise TracError('File with id ' + str(id) + ' not found.') self.id = record[0] self.release = record[1] self.name = record[2] self.name_disp = self.name self.notes = record[3] self.sort = record[4] self.timestamp = record[5] self.architecture = record[6] self.is_new = False self.name_disp = replace(self.name_disp, '+', '+​') self.name_disp = replace(self.name_disp, '_', '_​') self.name_disp = replace(self.name_disp, '.', '.​') self.name_disp = replace(self.name_disp, '-', '-​') self.name_disp = util.Markup(self.name_disp) # Set file path self._set_file_path()
def get_method_string(self, req, get_attrs=None): """ Gets string to use in url like getattr attributes which contains all attributes actually given by GET method listed in self.get_attrs """ if not hasattr(self, 'get_attrs') and not get_attrs: return '' if hasattr(self, 'get_attrs'): get_attrs = self.get_attrs lst = [] for item in get_attrs: if req.args.has_key(item): lst.append(str(item) + '=' + str(req.args.get(item))) if len(lst): return util.Markup('?' + join(lst, "&")) else: return ''
def _render_stats_table(self, req): """Renders whole stats table (gets all its data).""" ## Head self._render_stats_table_head(req) ## Body # Get list of downloads according to sort and page per_page = self.config.get('downloader', 'stats_per_page') try: per_page = int(per_page) except ValueError: self.config.remove('downloader', 'stats_per_page') per_page = int(self.config.get('downloader', 'stats_per_page')) req.hdf['stats.per_page'] = per_page if not req.args.get('page'): page = 1 else: try: page = int(req.args.get('page')) except ValueError: page = 1 # Render all setting if req.args.has_key('renderall'): page = 1 per_page = None # Fetch list of donwnloads rec_count, downloads = DownloadData.fetch_downloads_list( self.env, req, self.order, self.desc, per_page, page) rows = [] for dwn in downloads: file = File(self.env, dwn.file_id) act_show_href = self.env.href.admin(self.cat, self.page, req.args.get('page_part'), page, 'show', dwn.id) act_show = util.Markup('<a href="%s">show</a>' % (act_show_href \ + self.get_method_string(req))) act_del_href = self.env.href.admin(self.cat, self.page, req.args.get('page_part'), page, 'really_delete', dwn.id) act_del = util.Markup('<a href="%s">delete</a>' % (act_del_href \ + self.get_method_string(req))) row = { 'id': dwn.id, 'timestamp': util.format_datetime(dwn.timestamp), 'file_id': dwn.file_id, 'file_name': file.name_disp, 'actions': act_show + util.Markup(' | ') + act_del } for key, attr in dwn.attr.iteritems(): row[key] = attr rows.append(row) req.hdf['stats.rows'] = rows # Render in other formats if req.args.has_key('format'): format = req.args.get('format') if format == 'csv': return self._render_stats_table_special( req, self.stats_head, rows) if format == 'tab': return self._render_stats_table_special( req, self.stats_head, rows, "\t", '') # List of pges page_cnt = math.ceil(rec_count * 1.0 / per_page) pg_lst = [] for num in range(1, page_cnt + 1): href = self.env.href.admin(self.cat, self.page, req.args.get('page_part'), str(num)) href += self.get_method_string(req) pg_lst.append([href, num]) req.hdf['stats.pg_lst'] = pg_lst req.hdf['stats.pg_act'] = page # Links to alternative formats of this table self.add_alternate_links(req) # Order in table head req.hdf['stats.order'] = self.order if self.desc: req.hdf['stats.desc'] = 1 req.hdf['datetime_hint'] = util.get_datetime_format_hint() return 'admin_downloader_stats.cs', None
def get_navigation_items(self, req): if not req.perm.has_permission('TICKET_CREATE'): return yield ('mainnav', 'newticket', util.Markup('<a href="%s" accesskey="7">New Ticket</a>', self.env.href.newticket()))
def get_timeline_events(self, req, start, stop, filters): if 'ticket' in filters: format = req.args.get('format') sql = [] # New tickets sql.append("SELECT time,id,'','new',type,summary,reporter,summary" " FROM ticket WHERE time>=%s AND time<=%s") # Reopened tickets sql.append( "SELECT t1.time,t1.ticket,'','reopened',t.type," " t2.newvalue,t1.author,t.summary " " FROM ticket_change t1" " LEFT OUTER JOIN ticket_change t2 ON (t1.time=t2.time" " AND t1.ticket=t2.ticket AND t2.field='comment')" " LEFT JOIN ticket t on t.id = t1.ticket " " WHERE t1.field='status' AND t1.newvalue='reopened'" " AND t1.time>=%s AND t1.time<=%s") # Closed tickets sql.append("SELECT t1.time,t1.ticket,t2.newvalue,'closed',t.type," " t3.newvalue,t1.author,t.summary" " FROM ticket_change t1" " INNER JOIN ticket_change t2 ON t1.ticket=t2.ticket" " AND t1.time=t2.time" " LEFT OUTER JOIN ticket_change t3 ON t1.time=t3.time" " AND t1.ticket=t3.ticket AND t3.field='comment'" " LEFT JOIN ticket t on t.id = t1.ticket " " WHERE t1.field='status' AND t1.newvalue='closed'" " AND t2.field='resolution'" " AND t1.time>=%s AND t1.time<=%s") db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute(" UNION ALL ".join(sql), (start, stop, start, stop, start, stop)) kinds = { 'new': 'newticket', 'reopened': 'newticket', 'closed': 'closedticket' } verbs = { 'new': 'created', 'reopened': 'reopened', 'closed': 'closed' } for t, id, resolution, status, type, message, author, summary \ in cursor: title = util.Markup( 'Ticket <em title="%s">#%s</em> (%s) %s by ' '%s', summary, id, type, verbs[status], author) if format == 'rss': href = self.env.abs_href.ticket(id) if status != 'new': message = wiki_to_html(message or '--', self.env, req, db) else: message = util.escape(message) else: href = self.env.href.ticket(id) if status != 'new': message = util.Markup(': ').join( filter(None, [ resolution, wiki_to_oneliner( message, self.env, db, shorten=True) ])) else: message = util.escape(util.shorten_line(message)) yield kinds[status], href, title, t, author, message
def get_navigation_items(self, req): if not req.perm.has_permission (self.actionPermission): return yield 'mainnav', 'autotrac', util.Markup('<a href="%s">Ticket Inbox</a>', self.env.href.autotrac())