o
    [h~                     @   s  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m	Z
 d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ eeZi Zg Z dwddZ!G dd dZ"G dd dZ#G dd de#Z$G dd de#Z%e!ddG dd de#Z&e!dG dd de#Z'e!ddG d d! d!e#Z(e!d"G d#d$ d$e#Z)e!d%G d&d' d'e#Z*G d(d) d)e#Z+e!d*G d+d, d,e+Z,e!d-G d.d/ d/e+Z-e!d0G d1d2 d2e#Z.e!d3d4G d5d6 d6e#Z/e!d7d8G d9d: d:e#Z0d;e"fd<d=Z1e!d>G d?d@ d@e#Z2e!dAG dBdC dCe#Z3e!dDG dEdF dFe#Z4e!dGG dHdI dIe#Z5e!dJdKG dLdM dMe#Z6e!dNG dOdP dPe#Z7e!dQG dRdS dSe#Z8e!dTG dUdV dVe#Z9e!dWG dXdY dYe#Z:e!dZG d[d\ d\e#Z;e!d]G d^d_ d_e#Z<e!d`G dadb dbe#Z=G dcdd dde>Z?e!deG dfdg dge#Z@e!dhG didj dje#ZAeBdkejCZDdldm ZEdndo ZFe!dpdqG drds dse#ZGe!dtG dudv dve#ZHdS )x    N)chat_template_tag)CSRF_TOKEN_NAMEFULL_DECIMAL_PLACES)url_of_static)format_numbergettext)CheckboxField   )errors)filters)ibis_loader)utilsc                    s    fdd}|S )Nc                    s   |  ft <  rt  | S N)instruction_keywordsinstruction_endwordsappend)Z
node_classendwordkeyword }/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/otree/templating/nodes.pyregister_node_class#   s   
z%register.<locals>.register_node_classr   )r   r   r   r   r   r   register"   s   r   c                   @   s`   e Zd ZedZedZdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd ZdS )
Expressionz^([\w.]+)\((.*)\)$z^[\w.]+$c                 C   s\   || _ g | _tj| ddd}| |d  | |dd   | jr,| | j	| _	d S d S )N|Tstripr   r
   )
tokenr   r   splitcr   _parse_primary_expr_parse_filters
is_literal_apply_filters_to_literalliteral)selfexprr   Z
pipe_splitr   r   r   __init__E   s   zExpression.__init__c                 C   st   zt || _d| _W d S    d| _| |\| _| _| _| js4| j	|s7d| d}t
|| jY d S Y d S )NTFzUnparsable expression '')astliteral_evalr$   r"   _try_parse_as_func_callis_func_call	varstring	func_argsre_varstringmatchr   TemplateSyntaxErrorr   )r%   r&   msgr   r   r   r    N   s   zExpression._parse_primary_exprc           	      C   s   | j |}|sd|g fS |d}t|dddd}t|D ]+\}}z	t|||< W q! tyL } zd| d}|d7 }t	
|| j|d }~ww d||fS )	NFr
      ,TzUnparsable argument 'z'. z(Arguments must be valid Python literals.)re_func_callr0   groupr   r   	enumerater)   r*   	Exceptionr   r1   r   )	r%   r&   r0   	func_namer.   indexargerrr2   r   r   r   r+   ]   s   


z"Expression._try_parse_as_func_callc                 C   sZ   |D ](}|  |\}}}|tjv r| j|tj| |f qd| d}t|| jd S )NzUnrecognised filter name 'r(   )r+   r   Z	filtermapr   r   r1   r   )r%   Zfilter_listZfilter_expr_Zfilter_nameZfilter_argsr2   r   r   r   r!   l   s   
zExpression._parse_filtersc                 C   ^   | j D ])\}}}z
||g|R  }W q ty, } zd| d}t|| j|d }~ww |S )NError applying filter 'z' to literal.)r   r8   r   r1   r   r%   objnamefuncargsr<   r2   r   r   r   r#   w      z$Expression._apply_filters_to_literalc                 C   s   | j r| jS | |S r   )r"   r$   _resolve_variabler%   contextr   r   r   eval   s   
zExpression.evalc              
   C   s   | | j| j}| jst|tjtjfrFz|| j }W n* t	yE } zd| j d}|d| jj
 d| jj d7 }t|| j|d }~ww | |S )NzError calling function 'z' zin template 'z', line .)resolver-   r   r,   
