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, 5 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
change and inlinesearch

from OFS.Folder import Folder
from Globals import Persistent
from Acquisition import Implicit
from Globals import DTMLFile
import urllib
import re
import string
from AccessControl import getSecurityManager

def quoteString(name):
    #return re.sub(r'([\(\)\?])',"\\\1",name)
    #return "Euklid"
    return name

class ZSQLExtendFolder(Persistent, Implicit, Folder):
    """Folder"""
    meta_type="ZSQLExtendFolder"
    
    def ZSQLInlineSearch(self,**argv):
        """inlinesearch"""
        qs=[]
        
    

    
        for a in argv.keys():
            qs.append(a+"="+urllib.quote(str(argv[a])))

        return self.parseQueryString(string.join(qs,","),"_")
    
    def ZSQLAdd(self):
        """Neuer Eintrag"""
        qs=self.REQUEST['QUERY_STRING']
        addList={}
        for q in qs.split("&"):
            name=re.sub("r'+'"," ",q.split("=")[0].lower())
            value=q.split("=")[1]
	    value=re.sub(r'\+'," ",value)
	    value=urllib.unquote(value)	
            if name=="-table":
                table=urllib.unquote(value)
            elif name=="-format":
                format=urllib.unquote(value)
            elif (not name[0]=="-") and (not len(value)==0):
                addList[urllib.unquote(name)]=urllib.unquote(value)

        keyList=[]
        valueList=[]
        for x in addList.keys():
            keyList.append("\""+x+"\"")
            valueList.append("\'"+addList[x]+"\'")

        keyString=string.join(keyList,",")
        valueString=string.join(valueList,",")
        
        queryString="INSERT INTO %s (%s) VALUES (%s)"%(table,keyString,valueString)
        self.search(var=queryString)
        return self.REQUEST.RESPONSE.redirect(format)
        
    def ZSQLChange(self):
        """Ändern von Einträgen"""
        qs=self.REQUEST['QUERY_STRING']
        #print "CHANGE QS",self.REQUEST
        #return self.REQUEST
        changeList=[]
        for q in qs.split("&"):
            name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
            value=q.split("=")[1]
            value=re.sub(r'\+'," ",value)
	    value=urllib.unquote(value)
	    if name=="-table":
                table=urllib.unquote(value)
            elif name=="-identify":
                identify=urllib.unquote(value)
                identify=identify.split("=")[0]+"=\'"+identify.split("=")[1]+"\'"
            elif name=="-format":
                format=urllib.unquote(value)
            elif (not name[0]=="-") and (not len(value)==0):
                changeList.append("\""+name+"\"=\'"+urllib.unquote(value)+"\'")
        changeString=string.join(changeList,",")
        queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
        self.search(var=queryString)
        return self.REQUEST.RESPONSE.redirect(format)
    
    def ZSQLFind(self,qs="",select="*"):
        """Find"""


        if qs=="":
           if self.REQUEST['QUERY_STRING']:
               qs=self.REQUEST['QUERY_STRING']
               qs=string.join(qs.split("&"),",")
           else:
               qs=self.REQUEST.SESSION['query']
        else:
            qs=string.join(qs.split("&"),",")
        return self.parseQueryString(qs,"-",select=select,storemax="yes")

    def ZSQLFoundCount(self,founds):
        try:
            return len(founds)
        except:
            return 0

    def parseQueryString(self,qs,iCT,storemax="no",select=None):
        """analysierren den QueryString"""
        lop="AND" # standardsuche mit and
        max="ALL" #standard alle auswählen
        whereList=[]
        sort=""
        op="bw"
        opfields={}
        
        if not select:
            select="*"

        #check for op in the case of inline search
        if iCT=="_":            
            for q in qs.split(","):
                name=re.sub("r'+'"," ",q.split("=")[0].lower())
                value=urllib.unquote(q.split("=")[1])

                if name[0:3]==iCT+"op":
                    op=value
                    field=name[4:]
                    opfields[field]=op

        #now analyse the querystring
        for q in qs.split(","):
            try:

                name=re.sub("r'+'"," ",q.split("=")[0].lower())
                value=urllib.unquote(q.split("=")[1])
                value=quoteString(value)
                if name==iCT+"lop":
                    lop=value
                elif name==iCT+"table":
                    table=value
                elif name==iCT+"select":
                    select=value
                elif name==iCT+"max":
                    max=str(value)

                elif name==iCT+"join":
                    whereList.append(value)
                elif name==iCT+"sort":
                    sort="ORDER BY "+value
                elif name==iCT+"token":
                    self.REQUEST.SESSION['token']=value

                elif name==iCT+"op":
                    op=value
                    
                

                elif (not name[0]==iCT) and (not len(value)==0):
                    if opfields.has_key(name):
                        op=opfields[name]
                    if op=="ct":
                        whereList.append(name+"~\'.*"+value+".*\'")
                    elif op=="gt":
                        whereList.append(name+">\'"+value+"\'")
                    elif op=="lt":
                        whereList.append(name+"<\'"+value+"\'")
                    elif op=="eq":
                        whereList.append(name+"=\'"+value+"\'")
                    elif op=="bw":
                        whereList.append(name+"~\'"+value+".*\'")
                    elif op=="ew":
                        whereList.append(name+"~\'.*"+value+"\'")
                    op="ct"
            except:
                print "END"        
        if len(whereList)>0:
            where="WHERE "+string.join(whereList," "+lop+" ")
        else:
            where=""
        #print "QE",table
        
        query="SELECT %s FROM %s %s %s"%(select,table,where,sort)

        self.REQUEST.SESSION['qs']=opfields
        return self.search(var=query)
    
    def ZSQLSearch(self):
        """To be done"""
        rq=self.REQUEST['QUERY_STRING']
        querys=rq.split("&")
        

        for querytemp in querys:
            query=querytemp.split("=")
            try:
                if query[0].lower()=="-format":
                    formatfile=query[1]
            except:
                """nothing"""
        #print formatfile        
        self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")
        return self.REQUEST.RESPONSE.redirect(urllib.unquote(formatfile))

    
    def ZSQLint(self,string):
        try:

            return(int(string))
        except:
            return 0
    def prevLink(self,html):
        """prev link"""
        if self.REQUEST['QUERY_STRING']=="":
            qs=self.REQUEST.SESSION['query']
        else:
            qs=self.REQUEST['QUERY_STRING']
        max=re.search(r'max\=(.*)\,',qs.lower())
        offset=re.search(r'offset\=(.*)\,',qs.lower())
        if not offset:
            offsetnew=0
        else:
            offsetnew=int(offset)-max
            if offsetnew<0:
                offsetnew=0
        queries=string.split(qs,",")
        newquery=[]
        if offset:
            for query in queries:
                if query.split("=")[0].lower()=="offset":
                    query="-offset=%i"%offsetnew
                newquery.append(query)
                newquerystring=string.join(newquery,"&")
        else:
            queries.append("-offset=%i"%offsetnew)
            newquerystring=string.join(queries,"&")
        return "<a href='%s'>%s</a>"%(self.REQUEST['URL0']+"?"+newquerystring,html)
        
    def nextLink(self,html):
        """prev link"""
        if self.REQUEST['QUERY_STRING']=="":
            qs=self.REQUEST.SESSION['query']
        else:
            qs=self.REQUEST['QUERY_STRING']
        max=re.search(r'max\=(.*)\,',qs.lower())
    
        offset=re.search(r'offset\=(.*)\,',qs.lower())
        if not offset:
            offsetnew=1
        else:
            offsetnew=int(offset)+int(max)
            if offsetnew<0:
                offsetnew=0
        queries=string.split(qs,",")
        newquery=[]
        if offset:
            for query in queries:

                if query.split("=")[0].lower()=="-offset":
                    query="-offset=%i"%offsetnew
                newquery.append(query)
                newquerystring=string.join(newquery,"&")
        else:
            queries.append("-offset=%i"%offsetnew)
            newquerystring=string.join(queries,"&")
        
        return "<a href='%s'>%s</a>"%(self.REQUEST['URL0']+"?"+newquerystring,html)
        
    def ZSQLrangeStart(self):
        if self.REQUEST['QUERY_STRING']=="":
            qs=self.REQUEST.SESSION['query']
        else:
            qs=self.REQUEST['QUERY_STRING']
        offset=re.search(r'offset\=(.*)\,',qs.lower())
        if not offset:
            offset=1
        return offset
#    def search(self,**argv):
#        """to be done"""



manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())

def manage_addZSQLExtendFolder(self, id, title='',
                     createPublic=0,
                     createUserF=0,
                     REQUEST=None):
    """Add a new Folder object with id *id*.

    If the 'createPublic' and 'createUserF' parameters are set to any true
    value, an 'index_html' and a 'UserFolder' objects are created respectively
    in the new folder.
    """
    
    
    ob=ZSQLExtendFolder()
    ob.id=str(id)
    ob.title=title
    self._setObject(id, ob)
    ob=self._getOb(id)

    checkPermission=getSecurityManager().checkPermission

    if createUserF:
        if not checkPermission('Add User Folders', ob):
            raise Unauthorized, (
                  'You are not authorized to add User Folders.'
                  )
        ob.manage_addUserFolder()

    if createPublic:
        if not checkPermission('Add Page Templates', ob):
            raise Unauthorized, (
                  'You are not authorized to add Page Templates.'
                  )
        ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
            id='index_html', title='')

    if REQUEST is not None:
        return self.manage_main(self, REQUEST, update_menu=1)

    

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