Changeset 4084

Show
Ignore:
Timestamp:
07/30/08 05:54:12 (5 months ago)
Author:
gotoh
Message:

Support query string in macro argument and report definition.
See TracQuery for the syntax of query string.
Note that url style of query string is not yet supported.
So if you use it in report, you cannot refer it.

Example:

[[TicketBox("Unassigned tickets", [query:status=new],inline,summary)]]

Close #754.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ticketboxmacro/0.11/TicketBox.py

    r4083 r4084  
    1212[[TicketBox([report:1])]]              ... alternate format of report 
    1313[[TicketBox([report:9?name=val])]]     ... report with dynamic variable 
    14 [[TicketBox({1},#50,{2},100)]]         ... convination of above 
     14[[TicketBox([query:status=new])]]]     ... query string 
     15[[TicketBox({1},[query:status=new])]]  ... conbination 
    1516[[TicketBox(500pt,{1})]]               ... with box width as 50 point 
    1617[[TicketBox(200px,{1})]]               ... with box width as 200 pixel 
     
    4445from trac.ticket.report import ReportModule 
    4546from trac.ticket.model import Ticket 
     47from trac.ticket.query import Query 
    4648 
    4749## default style values 
     
    5456            r"{(?P<rptnum>\d+)}", 
    5557            r"\[report:(?P<rptnum2>\d+)(?P<dv>\?.*)?\]", 
     58            r"\[query:(?P<query>[^\]]*)\]", 
    5659            r"(?P<width>\d+(pt|px|%))", 
    5760            r"(?P<title>'[^']*'|\"[^\"]*\")", 
     
    139142    env = formatter.env 
    140143    args = parse(content or '') 
     144    try: 
     145        db = env.get_db_cnx() 
     146        return doit(req, env, args, db) 
     147    finally: 
     148        if db and not hasattr(env, 'get_cnx_pool'): 
     149            # without db connection pool, we should close db. 
     150            db.close() 
     151 
     152def doit(req, env, args, db): 
    141153    items = [] 
    142154    summary = None 
     
    172184    # pick up ticket numbers and report numbers 
    173185    for arg in args: 
     186        sql = None 
     187        params = [] 
    174188        match = args_re.match(arg) 
     189        id_name = ticket 
     190        sidx = iidx = -1 
    175191        if not match: 
    176192            continue 
    177193        elif match.group('tktnum'): 
    178194            items.append(int(match.group('tktnum'))) 
     195        elif match.group('query'): 
     196            q = Query.from_string(env, match.group('query')) 
     197            sql, params = q.get_sql(req) 
     198            id_name = 'id' 
    179199        elif match.group('rptnum') or match.group('rptnum2'): 
    180200            num = match.group('rptnum') or match.group('rptnum2') 
    181             dv = {} 
    182             # username, do not override if specified 
    183             if not dv.has_key('USER'): 
    184                 dv['USER'] = req.authname 
    185             if match.group('dv'): 
    186                 for expr in string.split(match.group('dv')[1:], '&'): 
    187                     k, v = string.split(expr, '=') 
    188                     dv[k] = v 
    189201            #env.log.debug('dynamic variables = %s' % dv) 
    190             db = env.get_db_cnx() 
    191202            curs = db.cursor() 
    192203            try: 
    193204                curs.execute('SELECT query FROM report WHERE id=%s' % num) 
    194                 (query,) = curs.fetchone() 
    195                 # replace dynamic variables with sql_sub_vars() 
     205                (sql,) = curs.fetchone() 
     206            finally: 
     207                curs.close() 
     208            if sql: 
     209                sql = sql.strip() 
     210                if sql.lower().startswith("query:"): 
     211                    if sql.lower().startswith('query:?'): 
     212                        raise Exception('URL style of query string is not supported.') 
     213                    q = Query.from_string(env, sql[6:]) 
     214                    sql, params = q.get_sql(req) 
     215                    id_name = 'id' 
     216        if sql: 
     217            if not params: 
     218                # handle dynamic variables 
    196219                # NOTE: sql_sub_vars() takes different arguments in 
    197220                #       several trac versions. 
     
    199222                #       For 0.10.x, arguments are (req, query, args, db) 
    200223                #       For 0.11 or later, arguments are (query, args, db) 
    201                 query, dv = ReportModule(env).sql_sub_vars(query, dv, db) 
    202                 #env.log.debug('query = %s' % query) 
    203                 curs.execute(query, dv) 
     224                dv = ReportModule(env).get_var_args(req) 
     225                sql, params = ReportModule(env).sql_sub_vars(sql, dv, db) 
     226            try: 
     227                #env.log.debug('sql = %s' % sql) 
     228                curs = db.cursor() 
     229                curs.execute(sql, params) 
    204230                rows = curs.fetchall() 
    205231                if rows: 
    206232                    descriptions = [desc[0] for desc in curs.description] 
    207233                    try: 
    208                         idx = descriptions.index(ticket
     234                        iidx = descriptions.index(id_name
    209235                    except: 
    210                         raise Exception('No such column for ticket: %r' 
    211                                         % ticket
     236                        raise Exception('No such column for ticket number: %r' 
     237                                        % id_name
    212238                    if summary: 
    213239                        try: 
     
    217243                                            % summary) 
    218244                    for row in rows: 
    219                         items.append(row[idx]) 
    220                         if summary
    221                             summaries[row[idx]] = row[sidx] 
     245                        items.append(row[iidx]) 
     246                        if summary and 0 <= sidx
     247                            summaries[row[iidx]] = row[sidx] 
    222248            finally: 
    223                 if not hasattr(env, 'get_cnx_pool'): 
    224                     # without db connection pool, we should close db. 
    225                     curs.close() 
    226                     db.close() 
     249                curs.close() 
     250 
    227251    if summary: 
    228252        # get summary text 
     
    242266        html = string.join([wiki_to_oneliner("%s (#%d)" % (summaries[n],n), 
    243267                                             env, 
    244                                              env.get_db_cnx()
    245                                              req=formatter.req) for n in items], "<br>") 
     268                                             db
     269                                             req=req) for n in items], "<br>") 
    246270    else: 
    247271        html = wiki_to_oneliner(string.join(["#%d" % c for c in items], ", "), 
    248                                 env, env.get_db_cnx(), req=formatter.req) 
     272                                env, db, req=req) 
    249273    if html != '': 
    250274        try: