U
    e                     @   sl   d dl Z d dlmZmZmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZ d dlmZ G dd deZdS )	    N)CreateErrorSessionBaseUpdateError)SuspiciousOperation)DatabaseErrorIntegrityErrorroutertransaction)timezone)cached_propertyc                       s   e Zd ZdZd fdd	Zedd Zedd Zd	d
 Z	dd Z
dd Zdd Zdd ZdddZdddZedd Z  ZS )SessionStorez+
    Implement database session store.
    Nc                    s   t  | d S N)super__init__selfsession_key	__class__ G/tmp/pip-unpacked-wheel-lctamlir/django/contrib/sessions/backends/db.pyr      s    zSessionStore.__init__c                 C   s   ddl m} |S )Nr   )Session)Zdjango.contrib.sessions.modelsr   )clsr   r   r   r   get_model_class   s    zSessionStore.get_model_classc                 C   s   |   S r   )r   r   r   r   r   model   s    zSessionStore.modelc              
   C   sz   z| j jj| jt dW S  | j jtfk
rt } z4t|tr^t	
d|jj }|t| d | _W 5 d }~X Y nX d S )N)r   Zexpire_date__gtzdjango.security.%s)r   objectsgetr   r
   nowDoesNotExistr   
isinstancelogging	getLoggerr   __name__warningstr_session_key)r   eloggerr   r   r   _get_session_from_db   s     
z!SessionStore._get_session_from_dbc                 C   s   |   }|r| |jS i S r   )r)   decodesession_data)r   sr   r   r   load)   s    zSessionStore.loadc                 C   s   | j jj|d S N)r   )r   r   filterexistsr   r   r   r   r0   -   s    zSessionStore.existsc                 C   s>   |   | _z| jdd W n tk
r2   Y q Y nX d| _d S )NT)must_create)Z_get_new_session_keyr&   saver   modifiedr   r   r   r   create0   s    

zSessionStore.createc                 C   s   | j |  | ||  dS )z
        Return a new instance of the session model object, which represents the
        current session state. Intended to be used for saving the session data
        to the database.
        )r   r+   Zexpire_date)r   Z_get_or_create_session_keyencodeZget_expiry_date)r   datar   r   r   create_model_instance=   s
    z"SessionStore.create_model_instanceFc              	   C   s   | j dkr|  S | j|d}| |}tj| j|d}z.tj|d |j	|| |d W 5 Q R X W n: t
k
r   |r~t Y n tk
r   |st Y nX dS )z
        Save the current session data to the database. If 'must_create' is
        True, raise a database error if the saving operation doesn't create a
        new entry (as opposed to possibly updating an existing entry).
        N)Zno_load)instance)using)Zforce_insertZforce_updater9   )r   r4   Z_get_sessionr7   r   Zdb_for_writer   r	   Zatomicr2   r   r   r   r   )r   r1   r6   objr9   r   r   r   r2   I   s(    

  zSessionStore.savec                 C   sR   |d kr| j d krd S | j }z| jjj|d  W n | jjk
rL   Y nX d S r.   )r   r   r   r   deleter   r   r   r   r   r;   b   s    
zSessionStore.deletec                 C   s   |   jjt d  d S )N)Zexpire_date__lt)r   r   r/   r
   r   r;   )r   r   r   r   clear_expiredl   s    zSessionStore.clear_expired)N)F)N)r#   
__module____qualname____doc__r   classmethodr   r   r   r)   r-   r0   r4   r7   r2   r;   r<   __classcell__r   r   r   r   r   
   s   




r   )r!   Z%django.contrib.sessions.backends.baser   r   r   Zdjango.core.exceptionsr   Z	django.dbr   r   r   r	   Zdjango.utilsr
   Zdjango.utils.functionalr   r   r   r   r   r   <module>   s   