Changeset 4087

Show
Ignore:
Timestamp:
07/30/08 14:45:35 (4 months ago)
Author:
gotoh
Message:

Fix bug of style changing.
Without this fix, changed style remains next use of macro
by overwriting global data.

Files:

Legend:

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

    r4085 r4087  
    1212[[TicketBox([report:1])]]              ... alternate format of report 
    1313[[TicketBox([report:9?name=val])]]     ... report with dynamic variable 
    14 [[TicketBox([query:status=new])]]]     ... query string 
    15 [[TicketBox({1},[query:status=new])]]  ... conbination 
     14[[TicketBox({1},#50,{2},100)]]         ... convination of above 
    1615[[TicketBox(500pt,{1})]]               ... with box width as 50 point 
    1716[[TicketBox(200px,{1})]]               ... with box width as 200 pixel 
     
    4544from trac.ticket.report import ReportModule 
    4645from trac.ticket.model import Ticket 
    47 from trac.ticket.query import Query 
    4846 
    4947## default style values 
    50 styles = { "float": "right", 
    51            "background": "#f7f7f0", 
    52            "width": "25%", 
    53            
     48default_styles = { "float": "right", 
     49                   "background": "#f7f7f0", 
     50                   "width": "25%", 
     51                  
    5452 
    5553args_pat = [r"#?(?P<tktnum>\d+)", 
    5654            r"{(?P<rptnum>\d+)}", 
    5755            r"\[report:(?P<rptnum2>\d+)(?P<dv>\?.*)?\]", 
    58             r"\[query:(?P<query>[^\]]*)\]", 
    5956            r"(?P<width>\d+(pt|px|%))", 
    6057            r"(?P<title>'[^']*'|\"[^\"]*\")", 
     
    142139    env = formatter.env 
    143140    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  
    152 def doit(req, env, args, db): 
    153141    items = [] 
    154142    summary = None 
     
    158146    nosort = False 
    159147    title = "Tickets" 
     148    styles = default_styles.copy() 
    160149    args_re = re.compile("^(?:" + string.join(args_pat, "|") + ")$") 
    161150    # process options first 
     
    184173    # pick up ticket numbers and report numbers 
    185174    for arg in args: 
    186         sql = None 
    187         params = [] 
    188175        match = args_re.match(arg) 
    189         id_name = ticket 
    190         sidx = iidx = -1 
    191176        if not match: 
    192177            continue 
    193178        elif match.group('tktnum'): 
    194179            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' 
    199180        elif match.group('rptnum') or match.group('rptnum2'): 
    200181            num = match.group('rptnum') or match.group('rptnum2') 
     182            dv = {} 
     183            # username, do not override if specified 
     184            if not dv.has_key('USER'): 
     185                dv['USER'] = req.authname 
     186            if match.group('dv'): 
     187                for expr in string.split(match.group('dv')[1:], '&'): 
     188                    k, v = string.split(expr, '=') 
     189                    dv[k] = v 
    201190            #env.log.debug('dynamic variables = %s' % dv) 
     191            db = env.get_db_cnx() 
    202192            curs = db.cursor() 
    203193            try: 
    204194                curs.execute('SELECT query FROM report WHERE id=%s' % num) 
    205                 rows = curs.fetchall() 
    206                 if len(rows) == 0: 
    207                     raise Exception("No such report: %s"  % num) 
    208                 sql = rows[0][0] 
    209             finally: 
    210                 curs.close() 
    211             if sql: 
    212                 sql = sql.strip() 
    213                 if sql.lower().startswith("query:"): 
    214                     if sql.lower().startswith('query:?'): 
    215                         raise Exception('URL style of query string is not supported.') 
    216                     q = Query.from_string(env, sql[6:]) 
    217                     sql, params = q.get_sql(req) 
    218                     id_name = 'id' 
    219         if sql: 
    220             if not params: 
    221                 # handle dynamic variables 
     195                (query,) = curs.fetchone() 
     196                # replace dynamic variables with sql_sub_vars() 
    222197                # NOTE: sql_sub_vars() takes different arguments in 
    223198                #       several trac versions. 
     
    225200                #       For 0.10.x, arguments are (req, query, args, db) 
    226201                #       For 0.11 or later, arguments are (query, args, db) 
    227                 dv = ReportModule(env).get_var_args(req) 
    228                 sql, params = ReportModule(env).sql_sub_vars(sql, dv, db) 
    229             try: 
    230                 #env.log.debug('sql = %s' % sql) 
    231                 curs = db.cursor() 
    232                 curs.execute(sql, params) 
     202                query, dv = ReportModule(env).sql_sub_vars(query, dv, db) 
     203                #env.log.debug('query = %s' % query) 
     204                curs.execute(query, dv) 
    233205                rows = curs.fetchall() 
    234206                if rows: 
    235207                    descriptions = [desc[0] for desc in curs.description] 
    236208                    try: 
    237                         iidx = descriptions.index(id_name
     209                        idx = descriptions.index(ticket
    238210                    except: 
    239                         raise Exception('No such column for ticket number: %r' 
    240                                         % id_name
     211                        raise Exception('No such column for ticket: %r' 
     212                                        % ticket
    241213                    if summary: 
    242214                        try: 
     
    246218                                            % summary) 
    247219                    for row in rows: 
    248                         items.append(row[iidx]) 
    249                         if summary and 0 <= sidx
    250                             summaries[row[iidx]] = row[sidx] 
     220                        items.append(row[idx]) 
     221                        if summary
     222                            summaries[row[idx]] = row[sidx] 
    251223            finally: 
    252                 curs.close() 
    253  
     224                if not hasattr(env, 'get_cnx_pool'): 
     225                    # without db connection pool, we should close db. 
     226                    curs.close() 
     227                    db.close() 
    254228    if summary: 
    255229        # get summary text 
     
    269243        html = string.join([wiki_to_oneliner("%s (#%d)" % (summaries[n],n), 
    270244                                             env, 
    271                                              db
    272                                              req=req) for n in items], "<br>") 
     245                                             env.get_db_cnx()
     246                                             req=formatter.req) for n in items], "<br>") 
    273247    else: 
    274248        html = wiki_to_oneliner(string.join(["#%d" % c for c in items], ", "), 
    275                                 env, db, req=req) 
     249                                env, env.get_db_cnx(), req=formatter.req) 
    276250    if html != '': 
    277251        try: 
     
    279253        except: 
    280254            pass 
    281         sty = styles.copy() 
    282255        if inline: 
    283256            for key in ['float', 'width']: 
    284                 del sty[key] 
    285         style = ';'.join(["%s:%s" % (k,v) for k,v in sty.items() if v]) 
     257                del styles[key] 
     258        style = ';'.join(["%s:%s" % (k,v) for k,v in styles.items() if v]) 
    286259        return '<fieldset class="ticketbox" style="%s"><legend>%s</legend>%s</fieldset>' % \ 
    287260               (style, title, html)