Mercurial > hg > ZDBInterface
annotate ZDBInterfaceFolder.py @ 22:7ee835840724 default tip
fix problem with config page when autocommit is not defined.
author | casties |
---|---|
date | Wed, 24 Apr 2013 20:49:42 +0200 |
parents | 9fb0d4f24486 |
children |
rev | line source |
---|---|
3 | 1 ''' |
2 Created on 14.2.2011 | |
3 | |
4 @author: casties | |
5 ''' | |
6 | |
7 from OFS.Folder import Folder | |
8 from Products.PageTemplates.PageTemplateFile import PageTemplateFile | |
9 from AccessControl import getSecurityManager, Unauthorized | |
10 import logging | |
11 import re | |
12 | |
13 from DBInterface import * | |
14 | |
15 | |
16 class ZDBInterfaceFolder(DBInterface, Folder): | |
17 """Folder for database queries | |
18 """ | |
19 | |
20 meta_type="ZDBInterfaceFolder" | |
21 manage_options=Folder.manage_options+( | |
22 {'label':'Config','action':'manage_editZDBInterfaceFolderForm'}, | |
23 ) | |
24 | |
25 # management templates | |
26 manage_editZDBInterfaceFolderForm=PageTemplateFile('zpt/editZDBInterfaceFolder',globals()) | |
27 | |
28 | |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
29 def __init__(self, id, title, connection_id=None, autocommit=False, default_search='bw'): |
3 | 30 """init""" |
31 self.id = id | |
32 self.title = title | |
33 # database connection id | |
34 self.connection_id = connection_id | |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
35 # set db connection to autocommit |
8 | 36 self.autocommit = autocommit |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
37 # default text search mode |
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
38 self.default_search = default_search |
3 | 39 |
13
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
40 def getSQLQuery(self, table, argv, ignore_empty=False): |
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
41 """returns dict with SQL query string and args. |
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
42 ignore_empty: remove fields with empty string values from query.""" |
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
43 logging.debug("getSQLquery table=%s argv=%s ignore_empty=%s"%(table,argv,ignore_empty)) |
4 | 44 args = [] |
45 select = "*" | |
46 order = None | |
47 wheres = [] | |
48 whereOp = "AND" | |
8 | 49 processed = {} |
50 unprocessed = {} | |
13
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
51 ignored = {} |
7 | 52 limit = None |
53 offset = None | |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
54 |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
55 def doOp(op, param, val): |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
56 # handles comparison operations in WHERE clause |
7 | 57 logging.debug("doop op=%s param=%s val=%s"%(op,param,val)) |
13
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
58 if ignore_empty and not val: |
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
59 # ignore parameter |
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
60 logging.debug(" param=%s ignored"%(param)) |
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
61 return |
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
62 |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
63 if isinstance(val, list): |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
64 # join multiple parameters with spaces (makes sense with checkbox and -op=all) |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
65 val = " ".join(val) |
7 | 66 |
67 # string comparisons are case-insensitive | |
68 if isinstance(val, basestring): | |
69 param = "LOWER(%s)"%param | |
70 val = val.lower() | |
71 | |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
72 if op == "eq": |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
73 wheres.append(param + " = %s") |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
74 args.append(val) |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
75 elif op == "lt": |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
76 wheres.append(param + " < %s") |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
77 args.append(val) |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
78 elif op == "gt": |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
79 wheres.append(param + " > %s") |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
80 args.append(val) |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
81 elif op == "ew": |
7 | 82 wheres.append(param + " ILIKE %s") |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
83 args.append("%" + val) |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
84 elif op == "bw": |
7 | 85 wheres.append(param + " ILIKE %s") |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
86 args.append(val + "%") |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
87 elif op == "ct": |
7 | 88 wheres.append(param + " ILIKE %s") |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
89 args.append("%" + val + "%") |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
90 elif op == "all": |
15 | 91 # p="a b c" -> WHERE (p ILIKE '%a%' AND p ILIKE '%b%' AND p ILIKE '%c%') |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
92 words = [] |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
93 for word in val.split(" "): |
7 | 94 words.append(param + " ILIKE %s") |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
95 args.append("%" + word + "%") |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
96 wheres.append("(" + " AND ".join(words) + ")") |
7 | 97 elif op == "one": |
15 | 98 # p="a b c" -> WHERE (p ILIKE '%a%' OR p ILIKE '%b%' OR p ILIKE '%c%') |
7 | 99 words = [] |
100 for word in val.split(" "): | |
101 words.append(param + " ILIKE %s") | |
102 args.append("%" + word + "%") | |
103 wheres.append("(" + " OR ".join(words) + ")") | |
14 | 104 elif op == "in": |
15 | 105 # p="a b c" -> WHERE p IN ('a', 'b', 'c') |
14 | 106 words = [] |
107 for word in val.split(" "): | |
108 words.append("%s") | |
109 args.append(word) | |
15 | 110 wheres.append(param + " IN (" + ", ".join(words) + ")") |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
111 else: |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
112 logging.error("getSQLquery: unknown op=%s!"%op) |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
113 |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
114 return |
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
115 |
4 | 116 # evaluate argv |
117 for (key, val) in argv.items(): | |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
118 logging.debug("process key=%s val=%s"%(key,val)) |
8 | 119 if key in processed: |
4 | 120 # parameter has been processed |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
121 logging.debug(" key=%s processed"%(key)) |
4 | 122 continue |
123 | |
124 # beginning of a command should always be "_" | |
125 if key[0] == "-": | |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
126 key = "_" + key[1:] |
4 | 127 |
128 if key == "_select": | |
129 # SELECT expression | |
130 select = sqlName(val, more="*,") | |
131 elif key == "_sort": | |
132 # sort i.e. ORDER BY expression | |
133 order = sqlName(val, more=",") | |
134 elif key == "_lop": | |
135 # logical operation joining WHERE clauses | |
136 whereOp = sqlName(val) | |
12
09882d5a3989
fix bug with _max and _skip. add _size and _start as alias.
casties
parents:
10
diff
changeset
|
137 elif key == "_max" or key == "_size": |
7 | 138 # number of results |
139 limit = sqlName(val) | |
12
09882d5a3989
fix bug with _max and _skip. add _size and _start as alias.
casties
parents:
10
diff
changeset
|
140 elif key == "_skip" or key == "_start": |
7 | 141 # start at result number |
142 offset = sqlName(val) | |
4 | 143 elif key[:3] == "_op": |
10 | 144 # operation parameters _op_param=val |
4 | 145 param = sqlName(key[4:]) |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
146 logging.debug("param=%s key=%s val=%s"%(param,key,val)) |
4 | 147 if param in argv: |
5
ca30cf0e810d
fix bugs in ZDBInlineSearch.
root@xserve09.mpiwg-berlin.mpg.de
parents:
4
diff
changeset
|
148 doOp(val, param, argv[param]) |
8 | 149 processed[param] = True |
4 | 150 else: |
151 # no corresponding parameter | |
152 logging.error("getSQLquery: param=%s for op not found!"%param) | |
8 | 153 else: |
154 # parameter=value pair | |
155 unprocessed[key] = val | |
4 | 156 |
157 # process remaining parameters (without _op) | |
8 | 158 for (key, val) in unprocessed.items(): |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
159 if key not in processed: |
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
160 param = sqlName(key) |
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
161 # default operation |
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
162 doOp(self.default_search, param, val) |
4 | 163 |
164 # join it all | |
165 query = "SELECT %s FROM %s"%(select, table) | |
166 if wheres: | |
167 query += " WHERE " + (" " + whereOp + " ").join(wheres) | |
168 | |
169 if order: | |
170 query += " ORDER BY " + order | |
7 | 171 |
172 if limit: | |
173 query += " LIMIT " + limit | |
174 | |
175 if offset: | |
176 query += " OFFSET " + offset | |
4 | 177 |
178 return {'query' : query, 'args' : args} | |
179 | |
13
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
180 def ZDBInlineSearch(self, _table=None, _ignore_empty=True, **argv): |
10 | 181 """returns result set from search with given parameters""" |
13
cf03ab908a2b
add _ignore_empty option (default=true) to ZSQLInlineSearch.
casties
parents:
12
diff
changeset
|
182 query = self.getSQLQuery(_table, argv, ignore_empty= _ignore_empty) |
4 | 183 result = self.executeZSQL(query['query'], query['args']) |
184 return result | |
3 | 185 |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
186 def manage_editZDBInterfaceFolder(self, title=None, connection_id=None, autocommit=None, default_search=None, |
3 | 187 REQUEST=None): |
188 """Change the object""" | |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
189 logging.debug("editZDBInterfaceFolder title=%s, connection_id=%s, autocommit=%s default_search=%s"%(title,connection_id,autocommit,default_search)) |
3 | 190 if title is not None: |
191 self.title = title | |
192 | |
193 if connection_id is not None: | |
194 self.connection_id = connection_id | |
195 | |
9
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
196 if default_search is not None: |
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
197 self.default_search = default_search |
87087f4f4059
fixed bug with default sort order.
root@xserve09.mpiwg-berlin.mpg.de
parents:
8
diff
changeset
|
198 |
8 | 199 self.autocommit = (autocommit == "on") |
200 | |
3 | 201 #checkPermission=getSecurityManager().checkPermission |
202 REQUEST.RESPONSE.redirect('manage_main') | |
203 | |
204 | |
205 manage_addZDBInterfaceFolderForm=PageTemplateFile('zpt/addZDBInterfaceFolder',globals()) | |
206 | |
207 def manage_addZDBInterfaceFolder(self, id, title='', label='', description='', | |
208 createPublic=0, | |
209 createUserF=0, | |
210 REQUEST=None): | |
211 """Add a new object with id *id*.""" | |
212 | |
213 ob=ZDBInterfaceFolder(str(id),title) | |
214 self._setObject(id, ob) | |
215 | |
216 #checkPermission=getSecurityManager().checkPermission | |
217 REQUEST.RESPONSE.redirect('manage_main') | |
218 | |
219 |