o
    i%                     @   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.
    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   db_indexT)getsuper__init__selfargskwargs	__class__ i/var/www/html/formularioweb/env/lib/python3.10/site-packages/django_extensions/mongodb/fields/__init__.pyr      s   zSlugField.__init__c                 C      dS Nr   r   r   r   r   r   get_internal_type      zSlugField.get_internal_typec                    s&   dt ji}|| t jdi |S )N
form_classr   )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 rtd|| _|dt| _|dtd	| _|d
d| _t	 j
|i | d S )N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   valuere_sepr   r   r   _slug_stripL   s   zAutoSlugField._slug_stripc                 C   s
   |  |S N)r*   )r   contentr   r   r   slugify_funcX   s   
zAutoSlugField.slugify_funcc                    s  t jttfsjf_ jj}|sjr- fdd}j	t
|j}d}n*t j}|jd }| rUj	|jd d }t|}nd}|j}|rb|d | }|}|} jj }	 jry|	j jd}	i }
 jjD ]}j|v r|D ]
}t |d |
|< qq||
j< |r|	jdi |
r|}dj|f }t|}|rt|| |kr|d ||  }|}d||f }||
j< |d7 }|r|	jdi |
s|S )	Nc                    s     | S r:   )r<   get_slug_fields)lookup_valuemodel_instancer   r   r   <lambda>c   s    
z+AutoSlugField.create_slug.<locals>.<lambda>   )pkz%s%s   r   )
isinstancer1   listtuple_meta	get_fieldattnamer-   r+   joinmapr9   getattrsplitisdigitintr	   r   _default_managerallrD   excludeunique_togetherfilterlen)r   r@   add
slug_fieldslug_for_fieldslugnextslug_lenoriginal_slugquerysetr   paramsparamendend_lenr   r?   r   create_slug[   sP   








zAutoSlugField.create_slugc                 C   s^   | t}|}|D ]}zt||}W q	 ty#   td||||w t|r-d|  S |S )Nzbvalue {} in AutoSlugField's 'populate_from' argument {} returned an error - {} has no attribute {}z%s)rO   r   rN   AttributeErrorformatcallable)r   r@   r>   lookup_value_pathattrelemr   r   r   r=      s   

zAutoSlugField.get_slug_fieldsc                 C   s"   t | ||}t|| j| |S r:   )r2   rd   setattrrK   r   r@   rX   r7   r   r   r   pre_save   s   zAutoSlugField.pre_savec                 C   r   r   r   r   r   r   r   r      r   zAutoSlugField.get_internal_type)r    r!   r"   __doc__r   r9   r<   rd   r=   rm   r   r%   r   r   r   r   r&   &   s    <r&   c                   @       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   r   Nr   r   r   r   r   r   r      r   z'CreationDateTimeField.get_internal_typeN)r    r!   r"   rn   r   r   r   r   r   r   rp      s    rp   c                   @   ro   )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 r:   )rr   rs   rk   rK   )r   modelrX   r7   r   r   r   rm      s   
z"ModificationDateTimeField.pre_savec                 C   r   rt   r   r   r   r   r   r      r   z+ModificationDateTimeField.get_internal_typeN)r    r!   r"   rn   rm   r   r   r   r   r   ru      s    ru   c                   @   s   e Zd ZdS )UUIDVersionErrorN)r    r!   r"   r   r   r   r   rw      s    rw   c                       sT   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
    NTrE   c           	      K   sd   d|d< || _ || _|dkr||| _| _n|dks|dkr%||| _| _tj| ||fi | d S )N$   r	   rE         )autoversionnode	clock_seq	namespacenamer   r   )	r   verbose_namer   r|   r}   r~   r   r   r   r   r   r   r      s   zUUIDField.__init__c                 C   s   t jS r:   )r   r    r   r   r   r   r      s   zUUIDField.get_internal_typec                    sZ   | j r$|jjrJ d| |||jjf t || d|j_| |j_d S t || d S )Nz=A model can't have more than one AutoField: %s %s %s; have %sT)primary_keyrI   has_auto_field
auto_fieldr   contribute_to_class)r   clsr   r   r   r   r      s   
zUUIDField.contribute_to_classc                 C   s   | j r| j dkrt S | j dkrt| j| jS | j dkr"td| j dkr/t| j| j	S | j dkr<t
| j| j	S td| j  )N   rE   rB   z UUID version 2 is not supported.rz   r{   zUUID version %s is not valid.)r}   uuiduuid4uuid1r~   r   rw   uuid3r   r   uuid5r   r   r   r   create_uuid  s   



zUUIDField.create_uuidc                    s^   | j r|rt|  }t|| j| |S t ||}| j r-|s-t|  }t|| j| |S r:   )r|   r2   r   rk   rK   r   rm   rl   r   r   r   rm     s   

zUUIDField.pre_save)NNTrE   NNN)
r    r!   r"   rn   r   r   r   r   rm   r%   r   r   r   r   rx      s    
rx   )rn   r4   rr   djangor   django.db.models.constantsr   django.template.defaultfiltersr   django.utils.translationr   r#   mongoengine.fieldsr   r   r   r   r&   rp   ru   	Exceptionrw   rx   r   r   r   r   <module>   s     