Ticket #879: patch-querynull-r1014.diff
| File patch-querynull-r1014.diff, 5.0 KB (added by pkou <pkou at ua.fm>, 8 years ago) |
|---|
-
trac/Query.py
111 111 if check: 112 112 del constraints[field] 113 113 114 def add_db_options(field, constraints, prefix, cursor, sql ):114 def add_db_options(field, constraints, prefix, cursor, sql, withnull=0): 115 115 cursor.execute(sql) 116 116 options = [] 117 if withnull: options.append({'name': '(empty)'}) 117 118 while 1: 118 119 row = cursor.fetchone() 119 120 if not row: break 120 121 if row[0]: options.append({'name': row[0]}) 121 122 add_options(field, constraints, prefix, options) 122 123 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'}])129 124 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') 130 129 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) 132 131 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) 134 133 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) 136 135 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') 138 137 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') 140 139 141 140 custom_fields = get_custom_fields(self.env) 142 141 for custom in custom_fields: … … 147 146 options[i] = {'name': options[i]} 148 147 if check and (options[i]['name'] in constraints[custom['name']]): 149 148 options[i]['selected'] = 1 149 options.insert(0, {'name': '(empty)'}) 150 150 custom['options'] = options 151 151 util.add_to_hdf(custom_fields, self.req.hdf, 'query.custom') 152 152 … … 182 182 if [k for k in constraints.keys() if k in custom_fields]: 183 183 sql += ", ticket_custom.name AS name, " \ 184 184 "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" 186 186 else: 187 187 sql += " FROM ticket" 188 188 sql += " INNER JOIN (SELECT name AS priority_name, value AS priority_value " \ … … 195 195 col = k 196 196 if not col in Ticket.std_fields: 197 197 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 198 205 if len(v) > 1: 199 206 inlist = ["'" + util.sql_escape(item) + "'" for item in v] 200 207 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]))) 205 213 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 + ")") 207 216 else: 208 217 clauses.append(" OR ".join(clause)) 209 218 if clauses:
