Annotation of ZSQLExtend/ZSQLExtend.py, revision 1.3
1.1 dwinter 1: from OFS.Folder import Folder
2: from Globals import Persistent
3: from Acquisition import Implicit
4: from Globals import DTMLFile
5: import urllib
6: import re
7: import string
1.3 ! dwinter 8: from pyPgSQL import libpq
1.1 dwinter 9: from AccessControl import getSecurityManager
10:
1.2 dwinter 11: def quoteString(name):
12: #return re.sub(r'([\(\)\?])',"\\\1",name)
13: #return "Euklid"
14: return name
15:
1.1 dwinter 16: class ZSQLExtendFolder(Persistent, Implicit, Folder):
17: """Folder"""
18: meta_type="ZSQLExtendFolder"
19:
20: def ZSQLInlineSearch(self,**argv):
21: """inlinesearch"""
22: qs=[]
23:
1.2 dwinter 24:
25:
26:
1.1 dwinter 27: for a in argv.keys():
28: qs.append(a+"="+urllib.quote(str(argv[a])))
29:
30: return self.parseQueryString(string.join(qs,","),"_")
31:
32: def ZSQLAdd(self):
33: """Neuer Eintrag"""
34: qs=self.REQUEST['QUERY_STRING']
35: addList={}
36: for q in qs.split("&"):
37: name=re.sub("r'+'"," ",q.split("=")[0].lower())
38: value=q.split("=")[1]
39: value=re.sub(r'\+'," ",value)
40: value=urllib.unquote(value)
41: if name=="-table":
42: table=urllib.unquote(value)
43: elif name=="-format":
44: format=urllib.unquote(value)
45: elif (not name[0]=="-") and (not len(value)==0):
46: addList[urllib.unquote(name)]=urllib.unquote(value)
47:
48: keyList=[]
49: valueList=[]
50: for x in addList.keys():
51: keyList.append("\""+x+"\"")
1.3 ! dwinter 52: valueList.append(libpq.PgQuoteString(addList[x]))
1.1 dwinter 53:
54: keyString=string.join(keyList,",")
55: valueString=string.join(valueList,",")
56:
57: queryString="INSERT INTO %s (%s) VALUES (%s)"%(table,keyString,valueString)
58: self.search(var=queryString)
59: return self.REQUEST.RESPONSE.redirect(format)
60:
61: def ZSQLChange(self):
62: """Ändern von Einträgen"""
63: qs=self.REQUEST['QUERY_STRING']
64: #print "CHANGE QS",self.REQUEST
65: #return self.REQUEST
66: changeList=[]
67: for q in qs.split("&"):
68: name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
69: value=q.split("=")[1]
70: value=re.sub(r'\+'," ",value)
71: value=urllib.unquote(value)
72: if name=="-table":
73: table=urllib.unquote(value)
74: elif name=="-identify":
75: identify=urllib.unquote(value)
1.3 ! dwinter 76: identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
1.1 dwinter 77: elif name=="-format":
78: format=urllib.unquote(value)
79: elif (not name[0]=="-") and (not len(value)==0):
1.3 ! dwinter 80: changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
1.1 dwinter 81: changeString=string.join(changeList,",")
82: queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
83: self.search(var=queryString)
84: return self.REQUEST.RESPONSE.redirect(format)
85:
86: def ZSQLFind(self,qs="",select="*"):
87: """Find"""
88:
89:
90: if qs=="":
91: if self.REQUEST['QUERY_STRING']:
92: qs=self.REQUEST['QUERY_STRING']
93: qs=string.join(qs.split("&"),",")
94: else:
95: qs=self.REQUEST.SESSION['query']
96: else:
97: qs=string.join(qs.split("&"),",")
98: return self.parseQueryString(qs,"-",select=select,storemax="yes")
99:
100: def ZSQLFoundCount(self,founds):
101: try:
102: return len(founds)
103: except:
104: return 0
105:
106: def parseQueryString(self,qs,iCT,storemax="no",select=None):
107: """analysierren den QueryString"""
108: lop="AND" # standardsuche mit and
109: max="ALL" #standard alle auswählen
110: whereList=[]
111: sort=""
112: op="bw"
1.2 dwinter 113: opfields={}
114:
1.1 dwinter 115: if not select:
116: select="*"
1.2 dwinter 117:
118: #check for op in the case of inline search
119: if iCT=="_":
120: for q in qs.split(","):
121: name=re.sub("r'+'"," ",q.split("=")[0].lower())
122: value=urllib.unquote(q.split("=")[1])
123:
124: if name[0:3]==iCT+"op":
125: op=value
126: field=name[4:]
127: opfields[field]=op
128:
129: #now analyse the querystring
1.1 dwinter 130: for q in qs.split(","):
131: try:
132:
133: name=re.sub("r'+'"," ",q.split("=")[0].lower())
134: value=urllib.unquote(q.split("=")[1])
1.2 dwinter 135: value=quoteString(value)
1.1 dwinter 136: if name==iCT+"lop":
137: lop=value
138: elif name==iCT+"table":
139: table=value
140: elif name==iCT+"select":
141: select=value
142: elif name==iCT+"max":
143: max=str(value)
144:
145: elif name==iCT+"join":
146: whereList.append(value)
147: elif name==iCT+"sort":
148: sort="ORDER BY "+value
149: elif name==iCT+"token":
150: self.REQUEST.SESSION['token']=value
151:
152: elif name==iCT+"op":
153: op=value
1.2 dwinter 154:
155:
1.1 dwinter 156:
157: elif (not name[0]==iCT) and (not len(value)==0):
1.2 dwinter 158: if opfields.has_key(name):
159: op=opfields[name]
1.1 dwinter 160: if op=="ct":
161: whereList.append(name+"~\'.*"+value+".*\'")
162: elif op=="gt":
163: whereList.append(name+">\'"+value+"\'")
164: elif op=="lt":
165: whereList.append(name+"<\'"+value+"\'")
166: elif op=="eq":
167: whereList.append(name+"=\'"+value+"\'")
168: elif op=="bw":
169: whereList.append(name+"~\'"+value+".*\'")
170: elif op=="ew":
171: whereList.append(name+"~\'.*"+value+"\'")
172: op="ct"
173: except:
174: print "END"
175: if len(whereList)>0:
176: where="WHERE "+string.join(whereList," "+lop+" ")
177: else:
178: where=""
179: #print "QE",table
180:
181: query="SELECT %s FROM %s %s %s"%(select,table,where,sort)
182:
1.2 dwinter 183: self.REQUEST.SESSION['qs']=opfields
1.1 dwinter 184: return self.search(var=query)
185:
186: def ZSQLSearch(self):
187: """To be done"""
188: rq=self.REQUEST['QUERY_STRING']
189: querys=rq.split("&")
190:
191:
192: for querytemp in querys:
193: query=querytemp.split("=")
194: try:
195: if query[0].lower()=="-format":
196: formatfile=query[1]
197: except:
198: """nothing"""
199: #print formatfile
200: self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")
201: return self.REQUEST.RESPONSE.redirect(urllib.unquote(formatfile))
202:
203:
204: def ZSQLint(self,string):
205: try:
206:
207: return(int(string))
208: except:
209: return 0
210: def prevLink(self,html):
211: """prev link"""
212: if self.REQUEST['QUERY_STRING']=="":
213: qs=self.REQUEST.SESSION['query']
214: else:
215: qs=self.REQUEST['QUERY_STRING']
216: max=re.search(r'max\=(.*)\,',qs.lower())
217: offset=re.search(r'offset\=(.*)\,',qs.lower())
218: if not offset:
219: offsetnew=0
220: else:
221: offsetnew=int(offset)-max
222: if offsetnew<0:
223: offsetnew=0
224: queries=string.split(qs,",")
225: newquery=[]
226: if offset:
227: for query in queries:
228: if query.split("=")[0].lower()=="offset":
229: query="-offset=%i"%offsetnew
230: newquery.append(query)
231: newquerystring=string.join(newquery,"&")
232: else:
233: queries.append("-offset=%i"%offsetnew)
234: newquerystring=string.join(queries,"&")
235: return "<a href='%s'>%s</a>"%(self.REQUEST['URL0']+"?"+newquerystring,html)
236:
237: def nextLink(self,html):
238: """prev link"""
239: if self.REQUEST['QUERY_STRING']=="":
240: qs=self.REQUEST.SESSION['query']
241: else:
242: qs=self.REQUEST['QUERY_STRING']
243: max=re.search(r'max\=(.*)\,',qs.lower())
244:
245: offset=re.search(r'offset\=(.*)\,',qs.lower())
246: if not offset:
247: offsetnew=1
248: else:
249: offsetnew=int(offset)+int(max)
250: if offsetnew<0:
251: offsetnew=0
252: queries=string.split(qs,",")
253: newquery=[]
254: if offset:
255: for query in queries:
256:
257: if query.split("=")[0].lower()=="-offset":
258: query="-offset=%i"%offsetnew
259: newquery.append(query)
260: newquerystring=string.join(newquery,"&")
261: else:
262: queries.append("-offset=%i"%offsetnew)
263: newquerystring=string.join(queries,"&")
264:
265: return "<a href='%s'>%s</a>"%(self.REQUEST['URL0']+"?"+newquerystring,html)
266:
267: def ZSQLrangeStart(self):
268: if self.REQUEST['QUERY_STRING']=="":
269: qs=self.REQUEST.SESSION['query']
270: else:
271: qs=self.REQUEST['QUERY_STRING']
272: offset=re.search(r'offset\=(.*)\,',qs.lower())
273: if not offset:
274: offset=1
275: return offset
276: # def search(self,**argv):
277: # """to be done"""
278:
279:
280:
281: manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
282:
283: def manage_addZSQLExtendFolder(self, id, title='',
284: createPublic=0,
285: createUserF=0,
286: REQUEST=None):
287: """Add a new Folder object with id *id*.
288:
289: If the 'createPublic' and 'createUserF' parameters are set to any true
290: value, an 'index_html' and a 'UserFolder' objects are created respectively
291: in the new folder.
292: """
293:
294:
295: ob=ZSQLExtendFolder()
296: ob.id=str(id)
297: ob.title=title
298: self._setObject(id, ob)
299: ob=self._getOb(id)
300:
301: checkPermission=getSecurityManager().checkPermission
302:
303: if createUserF:
304: if not checkPermission('Add User Folders', ob):
305: raise Unauthorized, (
306: 'You are not authorized to add User Folders.'
307: )
308: ob.manage_addUserFolder()
309:
310: if createPublic:
311: if not checkPermission('Add Page Templates', ob):
312: raise Unauthorized, (
313: 'You are not authorized to add Page Templates.'
314: )
315: ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
316: id='index_html', title='')
317:
318: if REQUEST is not None:
319: return self.manage_main(self, REQUEST, update_menu=1)
320:
321:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>