isinstancetypes
MethodTypeBuiltinMethodTyper.   r8   template_idline_numberr   TemplateRenderingError_apply_filters_to_variable)r%   rH   rA   r<   r2   r   r   r   rF      s   
zExpression._resolve_variablec                 C   r>   )Nr?   z' to variable)r   r8   r   rR   r   r@   r   r   r   rS      rE   z%Expression._apply_filters_to_variableN)__name__
__module____qualname__recompiler5   r/   r'   r    r+   r!   r#   rI   rF   rS   r   r   r   r   r   @   s    

		r   c                   @   sP   e Zd ZdddZdd ZdddZd	d
 Zdd Zdd Zdd Z	dd Z
dS )NodeNc              
   C   s   || _ |pg | _z| | W d S  tjy     tyX } z4|rC|jdkr.d|j dn|j}d| d}||jj	 d| 7 }n
d|jj	 d| }t
|||d }~ww )NINSTRUCTIONr(   zError while parsing the z tag : zSyntax error: )r   childrenprocess_tokenr   TemplateErrorr8   typer   	__class__rT   r1   )r%   r   r\   r<   tagnamer2   r   r   r   r'      s    
zNode.__init__c                 C   s   |   S r   )to_strr%   r   r   r   __str__      zNode.__str__r   c                 C   s>   d| | j j  g}| jD ]}|||d  qd|S )Nu   ·  r
   
)r`   rT   r\   r   rb   join)r%   depthoutputchildr   r   r   rb      s   

zNode.to_strc              
   C   s   z|  |W S  tjy     tyS } z9| jr=| jjdkr'd| jj dn| jj}d| d}||jj d| 7 }n
d|jj d| }t	|| j|d }~ww )NrZ   r(   zError while rendering the z tag: r[   zUnexpected rendering error: )
wrenderr   r^   r8   r   r_   r   r`   rT   rR   )r%   rH   r<   ra   r2   r   r   r   render   s    zNode.renderc                    s   d  fdd| jD S )N c                 3       | ]}|  V  qd S r   rl   .0rj   rH   r   r   	<genexpr>       zNode.wrender.<locals>.<genexpr>)rg   r\   rG   r   rr   r   rk      s   zNode.wrenderc                 C      d S r   r   r%   r   r   r   r   r]         zNode.process_tokenc                 C   ru   r   r   rc   r   r   r   
exit_scope   rw   zNode.exit_scopec                 C   sP   t | jD ]\}}t||r!| jd | || j|d d  f  S q| jd g fS )Nr
   )r7   r\   rL   )r%   Zdelimiter_classr:   rj   r   r   r   split_children   s
   
&zNode.split_children)NN)r   )rT   rU   rV   r'   rd   rb   rl   rk   r]   rx   ry   r   r   r   r   rY      s    

rY   c                   @      e Zd Zdd ZdS )TextNodec                 C   s   | j jS r   )r   textrG   r   r   r   rk      re   zTextNode.wrenderNrT   rU   rV   rk   r   r   r   r   r{      s    r{   c                   @      e Zd Zdd Zdd ZdS )	PrintNodec                    s   t  jdd}t|dkr7|d dkr7|d dkr7d| _t|d  | _t|d	  | _t|d
  | _d S d| _t  jd} fdd|D | _	d S )N)z\?\?z\:\:T   r
   z??   z::r   r3      F)\s+or\s+z\|\|c                       g | ]}t | qS r   r   )rq   er   r   r   
