U
    f~$                     @   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   | 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__ \/home/mars/bis/venv/lib/python3.8/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 |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:
    http://www.djangosnippets.org/snippets/690/
    c                    s|   | dd | dd |dd }|d kr6tdn|| _|dt| _|dtd	| _|d
d| _t	 j
|| 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   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|kr|D ]}t |d |
|< qq||
j< |rH|	jf |
r|}dj|f }t|}|rt|| |kr|d ||  }|}d||f }||
j< |d7 }q4|S )Nc                    s     | S r5   )r7   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mapr4   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   r:   r   create_slug\   sL    







zAutoSlugField.create_slugc                 C   sf   | t}|}|D ]<}zt||}W q tk
rL   td||||Y qX qt|rbd|  S |S )Nzbvalue {} in AutoSlugField's 'populate_from' argument {} returned an error - {} has no attribute {}z%s)rK   r   rJ   AttributeErrorformatcallable)r   r;   r9   Zlookup_value_pathattrelemr   r   r   r8      s"    
   
zAutoSlugField.get_slug_fieldsc                 C   s"   t | ||}t|| j| |S r5   )r.   rW   setattrrG   r   r;   rR   r3   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   r4   r7   rW   r8   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| f|| 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   ra      s   ra   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 r5   )rc   rd   r]   rG   )r   modelrR   r3   r   r   r   r_      s    
z"ModificationDateTimeField.pre_savec                 C   s   dS re   r   r   r   r   r   r      s    z+ModificationDateTimeField.get_internal_typeN)r   r   r   r`   r_   r   r   r   r   r   rf      s   rf   c                   @   s   e Zd ZdS )UUIDVersionErrorN)r   r   r   r   r   r   r   rh      s   rh   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: http://docs.python.org/lib/module-uuid.html
    NTrA   c           	      K   s`   d|d< || _ || _|dkr,|| | _| _n|dks<|dkrJ|| | _| _tj| ||f| d S )N$   r	   rA         )autoversionnode	clock_seq	namespacenamer   r   )	r   Zverbose_namerr   rm   rn   ro   rp   rq   r   r   r   r   r      s    zUUIDField.__init__c                 C   s   t jS r5   )r   r   r   r   r   r   r      s    zUUIDField.get_internal_typec                    sX   | j rF|jjr&t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_keyrE   Zhas_auto_fieldAssertionErrorZ
auto_fieldr   contribute_to_class)r   clsrr   r   r   r   rt      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   rA   r>   z UUID version 2 is not supported.rk   rl   zUUID version %s is not valid.)rn   uuiduuid4uuid1ro   rp   rh   uuid3rq   rr   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 r5   )rm   r.   r|   r]   rG   r   r_   r^   r   r   r   r_     s    

zUUIDField.pre_save)NNTrA   NNN)
r   r   r   r`   r   r   rt   r|   r_   r!   r   r   r   r   ri      s   	

	ri   )r`   r0   rc   djangor   Zdjango.db.models.constantsr   Zdjango.template.defaultfiltersr   Zdjango.utils.translationr   r   Zmongoengine.fieldsr   r   rw   r   r"   ra   rf   	Exceptionrh   ri   r   r   r   r   <module>   s    	