Listing 1. cgimodel.py

#!/usr/bin/env python
# $Id: cgimodel.py,v 1.3 1998/09/25 13:45:29
#     chenna Exp chenna $
# $Author: chenna $
# $Version$
# $Date: 1998/09/25 13:45:29 $
#  (C) Chenna Ramu, EMBL.
#      chenna@embl-heidelberg.de
# History
#  Fixed the bug, when more than one value has the
#  same key, the values should be a list for that
#  key in the dict!
import sys
from cgidisp import *
mime_html = "Content-type: text/html\n\n"
pre  = "<PRE>"
_pre = "</PRE>"
# A dictionary with default values for
# non-existing entries
import UserDict, copy
class DictWithDefault(UserDict.UserDict):
    def __init__(self, default):
        self.data = {}
        self.default = default
    def __getitem__(self, key):
        try:
            item = self.data[key]
        except KeyError:
            item = copy.copy(self.default)
            self.data[key] = item
        return item
    def __delitem__(self, key):
        try:
            del self.data[key]
        except KeyError:
            pass
def CollectArgs(parDict=None):
   if not parDict:
       parDict = DictWithDefault(None) # make anew
   if( len(sys.argv) > 1 ):
      cmdLine = sys.argv
      i = 1
      try:
        while i < len(cmdLine):
            key = cmdLine[i]
            val = cmdLine[i+1]
            if key[0] == '-':
           key = key[1:]
         if parDict.has_key(key): # make list
        if type(parDict[key]) == type([]):
            parDict[key].append(val)
        else:
            parDict[key] = []
            tmp = parDict[key]
            parDict[key].append(tmp)
            parDict[key].append(val)
         else:
        parDict[key] = val
         i = i + 2
        parDict['isCmdLine'] = 1
      except IndexError:
     pass
   else:
      import cgi
      form = cgi.FieldStorage()
      parDict['isHtml'] = 1
      for j in form.list:
     if j.name[0] == '-':  # take care of
                                # '-' in cgi
         j.name = j.name[1:]
        parDict[j.name]=j.value
      parDict['isCmdLine'] = None
      import os
      parDict['_environ'] = {}  # do not mix the
                   # environs with main dictionary
      for k,v in os.environ.items():
     parDict['_environ'][k] = v
   return parDict
def TraceIt(parDict):
    import traceback
    sys.stderr = sys.stdout
    if not parDict.has_key('isCmdLine'):
   print parDict['isCmdLine']
   print mime_html
   print pre
   print " <B> Tracing ... </B>"
    traceback.print_exc()
    if not parDict.has_key('isCmdLine'):
   print _pre
    return
##################################################
#  main
#
def main():
    parDict  = DictWithDefault(None)
    d = Dispatcher()
    parDict = CollectArgs(parDict)
    mime = parDict['mime']
    if not mime:
   print mime_html # print default mime
    if mime == 'simple':
   pass
    fun = parDict['fun']
    if not fun:
   print "usage : cgimodel -fun functionName"
   d.ShowAvailableFunc()
   TraceIt(parDict)
    else:
   try:
       d.dispatch(fun,parDict)
   except:
       TraceIt(parDict)
if __name__ == '__main__' :
    main()