<listcomp>      z+PrintNode.process_token.<locals>.<listcomp>)
r   splitrer|   len
is_ternaryr   	test_exprtrue_branch_exprfalse_branch_exprexprs)r%   r   chunksr   r   r   r   r]      s   $zPrintNode.process_tokenc                 C   sf   | j r| j|r| j|}t|S | j|}t|S | jD ]}||}|r. t|S q t|S r   )r   r   rI   r   r   r   localize)r%   rH   contentr&   r   r   r   rk     s   	

zPrintNode.wrenderNrT   rU   rV   r]   rk   r   r   r   r   r      s    r   forZendforc                   @   s.   e Zd ZedZdd Zdd Zdd ZdS )	ForNodez#for\s+(\w+(?:,\s*\w+)*)\s+in\s+(.+)c                 C   sX   | j |j}|d u rd}t||dd |ddD | _t|d|| _	d S )NMalformed tagc                 S   s   g | ]}|  qS r   r   )rq   varr   r   r   r   $  s    z)ForNode.process_token.<locals>.<listcomp>r
   r4   r3   )
regexr0   r|   r   r1   r6   splitloopvarsr   r&   )r%   r   r0   r2   r   r   r   r]     s   zForNode.process_tokenc           
      C   s   | j |}|rmt|}t| jdk}g }t|D ]N\}}|  |rJz
tt| j|}W n t	yC } z
d}	t
|	| j|d }~ww || n||| jd < ||d d|d< || j| |  qd|S | j|S )Nr
   zUnpacking errorr   )Zcounter0ZcounterZforlooprm   )r&   rI   listr   r   r7   pushdictzipr8   r   rR   r   updater   
for_branchrl   poprg   empty_branch)
r%   rH   Z
collectionunpackri   r:   itemunpackedr<   r2   r   r   r   rk   '  s0   


zForNode.wrenderc                 C   s,   |  t\}}}td || _td || _d S r   )ry   	EmptyNoderY   r   r   )r%   Z	for_nodesr=   Zempty_nodesr   r   r   rx   D  s   zForNode.exit_scopeN)	rT   rU   rV   rW   rX   r   r]   rk   rx   r   r   r   r   r     s
    
r   emptyc                   @      e Zd ZdS )r   NrT   rU   rV   r   r   r   r   r   K      r   ifendifc                	   @   sx   e Zd ZeddZedejZ	e
je
je
je
je
je
jdd dd dZdd	 Zd
d Zdd Zdd Zdd ZdS )IfNode	Conditionznegated lhs op rhszg
        (not\s+)?(.+?)\s+(==|!=|<|>|<=|>=|not[ ]in|in)\s+(.+)
        |
        (not\s+)?(.+)
        c                 C   s   | |v S r   r   abr   r   r   <lambda>t      zIfNode.<lambda>c                 C   s   | |vS r   r   r   r   r   r   r   u  r   )z==z!=<>z<=z>=inznot inc                    sX   |j  _z|jd dd }W n   d}t||d  fddt|dD  _d S )Nr
   r   c                    s&   g | ]} fd dt |dD qS )c                    s   g | ]}  |qS r   )parse_condition)rq   condstrrc   r   r   r     s    z3IfNode.process_token.<locals>.<listcomp>.<listcomp>)z	\s+and\s+)r   r   )rq   Zor_blockrc   r   r   r     s    

z(IfNode.process_token.<locals>.<listcomp>)r   )	r   tagr|   r   r   r1   r   r   condition_groups)r%   r   
conditionsr2   r   rc   r   r]   x  s   

zIfNode.process_tokenc                 C   s   | j |}|dr-| jt|dt|d| j| j|d t|d| jdS | jt|dt|d| jd d dS )Nr3   r
   r   r   )negatedlhsoprhsr      )re_conditionr0   r6   	conditionboolr   r   	operators)r%   r   r0   r   r   r   r     s   
