Edgewall Software

Ticket #879: patch-querynull-r1014.diff

File patch-querynull-r1014.diff, 5.0 KB (added by pkou <pkou at ua.fm>, 8 years ago)

Patch for the changes

  • trac/Query.py

     
    111111            if check: 
    112112                del constraints[field] 
    113113 
    114         def add_db_options(field, constraints, prefix, cursor, sql): 
     114        def add_db_options(field, constraints, prefix, cursor, sql, withnull=0): 
    115115            cursor.execute(sql) 
    116116            options = [] 
     117            if withnull: options.append({'name': '(empty)'}) 
    117118            while 1: 
    118119                row = cursor.fetchone() 
    119120                if not row: break 
    120121                if row[0]: options.append({'name': row[0]}) 
    121122            add_options(field, constraints, prefix, options) 
    122123 
    123         add_options('status', constraints, 'query.options.', 
    124                     [{'name': 'new'}, {'name': 'assigned'}, 
    125                      {'name': 'reopened'}, {'name': 'closed'}]) 
    126         add_options('resolution', constraints, 'query.options.', 
    127                     [{'name': 'fixed'}, {'name': 'invalid'}, {'name': 'wontfix'}, 
    128                      {'name': 'duplicate'}, {'name': 'worksforme'}]) 
    129124        cursor = self.db.cursor() 
     125        add_db_options('status', constraints, 'query.options.', cursor, 
     126                       'SELECT name FROM enum WHERE type=\'status\' ORDER BY value') 
     127        add_db_options('resolution', constraints, 'query.options.', cursor, 
     128                       'SELECT name FROM enum WHERE type=\'resolution\' ORDER BY value') 
    130129        add_db_options('component', constraints, 'query.options.', cursor, 
    131                        'SELECT name FROM component ORDER BY name', ) 
     130                       'SELECT name FROM component ORDER BY name', 1) 
    132131        add_db_options('milestone', constraints, 'query.options.', cursor, 
    133                        'SELECT name FROM milestone ORDER BY name') 
     132                       'SELECT name FROM milestone ORDER BY name', 1) 
    134133        add_db_options('version', constraints, 'query.options.', cursor, 
    135                        'SELECT name FROM version ORDER BY name') 
     134                       'SELECT name FROM version ORDER BY name', 1) 
    136135        add_db_options('priority', constraints, 'query.options.', cursor, 
    137                        'SELECT name FROM enum WHERE type=\'priority\'') 
     136                       'SELECT name FROM enum WHERE type=\'priority\' ORDER BY value') 
    138137        add_db_options('severity', constraints, 'query.options.', cursor, 
    139                        'SELECT name FROM enum WHERE type=\'severity\'') 
     138                       'SELECT name FROM enum WHERE type=\'severity\' ORDER BY value') 
    140139 
    141140        custom_fields = get_custom_fields(self.env) 
    142141        for custom in custom_fields: 
     
    147146                    options[i] = {'name': options[i]} 
    148147                    if check and (options[i]['name'] in constraints[custom['name']]): 
    149148                        options[i]['selected'] = 1 
     149                options.insert(0, {'name': '(empty)'}) 
    150150                custom['options'] = options 
    151151        util.add_to_hdf(custom_fields, self.req.hdf, 'query.custom') 
    152152 
     
    182182        if [k for k in constraints.keys() if k in custom_fields]: 
    183183            sql += ", ticket_custom.name AS name, " \ 
    184184                   "ticket_custom.value AS value " \ 
    185                    "FROM ticket OUTER JOIN ticket_custom ON id = ticket" 
     185                   "FROM ticket LEFT OUTER JOIN ticket_custom ON id = ticket" 
    186186        else: 
    187187            sql += " FROM ticket" 
    188188        sql += " INNER JOIN (SELECT name AS priority_name, value AS priority_value " \ 
     
    195195            col = k 
    196196            if not col in Ticket.std_fields: 
    197197                col = 'value' 
     198            empty_custom = '' 
     199            if len(v) != 0 and v[0] == '(empty)': 
     200                clause.append("IFNULL(%s, '') = ''" % col) 
     201                v.pop(0) 
     202                empty_custom = " OR id NOT IN (SELECT ticket" \ 
     203                                             " FROM ticket_custom" \ 
     204                                             " WHERE name = '%s') " % k 
    198205            if len(v) > 1: 
    199206                inlist = ["'" + util.sql_escape(item) + "'" for item in v] 
    200207                clause.append("%s IN (%s)" % (col, ", ".join(inlist))) 
    201             elif k in ['keywords', 'cc']: 
    202                 clause.append("%s LIKE '%%%s%%'" % (col, util.sql_escape(v[0]))) 
    203             else: 
    204                 clause.append("%s = '%s'" % (col, util.sql_escape(v[0]))) 
     208            elif len(v) != 0: 
     209                if k in ['keywords', 'cc']: 
     210                    clause.append("%s LIKE '%%%s%%'" % (col, util.sql_escape(v[0]))) 
     211                else: 
     212                    clause.append("%s = '%s'" % (col, util.sql_escape(v[0]))) 
    205213            if not k in Ticket.std_fields: 
    206                 clauses.append("(name='%s' AND (" % k + " OR ".join(clause) + "))") 
     214                clauses.append("(name='%s' AND (" % k +  
     215                               " OR ".join(clause) + ")" + empty_custom + ")") 
    207216            else: 
    208217                clauses.append(" OR ".join(clause)) 
    209218        if clauses: