Annotation of ZSQLExtend/ZSQLExtend.py, revision 1.2

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

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