Changeset 25969

Show
Ignore:
Timestamp:
12/05/08 21:59:50 (5 weeks ago)
Author:
hirobe
Message:

クエリストリングの解釈処理を変更
・URL形式('?'あり)と、TicketQuery形式('?'なし)の両方に対応
・URLがクエリストリングかつquery省略時にURLからクエリを生成する機能を追加

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • platform/trac/plugins/querychart/trunk/querychart/macro.py

    r25949 r25969  
    5252 
    5353 
     54    def _urlstring_to_reqarg(self,urlstr): 
     55        args={} 
     56        for uslarg in urlstr[1:].split('&'): 
     57            uslarg_sp = uslarg.split('=') 
     58            key = uslarg_sp[0] 
     59            val = '='.join(uslarg_sp[1:]) 
     60            if len(val)>1 and val[0] in ['~','^','$','!']: 
     61                if val[0] == '!': 
     62                    args[key+'_mode']=val[:1] 
     63                    val = val[2:] 
     64                else: 
     65                    args[key+'_mode']=val[0] 
     66                    val = val[1:] 
     67            if not args.get(key): 
     68                args[key] = [] 
     69            args[key].append(val) 
     70        return args 
     71     
     72    def _get_constraints(self, args): 
     73             
     74        constraints = {} 
     75        ticket_fields = [f['name'] for f in 
     76                         TicketSystem(self.env).get_ticket_fields()] 
     77        ticket_fields.append('id') 
     78 
     79        for field in [k for k in args.keys() if k in ticket_fields]: 
     80            vals = args[field] 
     81            if not isinstance(vals, (list, tuple)): 
     82                vals = [vals] 
     83            if vals: 
     84                mode = args.get(field + '_mode') 
     85                if mode: 
     86                    vals = [mode + x for x in vals] 
     87                constraints[field] = vals 
     88 
     89        return constraints 
     90 
    5491 
    5592    def _make_data(self,req,opts): 
     
    6198        upper = opts['upper'] 
    6299         
    63         query_str = query_str[1:] + ''.join(['&col=%s'%field  
    64                                          for field in fieldlist])  
    65         query = Query.from_string(self.env, query_str) 
     100        if len(query_str)>1 and query_str[0]!='?': 
     101            query_str = query_str + ''.join(['&col=%s'%field  
     102                                             for field in fieldlist])  
     103            query = Query.from_string(self.env, query_str) 
     104        elif len(query_str)>1 and query_str[0]=='?': 
     105            constraints = self._get_constraints(self._urlstring_to_reqarg(query_str)) 
     106            query = Query(self.env, constraints=constraints, cols=fieldlist) 
     107        else: 
     108            constraints = self._get_constraints(req.args) 
     109            query = Query(self.env, constraints=constraints, cols=fieldlist) 
     110                           
    66111        self.log.debug(query.get_sql()) 
    67112        result = query.execute(req, db=None, cached_ids=None) 
     
    95140         
    96141        if len(edgedays)==0: 
    97             return {}#'''No data to output.''' 
     142            return None#'''No data to output.''' 
    98143 
    99144        x_min = min(edgedays) 
     
    133178 
    134179         
    135          
    136         # make script string 
    137         linenum=1 
    138         outs = [] 
    139         vals = [] 
    140         for line in lines: 
    141             datastrings = [] 
    142             for p in line: 
    143                 if upper_flag: 
    144                     datastrings.append('[%d,%d]'%(to_timestamp(p.date)*1000,p.count)) 
    145                 else: 
    146                     datastrings.append('[%d,%d]'%(to_timestamp(p.date)*1000,result_len-p.count)) 
    147             outs.append( 'var d%s = [%s];'%(str(linenum),','.join(datastrings))) 
    148             vals.append( '{label:"%s",data:d%s}'%(fieldlist[linenum-1],str(linenum))) 
    149             linenum = linenum+1 
    150              
    151180    def expand_macro(self, formatter, name, content): 
    152181        req = formatter.req 
     
    165194               'max':None, 
    166195               'min':None, 
    167                'query':None, 
     196               'query':'', 
    168197               'col':[], 
    169198               'per':'week', 
     
    171200               } 
    172201        collabel={} 
     202        ticket_fields = TicketSystem(self.env).get_ticket_fields() 
     203 
    173204        for arg in content.split(','): 
    174205            colon_split = arg.split(':') 
     
    180211                value = True 
    181212            if key=='col': 
    182                 ticket_fields = TicketSystem(self.env).get_ticket_fields() 
    183213                if value=='time': 
    184214                    opts[key].append('time') 
     
    200230 
    201231         
     232         
    202233        data = self._make_data(req,opts) 
     234        if data==None: 
     235            raise TracError('No data matched') 
    203236        fieldlist = data['fieldlist'] 
    204237        x_axis = data['x_axis']