Example #1
0
    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
Example #2
0
    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)
Example #3
0
    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, '+', '+&#8203;')
        self.name_disp = replace(self.name_disp, '_', '_&#8203;')
        self.name_disp = replace(self.name_disp, '.', '.&#8203;')
        self.name_disp = replace(self.name_disp, '-', '-&#8203;')
        self.name_disp = util.Markup(self.name_disp)

        # Set file path
        self._set_file_path()
Example #4
0
    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 ''
Example #5
0
    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
Example #6
0
 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()))
Example #7
0
    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
Example #8
0
 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())