File:  [Repository] / ZSQLExtend / ZSQLExtend.py
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Thu Dec 11 17:22:51 2003 UTC (20 years, 6 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
bugs fixed encoding

    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 pyPgSQL import libpq
    9: from AccessControl import getSecurityManager
   10: 
   11: def quoteString(name):
   12:     #return re.sub(r'([\(\)\?])',"\\\1",name)
   13:     #return "Euklid"
   14:     return name
   15: 
   16: class ZSQLExtendFolder(Persistent, Implicit, Folder):
   17:     """Folder"""
   18:     meta_type="ZSQLExtendFolder"
   19:     
   20:     def ZSQLInlineSearch(self,**argv):
   21:         """inlinesearch"""
   22:         qs=[]
   23:         
   24:     
   25: 
   26:     
   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+"\"")
   52:             valueList.append(libpq.PgQuoteString(addList[x]))
   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)
   76:                 identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
   77:             elif name=="-format":
   78:                 format=urllib.unquote(value)
   79:             elif (not name[0]=="-") and (not len(value)==0):
   80:                 changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
   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"
  113:         opfields={}
  114:         
  115:         if not select:
  116:             select="*"
  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
  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])
  135:                 value=quoteString(value)
  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
  154:                     
  155:                 
  156: 
  157:                 elif (not name[0]==iCT) and (not len(value)==0):
  158:                     if opfields.has_key(name):
  159:                         op=opfields[name]
  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: 
  183:         self.REQUEST.SESSION['qs']=opfields
  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>