Esempio n. 1
0
 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')
Esempio n. 2
0
    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')
Esempio n. 3
0
 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
Esempio n. 4
0
 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]
Esempio n. 5
0
    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)
Esempio n. 6
0
    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()
Esempio n. 7
0
    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)
Esempio n. 8
0
    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
Esempio n. 9
0
    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')
Esempio n. 10
0
    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')
Esempio n. 11
0
    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