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>