Annotation of ZSQLExtend/ZSQLExtend.py, revision 1.4

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:         
1.4     ! dwinter    61:     def ZSQLChange(self,**argv):
        !            62:         """Ändern von Einträgen"""
        !            63:         #qs=self.REQUEST['QUERY_STRING']
        !            64:         # very bad hack
        !            65:         qs_temp=[]
        !            66:     
        !            67:         for a in self.REQUEST.form.keys():
        !            68:             qs_temp.append(a+"="+urllib.quote(str(self.REQUEST.form[a])))
        !            69: 
        !            70:         qs=string.join(qs_temp,"&")
        !            71: 
        !            72:     
        !            73:         #print "CHANGE QS",self.REQUEST
        !            74:         #return self.REQUEST
        !            75:         changeList=[]
        !            76:         for q in qs.split("&"):
        !            77:             name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
        !            78:             value=q.split("=")[1]
        !            79:             value=re.sub(r'\+'," ",value)
        !            80:        value=urllib.unquote(value)
        !            81:        if name=="-table":
        !            82:                 table=urllib.unquote(value)
        !            83:             elif name=="-identify":
        !            84:                 identify=urllib.unquote(value)
        !            85:                 identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
        !            86:             elif name=="-format":
        !            87:                 format=urllib.unquote(value)
        !            88:             elif (not name[0]=="-") and (not len(value)==0):
        !            89:                 changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
        !            90:         changeString=string.join(changeList,",")
        !            91:         queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
        !            92:         self.search(var=queryString)
        !            93:         return self.REQUEST.RESPONSE.redirect(format)
        !            94: 
        !            95:     def ZSQLChange_old(self):
1.1       dwinter    96:         """Ändern von Einträgen"""
                     97:         qs=self.REQUEST['QUERY_STRING']
                     98:         #print "CHANGE QS",self.REQUEST
                     99:         #return self.REQUEST
                    100:         changeList=[]
                    101:         for q in qs.split("&"):
                    102:             name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
                    103:             value=q.split("=")[1]
                    104:             value=re.sub(r'\+'," ",value)
                    105:        value=urllib.unquote(value)
                    106:        if name=="-table":
                    107:                 table=urllib.unquote(value)
                    108:             elif name=="-identify":
                    109:                 identify=urllib.unquote(value)
1.3       dwinter   110:                 identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
1.1       dwinter   111:             elif name=="-format":
                    112:                 format=urllib.unquote(value)
                    113:             elif (not name[0]=="-") and (not len(value)==0):
1.3       dwinter   114:                 changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
1.1       dwinter   115:         changeString=string.join(changeList,",")
                    116:         queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
                    117:         self.search(var=queryString)
                    118:         return self.REQUEST.RESPONSE.redirect(format)
                    119:     
                    120:     def ZSQLFind(self,qs="",select="*"):
                    121:         """Find"""
                    122: 
                    123: 
                    124:         if qs=="":
                    125:            if self.REQUEST['QUERY_STRING']:
                    126:                qs=self.REQUEST['QUERY_STRING']
                    127:                qs=string.join(qs.split("&"),",")
                    128:            else:
                    129:                qs=self.REQUEST.SESSION['query']
                    130:         else:
                    131:             qs=string.join(qs.split("&"),",")
                    132:         return self.parseQueryString(qs,"-",select=select,storemax="yes")
                    133: 
                    134:     def ZSQLFoundCount(self,founds):
                    135:         try:
                    136:             return len(founds)
                    137:         except:
                    138:             return 0
                    139: 
                    140:     def parseQueryString(self,qs,iCT,storemax="no",select=None):
                    141:         """analysierren den QueryString"""
                    142:         lop="AND" # standardsuche mit and
                    143:         max="ALL" #standard alle auswählen
                    144:         whereList=[]
                    145:         sort=""
                    146:         op="bw"
1.2       dwinter   147:         opfields={}
                    148:         
1.1       dwinter   149:         if not select:
                    150:             select="*"