zIfNode.parse_conditionc              
   C   s   z|j r| |j||j|}n	t|j|}W n& tyC } ztt	| d}|d| j
 d7 }t|| j|d }~ww |jrJ| }|S )Nz&Error evaluating the condition in the r(   z' tag)r   r   rI   r   operatortruthr8   logger	exceptionstrr   r   rR   r   r   )r%   ZcondrH   resultr<   r2   r   r   r   eval_condition  s   zIfNode.eval_conditionc                 C   sN   | j D ]}|D ]}| ||}|s nq|r nq|r!| j|S | j|S r   )r   r   true_branchrl   false_branch)r%   rH   Zcondition_groupr   Zis_truer   r   r   rk     s   
zIfNode.wrenderc                 C   sh   |  t\}}}|rtd || _t|j|| _| j  d S |  t\}}}td || _td || _d S r   )	ry   ElifNoderY   r   r   r   r   rx   ElseNode)r%   Zbefore_elifZ
first_elifZafter_first_elifZbefore_elser=   Zafter_first_elser   r   r   rx     s   
zIfNode.exit_scopeN)rT   rU   rV   collections
namedtupler   rW   rX   VERBOSEr   r   eqneltgtleger   r]   r   r   rk   rx   r   r   r   r   r   _  s(    
r   elifc                   @   r   )r   Nr   r   r   r   r   r     r   r   elsec                   @   rz   )r   c                 C   s2   |j  }||jkrd| d}t||d d S )NzInvalid 'else' tag: "z".)r|   r   r   r   r1   )r%   r   r   r2   r   r   r   r]     s
   

zElseNode.process_tokenNrT   rU   rV   r]   r   r   r   r   r         r   c                   @   s    e Zd ZdZdd Zdd ZdS )BaseIncludeNodeNc                 C   s   i | _ t|jt| jd  dg}t|dkr'|d | _t|d || _d S t|dkrl|d | _t|d || _tj	|d dddd}|D ]"}z|
dd\}}t| || j | < W qG   td	|d d S td	|)
Nwithr
   r   r3   &T)r   Zdiscard_empty=zMalformed 'include' tag.)	variablesr   r   r|   r   ra   template_argr   template_exprr   r   r   r   r1   )r%   r   partsr   chunkrB   r&   r   r   r   r]     s*   

	zBaseIncludeNode.process_tokenc                 C   s   | j |}t|tr4t| |}|  | j	 D ]\}}||||< q|j
|}|  |S d}|d| j d7 }|dt| d7 }t|| j)Nz(Invalid argument for the 'include' tag. zThe variable 'z' should evaluate to a string. zThis variable has the value: rJ   )r   rI   rL   r   r   loadexpand_template_namer   r   items	root_noderl   r   r   reprr   rR   r   )r%   rH   Ztemplate_nametemplaterB   r&   renderedr2   r   r   r   rk     s   
zBaseIncludeNode.wrender)rT   rU   rV   ra   r]   rk   r   r   r   r   r     s    r   includec                   @      e Zd ZdZdd ZdS )IncludeNoder   c                 C   s   |S r   r   r%   rB   r   r   r   r     rw   z IncludeNode.expand_template_nameNrT   rU   rV   ra   r   r   r   r   r   r         r   include_siblingc                   @   r   )IncludeSiblingNoder   c                 C   s0   d|v rt d| jtjtj| jj|S )N/zDArgument to 'include_sibling' must be a file name with no path parts)r   rR   r   ospathrg   dirnamerP   r   r   r   r   r     s   z'IncludeSiblingNode.expand_template_nameNr   r   r   r   r   r   	  r   r   Zextendsc                   @   rz   )ExtendsNodec                 C   sz   z|j d d\}}W n   d}t||d t||}|jr5t|jtr5t	
|j}| j|j d S d}t||)Nr
   r   zDMalformed 'extends' tag. The template name must be a string literal.)r|   r   r   r1   r   r"   rL   r$   r   r   r   r\   r   r   )r%   r   r   r;   r2   r&   r   r   r   r   r]     s   
