3
(h                 @   sx   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 d dlmZ G dd	 d	eZdS )
    N)CreateErrorSessionBaseUpdateError)SuspiciousOperation)DatabaseErrorIntegrityErrorroutertransaction)timezone)
force_text)cached_propertyc                   sz   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dZdddZedd Z  ZS )SessionStorez,
    Implements database session store.
    Nc                s   t t| j| d S )N)superr   __init__)selfsession_key)	__class__ G/tmp/pip-install-q3hcpn_q/Django/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   | j  S )N)r   )r   r   r   r   model   s    zSessionStore.modelc             C   s   y$| j jj| jtj d}| j|jS  | j jt	fk
r| } z4t
|t	rhtjd|jj }|jt| d | _i S d }~X nX d S )N)r   Zexpire_date__gtzdjango.security.%s)r   objectsgetr   r
   nowdecodesession_dataDoesNotExistr   
isinstancelogging	getLoggerr   __name__warningr   _session_key)r   seloggerr   r   r   load   s    
zSessionStore.loadc             C   s   | j jj|dj S )N)r   )r   r   filterexists)r   r   r   r   r   r*   -   s    zSessionStore.existsc             C   sB   x<| j  | _y| jdd W n tk
r2   wY nX d| _d S d S )NT)must_create)Z_get_new_session_keyr$   saver   modified)r   r   r   r   create0   s    
zSessionStore.createc             C   s   | j | j | j|| 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| j S | j|d}| j|}tj| j|d}y.tj|d |j	|| |d W dQ R X W n: t
k
r   |r~t Y n tk
r   |st Y nX dS )z
        Saves the current session data to the database. If 'must_create' is
        True, a database error will be raised 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_updater3   )r   r.   Z_get_sessionr1   r   Zdb_for_writer   r	   Zatomicr,   r   r   r   r   )r   r+   r0   objr3   r   r   r   r,   I   s     

 zSessionStore.savec             C   sR   |d kr| j d krd S | j }y| jjj|dj  W n | jjk
rL   Y nX d S )N)r   )r   r   r   r   deleter   )r   r   r   r   r   r5   a   s    
zSessionStore.deletec             C   s   | j  jjtj dj  d S )N)Zexpire_date__lt)r   r   r)   r
   r   r5   )r   r   r   r   clear_expiredk   s    zSessionStore.clear_expired)N)F)N)r"   
__module____qualname____doc__r   classmethodr   r   r   r(   r*   r.   r1   r,   r5   r6   __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.encodingr   Zdjango.utils.functionalr   r   r   r   r   r   <module>   s   