3
›(ƒhÖ   ã               @   sb  d 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 G dd	„ d	eƒZd
d„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZeedƒZeedƒZeedƒZeedƒZeedƒZeedƒZeed ƒZeed!ƒZeed"ƒZ eed#ƒZ!eed$ƒZ"eed%ƒZ#d*d&d'„Z$G d(d)„ d)eƒZ%dS )+zLayout primitives definitions.é    N)Úpartial)ÚTemplateDoesNotExist)Úget_templateÚselect_template)Úsix)Ú
smart_textc               @   s0   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ ZdS )
Ú
LayoutNodez#Base class for self-rendered nodes.é   Nc             C   s   i S )z`Additional context data to render node template.

        Subclasses could override it.
        © )ÚselfÚcontextr
   r
   ú:/tmp/pip-install-q3hcpn_q/django-material/material/base.pyÚget_context_data   s    zLayoutNode.get_context_datac             C   s*   | j }d|kr|d }tdj|d |ƒƒS )a  Determine template for the node.

        If `context` have the `template` variable it would be used as
        relative template name in the curent template pack.

        Assumes `form_template_pack` context variable points to the
        current template pack

        Útemplatez{}/{}Úform_template_pack)Útemplate_namer   Úformat)r   r   r   r
   r
   r   r      s
    
zLayoutNode.get_templatec          
   K   sT   |j ƒ  z<x"| j|ƒjƒ D ]\}}|||< qW | j|ƒ}|j|jƒ ƒS |jƒ  X dS )ze
        Render node in the template.

        Compatible with django ``{% include %}`` tag.
        N)Úpushr   Úitemsr   ÚrenderÚflattenÚpop)r   r   ÚoptionsÚkeyÚvaluer   r
   r
   r   r   )   s    
zLayoutNode.render)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úspan_columnsr   r   r   r   r
   r
   r
   r   r      s   r   c             C   s<   g }x2| D ]*}t |tjƒr*|jt|ƒƒ q
|j|ƒ q
W |S )N)Ú
isinstancer   Ústring_typesÚappendÚField)ÚelementsÚresultÚelementr
   r
   r   Ú_convert_to_field:   s    
r'   c             C   s   t jddt jdd| ƒƒjƒ S )Nz([a-z0-9])([A-Z])z\1_\2z(.)([A-Z][a-z]+))ÚreÚsubÚlower)Únamer
   r
   r   Ú_camel_case_to_underscoreD   s    r,   c                s`   dd„ t |jƒjƒ d d… D ƒ‰‡fdd„t |ƒjƒ d d… D ƒ}‡ fdd„ˆ| D ƒ}t|ƒS )Nc             S   s,   g | ]$}d j |jjddƒd |jjƒ ƒ‘qS )z
{}_{}.htmlÚ.r	   r   )r   r   Úsplitr   r*   )Ú.0Úclsr
   r
   r   ú
<listcomp>K   s   z'_get_field_template.<locals>.<listcomp>é   c                s8   g | ]0}ˆ D ]&}d j |jjddƒd |jjƒ |ƒ‘qqS )z{}_{}/{}r-   r	   r   )r   r   r.   r   r*   )r/   r0   Zwidget_template)Úwidget_templatesr
   r   r1   R   s   c                s   g | ]}d j ˆ |ƒ‘qS )z{}/fields/{})r   )r/   r   )Útemplate_packr
   r   r1   Z   s   éþÿÿÿr5   )ÚtypeÚwidgetÚmror   )r4   ÚfieldZfield_templatesZtemplate_namesr
   )r4   r3   r   Ú_get_field_templateI   s    

r:   c               @   s   e Zd ZdZdZdd„ ZdS )ÚLayoutzVForm layout specification.

    Allows to set relative field sizes and positions.
    zlayout/layout.htmlc             G   s   t |ƒ| _d S )N)r'   r$   )r   r$   r
   r
   r   Ú__init__h   s    zLayout.__init__N)r   r   r   r   r   r<   r
   r
   r
   r   r;   `   s   r;   c               @   s   e Zd ZdZdZdd„ ZdS )ÚFieldsetz’Group of relative elements in a form.

    :param label: Header for the fields group

    :param span_columns: Relative width of the fieldset
    zlayout/fieldset.htmlc             O   s"   || _ t|ƒ| _|jddƒ| _d S )Nr   r	   )Úlabelr'   r$   r   r   )r   r>   r$   Úkwargsr
   r
   r   r<   v   s    
zFieldset.__init__N)r   r   r   r   r   r<   r
   r
   r
   r   r=   l   s   r=   c               @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚRowz Place elements in a single line.zlayout/row.htmlc             O   s   t |ƒ| _|jdd ƒ| _d S )NÚrow_id)r'   r$   r   rA   )r   r$   r?   r
   r
   r   r<      s    