1.2       dwinter   151: 
                    152:         #check for op in the case of inline search
                    153:         if iCT=="_":            
                    154:             for q in qs.split(","):
                    155:                 name=re.sub("r'+'"," ",q.split("=")[0].lower())
                    156:                 value=urllib.unquote(q.split("=")[1])
                    157: 
                    158:                 if name[0:3]==iCT+"op":
                    159:                     op=value
                    160:                     field=name[4:]
                    161:                     opfields[field]=op
                    162: 
                    163:         #now analyse the querystring
1.1       dwinter   164:         for q in qs.split(","):
                    165:             try:
                    166: 
                    167:                 name=re.sub("r'+'"," ",q.split("=")[0].lower())
                    168:                 value=urllib.unquote(q.split("=")[1])
1.2       dwinter   169:                 value=quoteString(value)
1.1       dwinter   170:                 if name==iCT+"lop":
                    171:                     lop=value
                    172:                 elif name==iCT+"table":
                    173:                     table=value
                    174:                 elif name==iCT+"select":
                    175:                     select=value
                    176:                 elif name==iCT+"max":
                    177:                     max=str(value)
                    178: 
                    179:                 elif name==iCT+"join":
                    180:                     whereList.append(value)
                    181:                 elif name==iCT+"sort":
                    182:                     sort="ORDER BY "+value
                    183:                 elif name==iCT+"token":
                    184:                     self.REQUEST.SESSION['token']=value
                    185: 
                    186:                 elif name==iCT+"op":
                    187:                     op=value
1.2       dwinter   188:                     
                    189:                 
1.1       dwinter   190: 
                    191:                 elif (not name[0]==iCT) and (not len(value)==0):
1.2       dwinter   192:                     if opfields.has_key(name):
                    193:                         op=opfields[name]
1.1       dwinter   194:                     if op=="ct":
                    195:                         whereList.append(name+"~\'.*"+value+".*\'")
                    196:                     elif op=="gt":
                    197:                         whereList.append(name+">\'"+value+"\'")
                    198:                     elif op=="lt":
                    199:                         whereList.append(name+"<\'"+value+"\'")
                    200:                     elif op=="eq":
                    201:                         whereList.append(name+"=\'"+value+"\'")
                    202:                     elif op=="bw":
                    203:                         whereList.append(name+"~\'"+value+".*\'")
                    204:                     elif op=="ew":
                    205:                         whereList.append(name+"~\'.*"+value+"\'")
                    206:                     op="ct"
                    207:             except:
                    208:                 print "END"        
                    209:         if len(whereList)>0:
                    210:             where="WHERE "+string.join(whereList," "+lop+" ")
                    211:         else:
                    212:             where=""
                    213:         #print "QE",table
                    214:         
                    215:         query="SELECT %s FROM %s %s %s"%(select,table,where,sort)
                    216: 