zExtendsNode.process_tokenNr   r   r   r   r   r     r   r   blockZendblockc                   @   s$   e Zd Zdd Zdd Zdd ZdS )	BlockNodec                 C   s   |j dd   | _d S )Nr   )r|   r   titlerv   r   r   r   r]   9  s   zBlockNode.process_tokenc                 C   s2   |j j| j }|d | u r| ||d d  S dS )Nr   rm   )r   Zblock_registryr   render_block)r%   rH   
block_listr   r   r   rk   <  s   zBlockNode.wrenderc                    sR    r'   }   fddd< dfdd|jD }   |S dS )Nc                      s     S r   )r   r   r   rH   r%   r   r   r   N  s    z(BlockNode.render_block.<locals>.<lambda>superrm   c                 3   rn   r   ro   rp   rr   r   r   rs   O  rt   z)BlockNode.render_block.<locals>.<genexpr>)r   r   rg   r\   )r%   rH   r   Z
last_blockri   r   r   r   r   F  s   zBlockNode.render_blockN)rT   rU   rV   r]   rk   r   r   r   r   r   r   7  s    
r   r   Zendwithc                   @   r~   )WithNodec                 C   sV   z|j dd  dd\}}W n   d}t||d | | _t| || _d S )Nr   r   r
   r   )r|   r   r   r1   r   aliasr   r&   )r%   r   r  r&   r2   r   r   r   r]   \  s   
zWithNode.process_tokenc                    s@       | j  | j< d fdd| jD }   |S )Nrm   c                 3   rn   r   ro   rp   rr   r   r   rs   h  rt   z#WithNode.wrender.<locals>.<genexpr>)r   r&   rI   r  rg   r\   r   )r%   rH   r   r   rr   r   rk   e  s
   zWithNode.wrenderNr   r   r   r   r   r  Z  s    	r  returnc                 C   s@   |d }|  |sd| d|  }t|t| t|d  |S )Nr   zExpected argument z, but got: )
startswith
ValueErrorr   r   )r;   Zexpected_namer   prefixr2   r   r   r   parse_as_kwargm  s
   
r  Z	formfieldc                   @   r~   )FormFieldNodec                 C   s   t |jdd  }t|dkrd}t||t|dkr+dt| d}t|||d }|ds9|drCd	|d
d }t||| _	t|dkrh|d dsXJ t|d tdd  || _
d S d | _
d S )Nr
   r   z,formfield tag requires the name of the fieldr3   z*formfield tag takes 1 or 2 arguments, not zI. Delete the keyword 'with' or make sure there are no spaces around the =zplayer.zgroup.z'{}'rJ   zlabel=)smart_splitr|   r   r   r1   r  formatr   r   
field_expr
label_expr)r%   r   rD   r2   arg0r   r   r   r]   w  s     
zFormFieldNode.process_tokenc           	      C   s   ddl m} | j|}t|tr&||d vrtd|d|d | }nt|tjr/|}nt	d| j
}|r>||}n|jj}t|t}|rLd}nd}|jrU|d	7 }|d
jt||||j|dddS )Nr
   TemplateformField not found in form: .20zJformfield argument should be a string, e.g. {% formfield 'contribution' %}z
form-checkzmb-3 _formfieldz has-errorsa  
<div class="{{classes}}">
    {% if is_checkbox %}
      {{fld}}
      <label class="form-check-label" for="{{fld.id}}">
        {{label}}
      </label>
    {% else %}
        <label class="col-form-label" for="{{fld.id}}">{{label}}</label>
        <div class="controls">
            {{fld}}
        </div>
    {% endif %}
    {% if fld.description %}
        <p>
        <small>
            <p class="form-text text-muted">{{ fld.description }}</p>
        </small>
        </p>
    {% endif %}
    {% if errors %}
        <div class="form-control-errors">
            {% for error in errors %}{{ error }}<br/>{% endfor %}
        </div>
    {% endif %}
</div>)fldlabelclassesr   is_checkboxTstrict_mode)r   r  r  rI   rL   r   r  wtfieldsField	TypeErrorr  r  r|   r	   r   rl   r   )	r%   rH   r  r  r  r  r  r  r  r   r   r   rk     sD   

