3
̾6b                 @   s   d dl mZ d dlZd dlmZmZ d dlm	Z	m
Z
mZmZmZmZmZmZmZ d dlZyd dlmZ W n  ek
r   d dlmZ Y nX d dlmZ dZejeZe ZG d	d
 d
eZdd Z edZ!edddZ"ej#G dd deZdS )    )absolute_importN)EnumIntEnum)	AnyDictListOptionalSequenceTupleTypeVarUnioncast)classproperty)	EnumFieldr   r   c               @   s   e Zd ZdZedd ZdS )	BlankEnum c             C   s   dS )Nr    )selfr   r   T/var/www/html/sandeepIITI/myenv/lib/python3.6/site-packages/django_enumfield/enum.pylabel   s    zBlankEnum.labelN)__name__
__module____qualname__BLANKpropertyr   r   r   r   r   r      s   r   c                s   G  fdddt }|S )Nc                   s$   e Zd ZdddZd fdd	ZdS )z)classdispatcher.<locals>._classdispatcherNc             S   s
   || _ d S )N)fget)r   methodr   r   r   __init__!   s    z2classdispatcher.<locals>._classdispatcher.__init__c                s   |d krt | S | j|S )N)getattrr   )r   instancecls)class_methodr   r   __get__$   s    
z1classdispatcher.<locals>._classdispatcher.__get__)N)N)r   r   r   r   r"   r   )r!   r   r   _classdispatcher    s   
r#   )object)r!   r#   r   )r!   r   classdispatcher   s    	r%   DefaultT)boundc               @   s   e Zd ZdZi ZdZi Zdd Zeddd Z	edd	d
 Z
edd Zedd Zdd Zedd Zed$ddZedd Zedd Zed%ddZedd Zedd Zed d! Zed"d# ZdS )&r   z3 A container for holding and restoring enum values Nc             C   s   | j S )N)r   )r   r   r   r   __str__8   s    zEnum.__str__get_namec             C   s   | j S )N)_name_)r   r   r   r   name;   s    z	Enum.name	get_labelc             C   s$   t t| jjj| j| j}tj|S )zsGet human readable label for the matching Enum.Value.
        :return: label for value
        :rtype: str
        )	r   str	__class__
__labels__getvaluer,   six	text_type)r   r   r   r   r   r   @   s    z
Enum.labelc             C   s   dS )NTr   )r    r   r   r   do_not_call_in_templatesJ   s    zEnum.do_not_call_in_templatesc             C   s   dd | D S )Nc             S   s   i | ]}||j qS r   )r2   ).0memberr   r   r   
<dictcomp>S   s    zEnum.values.<locals>.<dictcomp>r   )r    r   r   r   valuesQ   s    zEnum.valuesc             C   s$   | j }dj|j|j}|| jgi fS )zy
        See "Adding a deconstruct() method" in
        https://docs.djangoproject.com/en/1.8/topics/migrations/
        z{}.{})r/   formatr   r   r2   )r   cpathr   r   r   deconstructU   s    zEnum.deconstructc             C   s   dd | D }t |dd dS )zw
        :return: List of tuples consisting of every enum value in the form
            [('NAME', value), ...]
        c             S   s   g | ]}|j |jfqS r   )r,   r2   )r6   r7   r   r   r   
<listcomp>e   s    zEnum.items.<locals>.<listcomp>c             S   s   | d S )N   r   )xr   r   r   <lambda>f   s    zEnum.items.<locals>.<lambda>)key)sorted)r    itemsr   r   r   rD   ^   s    z
Enum.itemsFc             C   s8   t dd | D dd d}|r4|jdtjjtjf |S )zMChoices for Enum
        :return: List of tuples (<value>, <member>)
        c             S   s   g | ]}|j |fqS r   )r2   )r6   r7   r   r   r   r>   o   s    z Enum.choices.<locals>.<listcomp>c             S   s   | d S )Nr   r   )r@   r   r   r   rA   o   s    zEnum.choices.<locals>.<lambda>)rB   r   )rC   insertr   r   r2   )r    Zblankchoicesr   r   r   rF   h   s
    zEnum.choicesc             C   s   | j dk	rtt| | j S dS )a0  Default Enum value. Set default value to `__default__` attribute
        of your enum class or override this method if you need another
        default value.
        Usage:
            IntegerField(choices=my_enum.choices(), default=my_enum.default(), ...
        :return Default value, if set.
        N)__default__r   r   )r    r   r   r   defaultu   s    

zEnum.defaultc             K   s   t | f|S )a,  A shortcut for field declaration
        Usage:
            class MyModelStatuses(Enum):
                UNKNOWN = 0

            class MyModel(Model):
                status = MyModelStatuses.field()

        :param kwargs: Arguments passed in EnumField.__init__()
        :rtype: EnumField
        )r   )r    kwargsr   r   r   field   s    z
Enum.fieldc             C   sf   t || r|S t |tr8y| |S  tk
r4   Y qbX n*t |tjrby| | S  tk
r`   Y nX |S )zGet Enum.Value object matching the value argument.
        :param name_or_numeric: Integer value or attribute name
        :param default: The default to return if the value passed is not
            a valid enum value
        )
isinstanceint
ValueErrorr3   string_typesKeyError)r    name_or_numericrH   r   r   r   r1      s    

zEnum.getc             C   s   | j |}|dk	r|jS dS )zGet Enum.Value name matching the value argument.
        :param name_or_numeric: Integer value or attribute name
        :return: The name or None if not found
        N)r1   r,   )r    rP   r2   r   r   r   r*      s    
zEnum.get_namec             C   s   | j |}|dk	r|jS dS )zGet Enum.Value label matching the value argument.
        :param name_or_numeric: Integer value or attribute name
        :return: The label or None if not found
        N)r1   r   )r    rP   r2   r   r   r   r-      s    
zEnum.get_labelc             C   s>   t || r|j}t || r |j}||kp<| j p<|| j|kS )zWill check if to_value is a valid transition from from_value.
        Returns true if it is a valid transition.

        :param from_value: Start transition point
        :param to_value: End transition point
        :return: Success flag
        )rK   r2   __transitions__transition_origins)r    
from_valueto_valuer   r   r   is_valid_transition   s    


zEnum.is_valid_transitionc             C   s(   t || r|j}ttt | jj|g S )zqReturns all values the to_value can make a transition from.
        :param to_value End transition point
        )rK   r2   r   r	   rL   rQ   r1   )r    rT   r   r   r   rR      s    
zEnum.transition_origins)F)N)r   r   r   __doc__r0   rG   rQ   r)   r%   r,   r   r   r5   r9   r=   classmethodrD   rF   rH   rJ   r1   r*   r-   rU   rR   r   r   r   r   r   0   s*   
	
)r   r   )$
__future__r   loggingenumr   Z
NativeEnumr   ZNativeIntEnumtypingr   r   r   r   r	   r
   r   r   r   r3   Zdjango.utils.functionalr   ImportErrorZdjango.utils.decoratorsZdjango_enumfield.db.fieldsr   __all__	getLoggerr   loggerr$   ZRAISEr   r%   r&   r'   python_2_unicode_compatibler   r   r   r   <module>   s$   ,
