a
    8Xh$                     @   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                    s6   | dd|d< d|vr d|d< t j|i | d S )N
max_length2   Zdb_indexT)getsuper__init__selfargskwargs	__class__ n/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/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}|| t jf i |S )NZ
form_class)r   r   updater   	formfield)r   r   defaultsr   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   | dd | dd |dd }|d u r6tdn|| _|dt| _|dtd	| _|d
d| _t	 j
|i | 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 }t d| | j|}t 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
   |  |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}|s2jrZ fdd}j	t
|j}d}nTt j}|jd }| rj	|jd d }t|}nd}|j}|r|d | }|}|} jj }	 jr|	j jd}	i }
 jjD ]*}j|v r|D ]}t |d |
|< qq||
j< |rL|	jf i |
r|}dj|f }t|}|rt|| |kr|d ||  }|}d||f }||
j< |d7 }q4|S )Nc                    s     | S r4   )r6   get_slug_fields)lookup_valuemodel_instancer   r   r   <lambda>d       z+AutoSlugField.create_slug.<locals>.<lambda>   )pkz%s%s   )
isinstancer,   listtuple_meta	get_fieldattnamer(   r&   joinmapr3   getattrsplitisdigitintr	   r   Z_default_managerallr?   excludeZunique_togetherfilterlen)r   r:   addZ
slug_fieldZslug_for_fieldZslugnextZslug_lenZoriginal_slugZquerysetr   paramsparamendZend_lenr   r9   r   create_slug\   sL    







zAutoSlugField.create_slugc                 C   sd   | t}|}|D ]:}zt||}W q tyJ   td||||Y q0 qt|r`d|  S |S )Nzbvalue {} in AutoSlugField's 'populate_from' argument {} returned an error - {} has no attribute {}z%s)rJ   r   rI   AttributeErrorformatcallable)r   r:   r8   Zlookup_value_pathattrelemr   r   r   r7      s    

zAutoSlugField.get_slug_fieldsc                 C   s"   t | ||}t|| j| |S r4   )r-   rV   setattrrF   r   r:   rQ   r2   r   r   r   pre_save   s    zAutoSlugField.pre_savec                 C   s   dS r   r   r   r   r   r   r      s    zAutoSlugField.get_internal_type)r   r   r   __doc__r   r3   r6   rV   r7   r^   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,   | dtjj tj| g|R i | d S )Ndefault)r)   datetimenowr   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   r_   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 )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  }t|| j| |S r4   )rb   rc   r\   rF   )r   modelrQ   r2   r   r   r   r^      s    
z"ModificationDateTimeField.pre_savec                 C   s   dS rd   r   r   r   r   r   r      s    z+ModificationDateTimeField.get_internal_typeN)r   r   r   r_   r^   r   r   r   r   r   re      s   re   c                   @   s   e Zd ZdS )UUIDVersionErrorN)r   r   r   r   r   r   r   rg      s   rg   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
    NTr@   c           	      K   sd   d|d< || _ || _|dkr,|| | _| _n|dks<|dkrJ|| | _| _tj| ||fi | d S )N$   r	   r@         )autoversionnode	clock_seq	namespacenamer   r   )	r   Zverbose_namerq   rl   rm   rn   ro   rp   r   r   r   r   r      s    zUUIDField.__init__c                 C   s   t jS r4   )r   r   r   r   r   r   r      s    zUUIDField.get_internal_typec                    sX   | j rF|jjr&J d| |||jjf t || d|j_| |j_nt || d S )Nz=A model can't have more than one AutoField: %s %s %s; have %sT)Zprimary_keyrD   Zhas_auto_fieldZ
auto_fieldr   contribute_to_class)r   clsrq   r   r   r   rr      s     
zUUIDField.contribute_to_classc                 C   s   | j r| j dkrt S | j dkr2t| j| jS | j dkrFtdnB| j dkr`t| j| j	S | j dkrzt
| j| j	S td| j  d S )N   r@   r=   z UUID version 2 is not supported.rj   rk   zUUID version %s is not valid.)rm   uuiduuid4uuid1rn   ro   rg   uuid3rp   rq   uuid5r   r   r   r   create_uuid   s    




zUUIDField.create_uuidc                    s^   | j r(|r(t|  }t|| j| |S t ||}| j rZ|sZt|  }t|| j| |S r4   )rl   r-   rz   r\   rF   r   r^   r]   r   r   r   r^     s    

zUUIDField.pre_save)NNTr@   NNN)
r   r   r   r_   r   r   rr   rz   r^   r!   r   r   r   r   rh      s   	

	rh   )r_   r/   rb   Zdjangor   Zdjango.db.models.constantsr   Zdjango.template.defaultfiltersr   Zdjango.utils.translationr   r   Zmongoengine.fieldsr   r   ru   r   r"   r`   re   	Exceptionrg   rh   r   r   r   r   <module>   s    	