zFormFieldNode.wrenderNr   r   r   r   r   r	  u  s    r	  Zformfield_errorsc                   @   r~   )FieldErrorsNodec                 C   s<   z	|j  \}}W n   d}t||d t||| _d S )Nz1 argument required)r|   r   r   r1   r   r  )r%   r   r   r;   r2   r   r   r   r]     s   zFieldErrorsNode.process_tokenc                 C   sd   | j |}t|tstd||d vrtd|d|d | }|js(dS dd|j d S )	Nzargument must be a stringr  r  r  rm   z!<div class="form-control-errors">z<br/>z</div>)r  rI   rL   r   r  r  r   rg   )r%   rH   	fieldnamer  r   r   r   rk     s   
zFieldErrorsNode.wrenderNr   r   r   r   r   r    s    r  Z
formfieldsc                   @   rz   )
FormFieldsc                 C   s6   ddl m} |d }dd |D }|dj||ddS )	Nr
   r  r  c                 S   s   g | ]}|j qS r   )rB   )rq   fr   r   r   r     s    z&FormFields.wrender.<locals>.<listcomp>z={% for name in field_names %}{% formfield name %}{% endfor %}T)field_namesr  r  )r   r  rl   )r%   rH   r  r  r!  r   r   r   rk     s   zFormFields.wrenderNr}   r   r   r   r   r    r   r  r   c                   @   rz   )LoadShimc                 C      dS Nrm   r   rG   r   r   r   rk     rw   zLoadShim.wrenderNr}   r   r   r   r   r"    r   r"  commentZ
endcommentc                   @   r   )BlockCommenta  
    It's better to use {# #} style comments because with a block like this,
    because that prevents parsing of its contents,
    whereas this style comment means children will get parsed,
    meaning that any incorrectly used tags will cause
    a TemplateSyntaxError.
    c                 C   r#  r$  r   rG   r   r   r   rk     rw   zBlockComment.wrenderN)rT   rU   rV   __doc__rk   r   r   r   r   r&    s    r&  Zibis_tag_lvarc                   @   rz   )OpenVarc                 C   r#  )Nz{{r   rG   r   r   r   rk     rw   zOpenVar.wrenderNr}   r   r   r   r   r(    r   r(  Zibis_tag_rvarc                   @   rz   )CloseVarc                 C   r#  )Nz}}r   rG   r   r   r   rk     rw   zCloseVar.wrenderNr}   r   r   r   r   r)    r   r)  Zibis_tag_lblockc                   @   rz   )	OpenBlockc                 C   r#  )Nz{%r   rG   r   r   r   rk     rw   zOpenBlock.wrenderNr}   r   r   r   r   r*    r   r*  Zibis_tag_rblockc                   @   rz   )
CloseBlockc                 C   r#  )Nz%}r   rG   r   r   r   rk   #  rw   zCloseBlock.wrenderNr}   r   r   r   r   r+  !  r   r+  Znext_buttonc                   @   rz   )
NextButtonc                 C   s   t d}d| dS )NZNextzH
        <p>
            <button class="otree-btn-next btn btn-primary">z</button>
        </p>
        r   )r%   rH   ZNEXT_BTN_TEXTr   r   r   rk   )  s   zNextButton.wrenderNr}   r   r   r   r   r,  '  r   r,  Z
csrf_tokenc                   @   rz   )	CsrfTokenc                 C   s   |t  S r   )r   rG   r   r   r   rk   5  re   zCsrfToken.wrenderNr}   r   r   r   r   r-  3  r   r-  Zchatc                   @   s$   e Zd ZdZdZdd Zdd ZdS )ChatNodeNc                 C   sd   |j  dd  }t|dksJ d|D ]}|dr#t|d|| _|dr/t|d|| _qd S )Nr
   r3   z({{ chat }} tag takes at most 2 argumentszchannel=channelz	nickname=nickname)r|   r   r   r  r  channel_exprnickname_expr)r%   r   rD   r;   r   r   r   r]   >  s   

