î
à^Q\‘  ã               @   s¿   d  Z  d d l m Z d d l Z d d l Z d d l m Z d d l m Z d d l	 m
 Z
 d d „  Z d	 d
 „  Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d „  d e
 j ƒ Z d S)a%  
JSONField automatically serializes most Python terms to JSON data.
Creates a TEXT field with a default value of "{}".  See test_json.py for
more information.

 from django.db import models
 from django_extensions.db.fields import json

 class LOL(models.Model):
     extra = json.JSONField()
é    )Úabsolute_importN)Úsettings)ÚDjangoJSONEncoder)Úmodelsc             C   s   t  ƒ  j |  ƒ S)N)r   Úencode)Úvalue© r   úQ/var/www/dbchiro/venv/build/django-extensions/django_extensions/db/fields/json.pyÚdumps   s    r
   c             C   s   t  j |  d t j ƒ} | S)NÚencoding)ÚjsonÚloadsr   ÚDEFAULT_CHARSET)Ztxtr   r   r   r	   r      s    r   c               @   s"   e  Z d  Z d Z d d „  Z d S)ÚJSONDictz€
    Hack so repr() called by dumpdata will output JSON instead of
    Python formatted data.  This way fixtures will work!
    c             C   s
   t  |  ƒ S)N)r
   )Úselfr   r   r	   Ú__repr__(   s    zJSONDict.__repr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r	   r   #   s   r   c               @   s"   e  Z d  Z d Z d d „  Z d S)ÚJSONListz
    As above
    c             C   s
   t  |  ƒ S)N)r
   )r   r   r   r	   r   0   s    zJSONList.__repr__N)r   r   r   r   r   r   r   r   r	   r   ,   s   r   c                   s|   e  Z d  Z d Z d d „  Z ‡  f d d †  Z d d „  Z ‡  f d d	 †  Z d
 d „  Z d d „  Z	 ‡  f d d †  Z
 ‡  S)Ú	JSONFieldz…JSONField is a generic textfield that neatly serializes/unserializes
    JSON objects seamlessly.  Main thingy must be a dict object.c             O   s0   | j  d t ƒ | d <t j j |  | | Ž d  S)NÚdefault)ÚgetÚdictr   Ú	TextFieldÚ__init__)r   ÚargsÚkwargsr   r   r	   r   8   s    zJSONField.__init__c                sM   |  j  ƒ  r: |  j } t | ƒ r- | ƒ  } n  |  j | ƒ St t |  ƒ j ƒ  S)N)Zhas_defaultr   ÚcallableÚ	to_pythonÚsuperr   Úget_default)r   r   )Ú	__class__r   r	   r"   <   s    	zJSONField.get_defaultc             C   sy   | d k s | d k r i  St  | t j ƒ r= t | ƒ } n | } t  | t ƒ r\ t |   St  | t ƒ ru t | ƒ S| S)z=Convert our string value to JSON after we load it from the DBNÚ )Ú
isinstanceÚsixÚstring_typesr   r   r   Úlistr   )r   r   Úresr   r   r	   r    F   s    

zJSONField.to_pythonc                s5   t  | t j ƒ s t | ƒ St t j |  ƒ j | ƒ S)N)r%   r&   r'   r
   r!   r   r   Úget_prep_value)r   r   )r#   r   r	   r*   W   s    
zJSONField.get_prep_valuec             C   s   |  j  | ƒ S)N)r    )r   r   Z
expressionÚ
connectionÚcontextr   r   r	   Úfrom_db_value\   s    zJSONField.from_db_valuec             K   s>   | d k r |  j  r d St | t j ƒ s: t | ƒ } n  | S)z2Convert our JSON object to a string before we saveN)Únullr%   r&   r'   r
   )r   r   r+   r   r   r   r	   Úget_db_prep_save_   s
    zJSONField.get_db_prep_savec                sJ   t  t |  ƒ j ƒ  \ } } } } |  j d k r: | d =n  | | | | f S)Nz{}r   )r!   r   Údeconstructr   )r   ÚnameÚpathr   r   )r#   r   r	   r0   j   s    !
zJSONField.deconstruct)r   r   r   r   r   r"   r    r*   r-   r/   r0   r   r   )r#   r	   r   4   s   
r   )r   Ú
__future__r   r   r&   Zdjango.confr   Zdjango.core.serializers.jsonr   Z	django.dbr   r
   r   r   r   r(   r   r   r   r   r   r   r	   Ú<module>   s   	