Changeset 4087
- Timestamp:
- 07/30/08 14:45:35 (4 months ago)
- Files:
-
- ticketboxmacro/0.11/TicketBox.py (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
ticketboxmacro/0.11/TicketBox.py
r4085 r4087 12 12 [[TicketBox([report:1])]] ... alternate format of report 13 13 [[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 16 15 [[TicketBox(500pt,{1})]] ... with box width as 50 point 17 16 [[TicketBox(200px,{1})]] ... with box width as 200 pixel … … 45 44 from trac.ticket.report import ReportModule 46 45 from trac.ticket.model import Ticket 47 from trac.ticket.query import Query48 46 49 47 ## default style values 50 styles = { "float": "right",51 "background": "#f7f7f0",52 "width": "25%",53 }48 default_styles = { "float": "right", 49 "background": "#f7f7f0", 50 "width": "25%", 51 } 54 52 55 53 args_pat = [r"#?(?P<tktnum>\d+)", 56 54 r"{(?P<rptnum>\d+)}", 57 55 r"\[report:(?P<rptnum2>\d+)(?P<dv>\?.*)?\]", 58 r"\[query:(?P<query>[^\]]*)\]",59 56 r"(?P<width>\d+(pt|px|%))", 60 57 r"(?P<title>'[^']*'|\"[^\"]*\")", … … 142 139 env = formatter.env 143 140 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):153 141 items = [] 154 142 summary = None … … 158 146 nosort = False 159 147 title = "Tickets" 148 styles = default_styles.copy() 160 149 args_re = re.compile("^(?:" + string.join(args_pat, "|") + ")$") 161 150 # process options first … … 184 173 # pick up ticket numbers and report numbers 185 174 for arg in args: 186 sql = None187 params = []188 175 match = args_re.match(arg) 189 id_name = ticket190 sidx = iidx = -1191 176 if not match: 192 177 continue 193 178 elif match.group('tktnum'): 194 179 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'199 180 elif match.group('rptnum') or match.group('rptnum2'): 200 181 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 201 190 #env.log.debug('dynamic variables = %s' % dv) 191 db = env.get_db_cnx() 202 192 curs = db.cursor() 203 193 try: 204 194 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() 222 197 # NOTE: sql_sub_vars() takes different arguments in 223 198 # several trac versions. … … 225 200 # For 0.10.x, arguments are (req, query, args, db) 226 201 # 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) 233 205 rows = curs.fetchall() 234 206 if rows: 235 207 descriptions = [desc[0] for desc in curs.description] 236 208 try: 237 i idx = descriptions.index(id_name)209 idx = descriptions.index(ticket) 238 210 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 ) 241 213 if summary: 242 214 try: … … 246 218 % summary) 247 219 for row in rows: 248 items.append(row[i idx])249 if summary and 0 <= sidx:250 summaries[row[i idx]] = row[sidx]220 items.append(row[idx]) 221 if summary: 222 summaries[row[idx]] = row[sidx] 251 223 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() 254 228 if summary: 255 229 # get summary text … … 269 243 html = string.join([wiki_to_oneliner("%s (#%d)" % (summaries[n],n), 270 244 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>") 273 247 else: 274 248 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) 276 250 if html != '': 277 251 try: … … 279 253 except: 280 254 pass 281 sty = styles.copy()282 255 if inline: 283 256 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]) 286 259 return '<fieldset class="ticketbox" style="%s"><legend>%s</legend>%s</fieldset>' % \ 287 260 (style, title, html)