zChatNode.process_tokenc                 C   sT   i }| j r| j ||d< | jr| j||d< t|fi |}tdj|ddS )Nr/  r0  zotree/tags/chat.htmlTr  )r1  rI   r2  r   r   r   rl   )r%   rH   kwargsZtag_contextr   r   r   rk   G  s   
zChatNode.wrender)rT   rU   rV   r1  r2  r]   rk   r   r   r   r   r.  9  s
    	r.  c                   @   r   )BackslashErrorNr   r   r   r   r   r4  S  s    r4  Zstaticc                   @   r~   )
StaticNodec                 C   sV   |j  dd  }t|dksJ d|\}d|v r#d|}t|t||| _d S )Nr
   z!{% static %} tag takes 1 argument\z\{{% static {} %}} contains a backslash ("\"); you should change it to a forward slash ("/").)r|   r   r   r  r4  r   	path_expr)r%   r   rD   r   r2   r   r   r   r]   Y  s   zStaticNode.process_tokenc                 C   s   | j |}t|S r   )r7  rI   r   )r%   rH   r   r   r   r   rk   g  s   zStaticNode.wrenderNr   r   r   r   r   r5  W  s    r5  urlc                   @   r~   )UrlNodec                    sV    j  dd  }t|dksJ dt|d  | _ fdd|dd  D | _d S )Nr
   z'{% url %} tag takes at least 1 argumentr   c                    r   r   r   rq   r;   r   r   r   r   r  r   z)UrlNode.process_token.<locals>.<listcomp>)r|   r   r   r   	name_expr	arg_exprsr%   r   rD   r   r   r   r]   n  s    zUrlNode.process_tokenc                    s   ddl m}  fdd| jD }| j }|jjD ]!}|j|kr;t|j	
 }tt||}|j|jfi |  S qtd| d)z;like url_for, but allows us to pass url params positionallyr   )appc                    s   g | ]}|  qS r   )rI   r:  rr   r   r   r   x  r   z#UrlNode.wrender.<locals>.<listcomp>zno match for url "")Z
otree.asgir>  r<  r;  rI   ZrouterZroutesrB   r   Zparam_convertorskeysr   r   Zurl_path_forr8   )r%   rH   r>  valuesZurl_nameZroute	arg_namesZpath_paramsr   rr   r   rk   t  s   
zUrlNode.wrenderNr   r   r   r   r   r9  l  s    r9  z
    ((?:
        [^\s'"]*
        (?:
            (?:"(?:[^"\\]|\\.)*" | '(?:[^'\\]|\\.)*')
            [^\s'"]*
        )+
    ) | \S+)
c                 C   s,   g }t t| D ]
}||d q	|S )zfrom djangor   )_smart_split_refinditerr   r   r6   )r|   retbitr   r   r   r
    s   r
  c                 C   s   t | trt| tdS t| S )N)Zplaces)rL   floatr   r   r   )vr   r   r   r     s   
r   Z
blocktransZendblocktransc                   @   s   e Zd ZdZdS )BlockTransNodezjust a shimN)rT   rU   rV   r'  r   r   r   r   rI    s    rI  Ztransc                   @   s    e Zd ZdZdd Zdd ZdS )	TransNodezcthis is only for the user's own translations, because it uses gettext with the 'messages.mo' domainc                 C   sD   t |jdd  }t|dksJ dt| t|d || _d S )Nr
   z trans tag takes 1 argument, not r   )r
  r|   r   r   term_literalr=  r   r   r   r]     s   zTransNode.process_tokenc                 C   s   t | j|S r   )r   rK  rI   rG   r   r   r   rk     s   zTransNode.wrenderN)rT   rU   rV   r'  r]   rk   r   r   r   r   rJ    s    rJ  r   )Ir)   r   loggingr   rW   rM   Zos.pathr   Zwtforms.fieldsfieldsr  Z
otree.chatr   Zotree.commonr   r   Zotree.common2r   Z
otree.i18nr   r   Zotree.forms.fieldsr	   rm   r   r   r   r   	getLoggerrT   r   r   r   r   r   rY   r{   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r"  r&  r(  r)  r*  r+  r,  r-  r.  r  r4  r5  r9  rX   r   rC  r
  r   rI  rJ  r   r   r   r   <module>   s    

`?(0b	/"`	