3
g$                 @   s   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 ddl	m
Z ddlmZmZ ddl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G dd deZdS )z
MongoDB model fields emulating Django Extensions' additional model fields

These fields are essentially identical to existing Extensions fields, but South hooks have been removed (since mongo requires no schema migration)

    N)forms)
LOOKUP_SEP)slugify)gettext_lazy)StringFieldDateTimeFieldc                   s8   e Zd ZedZ fddZdd Z fddZ  ZS )	SlugFieldzString (up to %(max_length)s)c                s2   |j dd|d< d|kr d|d< t j|| d S )N
max_length2   Zdb_indexT)getsuper__init__)selfargskwargs)	__class__ g/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django_extensions/mongodb/fields/__init__.pyr      s    zSlugField.__init__c             C   s   dS )Nr   r   )r   r   r   r   get_internal_type   s    zSlugField.get_internal_typec                s"   dt ji}|j| t jf |S )NZ
form_class)r   r   updater   	formfield)r   r   defaults)r   r   r   r   !   s    

zSlugField.formfield)	__name__
__module____qualname___descriptionr   r   r   __classcell__r   r   )r   r   r      s   r   c                   sP   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
  ZS )AutoSlugFielda  
    AutoSlugField, adapted for MongoDB

    By default, sets editable=False, blank=True.

    Required arguments:

    populate_from
        Specifies which field or list of fields the slug is populated from.

    Optional arguments:

    separator
        Defines the used separator (default: '-')

    overwrite
        If set to True, overwrites the slug on every save (default: False)

    Inspired by SmileyChris' Unique Slugify snippet:
    https://www.djangosnippets.org/snippets/690/
    c                s|   |j dd |j dd |jdd }|d kr6tdn|| _|jdt| _|jdtd	| _|jd
d| _t	 j
|| d S )NZblankTeditableFpopulate_fromz missing 'populate_from' argumentslugify_function	separator-	overwrite)
setdefaultpop
ValueError_populate_fromr   r!   strr"   r$   r   r   )r   r   r   r    )r   r   r   r   >   s    
zAutoSlugField.__init__c             C   s:   dt j| j }t jd| | j|}t jd||f d|S )a	  
        Clean up a slug by removing slug separator characters that occur at
        the beginning or end of a slug.

        If an alternate separator is used, it will also replace any instances
        of the default '-' separator with the new separator.
        z(?:-|%s)z%s+z	^%s+|%s+$ )reescaper"   sub)r   valueZre_sepr   r   r   _slug_stripM   s    zAutoSlugField._slug_stripc             C   s
   | j |S )N)r!   )r   contentr   r   r   slugify_funcY   s    zAutoSlugField.slugify_funcc                s  t jttfsjf_ jjj}|s2jrZ fdd}jj	t
|j}d}nTjt j}|jjd }|j rjj	|jjd d }t|}nd}|j}|r|d | }j|}|} jjj }	 jr|	j jd}	i }
x> jjD ]2}j|kr x|D ]}t |d |
|< qW q W ||
j< x| sX|	jf |
r|}dj|f }t|}|rt|| |kr|d ||  }j|}d||f }||
j< |d7 }qBW |S )	Nc                s   j j | S )N)r1   get_slug_fields)lookup_value)model_instancer   r   r   <lambda>d   s    z+AutoSlugField.create_slug.<locals>.<lambda>      )pkz%s%sr9   )
isinstancer(   listtuple_meta	get_fieldattnamer$   r"   joinmapr/   getattrsplitisdigitintr	   r   Z_default_managerallr8   excludeZunique_togetherfilterlen)r   r4   addZ
slug_fieldZslug_for_fieldZslugnextZslug_lenZoriginal_slugZquerysetr   paramsparamendZend_lenr   )r4   r   r   create_slug\   sL    







zAutoSlugField.create_slugc             C   sj   |j t}|}xD|D ]<}yt||}W q tk
rN   tdj||||Y qX qW t|rfd|  S |S )Nzbvalue {} in AutoSlugField's 'populate_from' argument {} returned an error - {} has no attribute {}z%s)rC   r   rB   AttributeErrorformatcallable)r   r4   r3   Zlookup_value_pathattrelemr   r   r   r2      s    


