
wDEc           @   s  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l	 Z	 d d l
 Z
 d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z y d d l Z Wn e k
 r%d d l Z n Xy d d l Z Wn e k
 rUd d l Z n Xd f  d     YZ d f  d     YZ d f  d     YZ d	 f  d
     YZ d f  d     YZ d e f d     YZ  d e f d     YZ! d g  d  Z" d e# f d     YZ$ d e$ f d     YZ% d f  d     YZ& d e# f d     YZ' d e# f d     YZ( d f  d     YZ) d e j* f d      YZ+ d! e j, e j- f d"     YZ. d# d$ d% d% e/ d&  Z0 d'   Z1 d S((   s  = QWeb Framework =

== What is QWeb ? ==

QWeb is a python based [http://www.python.org/doc/peps/pep-0333/ WSGI]
compatible web framework, it provides an infratructure to quickly build web
applications consisting of:

 * A lightweight request handler (QWebRequest)
 * An xml templating engine (QWebXml and QWebHtml)
 * A simple name based controler (qweb_control)
 * A standalone WSGI Server (QWebWSGIServer)
 * A cgi and fastcgi WSGI wrapper (taken from flup)
 * A startup function that starts cgi, factgi or standalone according to the
   evironement (qweb_autorun).

QWeb applications are runnable in standalone mode (from commandline), via
FastCGI, Regular CGI or by any python WSGI compliant server.

QWeb doesn't provide any database access but it integrates nicely with ORMs
such as SQLObject, SQLAlchemy or plain DB-API.

Written by Antony Lesuisse (email al AT udev.org)

Homepage: http://antony.lesuisse.org/qweb/trac/

Forum: [http://antony.lesuisse.org/qweb/forum/viewforum.php?id=1 Forum]

== Quick Start (for Linux, MacOS X and cygwin) ==

Make sure you have at least python 2.3 installed and run the following commands:

{{{
$ wget http://antony.lesuisse.org/qweb/files/QWeb-0.7.tar.gz
$ tar zxvf QWeb-0.7.tar.gz
$ cd QWeb-0.7/examples/blog
$ ./blog.py
}}}

And point your browser to http://localhost:8080/

You may also try AjaxTerm which uses qweb request handler.

== Download ==

 * Version 0.7:
   * Source [/qweb/files/QWeb-0.7.tar.gz QWeb-0.7.tar.gz]
   * Python 2.3 Egg [/qweb/files/QWeb-0.7-py2.3.egg QWeb-0.7-py2.3.egg]
   * Python 2.4 Egg [/qweb/files/QWeb-0.7-py2.4.egg QWeb-0.7-py2.4.egg]

 * [/qweb/trac/browser Browse the source repository]

== Documentation ==

 * [/qweb/trac/browser/trunk/README.txt?format=raw Read the included documentation] 
 * QwebTemplating

== Mailin-list ==

 * Forum: [http://antony.lesuisse.org/qweb/forum/viewforum.php?id=1 Forum]
 * No mailing-list exists yet, discussion should happen on: [http://mail.python.org/mailman/listinfo/web-sig web-sig] [http://mail.python.org/pipermail/web-sig/ archives]

QWeb Components:
----------------

QWeb also feature a simple components api, that enables developers to easily
produces reusable components.

Default qweb components:

    - qweb_static:
        A qweb component to serve static content from the filesystem or from
        zipfiles.

    - qweb_dbadmin:
        scaffolding for sqlobject

License
-------
qweb/fcgi.py wich is BSD-like from saddi.com.
Everything else is put in the public domain.


TODO
----
    Announce QWeb to python-announce-list@python.org web-sig@python.org
    qweb_core
        rename request methods into
            request_save_files
            response_404
            response_redirect
            response_download
        request callback_generator, callback_function ?
        wsgi callback_server_local
        xml tags explicitly call render_attributes(t_att)?
        priority form-checkbox over t-value (for t-option)

iNt   QWebEvalc           B   s>   e  Z d    Z d   Z d   Z d   Z d   Z d   Z RS(   c         C   s   | |  _  d  S(   N(   t   data(   t   selfR   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   __init__{   s    c         C   s   |  j  j |  r |  j  | Sd  } y t | |  j   } WnD t k
 rN } n2 t k
 r` } n  t k
 r } d | G| GHn X|  j  j d  r |  j  d =n  | S(   Ns   qweb: expression error '%s' t   __builtins__(   R   t   has_keyt   Nonet   evalt	   NameErrort   AttributeErrort	   Exception(   R   t   exprt   rt   e(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   __getitem__}   s    c         C   s   |  | S(   N(    (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   eval_object   s    c         C   sI   | d k r |  j  d St |  | t  r; |  | j d  St |  |  S(   Nt   0i    t   utf8(   R   t
   isinstancet   unicodet   encodet   str(   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   eval_str   s
    c         C   s%   y t  | |   SWn d | SXd  S(   Ns   qweb: format error '%s' (   R   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   eval_format   s    c         C   s   |  j  |  r d Sd Sd  S(   Ni   i    (   R   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt	   eval_bool   s    (   t   __name__t
   __module__R   R   R   R   R   R   (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR    z   s   					t   QWebXmlc           B   s   e  Z d  Z d d d  Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z i  d d	  Z d
   Z d d d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   sK  QWeb Xml templating engine
    
    The templating engine use a very simple syntax, "magic" xml attributes, to
    produce any kind of texutal output (even non-xml).
    
    QWebXml:
        the template engine core implements the basic magic attributes:
    
        t-att t-raw t-esc t-if t-foreach t-set t-call t-trim
    
    c   	      C   su  t  j j |  _ i  |  _ i  |  _ d } xk g  t |   D] } | j |  r7 | ^ q7 D]; } | t |  j	 d d  } t
 |  j |  |  j | <qV Wi  |  _ d } xk g  t |   D] } | j |  r | ^ q D]; } | t |  j	 d d  } t
 |  j |  |  j | <q W| d  k rq| d  k rad d  l } | j | d  } |  j | j |   qq|  j |  n  d  S(   Nt   render_tag_t   _t   -t   render_att_iR   (   t   xmlt   domt   Nodet   nodet   _tt   _render_tagt   dirt
   startswitht   lent   replacet   getattrt	   __class__t   _render_attR   t   zipfilet   ZipFilet   add_templatet   read(	   R   t   xt   zipnamet   prefixt   jt   it   nameR-   t   zf(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR      s$    		5	5c         C   s   | |  j  | <d  S(   N(   R%   (   R   t   tagt   func(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   register_tag   s    c         C   s   t  | d  r | } nT | j d  rK d d  l } | j j j |  } n! d d  l } | j j j |  } xB | j j D]4 } | j	 d k ry | |  j
 t | j d   <qy qy Wd  S(   Nt   documentElements   <?xmlit   ts   t-name(   t   hasattrR'   t   xml.dom.minidomR!   t   minidomt   parseStringt   parseR;   t
   childNodest   nodeNameR$   R   t   getAttribute(   R   R1   R!   R    t   n(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR/      s    	c         C   s   |  j  | S(   N(   R$   (   R   R6   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   get_template   s    c         C   s   t  |  j |  S(   N(   R    R   (   R   R   t   v(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR      s    c         C   s   t  |  j |  S(   N(   R    R   (   R   R   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR      s    c         C   s   t  |  j |  S(   N(   R    R   (   R   R   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR      s    c         C   s   t  |  j |  S(   N(   R    R   (   R   R   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR      s    c         C   s5   |  j  j |  r) |  j |  j  | |  Sd | Sd  S(   Ns   qweb: template "%s" not found(   R$   R   t   render_node(   R   t   tnameRG   t   out(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render   s    c      
   C   s  d } | j  |  j j k s0 | j  |  j j k rE | j j d  } n| j  |  j j k rd } d } d  } i  } x| j j	   D] \ } }	 t
 |  } t |	 t j  r |	 j d  }	 n |	 j j d  }	 | j d  rax |  j D]@ }
 | d j |
  r | |  j |
 |  | | |	 |  7} Pq q W|  j j | d  rP| d } n  |	 | | d <q | d | t j |	 d  f 7} q W| r|  j j |  r|  j | |  | | | |  } qq|  j | | | | | j d d   } n  | S(	   Nt    R   s   t-i   s    %s="%s"i   t   trimi    (   t   nodeTypeR#   t	   TEXT_NODEt   CDATA_SECTION_NODER   R   t   ELEMENT_NODER   t
   attributest   itemsR   R   t   typest   UnicodeTypet	   nodeValueR'   R,   R%   R   t   cgit   escapet   render_elementt   get(   R   R   RG   R   t   pret   g_attt   t_rendert   t_attt   ant   avR5   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRH      s6    *#$%*RL   i    c   
      C   s   g  } x* | j  D] } | j |  j | |   q Wt | j  } d j |  }	 | d k r` nQ | d k r{ |	 j   }	 n6 | d k r |	 j   }	 n | d k r |	 j   }	 n  | d k r |	 St	 |	  r d | | | |	 | f Sd | | f Sd  S(	   NRL   i    t   leftt   rightt   bothR<   s   <%s%s>%s%s</%s>s   <%s%s/>(
   RB   t   appendRH   R   RC   t   joint   lstript   rstript   stripR(   (
   R   R   R\   RG   R[   RM   t   g_innerRE   R6   t   inner(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRY     s$    c         C   s   | j  d  r/ | d |  j | |  } } nG | j  d  r^ | d |  j | |  } } n |  j | |  \ } } d | t j | d  f S(   Ns   t-attf-i   s   t-att-i   s    %s="%s"i   (   R'   R   R   R   RW   RX   (   R   R   R_   R`   RG   t   attt   val(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_att_att  s      c         C   s   |  j  | d |  S(   Nt   raw(   R   (   R   R   R^   R\   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_raw!  s    c         C   s   |  j  | d |  S(   Nt   rawf(   R   (   R   R   R^   R\   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_rawf#  s    c         C   s   t  j |  j | d |   S(   Nt   esc(   RW   RX   R   (   R   R   R^   R\   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_esc%  s    c         C   s   t  j |  j | d |   S(   Nt   escf(   RW   RX   R   (   R   R   R^   R\   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_escf'  s    c         C   s  | d } |  j  | |  } | d  k r| j d |  j d d  } | j   } d }	 t | t j  ry t |  }	 n? t | t j	  r t |  }	 n t
 | d  r | j   }	 n  |	 | d | <| | d | <d	 }
 g  } x | D] } | | d
 | <|
 | d | <|
 d	 k | d | <|
 d | d | <|
 d d | d | <|
 d |	 k | d | <|
 d rxd | d | <n d | d | <t | t j  r| j |  n
 | | | <| j |  j | | |   |
 d 7}
 q Wd j |  Sd | Sd  S(   Nt   foreacht   ast   .R   it   counts   %s_sizes   %s_alli    s   %s_values   %s_indexs   %s_firsti   s   %s_eveni   s   %s_odds   %s_lastt   odds	   %s_parityt   evenRL   s   qweb: t-foreach %s not found.(   R   R   RZ   R)   t   copyR   RT   t   ListTypeR(   t	   TupleTypeR=   Ry   t   DictTypet   updateRd   RY   Re   (   R   R   R^   R\   RG   R   t   enumt   vart   dt   sizet   indext   ruR5   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_foreach)  sB    


c         C   s1   |  j  | d |  r) |  j | | |  Sd Sd  S(   Nt   ifRL   (   R   RY   (   R   R   R^   R\   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_ifN  s    c         C   sQ   | j  d  r | } n | j   } |  j | | |  | d <|  j | d |  S(   Nt   importi    t   call(   R   R|   RY   RK   (   R   R   R^   R\   RG   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_callS  s
    	c         C   sQ   | j  d  r0 |  j | d |  | | d <n |  j | | |  | | d <d S(   NR   t   setRL   (   R   R   RY   (   R   R   R^   R\   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_set[  s    !N(   R   R   t   __doc__R   R   R:   R/   RF   R   R   R   R   RK   RH   RY   Rm   Ro   Rq   Rs   Ru   R   R   R   R   (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR      s*   								 	
					%		t   QWebURLc           B   sw   e  Z d  Z d d d i  d  Z d   Z d   Z d   Z d d d  Z d d  Z	 d i  d	  Z
 d i  d
  Z RS(   s    URL helper
    assert req.PATH_INFO== "/site/admin/page_edit"
    u = QWebURL(root_path="/site/",req_path=req.PATH_INFO)
    s=u.url2_href("user/login",{'a':'1'})
    assert s=="../user/login?a=1"
    
    t   /RL   c         C   sP   | |  _  | |  _ | |  _ | |  _ | j d  d  |  _ t |  j  |  _ d  S(   NR   i(   t   defpatht   defparamt	   root_patht   req_patht   splitt   req_listR(   t   req_len(   R   R   R   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   m  s    				c         C   s7   i  } x* t  j | d  D] \ } } | | | <q W| S(   Ni   (   RW   t	   parse_qsl(   R   t   st   ht   kRG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   decodet  s    c         C   s   t  j | j    S(   N(   t   urllibt	   urlencodeRS   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   y  s    c         C   s   | j  S(   N(   t   REQUEST(   R   t   req(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   request{  s    c         C   sV   |  j  } | r | } n  |  j j   } | r= | j |  n  t |  j |  j | |  S(   N(   R   R   R|   R   R   R   R   (   R   t   patht   paramt   npatht   nparam(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR|   }  s    		c         C   s   | s |  j  } n  |  j | j d  } d } xK t t t |  |  j   D]! } | | |  j | k rM PqM qM W| d 7} |  j | } | d k  r d } n  d j d g | | |  S(   NR   i    i   s   ..(	   R   R   R   t   ranget   minR(   R   R   Re   (   R   R   t   plR5   t   dd(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    %
	c         C   sZ   |  j  |  } |  j j   } | j |  |  j |  } t |  rR | d | S| Sd  S(   Nt   ?(   R   R   R|   R   R   R(   (   R   R   t   argt   pt   tmpR   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   href  s    c         C   s   |  j  |  } |  j j   } | j |  d j g  | j   D]. \ } } d | t j t |  d  f ^ q>  } | | f S(   NRL   s+   <input type="hidden" name="%s" value="%s"/>i   (	   R   R   R|   R   Re   RS   RW   RX   R   (   R   R   R   R   R   R   RG   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   form  s
    JN(   R   R   R   R   R   R   R   R   R|   R   R   R   (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   e  s   				t	   QWebFieldc           B   s5   e  Z d d  d d  Z d d d  Z d d  Z RS(   RL   c         C   s   | |  _  | |  _ | |  _ d  |  _ d |  _ d |  _ d |  _ d |  _ d  |  _	 d  |  _
 d  |  _ d  |  _ d  |  _ d  |  _ |  j d  d  S(   Ni   t
   form_validt   form_invalid(   R6   t   defaultt   checkR   t   typeRM   t   requiredt   cssvalidt
   cssinvalidR   t   inputt   csst   valuet   validt   invalidt   validate(   R   R6   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    														i   c         C   sh   | r' d |  _  d |  _ |  j |  _ n d |  _  d |  _ |  j |  _ | rd |  j rd |  j j   n  d  S(   Ni   i    (   R   R   R   R   R   R   R   (   R   Rl   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    				c         C   s   |  j  d |  d  S(   Ni    (   R   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt
   invalidate  s    N(   R   R   R   R   R   R   (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s   t   QWebFormc           B   s   e  Z d  d d     YZ d d d d  Z d   Z d d  Z d   Z d   Z d   Z	 d d	  Z
 d
   Z d   Z d   Z RS(   t	   QWebFormFc           B   s   e  Z RS(    (   R   R   (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s   c         C   s   i  |  _  t |  _ g  |  _ t |  _ g  |  _ t |  _ |  j   |  _ | r[ |  j	 |  n  | rz |  j
 | | d  k  n  | d  k r |  j |  n  d  S(   N(   t   fieldst   Falset	   submittedt   missingR   t   errorR   R   t   fR/   t   set_defaultR   t   process_input(   R   R   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    						c         C   s   |  j  | S(   N(   R   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    i   c         C   sk   xd | j    D]V \ } } |  j j |  rD t |  |  j | _ q | r |  j t | |   q q Wd  S(   N(   RS   R   R   R   R   t	   add_fieldR   (   R   R   t   add_missingR   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s
    c         C   s3   | |  j  | j <|  | _ t |  j | j |  d  S(   N(   R   R6   R   t   setattrR   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    	c         C   sf  i  } xR | j  j   D]A \ } } t |  } | j d  r | j d  | | d <q q Wx d d d d d d	 g D] } | j |  rt | | j d
  d } | j d d  } | j d d   } t	 | | |  }	 | d	 k r d |	 _
 d |	 _ n  | d k rd |	 _
 d |	 _ n  |  j |	  qt qt Wx3 | j D]( }
 |
 j |
 j k r6|  j |
  q6q6Wd  S(   Ns   t-R   i   s	   form-texts   form-passwords
   form-radios   form-checkboxs   form-selects   form-textareaRx   iR   RL   R   t   textareai    t   checkbox(   RR   RS   R   R'   R   R   R   RZ   R   R   R   RM   R   R   RB   RN   RQ   R/   (   R   R   Rk   R_   R`   R5   R6   R   R   R   RE   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR/     s*    		c         C   s7  x&|  j  j   D]} | j | j  r| | j | _ | j | _ | j rb | j j   | _ n  | j d t	  | j
 d  k r q q%t | j
  r q%t | j
 t  r%| j
 } | j
 d k r d } n  | j
 d k r d } n  t j | d d !| j  s| j d t	  qq%q | j | _ q W|  j   d  S(   Ni   t   emails<   /^[^@#!& ]+@[A-Za-z0-9-][.A-Za-z0-9-]{0,64}\.[A-Za-z]{2,5}$/t   dates8   /^(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/ii    (   R   t   valuesR   R6   R   R   RM   Rh   R   R   R   R   t   callableR   R   t   ret   matchR   R   (   R   R   R   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s*    				c         C   s8   x' |  j  j   D] } | j | d  q W|  j   d  S(   Ni    (   R   R   R   R   (   R   Rl   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   validate_all  s    c         C   s   |  j  d  d  S(   Ni    (   R   (   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   invalidate_all  s    c         C   s   t  |  _ t  |  _ g  |  _ x |  j j   D]n } | j rq | j d  k rq t	 |  _ t	 |  _ |  j
 j | j  n  | j r+ t	 |  _ |  j j | j  q+ q+ W|  j o |  j t	 k |  _ d  S(   N(   t   TrueR   R   t   errorsR   R   R   R   R   R   R   Rd   R6   R   R   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    							c         C   s4   i  } x' |  j  j   D] } | j | | j <q W| S(   N(   R   R   R   R6   (   R   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   collect&  s    (    N(   R   R   R   R   R   R   R   R   R/   R   R   R   R   R   (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s   						t   QWebURLEvalc           B   s   e  Z d    Z d   Z RS(   c         C   s   t  j |  |  d  S(   N(   R    R   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   ,  s    c         C   s6   t  j |  |  } t | t  r. t j |  S| Sd  S(   N(   R    R   R   R   R   t
   quote_plus(   R   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   .  s    (   R   R   R   R   (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   +  s   	t   QWebHtmlc           B   s   e  Z d  Z d d d  Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   s{  QWebHtml
    QWebURL:
    QWebField:
    QWebForm:
    QWebHtml:
        an extended template engine, with a few utility class to easily produce
        HTML, handle URLs and process forms, it adds the following magic attributes:
    
        t-href t-action t-form-text t-form-password t-form-textarea t-form-radio
        t-form-checkbox t-form-select t-option t-selected t-checked t-pager
    
    # explication URL:
    # v['tableurl']=QWebUrl({p=afdmin,saar=,orderby=,des=,mlink;meta_active=})
    # t-href="tableurl?desc=1"
    #
    # explication FORM: t-if="form.valid()"
    # Foreach i
    #   email: <input type="text" t-esc-name="i" t-esc-value="form[i].value" t-esc-class="form[i].css"/>
    #   <input type="radio" name="spamtype" t-esc-value="i" t-selected="i==form.f.spamtype.value"/>
    #   <option t-esc-value="cc" t-selected="cc==form.f.country.value"><t t-esc="cname"></option>
    # Simple forms:
    #   <input t-form-text="form.email" t-check="email"/>
    #   <input t-form-password="form.email" t-check="email"/>
    #   <input t-form-radio="form.email" />
    #   <input t-form-checkbox="form.email" />
    #   <textarea t-form-textarea="form.email" t-check="email"/>
    #   <select t-form-select="form.email"/>
    #       <option t-value="1">
    #   <input t-form-radio="form.spamtype" t-value="1"/> Cars
    #   <input t-form-radio="form.spamtype" t-value="2"/> Sprt
    c         C   s   t  |  j | | |  } | S(   N(   R   R$   (   R   RI   R   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   U  s    c   
      C   s   t  |  j |  } | j d d  } i  } t |  d k rs x1 t j | d d  D] \ } } | | | <qV Wn  | d j d d  } d } t |  d k r | d } n  | d }	 |	 | | f S(   NR   i   i    R   RL   (   R   R   R   R(   RW   R   (
   R   R`   RG   R   t   aR   R   t   bR   t   u(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   eval_urlZ  s    #
c   	      C   s   |  j  | |  \ } } } t | j | d  t  sL d | | | f } n | | j | |  } d | d t j | d  f S(   Ni    s   qweb: missing url %r %r %rs    %s="%s"i   i   (   R   R   RZ   R   R   RW   RX   (	   R   R   R_   R`   RG   R   R   R   RJ   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_att_url_g  s
    c         C   s   |  j  | d | |  S(   Ns
   t-url-href(   R   (   R   R   R_   R`   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_att_hrefn  s    c         C   s0   |  j  | |  r( d | d | d f Sd Sd  S(   Ns    %s="%s"i   RL   (   R   (   R   R   R_   R`   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_att_checkedp  s    c         C   s   |  j  | | | |  S(   N(   R   (   R   R   R_   R`   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_att_selectedu  s    c         C   s3   |  j  | d |  \ } } } | | j | |  S(   Nt   rawurl(   R   R   (   R   R   R^   R\   RG   R   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_rawurly  s    c         C   s<   |  j  | d |  \ } } } t j | | j | |   S(   Nt   escurl(   R   RW   RX   R   (   R   R   R^   R\   RG   R   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_escurl|  s    c   
      C   s   |  j  | d |  \ } } } t | j | d  t  sW d | | | f d } }	 n | | j | |  \ } }	 | d | 7} |  j | | | |	  S(   Nt   actioni    s   qweb: missing url %r %r %rRL   s    action="%s"(   R   R   RZ   R   R   RY   (
   R   R   R^   R\   RG   R   R   R   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_action  s    c         C   sU   |  j  | d |  } | d | j t j | j d  | j f 7} |  j | | |  S(   Ns	   form-texts,    type="text" name="%s" value="%s" class="%s"i   (   R   R6   RW   RX   R   R   RY   (   R   R   R^   R\   RG   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_form_text  s    ,c         C   sU   |  j  | d |  } | d | j t j | j d  | j f 7} |  j | | |  S(   Ns   form-passwords0    type="password" name="%s" value="%s" class="%s"i   (   R   R6   RW   RX   R   R   RY   (   R   R   R^   R\   RG   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_form_password  s    ,c         C   s_   d } |  j  | d |  } | d | j | j f 7} d | | t j | j d  | f } | S(   NR   s   form-textareas    name="%s" class="%s"s   <%s%s>%s</%s>i   (   R   R6   R   RW   RX   R   (   R   R   R^   R\   RG   R   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_form_textarea  s
    %c         C   sf   |  j  | d |  } | d } | d | j | f 7} | j | k rS | d 7} n  |  j | | |  S(   Ns
   form-radioR   s"    type="radio" name="%s" value="%s"s    checked="checked"(   R   R6   R   RY   (   R   R   R^   R\   RG   R   Rl   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_form_radio  s    
c         C   sf   |  j  | d |  } | d } | d | j | f 7} | j | k rS | d 7} n  |  j | | |  S(   Ns   form-checkboxR   s%    type="checkbox" name="%s" value="%s"s    checked="checked"(   R   R6   R   RY   (   R   R   R^   R\   RG   R   Rl   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_form_checkbox  s    
c         C   sC   |  j  | d |  } | d | j | j f 7} |  j | | |  S(   Ns   form-selects    name="%s" class="%s"(   R   R6   R   RY   (   R   R   R^   R\   RG   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_form_select  s    c         C   se   |  j  | j j d  |  } | d } | d | 7} | j | k rR | d 7} n  |  j | | |  S(   Ns   t-form-selectt   options    value="%s"s    selected="selected"(   R   t
   parentNodeRD   R   RY   (   R   R   R^   R\   RG   R   Rl   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_option  s    
c         C   s  | d } t  |  j | d |   } t  |  j | d |   } t  |  j | j d d  |   } t  |  j | j d d  |   }	 | d }
 i  } | | |
 d	 <| | | |
 d
 <} | o | | |
 d <| o | d | |
 d <t d t | | d | d   | |
 d <t | | |  | |
 d <| | | |
 d <} | d | |
 d <| d k | |
 d <| d | | |
 d <| | d k | |
 d <| d | | |
 d <g  } | |	 } | |	 } | d k  r| | 8} n  | | k r| | | 8} n  t d |  } xv | t | |  k r| | k r| j i | |
 d 6| d |
 d 6| | |
 d 6| | k |
 d 6 | d 7} qWt |  d k | |
 d <| | |
 d <| j |  d S(   Nt   pagert   totalt   startt   stept   100t   scopet   5R   t   tot_sizet   tot_paget
   win_start0i   t
   win_start1i    t   win_end0t   win_end1t	   win_page0t	   win_page1t   prevt
   prev_startt   nextt
   next_startt   page0t   page1t   selt   activet   listRL   (   t   intR   RZ   t   maxR   Rd   R(   R   (   R   R   R^   R\   RG   R[   R   R   R   R   R   R   R   t   win_paget   lt   begint   endR5   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   render_tag_pager  sD    
$$
,

$GN(   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R  (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   4  s$   																t   mainc   	      C   s%  | j  d d  j d  } t |  |  s. d Si  } g  } x | d k r d } g  } xL | j d  D]; } | | d 7} | j | d   se | j | d   qe qe Wd } q= t |  r| j d  } d | | <t |  |  rt	 |  |  } | |   } t
 | t j  r| } qqq= Pq= d S(   s[   qweb_control(self,jump='main',p=[]):
    A simple function to handle the controler part of your application. It
    dispatch the control to the jump argument, while ensuring that prefix
    function have been called.

    qweb_control replace '/' to '_' and strip '_' from the jump argument.

    name1
    name1_name2
    name1_name2_name3

    R   R   i    RL   ii   N(   R)   Rh   R=   R   R   R   Rd   R(   t   popR*   R   RT   t
   StringType(	   R   t   jumpR   t   donet   todoR   R5   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   qweb_control  s0    	
t   QWebSessionc           B   s5   e  Z d    Z d   Z d   Z d   Z d   Z RS(   c   	      K   s   t  j |   i	 t j   d 6d d 6d d 6d d 6d d	 6d
 d 6d d 6d d 6d d 6} x: | j   D], \ } } t |  d | | j | |   qe Wd |  _ d |  _ d |  _	 d |  _
 t j   } | j | j d d   | j |  j  rF| |  j j d  } t j d |  rF|  j |  rF| |  _ d
 |  _ d
 |  _	 qFn  |  j st j d |  j | j d d   } | r|  j | j d
   r| j d
  |  _ d
 |  _ d
 |  _	 qn  |  j	 sd t j d
 d  |  _ n  d |  j |  j f |  _ t j   |  j k  r|  j   n  d  S(   NR   t   QWEBSIDt   cookie_namei    t   cookie_lifetimeR   t   cookie_pathRL   t   cookie_domaini   t   limit_cacheg{Gz?t   probabilityi  t   maxlifetimet   disables
   session_%st   HTTP_COOKIEi@   s
   [a-f0-9]+$s   &%s=([a-f0-9]+)t   QUERY_STRINGs   %032xi   i   s
   &amp;%s=%sl	                    (   t   dictR   t   tempfilet
   gettempdirRS   R   RZ   t   session_found_cookiet   session_found_urlt   session_foundt   session_origt   Cookiet   SimpleCookiet   loadR   t   session_cookie_nameR   R   R   t   session_loadt
   session_idt   searcht   groupt   randomt   randintt   session_trans_sidt   session_probabilityt   session_clean(	   R   t   environt   kwR   R   RG   t   ct   sidt   mo(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     sH    
$				!			%		c         C   s   g  } |  j  r t |   s+ t |  j  r |  j   |  j s t j   } |  j | |  j <|  j	 | |  j d <|  j
 r |  j
 | |  j d <n  | j d | |  j j   f  n  |  j r | j d
  | j d  | j d  q n  | S(   NR   t   domains
   Set-Cookies   Cache-Controls>   no-store, no-cache, must-revalidate, post-check=0, pre-check=0t   Expiress   Thu, 19 Nov 1981 08:52:00 GMTt   Pragmas   no-cache(   s   Cache-Controls>   no-store, no-cache, must-revalidate, post-check=0, pre-check=0(   RA  s   Thu, 19 Nov 1981 08:52:00 GMT(   RB  s   no-cache(   t   session_disableR(   R-  t   session_saveR*  R.  R/  R3  R1  t   session_cookie_patht   session_cookie_domainRd   t   OutputStringt   session_limit_cache(   R   R   R=  (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   session_get_headers/  s    %
		#	c         C   sf   t  j j |  j d |  } y% t |  j   } t j |  } Wn d  SX| |  _ |  j	 |  d S(   Ns   qweb_sess_%si   (
   t   osR   Re   t   session_patht   fileR0   t   picklet   loadsR-  R   (   R   R>  t   fnamet   origR   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR2  A  s    	c      	   C   sY  t  j j |  j  s( t  j |  j  n  t  j j |  j d |  j  } y t  j j |  } Wn t k
 rx } d } n Xt	 j
 |  j    } | |  j k s t j   | |  j d k rUt  j j |  j d |  j t j d d
  f  } t | d  } | j |  | j   t j d	 k rBt  j j |  rBt  j |  n  t  j | |  n  d  S(   Ns   qweb_sess_%si    i   s   qweb_sess_%s_%xi   i   i    t   wbt   win32I       (   RJ  R   t   isdirRK  t   makedirsRe   R3  t   getmtimet   OSErrorRM  t   dumpsR|   R-  t   timet   session_maxlifetimeR6  R7  RL  t   writet   closet   syst   platformt   isfilet   removet   rename(   R   RO  t   oldtimet   IOErrort   dumpt   tmpnameR   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRD  K  s     
,1
!c         C   s   t  j    } y x} g  t j |  j  D]- } | j d  r% t j j |  j |  ^ q% D]5 } | t j j |  |  j k rV t j	 |  qV qV WWn t
 k
 r } n Xd  S(   Nt
   qweb_sess_(   RX  RJ  t   listdirRK  R'   R   Re   RU  RY  t   unlinkRV  (   R   R<   R5   Rb  (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR:  \  s    M(   R   R   R   RI  R2  RD  R:  (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR    s
   	+		
	t   QWebSessionMemc           B   s   e  Z d    Z d   Z RS(   c         C   sL   d t    k r i  a n  t j |  rH t | |  _ |  j |  j  d Sd  S(   Nt   _qweb_sessionsi   (   t   globalsRi  R   R-  R   (   R   R>  (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR2  e  s    	c         C   s/   d t    k r i  a n  |  j   t |  j <d  S(   NRi  (   Rj  Ri  R|   R3  (   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRD  m  s    	(   R   R   R2  RD  (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRh  d  s   	t   QWebSessionServicec           B   s   e  Z d  d  Z d   Z RS(   i    c         C   s   | |  _  d |  _ d  S(   Ns*   a=href,area=href,frame=src,form=,fieldset=(   t   wsgiappt   url_rewrite_tags(   R   Rl  t   url_rewrite(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   s  s    	c         C   s   |  j  | |  S(   N(   Rl  (   R   R;  t   start_response(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   __call__v  s    (   R   R   R   Rp  (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRk  r  s   t   QWebDictc           B   s#   e  Z d    Z d   Z d   Z RS(   c         G   s   t  j |  |  d  S(   N(   R'  R   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   {  s    c         C   s   |  j  | d  S(   NRL   (   RZ   (   R   t   key(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   }  s    c         C   s3   y t  |  j | d   SWn t k
 r. d SXd  S(   NR   i    (   R  RZ   t
   ValueError(   R   Rr  (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR    s    (   R   R   R   R   R  (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRq  z  s   		t   QWebListDictc           B   s,   e  Z d    Z d   Z d   Z d   Z RS(   c         G   s   t  j |  |  d  S(   N(   R'  R   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    c         C   s   |  j  | g   S(   N(   RZ   (   R   Rr  (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    c         C   s4   |  j  |  r# |  | j |  n | g |  | <d  S(   N(   R   Rd   (   R   Rr  Rl   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt
   appendlist  s    c         C   s8   t    } x( |  j   D] \ } } | d | | <q W| S(   Ni(   Rq  RS   (   R   R   R   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   get_qwebdict  s    	(   R   R   R   R   Ru  Rv  (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRt    s   			t   QWebRequestc           B   s   e  Z d  Z d e f d     YZ d   Z e d  Z d   Z e	 e  Z d   Z
 d   Z d   Z d	   Z d
   Z d   Z d d  Z d d  Z d d  Z RS(   s\  QWebRequest a WSGI request handler.

    QWebRequest is a WSGI request handler that feature GET, POST and POST
    multipart methods, handles cookies and headers and provide a dict-like
    SESSION Object (either on the filesystem or in memory).

    It is constructed with the environ and start_response WSGI arguments:
    
      req=qweb.QWebRequest(environ, start_response)
    
    req has the folowing attributes :
    
      req.environ standard WSGI dict (CGI and wsgi ones)
    
    Some CGI vars as attributes from environ for convenience: 
    
      req.SCRIPT_NAME
      req.PATH_INFO
      req.REQUEST_URI
    
    Some computed value (also for convenience)
    
      req.FULL_URL full URL recontructed (http://host/query)
      req.FULL_PATH (URL path before ?querystring)
    
    Dict constructed from querystring and POST datas, PHP-like.
    
      req.GET contains GET vars
      req.POST contains POST vars
      req.REQUEST contains merge of GET and POST
      req.FILES contains uploaded files
      req.GET_LIST req.POST_LIST req.REQUEST_LIST req.FILES_LIST multiple arguments versions
      req.debug() returns an HTML dump of those vars
    
    A dict-like session object.
    
      req.SESSION the session start when the dict is not empty.
    
    Attribute for handling the response
    
      req.response_headers dict-like to set headers
      req.response_cookies a SimpleCookie to set cookies
      req.response_status a string to set the status like '200 OK'
    
      req.write() to write to the buffer
    
    req itselfs is an iterable object with the buffer, it will also also call
    start_response automatically before returning anything via the iterator.
    
    To make it short, it means that you may use
    
      return req
    
    at the end of your request handling to return the reponse to any WSGI
    application server.
    t   HttpHeadersc           B   sb   e  Z d    Z d   Z d   Z d   Z d   Z d d  Z d   Z d   Z	 e
 e
 d	  Z RS(
   c         C   s   d g |  _  d  S(   Ns   Content-Types	   text/html(   s   Content-Types	   text/html(   R   (   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    c         C   s   |  j  | |  d  S(   N(   R   (   R   Rr  R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   __setitem__  s    c         C   s   |  j  |  d  S(   N(   R_  (   R   Rr  (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   __delitem__  s    c         C   s@   | j    } x- |  j D]" \ } } | j    | k r t Sq Wt S(   N(   t   lowerR   R   R   (   R   Rr  R   RG   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   __contains__  s
    c         C   s   |  j  j | | f  d  S(   N(   R   Rd   (   R   Rr  R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   add  s    ic         C   s   d } g  } xn |  j  D]c \ } } | j   | j   k r | d k rc | | k rV Pqc | d 7} n  | j | | f  q q W| |  _  d  S(   Ni    ii   (   R   R{  Rd   (   R   Rr  Ry   t   removedR   t   _keyt   _value(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR_    s    c         C   s   g  |  _  d  S(   N(   R   (   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   clear  s    c         C   s!   |  j  |  |  j | |  d  S(   N(   R_  R}  (   R   Rr  R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    c         C   s   | s |  j  } nN g  } xE |  j  D]: \ } } | j   | j   k r" | j | | f  q" q" W| r d j g  | D] } d | ^ qs  S| S(   Ns   
s   %s: %s(   R   R{  Rd   Re   (   R   Rr  t
   httpformatt   resultR  R  t   item(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRZ     s    $(   R   R   R   Ry  Rz  R|  R}  R_  R  R   R   RZ   (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRx    s   							c         C   s  t  | d  } | d j |  } | j d d  j d  rd | j d d  g } xC | j   D]5 \ } } | j d  rd | j d | | f  qd qd Wd	 j |  d
 | }	 t j |	  }
 x=|
 j	   D]} t
 | t j j  s q n  t j | d  d } d | k rt g   t | j	    k r8q n  | d j   sNq n  | d } | | j d  d } d | k r| d } n d  } i | d 6| d 6| j	   d 6} | j | d |  q | j | d | j	    q Wn | j t j | d d  | S(   Nt   CONTENT_LENGTHs
   wsgi.inputt   CONTENT_TYPERL   t	   multiparts   Content-Type: %st   HTTP_s   %s: %ss   
s   

s   Content-Dispositioni   t   filenames   \s   Content-TypeR6   R   R   t   keep_blank_values(   R  R0   RZ   R'   RS   Rd   Re   R   t   message_from_stringt   get_payloadR   t   MessageRW   t   parse_headerR   Rh   t   rfindR   Ru  R   t   parse_qs(   R   R;  t   POSTt   FILESt   lengtht   DATAt   linesRr  R   Rn   t   msgt   subt	   name_dictR  t   content_typeR   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   load_post_data  s8    
!!c         C   s  | |  _  | |  _ g  |  _ | j d d  |  _ | j d d  |  _ |  j |  |  _ | d <| j d  s t	 j
 |  j |  j  | d <| j d  r | d c d | d 7<q n  | d |  _ |  j j d  d |  _ | d	 <t j   |  _ |  j j | j d
 d   t |  _ t |  _ t j   |  _ |  j   |  _ d |  _ d  |  _ |  j  j d  r| d |  _ |  j j |  _ |  j j |  _ |  j j |  _  |  j j! |  _" |  j j# |  _$ nt% | t&  r| |  _ n! | r| |  |  _ n	 d  |  _ t' t( j) | j d d  d d  |  _* t'   |  _+ t'   |  _, t' |  j*  |  _- | d d k r|  j. | |  j+ |  j,  |  _/ |  j- j0 |  j+  n  |  j* j1   |  _ |  j+ j1   |  _  |  j, j1   |  _$ |  j- j1   |  _" d  S(   Nt   SCRIPT_NAMERL   t	   PATH_INFOt   FULL_URLt   REQUEST_URIR&  R   i    t	   FULL_PATHR%  s   200 OKt   phpR  i   t   REQUEST_METHODR  (2   R;  Ro  t   bufferRZ   R  R  t   get_full_urlR  R   R   t   quoteR  R   R  R.  R/  t   request_cookiesR0  R   t   response_startedt   response_gzencodet   response_cookiesRx  t   response_headerst   response_statusR   R  t   _SESSIONt   SESSIONt   _GETt   GETt   _POSTR  t   _ARGR   t   _FILESR  R   R  Rt  RW   R  t   GET_LISTt	   POST_LISTt
   FILES_LISTt   REQUEST_LISTR  R  R   Rv  (   R   R;  Ro  t   session(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR   !  sV    			!					*c         C   s3  d |  k r |  d S|  d d } |  j  d  rB | |  d 7} nk | |  d 7} |  d d k r |  d d k r | d	 |  d 7} q n% |  d d
 k r | d	 |  d 7} n  |  j d  r | |  d 7} nb | t j |  j  d d   7} | t j |  j  d d   7} |  j  d  r/| d |  d 7} n  | S(   NR  s   wsgi.url_schemes   ://t	   HTTP_HOSTt   SERVER_NAMEt   httpst   SERVER_PORTt   443t   :t   80R  R  RL   R  R&  R   (   RZ   R   R   R  (   R;  t   url(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR  W  s$    c         C   st   xm |  j  j   D]\ \ } } | j d  s t j   } | j | d  | j   | | d <| j | d <q q Wd  S(   Nt   tmp_fileR   t   tmp_name(   R  RS   R   R(  t   NamedTemporaryFileRZ  t   flushR6   (   R   R   RG   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt
   save_fileso  s    

c         C   s  d } xd |  j  f d |  j f d |  j f d |  j f d |  j f d |  j f d |  j f d	 |  j f d
 |  j f d |  j	 f g
 D] \ } } | d 7} | d | 7} | j
   } | j   | d j g  | D]) } d | t j t | |   f ^ q  7} | d 7} q W| S(   NRL   R  R  R   R  R  R  R  R  R  R;  s/   <table border="1" width="100%" align="center">
s0   <tr><th colspan="2" align="center">%s</th></tr>
s    <tr><td>%s</td><td>%s</td></tr>
s   </table><br><br>

(   R  R  R   R  R  R  R  R  R  R;  t   keyst   sortRe   RW   RX   t   repr(   R   t   bodyR6   R   R  R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   debugw  s    00(

Cc         C   s   |  j  j |  d  S(   N(   R  Rd   (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRZ    s    c         G   s-   |  j  j g  | D] } t |  ^ q  d  S(   N(   R  t   extendR   (   R   R   R5   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   echo  s    c         C   s  |  j  s|  j sxU |  j j   D]D \ } } | j d  r" y | d j   Wqf t k
 rb qf Xq" q" W|  j r|  j j	 d d  j
 d  d k rt j   } t j d d d |  } | j d j |  j   | j   | j   } | g |  _ d |  j d	 <t t |   |  j d
 <n  |  j j	   } t |  j t  rY| j |  j j    n  | j g  |  j D] } d |  j | j   f ^ qi |  j |  j |  n  t |  _  n  |  j S(   NR  t   HTTP_ACCEPT_ENCODINGRL   t   gzipit   modeRQ  t   fileobjs   Content-Encodings   Content-Lengths
   Set-Cookie(   R  R  R  RS   R   R[  RV  R  R;  RZ   t   findt   StringIOR  t   GzipFileRZ  Re   R  t   getvalueR  R   R(   R   R  R  R  RI  R  RG  Ro  R  R   (   R   R   RG   t   zbuft   zfilet   headersR5   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   response  s0    		-
6c         C   s   |  j    j   S(   N(   R  t   __iter__(   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR    s    i   c         C   s,   | r d |  _  n	 d |  _  | |  j d <d  S(   Ns   301 Moved Permanentlys	   302 Foundt   Location(   R  R  (   R   R  t	   permanent(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   http_redirect  s    	s   <h1>404 Not Found</h1>c         C   s#   d |  _  | r |  j |  n  d  S(   Ns   404 Not Found(   R  RZ  (   R   R  (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   http_404  s    	i    c         C   sS   d |  j  d <d | |  j  d <d |  j  d <d t |  |  j  d <|  j |  d  S(	   Ns   application/octet-streams   Content-Types   attachment; filename="%s"s   Content-Dispositiont   binarys   Content-Transfer-Encodings   %ds   Content-Length(   R  R(   RZ  (   R   RO  t   fstrt   partial(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   http_download  s
    (   R   R   R   t   objectRx  R  R  R   R  t   staticmethodR  R  RZ  R  R  R  R  R  R  (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRw    s   8+	#6							t   QWebWSGIHandlerc           B   sY   e  Z d    Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 RS(	   c         G   s#   |  j  j r t j j |  |  Sd  S(   N(   t   servert   logt   BaseHTTPServert   BaseHTTPRequestHandlert   log_message(   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR    s    c         C   s   |  j  d S(   Ni    (   t   client_address(   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   address_string  s    c         C   s   | j  d d  } |  j t | d  | d  d } x: | D]2 } | d j   d k rb d } n  |  j |   q= W| s |  j d d  n  |  j   |  j S(   Nt    i   i    s   content-types   Content-types	   text/html(   R   t   send_responseR  R{  t   send_headert   end_headersRZ  (   R   t   statusR  R  t
   ctype_sentR5   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRo    s    	
c         C   s?   y |  j  j |  Wn$ t j t j f k
 r: } | GHn Xd  S(   N(   t   wfileRZ  t   socketR   t   timeout(   R   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyRZ    s    c         C   s=   t  |  d d  s9 d |  _ |  j |  _ t j   |  _ n  d  S(   Nt	   wfile_bufi    i   (   R*   R  R  t	   wfile_bakR  (   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   bufferon  s    	c         C   sA   |  j  r= |  j } |  j |  _ |  j | j    d |  _  n  d  S(   Ni    (   R  R  R  RZ  R  (   R   t   buf(    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt	   bufferoff  s
    		c   
      C   s  t  j  |  j  d d !\ } } } i d! d 6d d 6|  j d 6t j d	 6d d
 6d d 6d d 6|  j d 6d d 6| d 6|  j j d d  d 6|  j j d d  d 6|  j d d 6t	 |  j d  d 6|  j
 j d d 6t	 |  j
 j d  d 6|  j d 6|  j d 6d d 6} | r$t j |  | d <n  x= |  j j   D], \ } } | | d | j   j d d   <q4W|  j   |  j
 j | |  j  } x% | D] }	 |  j |	  |  j   qW|  j   d  S("   Ni   i   i   i    s   wsgi.versiont   https   wsgi.url_schemes
   wsgi.inputs   wsgi.errorss   wsgi.multithreads   wsgi.multiprocesss   wsgi.run_onceR  RL   R  R&  s   Content-TypeR  s   Content-LengthR  t   REMOTE_ADDRt   REMOTE_PORTR  R  t   SERVER_PROTOCOLR  t
   standalones	   qweb.modeR  R  R   R   (   i   i    (   t   urlparseR   t   rfileR\  t   stderrt   commandR  RZ   R  R   R  t   server_addresst   request_versionR   t   unquoteRS   t   upperR)   R  Rl  Ro  RZ  R  (
   R   R   t	   path_infot
   parameterst   queryR;  Rr  R   t   appiterR   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   serve  s>    "





$
c         C   s   |  j  d  d  S(   NR  (   R	  (   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   do_GET  s    c         C   s   |  j  d  d  S(   NR  (   R	  (   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   do_POST
  s    (   R   R   R  R  Ro  RZ  R  R  R	  R
  R  (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR    s   							#	t   QWebWSGIServerc           B   s&   e  Z d  Z d d d  Z d   Z RS(   s   QWebWSGIServer
        qweb_wsgi_autorun(wsgiapp,ip='127.0.0.1',port=8080,threaded=1)
        A WSGI HTTP server threaded or not and a function to automatically run your
        app according to the environement (either standalone, CGI or FastCGI).

        This feature is called QWeb autorun. If you want to  To use it on your
        application use the following lines at the end of the main application
        python file:

        if __name__ == '__main__':
            qweb.qweb_wsgi_autorun(your_wsgi_app)

        this function will select the approriate running mode according to the
        calling environement (http-server, FastCGI or CGI).
    i   c         C   s;   t  j j |  | | f t  | |  _ | |  _ | |  _ d  S(   N(   R  t
   HTTPServerR   R  Rl  t   threadedR  (   R   Rl  t   ipt   portR  R  (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR     s    		c         G   s3   |  j  r t j j |  |  St j j |  |  Sd  S(   N(   R  t   SocketServert   ThreadingMixInt   process_requestR  R  (   R   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR  !  s    	(   R   R   R   R   R  (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR    s   s	   127.0.0.1i  i   c   
      C   sC  t  j d k r d } nd d } t j d t j t j  } y | j   Wn2 t j k
 r{ } | d t j	 k r| d } q| n X| s t
 j j d  r d d  l } | j |  d t j   n | r d | | f GHn  t |  d | d	 | d
 | d | }	 | r|   n  y |	 j   Wn& t k
 r>} t  j t  j     n Xd  S(   NRR  i    i   R  it   multithreadeds   Serving on %s:%dR  R  R  R  (   R\  R]  R  t   fromfdt   AF_INETt   SOCK_STREAMt   getpeernameR   t   errnot   ENOTSOCKRJ  R;  R   t   fcgit
   WSGIServerR   t   runR  t   serve_forevert   KeyboardInterruptt
   excepthookt   exc_info(
   Rl  R  R  R  R  t   callback_readyR  t   sockR   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   qweb_wsgi_autorun&  s*    	$
c       	   C   sq   t  }  x\ t t t t t t t t t	 g	 D]9 } | j
 } | j  } |  d | d t |  | f 7}  q( W|  St   GH(   Ns   

%s
%s

%sR   (   R   R   R   R   R   R  Rw  R  R  R$  R   R(   t   qweb_doc(   R  R5   RE   R   (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyR%  B  s    (		%(2   R   R  R  R.  RW   t   datetimeR   t   email.MessageR  R  RJ  R6  R   R  R\  R(  RX  RT   R   R  t   xml.domR    t   cPickleRM  t   ImportErrort	   cStringIOR  R    R   R   R   R   R   R   R  R'  R  Rh  Rk  Rq  Rt  Rw  R  R  R  R  R  R   R$  R%  (    (    (    s-   /usr/local/webadmin/ajaxterm/ajaxterm/qweb.pyt   <module>j   s:   $&=!h	*a
 1I