1.2       dwinter   217:         self.REQUEST.SESSION['qs']=opfields
1.1       dwinter   218:         return self.search(var=query)
                    219:     
                    220:     def ZSQLSearch(self):
                    221:         """To be done"""
                    222:         rq=self.REQUEST['QUERY_STRING']
                    223:         querys=rq.split("&")
                    224:         
                    225: 
                    226:         for querytemp in querys:
                    227:             query=querytemp.split("=")
                    228:             try:
                    229:                 if query[0].lower()=="-format":
                    230:                     formatfile=query[1]
                    231:             except:
                    232:                 """nothing"""
                    233:         #print formatfile        
                    234:         self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")
                    235:         return self.REQUEST.RESPONSE.redirect(urllib.unquote(formatfile))
                    236: 
                    237:     
                    238:     def ZSQLint(self,string):
                    239:         try:
                    240: 
                    241:             return(int(string))
                    242:         except:
                    243:             return 0
                    244:     def prevLink(self,html):
                    245:         """prev link"""
                    246:         if self.REQUEST['QUERY_STRING']=="":
                    247:             qs=self.REQUEST.SESSION['query']
                    248:         else:
                    249:             qs=self.REQUEST['QUERY_STRING']
                    250:         max=re.search(r'max\=(.*)\,',qs.lower())
                    251:         offset=re.search(r'offset\=(.*)\,',qs.lower())
                    252:         if not offset:
                    253:             offsetnew=0
                    254:         else:
                    255:             offsetnew=int(offset)-max
                    256:             if offsetnew<0:
                    257:                 offsetnew=0
                    258:         queries=string.split(qs,",")
                    259:         newquery=[]
                    260:         if offset:
                    261:             for query in queries:
                    262:                 if query.split("=")[0].lower()=="offset":
                    263:                     query="-offset=%i"%offsetnew
                    264:                 newquery.append(query)
                    265:                 newquerystring=string.join(newquery,"&")
                    266:         else:
                    267:             queries.append("-offset=%i"%offsetnew)
                    268:             newquerystring=string.join(queries,"&")
                    269:         return "<a href='%s'>%s</a>"%(self.REQUEST['URL0']+"?"+newquerystring,html)
                    270:         
                    271:     def nextLink(self,html):
                    272:         """prev link"""
                    273:         if self.REQUEST['QUERY_STRING']=="":
                    274:             qs=self.REQUEST.SESSION['query']
                    275:         else:
                    276:             qs=self.REQUEST['QUERY_STRING']
                    277:         max=re.search(r'max\=(.*)\,',qs.lower())
                    278:     
                    279:         offset=re.search(r'offset\=(.*)\,',qs.lower())
                    280:         if not offset:
                    281:             offsetnew=1
                    282:         else:
                    283:             offsetnew=int(offset)+int(max)
                    284:             if offsetnew<0:
                    285:                 offsetnew=0
                    286:         queries=string.split(qs,",")
                    287:         newquery=[]
                    288:         if offset:
                    289:             for query in queries:
                    290: 
                    291:                 if query.split("=")[0].lower()=="-offset":
                    292:                     query="-offset=%i"%offsetnew
                    293:                 newquery.append(query)
                    294:                 newquerystring=string.join(newquery,"&")
                    295:         else:
                    296:             queries.append("-offset=%i"%offsetnew)
                    297:             newquerystring=string.join(queries,"&")
                    298:         
                    299:         return "<a href='%s'>%s</a>"%(self.REQUEST['URL0']+"?"+newquerystring,html)
                    300:         
                    301:     def ZSQLrangeStart(self):
                    302:         if self.REQUEST['QUERY_STRING']=="":
                    303:             qs=self.REQUEST.SESSION['query']
                    304:         else:
                    305:             qs=self.REQUEST['QUERY_STRING']
                    306:         offset=re.search(r'offset\=(.*)\,',qs.lower())
                    307:         if not offset:
                    308:             offset=1
                    309:         return offset
                    310: #    def search(self,**argv):
                    311: #        """to be done"""
                    312: 
                    313: 
                    314: 
                    315: manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
                    316: 
                    317: def manage_addZSQLExtendFolder(self, id, title='',
                    318:                      createPublic=0,
                    319:                      createUserF=0,
                    320:                      REQUEST=None):
                    321:     """Add a new Folder object with id *id*.
                    322: 
                    323:     If the 'createPublic' and 'createUserF' parameters are set to any true
                    324:     value, an 'index_html' and a 'UserFolder' objects are created respectively
                    325:     in the new folder.
                    326:     """
                    327:     
                    328:     
                    329:     ob=ZSQLExtendFolder()
                    330:     ob.id=str(id)
                    331:     ob.title=title
                    332:     self._setObject(id, ob)
                    333:     ob=self._getOb(id)
                    334: 
                    335:     checkPermission=getSecurityManager().checkPermission
                    336: 
                    337:     if createUserF:
                    338:         if not checkPermission('Add User Folders', ob):
                    339:             raise Unauthorized, (
                    340:                   'You are not authorized to add User Folders.'
                    341:                   )
                    342:         ob.manage_addUserFolder()
                    343: 
                    344:     if createPublic:
                    345:         if not checkPermission('Add Page Templates', ob):
                    346:             raise Unauthorized, (
                    347:                   'You are not authorized to add Page Templates.'
                    348:                   )
                    349:         ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
                    350:             id='index_html', title='')
                    351: 
                    352:     if REQUEST is not None:
                    353:         return self.manage_main(self, REQUEST, update_menu=1)
                    354: 
                    355:     

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>