
    ]jy                         d dl 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l	m
Z
 d dlmZ d Z G d d	e
      Z G d
 de      Z G d dej                         Zy)    N)DjangoJSONEncoder)models)OneToOneField)ReverseOneToOneDescriptor)atomicc                 >    t        j                  | t        ddd      S )NT   ),z: )cls	sort_keysindent
separators)jsondumpsr   )values    9/root/env/lib/python3.12/site-packages/annoying/fields.pyr   r      s"    ::     c                   .     e Zd ZdZed fd	       Z xZS )!AutoSingleRelatedObjectDescriptorzS
    The descriptor that handles the object creation for an AutoOneToOneField.
    c                 h   t        | j                  d| j                  j                        }	 t        t        |   ||      S # |j                  $ r  |j                  j                  di | j                  j                  j                  |i\  }}t        j                  dk\  rC| j                  j                  ||       | j                  j                  j                  ||       nFt        || j                  |       t        || j                  j                  j!                         |       |cY S w xY w)Nrelated_model)r	   r    )getattrrelatedmodelsuperr   __get__DoesNotExistobjectsget_or_createfieldnamedjangoVERSIONset_cached_valuesetattr
cache_nameget_cache_name)selfinstanceinstance_typer   obj_	__class__s         r   r   z)AutoSingleRelatedObjectDescriptor.__get__   s    ot||7I7IJ	7 !=1 !! 	0U]]00WDLL4F4F4K4KX3VWFC ~~'--h<""33CB$//37T\\//>>@(KJ	s   A C,D10D1N)__name__
__module____qualname____doc__r   r   __classcell__r.   s   @r   r   r      s      r   r   c                       e Zd ZdZd Zy)AutoOneToOneFielda{  
    OneToOneField creates related object on first call if it doesnt exist yet.
    Use it instead of original OneToOne field.

    example:

        class MyProfile(models.Model):
            user = AutoOneToOneField(User, primary_key=True)
            home_page = models.URLField(max_length=255, blank=True)
            icq = models.IntegerField(max_length=255, null=True)
    c                 L    t        ||j                         t        |             y r/   )r&   get_accessor_namer   )r)   r   r   s      r   contribute_to_related_classz-AutoOneToOneField.contribute_to_related_classB   s!    %%'-g6	
r   N)r0   r1   r2   r3   r:   r   r   r   r7   r7   5   s    

r   r7   c                   \     e Zd ZdZ fdZ fdZd Z fdZd Zd Z	 fdZ
 fd	Z xZS )
	JSONFieldaQ  
    JSONField is a generic textfield that neatly serializes/unserializes
    JSON objects seamlessly.
    Django snippet #1478

    Custom serializer/deserializer functions can be used to customize field's behavior.
    Defaults:
     - serializer: json.dumps(value, cls=DjangoJSONEncoder, sort_keys=True, indent=2, separators=(',', ': '))
     - deserializer: json.loads(value)

    example:
        class Page(models.Model):
            data = JSONField(blank=True, null=True)


        page = Page.objects.get(pk=5)
        page.data = {'title': 'test', 'type': 3}
        page.save()
    c                     |j                  dt              | _        |j                  dt        j                        | _        t        t        | "  |i | y N
serializerdeserializer)	popr   r?   r   loadsr@   r   r<   __init__)r)   argskwargsr.   s      r   rC   zJSONField.__init___   s@     **\59"JJ~tzzBi'88r   c                 z    t         t        |          \  }}}}| j                  |d<   | j                  |d<   ||||fS r>   )r   r<   deconstructr?   r@   )r)   r"   pathrD   rE   r.   s        r   rG   zJSONField.deconstructe   sH    #(D#E#G dD&#|!%!2!2~T4''r   c                     |dk(  ry	 t        |t        j                        r| j                  |      S t        |t              r | j                  |j                  d            S 	 |S # t        $ r Y |S w xY w)zG
        Convert a string from the database to a Python value.
         Nutf8)
isinstancesixstring_typesr@   bytesdecode
ValueError)r)   r   s     r   	to_pythonzJSONField.to_pythonk   s}     B;	%!1!12((//E5)((f)=>> *   		s   *A& /A& &	A32A3c                     |dk(  ryt        |t        t        f      r| j                  |      S t        t
        |   |      S )zT
        Convert the value to a string so it can be stored in the database.
        rJ   N)rL   dictlistr?   r   r<   get_prep_value)r)   r   r.   s     r   rV   zJSONField.get_prep_value{   s>     B;edD\*??5))Y4U;;r   c                 $    | j                  |      S r/   )rR   )r)   r   rD   rE   s       r   from_db_valuezJSONField.from_db_value   s    ~~e$$r   c                     | j                         r1t        | j                        r| j                         S | j                  S yNrJ   )has_defaultcallabledefault)r)   s    r   get_defaultzJSONField.get_default   s1    %-dll%;4<<>MMr   c                     |dk(  ry t        |t        t        f      r| j                  |      S t	        t
        |   |g|i |S rZ   )rL   rT   rU   r?   r   r<   get_db_prep_save)r)   r   rD   rE   r.   s       r   r`   zJSONField.get_db_prep_save   sX    B;edD\*??5))005H8<H@FH Hr   c                 j    t         t        |   |      }| j                  r|y | j	                  |      S r/   )r   r<   value_from_objectnullr?   )r)   r,   r   r.   s      r   rb   zJSONField.value_from_object   s1    i8=99u%%r   )r0   r1   r2   r3   rC   rG   rR   rV   rX   r^   r`   rb   r4   r5   s   @r   r<   r<   J   s6    (9( <%H& &r   r<   )r   r#   rM   django.core.serializers.jsonr   	django.dbr   django.db.modelsr   +django.db.models.fields.related_descriptorsr   django.db.transactionr   r   r   r7   	TextFieldr<   r   r   r   <module>rj      sS      
 :  * )(A :
 
*Q&   Q&r   