σ
P'^c           @@  s@  d  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	 d d l
 m Z d d l m Z d d	 l m Z m Z d d
 l m Z d d l m Z y d d l Z Wn e k
 rΥ d Z n Xe ry d d l m Z Wqe k
 rd d l m Z qXn d Z d g Z d e f d     YZ d S(   s]   
    celery.backends.mongodb
    ~~~~~~~~~~~~~~~~~~~~~~~

    MongoDB result store backend.

i    (   t   absolute_import(   t   datetime(   t   detect_environment(   t   cached_property(   t   maybe_sanitize_url(   t   states(   t   ImproperlyConfigured(   t   itemst   string_t(   t   maybe_timedeltai   (   t   BaseBackendN(   t   Binaryt   MongoBackendc           B@  sϋ   e  Z d  Z d Z d Z d Z d Z d Z d Z	 d Z
 d Z e Z d Z d d d  Z d   Z d   Z d	   Z d d d
  Z d   Z d   Z d   Z d   Z d   Z d   Z d i  d  Z d   Z e d    Z e d    Z e d  Z RS(   s   MongoDB result backend.

    :raises celery.exceptions.ImproperlyConfigured: if
        module :mod:`pymongo` is not available.

    t	   localhostii  t   celeryt   celery_taskmetai
   c         K@  sΑ  i  |  _  t t |   j | |  | j d  pC t |  j j j  |  _	 t
 s^ t d   n  |  j j j d  } | d  k	 rt | t  s t d   n  t |  } | j d |  j  |  _ t | j d |  j   |  _ | j d |  j  |  _ | j d |  j  |  _ | j d	 |  j  |  _ | j d
 |  j  |  _ t | | j d d   pZi   |  _  x6 t |  j    D] \ } } |  j  j | |  qvWn  | |  _ |  j r½|  j |  _ n  d  S(   Nt   expiressC   You need to install the pymongo library to use the MongoDB backend.t   CELERY_MONGODB_BACKEND_SETTINGSs4   MongoDB backend settings should be grouped in a dictt   hostt   portt   usert   passwordt   databaset   taskmeta_collectiont   options(   R   t   superR   t   __init__t   getR	   t   appt   conft   CELERY_TASK_RESULT_EXPIRESR   t   pymongoR   t   Nonet
   isinstancet   dictt   popR   t   intR   R   R   t   database_nameR   R   t   _prepare_client_optionst
   setdefaultt   url(   t   selfR   R(   t   kwargst   configt   keyt   value(    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyR   =   s4    	$		c         C@  sX   t  j d k r i |  j d 6Si |  j d 6t d 6} t   d k rP t | d <n  | Sd  S(   Ni   t   maxPoolSizet   max_pool_sizet   auto_start_requestt   defaultt   use_greenlets(   i   (   R   t   version_tupleR/   t   FalseR   t   True(   R)   R   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyR&   c   s    

c         C@  s   |  j  d k r d d l m } |  j } t | t  r_ | j d  r_ d j | |  j	  } n  | d k rx | d } n  | d | |  j
  |  _  n  |  j  S(   s   Connect to the MongoDB server.i    (   t   MongoClients
   mongodb://s   mongodb://{0}:{1}R   R   N(   t   _connectionR    R   R6   R   R!   R   t
   startswitht   formatR   R   (   R)   R6   R(   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   _get_connectiono   s    	c         C@  s+   |  j  d  k	 r' |  ` |  ` d  |  _  n  d  S(   N(   R7   R    t
   collectionR   (   R)   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   process_cleanup   s    c         K@  s   i | d 6| d 6t  |  j |   d 6t j   d 6t  |  j |   d 6t  |  j |  j |    d 6} |  j j |  | S(   s2   Store return value and status of an executed task.t   _idt   statust   resultt	   date_donet	   tracebackt   children(   R   t   encodeR   t   utcnowt   current_task_childrenR;   t   save(   R)   t   task_idR?   R>   RA   t   requestR*   t   meta(    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   _store_result   s    
	c         C@  s   |  j  j i | d 6 } | s4 i t j d 6d d 6Si | d d 6| d d 6|  j | d  d 6| d d 6|  j | d  d 6|  j | d  d 6} | S(	   s#   Get task metadata for a task by id.R=   R>   R?   RG   R@   RA   RB   N(   R;   t   find_oneR   t   PENDINGR    t   decode(   R)   RG   t   objRI   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   _get_task_meta_for   s    c         C@  sD   i | d 6t  |  j |   d 6t j   d 6} |  j j |  | S(   s   Save the group result.R=   R?   R@   (   R   RC   R   RD   R;   RF   (   R)   t   group_idR?   RI   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   _save_group­   s
    
c         C@  sW   |  j  j i | d 6 } | s# d Si | d d 6|  j | d  d 6| d d 6} | S(   s!   Get the result for a group by id.R=   NRG   R?   R@   (   R;   RK   RM   (   R)   RP   RN   RI   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   _restore_groupΆ   s    c         C@  s   |  j  j i | d 6 d S(   s   Delete a group by id.R=   N(   R;   t   remove(   R)   RP   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   _delete_groupΔ   s    c         C@  s   |  j  j i | d 6 d S(   s   Remove result from MongoDB.

        :raises celery.exceptions.OperationsError:
            if the task_id could not be removed.

        R=   N(   R;   RS   (   R)   RG   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   _forgetΘ   s    
c         C@  s2   |  j  j i i |  j j   |  j d 6d 6 d S(   s   Delete expired metadata.s   $ltR@   N(   R;   RS   R   t   nowR   (   R)   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   cleanupΤ   s    	c         C@  s1   t  t |   j | t | d |  j d |  j  S(   NR   R(   (   R   R   t
   __reduce__R"   R   R(   (   R)   t   argsR*   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyRX   Ϊ   s    c         C@  sY   |  j    } | |  j } |  j rU |  j rU | j |  j |  j  sU t d   qU n  | S(   Ns%   Invalid MongoDB username or password.(   R:   R%   R   R   t   authenticateR   (   R)   t   connt   db(    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   _get_databaseί   s    c         C@  s
   |  j    S(   sU   Get database from MongoDB connection and perform authentication
        if necessary.(   R]   (   R)   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyR   ι   s    c         C@  s'   |  j  |  j } | j d d d | S(   s!   Get the metadata task collection.R@   t
   backgroundt   true(   R   R   t   ensure_index(   R)   R;   (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyR;   ο   s    c         C@  sj   |  j  s d S| r |  j  Sd |  j  k r6 t |  j   S|  j  j d d  \ } } d j t |  | g  S(   s]   Return the backend as an URI.

        :keyword include_password: Censor passwords.

        s
   mongodb://t   ,i   (   R(   R   t   splitt   join(   R)   t   include_passwordt   uri1t	   remainder(    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   as_uriω   s    	N(    (    t   __name__t
   __module__t   __doc__R   R   R    R   R   R%   R   R/   R   R4   t   supports_autoexpireR7   R   R&   R:   R<   RJ   RO   RQ   RR   RT   RU   RW   RX   R]   R   R   R;   Rg   (    (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyR   (   s6   &												

(   Rj   t
   __future__R    R   t	   kombu.synR   t   kombu.utilsR   t   kombu.utils.urlR   R   R   t   celery.exceptionsR   t   celery.fiveR   R   t   celery.utils.timeutilsR	   t   baseR
   R   t   ImportErrorR    t   bson.binaryR   t   pymongo.binaryt   __all__R   (    (    (    s9   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/mongodb.pyt   <module>   s,   
	