from OFS.Folder import Folder
from Globals import Persistent
from Acquisition import Implicit
from Globals import DTMLFile
import urllib
import re
import string
from AccessControl import getSecurityManager
def quoteString(name):
#return re.sub(r'([\(\)\?])',"\\\1",name)
#return "Euklid"
return name
class ZSQLExtendFolder(Persistent, Implicit, Folder):
"""Folder"""
meta_type="ZSQLExtendFolder"
def ZSQLInlineSearch(self,**argv):
"""inlinesearch"""
qs=[]
for a in argv.keys():
qs.append(a+"="+urllib.quote(str(argv[a])))
return self.parseQueryString(string.join(qs,","),"_")
def ZSQLAdd(self):
"""Neuer Eintrag"""
qs=self.REQUEST['QUERY_STRING']
addList={}
for q in qs.split("&"):
name=re.sub("r'+'"," ",q.split("=")[0].lower())
value=q.split("=")[1]
value=re.sub(r'\+'," ",value)
value=urllib.unquote(value)
if name=="-table":
table=urllib.unquote(value)
elif name=="-format":
format=urllib.unquote(value)
elif (not name[0]=="-") and (not len(value)==0):
addList[urllib.unquote(name)]=urllib.unquote(value)
keyList=[]
valueList=[]
for x in addList.keys():
keyList.append("\""+x+"\"")
valueList.append("\'"+addList[x]+"\'")
keyString=string.join(keyList,",")
valueString=string.join(valueList,",")
queryString="INSERT INTO %s (%s) VALUES (%s)"%(table,keyString,valueString)
self.search(var=queryString)
return self.REQUEST.RESPONSE.redirect(format)
def ZSQLChange(self):
"""Ändern von Einträgen"""
qs=self.REQUEST['QUERY_STRING']
#print "CHANGE QS",self.REQUEST
#return self.REQUEST
changeList=[]
for q in qs.split("&"):
name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
value=q.split("=")[1]
value=re.sub(r'\+'," ",value)
value=urllib.unquote(value)
if name=="-table":
table=urllib.unquote(value)
elif name=="-identify":
identify=urllib.unquote(value)
identify=identify.split("=")[0]+"=\'"+identify.split("=")[1]+"\'"
elif name=="-format":
format=urllib.unquote(value)
elif (not name[0]=="-") and (not len(value)==0):
changeList.append("\""+name+"\"=\'"+urllib.unquote(value)+"\'")
changeString=string.join(changeList,",")
queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
self.search(var=queryString)
return self.REQUEST.RESPONSE.redirect(format)
def ZSQLFind(self,qs="",select="*"):
"""Find"""
if qs=="":
if self.REQUEST['QUERY_STRING']:
qs=self.REQUEST['QUERY_STRING']
qs=string.join(qs.split("&"),",")
else:
qs=self.REQUEST.SESSION['query']
else:
qs=string.join(qs.split("&"),",")
return self.parseQueryString(qs,"-",select=select,storemax="yes")
def ZSQLFoundCount(self,founds):
try:
return len(founds)
except:
return 0
def parseQueryString(self,qs,iCT,storemax="no",select=None):
"""analysierren den QueryString"""
lop="AND" # standardsuche mit and
max="ALL" #standard alle auswählen
whereList=[]
sort=""
op="bw"
opfields={}
if not select:
select="*"
#check for op in the case of inline search
if iCT=="_":
for q in qs.split(","):
name=re.sub("r'+'"," ",q.split("=")[0].lower())
value=urllib.unquote(q.split("=")[1])
if name[0:3]==iCT+"op":
op=value
field=name[4:]
opfields[field]=op
#now analyse the querystring
for q in qs.split(","):
try:
name=re.sub("r'+'"," ",q.split("=")[0].lower())
value=urllib.unquote(q.split("=")[1])
value=quoteString(value)
if name==iCT+"lop":
lop=value
elif name==iCT+"table":
table=value
elif name==iCT+"select":
select=value
elif name==iCT+"max":
max=str(value)
elif name==iCT+"join":
whereList.append(value)
elif name==iCT+"sort":
sort="ORDER BY "+value
elif name==iCT+"token":
self.REQUEST.SESSION['token']=value
elif name==iCT+"op":
op=value
elif (not name[0]==iCT) and (not len(value)==0):
if opfields.has_key(name):
op=opfields[name]
if op=="ct":
whereList.append(name+"~\'.*"+value+".*\'")
elif op=="gt":
whereList.append(name+">\'"+value+"\'")
elif op=="lt":
whereList.append(name+"<\'"+value+"\'")
elif op=="eq":
whereList.append(name+"=\'"+value+"\'")
elif op=="bw":
whereList.append(name+"~\'"+value+".*\'")
elif op=="ew":
whereList.append(name+"~\'.*"+value+"\'")
op="ct"
except:
print "END"
if len(whereList)>0:
where="WHERE "+string.join(whereList," "+lop+" ")
else:
where=""
#print "QE",table
query="SELECT %s FROM %s %s %s"%(select,table,where,sort)
self.REQUEST.SESSION['qs']=opfields
return self.search(var=query)
def ZSQLSearch(self):
"""To be done"""
rq=self.REQUEST['QUERY_STRING']
querys=rq.split("&")
for querytemp in querys:
query=querytemp.split("=")
try:
if query[0].lower()=="-format":
formatfile=query[1]
except:
"""nothing"""
#print formatfile
self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")
return self.REQUEST.RESPONSE.redirect(urllib.unquote(formatfile))
def ZSQLint(self,string):
try:
return(int(string))
except:
return 0
def prevLink(self,html):
"""prev link"""
if self.REQUEST['QUERY_STRING']=="":
qs=self.REQUEST.SESSION['query']
else:
qs=self.REQUEST['QUERY_STRING']
max=re.search(r'max\=(.*)\,',qs.lower())
offset=re.search(r'offset\=(.*)\,',qs.lower())
if not offset:
offsetnew=0
else:
offsetnew=int(offset)-max
if offsetnew<0:
offsetnew=0
queries=string.split(qs,",")
newquery=[]
if offset:
for query in queries:
if query.split("=")[0].lower()=="offset":
query="-offset=%i"%offsetnew
newquery.append(query)
newquerystring=string.join(newquery,"&")
else:
queries.append("-offset=%i"%offsetnew)
newquerystring=string.join(queries,"&")
return "%s"%(self.REQUEST['URL0']+"?"+newquerystring,html)
def nextLink(self,html):
"""prev link"""
if self.REQUEST['QUERY_STRING']=="":
qs=self.REQUEST.SESSION['query']
else:
qs=self.REQUEST['QUERY_STRING']
max=re.search(r'max\=(.*)\,',qs.lower())
offset=re.search(r'offset\=(.*)\,',qs.lower())
if not offset:
offsetnew=1
else:
offsetnew=int(offset)+int(max)
if offsetnew<0:
offsetnew=0
queries=string.split(qs,",")
newquery=[]
if offset:
for query in queries:
if query.split("=")[0].lower()=="-offset":
query="-offset=%i"%offsetnew
newquery.append(query)
newquerystring=string.join(newquery,"&")
else:
queries.append("-offset=%i"%offsetnew)
newquerystring=string.join(queries,"&")
return "%s"%(self.REQUEST['URL0']+"?"+newquerystring,html)
def ZSQLrangeStart(self):
if self.REQUEST['QUERY_STRING']=="":
qs=self.REQUEST.SESSION['query']
else:
qs=self.REQUEST['QUERY_STRING']
offset=re.search(r'offset\=(.*)\,',qs.lower())
if not offset:
offset=1
return offset
# def search(self,**argv):
# """to be done"""
manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
def manage_addZSQLExtendFolder(self, id, title='',
createPublic=0,
createUserF=0,
REQUEST=None):
"""Add a new Folder object with id *id*.
If the 'createPublic' and 'createUserF' parameters are set to any true
value, an 'index_html' and a 'UserFolder' objects are created respectively
in the new folder.
"""
ob=ZSQLExtendFolder()
ob.id=str(id)
ob.title=title
self._setObject(id, ob)
ob=self._getOb(id)
checkPermission=getSecurityManager().checkPermission
if createUserF:
if not checkPermission('Add User Folders', ob):
raise Unauthorized, (
'You are not authorized to add User Folders.'
)
ob.manage_addUserFolder()
if createPublic:
if not checkPermission('Add Page Templates', ob):
raise Unauthorized, (
'You are not authorized to add Page Templates.'
)
ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
id='index_html', title='')
if REQUEST is not None:
return self.manage_main(self, REQUEST, update_menu=1)