File:  [Repository] / ZSQLExtend / ZSQLExtend.py
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Wed Dec 3 17:38:43 2003 UTC (20 years, 6 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
change and inlinesearch

    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: 
   10: def quoteString(name):
   11:     #return re.sub(r'([\(\)\?])',"\\\1",name)
   12:     #return "Euklid"
   13:     return name
   14: 
   15: class ZSQLExtendFolder(Persistent, Implicit, Folder):
   16:     """Folder"""
   17:     meta_type="ZSQLExtendFolder"
   18:     
   19:     def ZSQLInlineSearch(self,**argv):
   20:         """inlinesearch"""
   21:         qs=[]
   22:         
   23:     
   24: 
   25:     
   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"
  112:         opfields={}
  113:         
  114:         if not select:
  115:             select="*"
  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
  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])
  134:                 value=quoteString(value)
  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
  153:                     
  154:                 
  155: 
  156:                 elif (not name[0]==iCT) and (not len(value)==0):
  157:                     if opfields.has_key(name):
  158:                         op=opfields[name]
  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: 
  182:         self.REQUEST.SESSION['qs']=opfields
  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>