ó
D²<Uc           @   s  d  Z  d d l m Z d d l Z d d l Z d d l Z y d d l Z Wn e k
 ri d d l Z n Xd d l	 m
 Z
 e j j d k Z e e ƒ Z y e j e Z Wn' e k
 rÒ d e f d „  ƒ  YZ n Xd	 e j f d
 „  ƒ  YZ d e f d „  ƒ  YZ d S(   sI   
.. module:: json_backend
   :synopsis: JSON file-based storage backend.
iÿÿÿÿ(   t	   getLoggerNi   (   t   BackendIOExceptioni   t   py23dictc           B   s   e  Z e j Z RS(    (   t   __name__t
   __module__t   dictt   itemst	   iteritems(    (    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyR      s   t   BytesEncoderc           B   s   e  Z d  „  Z RS(   c         C   s2   t  r t | t ƒ r | j ƒ  St j j |  | ƒ S(   N(   t   is_py3t
   isinstancet   bytest   decodet   jsont   JSONEncodert   default(   t   selft   obj(    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyR   "   s    
(   R   R   R   (    (    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyR   !   s   t   JsonBackendc           B   sb   e  Z d  Z d d d e d „ Z d „  Z d „  Z d „  Z d „  Z d	 „  Z	 d
 „  Z
 d „  Z RS(   s    JSON file-based storage backend.t   userst   rolest   registerc         C   s‡   | s t  d ƒ ‚ | |  _ t ƒ  |  _ | |  _ t ƒ  |  _ | |  _ t ƒ  |  _ | |  _ t ƒ  |  _	 | ry |  j
 ƒ  n  |  j ƒ  d S(   sÇ  Data storage class. Handles JSON files

        :param users_fname: users file name (without .json)
        :type users_fname: str.
        :param roles_fname: roles file name (without .json)
        :type roles_fname: str.
        :param pending_reg_fname: pending registrations file name (without .json)
        :type pending_reg_fname: str.
        :param initialize: create empty JSON files (defaults to False)
        :type initialize: bool.
        s   Directory name must be validN(   t   AssertionErrort
   _directoryR   R   t   _users_fnameR   t   _roles_fnamet   _mtimest   _pending_reg_fnamet   pending_registrationst   _initialize_storaget   _refresh(   R   t	   directoryt   users_fnamet   roles_fnamet   pending_reg_fnamet
   initialize(    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyt   __init__,   s    				c         C   s=   |  j  |  j i  ƒ |  j  |  j i  ƒ |  j  |  j i  ƒ d S(   s   Create empty JSON filesN(   t	   _savejsonR   R   R   (   R   (    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyR   F   s    c         C   sF   |  j  |  j |  j ƒ |  j  |  j |  j ƒ |  j  |  j |  j ƒ d S(   s/   Load users and roles from JSON files, if neededN(   t	   _loadjsonR   R   R   R   R   R   (   R   (    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyR   L   s    c         C   s  yi d |  j  | f } t j | ƒ j } |  j j | d ƒ | k rG d St | ƒ  } | j ƒ  } Wd QXWn) t k
 r” } t	 d | | f ƒ ‚ n XyC t
 j | ƒ } | j ƒ  | j | ƒ t j | ƒ j |  j | <Wn) t k
 r} t	 d | | f ƒ ‚ n Xd S(   sÔ   Load JSON file located under self._directory, if needed

        :param fname: short file name (without path and .json)
        :type fname: str.
        :param dest: destination
        :type dest: dict
        s
   %s/%s.jsoni    Ns   Unable to read json file %s: %ss%   Unable to parse JSON data from %s: %s(   R   t   ost   statt   st_mtimeR   t   gett   opent   readt	   ExceptionR   R   t   loadst   cleart   update(   R   t   fnamet   destt   mtimet   ft	   json_datat   et   json_obj(    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyR&   R   s"    
c      	   C   s—   d |  j  | f } yT t d | d ƒ ' } t j | | d t ƒ| j ƒ  Wd QXt j d | | ƒ Wn) t k
 r’ } t	 d | | f ƒ ‚ n Xd S(   s4   Save obj in JSON format in a file in self._directorys
   %s/%s.jsons   %s.tmpt   wt   clsNs   Unable to save JSON file %s: %s(
   R   R+   R   t   dumpR   t   flusht   shutilt   moveR-   R   (   R   R1   R   R4   R6   (    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyR%   p   s    c         C   s   |  j  |  j |  j ƒ d S(   s   Save users in a JSON fileN(   R%   R   R   (   R   (    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyt
   save_users|   s    c         C   s   |  j  |  j |  j ƒ d S(   s   Save roles in a JSON fileN(   R%   R   R   (   R   (    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyt
   save_roles€   s    c         C   s   |  j  |  j |  j ƒ d S(   s)   Save pending registrations in a JSON fileN(   R%   R   R   (   R   (    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyt   save_pending_registrations„   s    (   R   R   t   __doc__t   FalseR$   R   R   R&   R%   R>   R?   R@   (    (    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyR   )   s   						(   RA   t   loggingR    R'   R<   t   sysR   t   ImportErrort
   simplejsont   base_backendR   t   version_infot   majorR	   R   t   logR   R   R   t   AttributeErrorR   R   t   objectR   (    (    (    sB   /home/fede/newhome/projects/bottle-cork/tests/cork/json_backend.pyt   <module>   s$   