zRow.__init__c                s(   |j dƒ\}‰ tˆ ƒ‰ ‡ ‡fdd„}|S )NÚ_c              3   s`   t dd„ ˆjD ƒƒ} ˆ |  dkr4tjdjˆ ˆjƒƒ ˆ |  }xˆjD ]}||j| fV  qDW d S )Nc             s   s   | ]}|j V  qd S )N)r   )r/   r&   r
   r
   r   ú	<genexpr>‹   s    z=Row.__getattr__.<locals>.elements_iterator.<locals>.<genexpr>r   z6Can't equally divide container {} for {} span elements)Úsumr$   ÚwarningsÚwarnr   r   )Zelements_spanZspan_multiplierr&   )Úcontainer_sizer   r
   r   Úelements_iterator‰   s    z*Row.__getattr__.<locals>.elements_iterator)r.   Úint)r   r+   rB   rH   r
   )rG   r   r   Ú__getattr__…   s    zRow.__getattr__N)r   r   r   r   r   r<   rJ   r
   r
   r
   r   r@   |   s   r@   c               @   s   e Zd ZdZdZdd„ ZdS )ÚColumnzsPlace elements vertically stacked, one ander another.

    :param span_columns: Relative width of the fieldset
    zlayout/column.htmlc             O   s*   t |ƒ| _|jddƒ| _|jdd ƒ| _d S )Nr   r	   Ú	column_id)r'   r$   r   r   rL   )r   r$   r?   r
   r
   r   r<   ¢   s    
zColumn.__init__N)r   r   r   r   r   r<   r
   r
   r
   r   rK   š   s   rK   c               @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚSpana  Wrapper for a field reference.

    There are  ``Span2``, ``Span3``, .., ``Span12`` shortcut classes.
    ``Layout`` autowraps string field referencies into Span(1, field_name)

    :param span_columns: relative field width
    :param field_name: field name in the form
    zlayout/field.htmlc             C   s   || _ || _d S )N)r   Ú
field_name)r   r   rN   r
   r
   r   r<   ´   s    zSpan.__init__c                s  |d ‰ |d }|| j  }yhd|kr<tdjˆ |d ƒgƒ}nDd|krt‡ fdd„t|d ƒjƒ dd… D ƒ}t|ƒ}ntˆ |jƒ}W n4 tk
r¶   tj	d
j|jj
|jjj
ƒƒ t|ƒS X d}|jjrÐ|jdd}|jƒ  z(||d< |j|d< ||d< |j|jƒ ƒS |jƒ  X dS )zf
        Render field in the template.

        Compatible with django ``{% include %}`` tag.
        r   Úformr   z{}/{}r7   c                s.   g | ]&}d j ˆ |jjddƒd |jjƒ ƒ‘qS )z{}/fields/{}_{}.htmlr-   r	   r   )r   r   r.   r   r*   )r/   r0   )r4   r
   r   r1   É   s   zSpan.render.<locals>.<listcomp>Nr2   zUnknown field and widget {} {}Ú T)Zonly_initialÚbound_fieldr9   Úhidden_initialr5   )rN   r   r   r6   r8   r:   r9   r   rE   rF   Ú	__class__r7   r   Zshow_hidden_initialZ	as_hiddenr   r   r   r   )r   r   r   rO   rQ   r   r3   rR   r
   )r4   r   r   ¸   s8    




zSpan.renderc             C   s   dj | j| jƒS )Nz
Span{}({}))r   r   rN   )r   r
   r
   r   Ú__str__é   s    zSpan.__str__N)r   r   r   r   r   r<   r   rT   r
   r
   r
   r   rM   ¨   s
   1rM   r	   r2   é   é   é   é   é   é   é	   é
   é   é   c             C   sL   |d krg }t |dƒr4x|jD ]}t| ||d qW t|| ƒrH|j|ƒ |S )Nr$   )Ú	container)Úhasattrr$   Ú_collect_elementsr    r"   )Zelement_clsÚparentr_   r&   r
   r
   r   ra   û   s    


ra   c               @   s   e Zd ZdZedd„ ƒZdS )ÚLayoutMixinaG  Extracts from layout `fields` for django FormView.

    Shortcut allows don't specify ``fields`` parameter in the GenericView
    if you already  have layout object.

    .. code: python:

        class MyView(LayoutMixin, generics.CreateView):
            model = MyModel
            layout = Layout('field_1', 'field_2')
    c             C   s   t t| jƒ}dd„ |D ƒS )z$Provide list of field for ModelForm.c             S   s   g | ]
}|j ‘qS r
   )rN   )r/   r9   r
   r
   r   r1     s    z&LayoutMixin.fields.<locals>.<listcomp>)ra   rM   Zlayout)r   Úfieldsr
   r
   r   rd     s    zLayoutMixin.fieldsN)r   r   r   r   Úpropertyrd   r
   r
   r
   r   rc   	  s   rc   )N)&r   r(   rE   Ú	functoolsr   Zdjango.templater   Zdjango.template.loaderr   r   Zdjango.utilsr   Zdjango.utils.encodingr   Úobjectr   r'   r,   r:   r;   r=   r@   rK   rM   r#   ZSpan2ZSpan3ZSpan4ZSpan5ZSpan6ZSpan7ZSpan8ZSpan9ZSpan10ZSpan11ZSpan12ra   rc   r
   r
   r
   r   Ú<module>   s<   .
E