zAutoSlugField.get_slug_fieldsc             C   s"   t | j||}t|| j| |S )N)r)   rO   setattrr?   )r   r4   rJ   r.   r   r   r   pre_save   s    zAutoSlugField.pre_savec             C   s   dS )Nr   r   )r   r   r   r   r      s    zAutoSlugField.get_internal_type)r   r   r   __doc__r   r/   r1   rO   r2   rV   r   r   r   r   )r   r   r   '   s   :r   c               @   s    e Zd ZdZdd Zdd ZdS )CreationDateTimeFieldzf
    CreationDateTimeField

    By default, sets editable=False, blank=True, default=datetime.now
    c             O   s&   |j dtjj tj| f|| d S )Ndefault)r%   datetimenowr   r   )r   r   r   r   r   r   r      s    zCreationDateTimeField.__init__c             C   s   dS )Nr   r   )r   r   r   r   r      s    z'CreationDateTimeField.get_internal_typeN)r   r   r   rW   r   r   r   r   r   r   rX      s   rX   c               @   s    e Zd ZdZdd Zdd ZdS )ModificationDateTimeFieldz
    ModificationDateTimeField

    By default, sets editable=False, blank=True, default=datetime.now

    Sets value to datetime.now() on each save of the model.
    c             C   s   t j j }t|| j| |S )N)rZ   r[   rU   r?   )r   modelrJ   r.   r   r   r   rV      s    
z"ModificationDateTimeField.pre_savec             C   s   dS )Nr   r   )r   r   r   r   r      s    z+ModificationDateTimeField.get_internal_typeN)r   r   r   rW   rV   r   r   r   r   r   r\      s   r\   c               @   s   e Zd ZdS )UUIDVersionErrorN)r   r   r   r   r   r   r   r^      s   r^   c                   sF   e Zd ZdZdddZdd Z fd	d
Zdd Z fddZ  Z	S )	UUIDFielda  
    UUIDField

    By default uses UUID version 1 (generate from host ID, sequence number and current time)

    The field support all uuid versions which are natively supported by the uuid python module.
    For more information see: https://docs.python.org/lib/module-uuid.html
    NTr7   c       	      K   s`   d|d< || _ || _|dkr,|| | _| _n|dks<|dkrJ|| | _| _tj| ||f| d S )N$   r	   r7         )autoversionnode	clock_seq	namespacenamer   r   )	r   Zverbose_namerh   rc   rd   re   rf   rg   r   r   r   r   r      s    zUUIDField.__init__c             C   s   t jS )N)r   r   )r   r   r   r   r      s    zUUIDField.get_internal_typec                sZ   | j rH|jj s(td| |||jjf t j|| d|j_| |j_nt j|| d S )Nz=A model can't have more than one AutoField: %s %s %s; have %sT)Zprimary_keyr=   Zhas_auto_fieldAssertionErrorZ
auto_fieldr   contribute_to_class)r   clsrh   )r   r   r   rj      s    "
zUUIDField.contribute_to_classc             C   s   | j  s| j dkrtj S | j dkr4tj| j| jS | j dkrHtdnB| j dkrbtj| j| j	S | j dkr|tj
| j| j	S td| j  d S )N   r7   r6   z UUID version 2 is not supported.ra   rb   zUUID version %s is not valid.)rd   uuiduuid4uuid1re   rf   r^   uuid3rg   rh   uuid5)r   r   r   r   create_uuid   s    




zUUIDField.create_uuidc                s`   | j r(|r(t| j }t|| j| |S t j||}| j r\| r\t| j }t|| j| |S )N)rc   r)   rr   rU   r?   r   rV   )r   r4   rJ   r.   )r   r   r   rV     s    
zUUIDField.pre_save)NNTr7   NNN)
r   r   r   rW   r   r   rj   rr   rV   r   r   r   )r   r   r_      s   

	r_   )rW   r+   rZ   Zdjangor   Zdjango.db.models.constantsr   Zdjango.template.defaultfiltersr   Zdjango.utils.translationr   r   Zmongoengine.fieldsr   r   rm   r   r   rX   r\   	Exceptionr^   r_   r   r   r   r   <module>   s    	