
    h                        d Z 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mZmZ ddlmZmZmZmZmZ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% ddl&m'Z'm(Z(  e) ejT                         jW                  d      d         Z,e,dk\  rddl-m.Z.m/Z/ d Z0d Z1 G d de      Z2 G d de      Z3 G d de3      Z4 G d de3      Z5 G d de5      Z6 G d  d!e6      Z7d" Z8 G d# d$ejr                  jt                        Z; G d% d&ej$                        Z< G d' d(ejz                        Z> G d) d*ej~                        Z@ G d+ d,e6      ZA G d- d.ej                        ZC G d/ d0ejz                        ZD G d1 d2ej                        ZF G d3 d4      ZG G d5 d6eGe      ZHe,dk\  r G d7 d8e.eHe/9      ZIn G d: d8eGe      ZI G d; d<eI      ZJ G d= d>      ZKd? ZLd@ ZM G dA dB      ZN G dC dD      ZO G dE dFe      ZPy)Ga6  
The standard way of using djongo is to import models.py
in place of Django's standard models module.

Djongo Fields is where custom fields for working with
MongoDB is defined.

 - EmbeddedField
 - ArrayField
 - ArrayReferenceField
 - GenericReferenceField

These are the main fields for working with MongoDB.
    N)ObjectId)forms)ValidationError)connections)routerr   transaction)ManagerModelField	AutoField
ForeignKeyBigAutoField)version)RelatedField)modelform_factory)cached_property)format_html_joinformat_html)	mark_safe)gettext_lazy)NotSupportedError
print_warn.   )AutoFieldMixinAutoFieldMetac                     |D ]4  }| j                   j                  |      }|j                  ||         ||<   6  | di |S )z:
    Builds an instance of model from the model_dict.
     )_meta	get_field	to_python)model
model_dict
field_namefields       W/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/djongo/models/fields.pymake_mdlr'   +   sQ     ! I
%%j1!&J1G!H
:I :    c                 L    | j                   xr t        | t        t        f       S N)concrete
isinstancer   r   r%   s    r&   useful_fieldr.   6   s     >>N*UY4M"NNNr(   c                   2     e Zd ZdZ fdZed        Z xZS )DjongoManagerz
    This modified manager allows to issue Mongo functions by prefixing
    them with 'mongo_'.

    This module allows methods to be passed directly to pymongo.
    c                 z    |j                  d      r|dd  }t        | j                  |      S t        |   |      S )Nmongo   )
startswithgetattr_clientsuper__getattr__)selfname	__class__s     r&   r8   zDjongoManager.__getattr__B   s;    ??7#8D4<<..7&t,,r(   c                     t         | j                     j                         j                  | j                  j
                  j                     S r*   )pymongo_connectionsdbcursordb_connr"   r   db_tabler9   s    r&   r6   zDjongoManager._clientI   s6    #DGG,))224 	5r(   )__name__
__module____qualname____doc__r8   propertyr6   __classcell__r;   s   @r&   r0   r0   :   s!    - 5 5r(   r0   c                       e Zd ZdZy)
MongoFieldFN)rC   rD   rE   empty_strings_allowedr   r(   r&   rK   rK   P   s    !r(   rK   c                       e Zd Zd Zd Zy)	JSONFieldc                 P    t        |t        t        f      st        d| d      |S )NValue: z must be of type dict/listr,   dictlist
ValueErrorr9   values     r&   get_prep_valuezJSONField.get_prep_valueU   s1    %$.% :;  r(   c                 P    t        |t        t        f      st        d| d      |S )NrP   zC stored in DB must be of type dict/listDid you miss any Migrations?rQ   rU   s     r&   r!   zJSONField.to_python\   s5    %$.% !/ /  r(   N)rC   rD   rE   rW   r!   r   r(   r&   rN   rN   T   s    r(   rN   c                        e Zd ZdZeZdej                  e   f fdZ	d Z
dedefdZdedefdZded	efd
Zd Zd fd	Zd Z fdZ fdZd Zd Zd Zd Z xZS )
ModelFieldzh
    Allows for the inclusion of an instance of an abstract model as
    a field inside a document.
    model_containerc                 R    || _         | j                          t        |   |i | y r*   )r[   _validate_containerr7   __init__)r9   r[   argskwargsr;   s       r&   r^   zModelField.__init__l   s+      /  "$)&)r(   c                    | j                   j                  j                  d      D ]  }t        |t        t
        t        f      r(t        d| d| j                    dt        |       d      |j                  |j                  k7  r6t        d| d| j                    d|j                   d	|j                   d	      |j                  st        d
       t        d       y )NF)reversezField "z" of model container:"z" cannot be of type ""z"  of model container:"z" cannot be named as "z", different from column name "zEmbedded field indexzBThis version of djongo does not support indexes on embedded fields)r[   r   _get_fieldsr,   r   r   r   r   typeattnamecolumndb_indexr   r   )r9   r%   s     r&   r]   zModelField._validate_containers   s    ))//;;E;J 	E%)"."."0 1 &eW$:4;O;O:P Q**.u+a9: : }},%eW$;D<P<P;Q R++0==/ :$$)LL>45 5
 ~~12'X !	r(   	func_namerV   c                     i }| j                   j                  j                         D ]2  }	 ||j                     } t        ||      |g| ||j                  <   4 |S # t        $ r Y Bw xY wr*   )r[   r   
get_fieldsrf   KeyErrorr5   )r9   ri   rV   
other_argsprocessed_valuer%   field_values          r&   _value_thru_fieldszModelField._value_thru_fields   s     ))//::< 	aE#EMM2 .GWUI-F{-`U_-`OEMM*	a   s   A	A*)A*c                    i }i }| j                   j                  j                         D ]3  }	 	 ||j                     } t        ||      |g| ||j                  <   5 |rt        |      }t        t        |            |S # t        $ r t        d| d      w xY w# t
        $ r#}|j                  ||j                  <   Y d }~d }~ww xY w)NzValue for field "z" not supplied)
r[   r   rk   rf   rl   r   r5   
error_listr:   str)	r9   ri   rV   rm   rn   errorsr%   ro   es	            r&   _save_value_thru_fieldsz"ModelField._save_value_thru_fields   s     ))//::< 	2E2U"'"6K 2K	1J;1dYc1d.	2 'A!#a&))   U),=eWN*STTU # 2%&\\uzz"2s(   B BBB	C
'CC
objc                     i }| j                   j                  j                         D ]"  } t        ||      |g| ||j                  <   $ |S r*   r[   r   rk   r5   rf   )r9   ri   rw   rm   rn   r%   s         r&   _obj_thru_fieldszModelField._obj_thru_fields   sV     ))//::< 	YE-FWUI-Fs-XZ-XOEMM*	Yr(   c                     i } | j                   di |}| j                   j                  j                         D ]%  }t        ||j                        ||j                  <   ' |S Nr   ry   )r9   rV   rn   instr%   s        r&   _value_thru_containerz ModelField._value_thru_container   sa    #t##,e,))//::< 	JE-4T5==-IOEMM*	Jr(   c                     |rt         |   ||       |t         |   ||       y  | j                  di |}| j                  d||       y )Nvalidater   )r7   r   r[   rp   )r9   rV   model_instancevalidate_parentcontainer_instancer;   s        r&   r   zModelField.validate   sU    GUN3=GUN31T11:E:
E3EFr(   c                     | j                  |      }|t        dt        |       d       | j                  di |}| j	                  d|      }t        j                  |      S )NzType: z cannot be serializedvalue_to_stringr   )value_from_object	TypeErrorre   r[   rz   jsondumps)r9   rw   rV   container_objrn   s        r&   r   zModelField.value_to_string   sg    &&s+=fT%[M1FGHH,,,5u5//0A=Qzz/**r(   c                 t    t         |   |      }|y  | j                  di |}| j                  d|      }|S Nr   r   )r7   r   r[   rz   )r9   rw   rV   r   rn   r;   s        r&   r   zModelField.value_from_object   sH    )#.=,,,5u5//0C]Sr(   c                 T    t         |          \  }}}}| j                  |d<   ||||fS )Nr[   )r7   deconstructr[   r9   r:   pathr_   r`   r;   s        r&   r   zModelField.deconstruct   s9    #(7#6#8 dD&$($8$8 !T4''r(   c                     |y t        || j                        st        d| d| j                         | j                  d||      }|S )NrP    must be an instance of get_db_prep_save)r,   	base_typerT   rv   )r9   rV   
connectionrn   s       r&   r   zModelField.get_db_prep_save   sa    =%0% 88HIK K 667I7<7AC r(   c                 ^    |t        || j                        s|S | j                  d|      }|S )NrW   )r,   r   rp   r9   rV   rn   s      r&   rW   zModelField.get_prep_value   s6    Mudnn5L112B279r(   c                 $    | j                  |      S r*   r!   )r9   rV   r_   s      r&   from_db_valuezModelField.from_db_value       ~~e$$r(   c                     |yt        |t              rt        j                  |      }t        || j                        st        d| d| j                         | j                  |      }| j                  d|      }|S )zh
        Overrides Django's default to_python to allow correct
        translation to instance.
        NrP   r   r!   )r,   rs   r   loadsr   r   r~   rp   r   s      r&   r!   zModelField.to_python   s    
 =eS!JJu%E%0!% 88HIK K **5111+uEr(   T)rC   rD   rE   rF   rR   r   typingTyper
   r^   r]   rs   rp   rv   rz   r~   r   r   r   r   r   rW   r   r!   rH   rI   s   @r&   rZ   rZ   e   s     I*"(++e"4**&)"&+.'+,$'#	G+(
%r(   rZ   c                        e Zd Z	 	 ddej                  e   dej                  ej                     def fdZ	 fdZ
 fdZ xZS )FormedFieldr[   model_form_classmodel_form_kwargsc                 P    t        |   |g|i | || _        |i }|| _        y r*   )r7   r^   r   r   )r9   r[   r   r   r_   r`   r;   s         r&   r^   zFormedField.__init__  s8    
 	:4:6: 0$ "!2r(   c                     t         |          \  }}}}| j                  | j                  |d<   | j                  r| j                  |d<   ||||fS )Nr   r   )r7   r   r   r   r   s        r&   r   zFormedField.deconstruct  s_    #(7#6#8 dD&  ,)-)>)>F%&!!*.*@*@F&'T4''r(   c                     t         | j                  | j                  | j                  | j                  d}|j                  |       t        |   di |S )N)
form_classr[   r   model_form_kwr:   r   )EmbeddedFormFieldr[   r   r   rf   updater7   	formfield)r9   r`   defaultsr;   s      r&   r   zFormedField.formfield   sP    +#33 $ 5 5!33LL
 	w ,8,,r(   NN)rC   rD   rE   r   r   r
   r   	ModelFormrR   r^   r   r   rH   rI   s   @r&   r   r   
  sQ     CG+/
3"(++e"4
3#);;u#?
3 %)
3(
- 
-r(   r   c                        e Zd ZdZdZeZ fdZdede	j                  eef   f fdZdede	j                  eef   f fdZd Zd	 Zd fd
	Z xZS )
ArrayFielda]  
    Implements an array of objects inside the document.

    The allowed object type is defined on model declaration. The
    declared instance will accept a python list of instances of the
    given model as its contents.

    The model of the container must be declared as abstract, thus should
    not be treated as a collection of its own.
    Fc                 V    g }|D ]   }|j                  t        | 	  |             " |S r*   )appendr7   r~   )r9   rV   
post_value_dictr;   s       r&   r~   z ArrayField._value_thru_container;  s7    
 	DEeg;EBC	Dr(   ri   rV   c                     t        |t              rt        |   ||g| S g }|D ]$  }t        |   ||g| }|j	                  |       & |S r*   )r,   rR   r7   rp   r   r9   ri   rV   rm   rn   pre_dict	post_dictr;   s          r&   rp   zArrayField._value_thru_fieldsA  sz     eT"7-i.3;/9; ;  	.H293;@4>@I ""9-		.
 r(   c                 ^    g }|D ]$  }t        |   ||g| }|j                  |       & |S r*   )r7   rv   r   r   s          r&   rv   z"ArrayField._save_value_thru_fieldsR  sO      	.H7	8@E9CEI ""9-		.
 r(   c                     | j                  |      }g }|D ]7  } | j                  di |}| j                  d|      }|j                  |       9 t	        j
                  |      S )Nr   r   )r   r[   rz   r   r   r   r9   rw   rV   rn   r   r   r   s          r&   r   zArrayField.value_to_string^  sm    &&s+ 	.E0D00959M--.?OI""9-	. zz/**r(   c                     t        || j                        }g }|D ]7  } | j                  di |}| j                  d|      }|j	                  |       9 |S r   )r5   rf   r[   rz   r   r   s          r&   r   zArrayField.value_from_objectg  sd    T\\* 	.E0D00959M--.A=QI""9-	. r(   c                 `    t         t        |   ||       |D ]  }t         | 	  ||d        y )NF)r   )r7   rZ   r   )r9   rV   r   r   r   r;   s        r&   r   zArrayField.validatep  s9    j$(? 	KEGUNEJ	Kr(   r   )rC   rD   rE   rF   rL   rS   r   r~   rs   r   UnionrR   rp   rv   r   r   r   rH   rI   s   @r&   r   r   -  st    	 "I&)"(,,tTz":"
+.
'-||D$J'?
+K Kr(   r   c                     | s]t        t        j                  t        j                        }|r&|r$t	        j
                  |j                  |      |d<   t        |fi |} | S )N)formfields)requestformfield_callback)rR   r   r   
ALL_FIELDS	functoolspartialformfield_for_dbfieldr   )r   r[   adminr   form_kwargss        r&   _get_model_form_classr   v  s_    ##

 W090A0A++W1>K,- -_LLr(   c                        e Zd Z fdZ xZS )NestedFormSetc                     |j                   j                         D ],  \  }}t        |t              s|j                  d||_        . t        t        | #  ||       y )N-)	r   itemsr,   ArrayFormFieldprefixr:   r7   r   
add_fields)r9   r   indexr:   r%   r;   s        r&   r   zNestedFormSet.add_fields  sP    ;;,,. 	;KD%%0(,T:
	; 	mT-dE:r(   )rC   rD   rE   r   rH   rI   s   @r&   r   r     s    ; ;r(   r   c                   4     e Zd Z	 d fd	Zd Zd Zd Z xZS )r   c                 6   || _         || _        t        ||||      | _        || _        || _        || _        |st        | j                  j                        }ddi}
t        j                  | j                  t        d      | _        t        | 8  ||
|d|	 y )N
incompleteEnter all required fields.T)formset
can_delete)error_messageswidget)r:   r[   r   r   mdl_form_kw_lr   r   ArrayFormWidgetrC   r   formset_factoryr   ArrayFormSetr7   r^   )r9   r:   r   r[   r   r   r   r   r_   r`   r   r;   s              r&   r^   zArrayFormField.__init__  s     	. 5oug!?*
$T%:%:%C%CDF 6
 "11!!=TK)- )7 &	917	9r(   c                    |sg S | j                  || j                        }|j                         rng }|j                  D ][  }|j	                  dd      r|j                  d       |j                   | j                  j                  j                  di |       ] |S t        |j                  |j                         z         )N)r   DELETETr   )r   r:   is_validcleaned_datagetpopr   r   r   r"   r   rt   non_form_errors)r9   rV   form_setretitms        r&   cleanzArrayFormField.clean  s    I$$U499$=C,, E778T*!

<40066<<CsCD	E
 J "(//H4L4L4N"NOOr(   c                 >   g }|xs g D ]e  }|j                  t        j                  || j                  j                  j
                  | j                  j                  j                               g | j                  ||| j                        }|j                         S N)r   exclude)initialr   )
r   r   model_to_dictr   r   r   r   r   r:   has_changed)r9   r   dataform_set_initialinitr   s         r&   r   zArrayFormField.has_changed  s    Mr 	D####0066== 1177??	 $$T3CDII$V##%%r(   c                     t        || |      S r*   )ArrayFormBoundFieldr9   r   r$   s      r&   get_bound_fieldzArrayFormField.get_bound_field  s    "4z::r(   )NNN)rC   rD   rE   r^   r   r   r   rH   rI   s   @r&   r   r     s    269.P"&;r(   r   c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )r   c                    t         |   |||       |j                  r| j                  nd }g }| j                  | j                  D ]v  }t        |t              s|j                  t        j                  ||j                  j                  j                  |j                  j                  j                               x |j                  ||| j                        | _        y r   )r7   r^   is_boundr   r   r,   r
   r   r   r   r   r   r   r   r   	html_namer   )r9   r   r%   r:   r   r   inir;   s          r&   r^   zArrayFormBoundField.__init__  s    ud+ MMtyyt<<#|| c5)NN++#(#9#9#?#?#F#F$)$:$:$@$@$H$H **4*Xr(   c                 X    t        |t        t        f      st        | j                  |   S r*   )r,   intslicer   r   )r9   idxs     r&   __getitem__zArrayFormBoundField.__getitem__  s$    #U|,O}}S!!r(   c              #   6   K   | j                   D ]  }|  y wr*   )r   )r9   r   s     r&   __iter__zArrayFormBoundField.__iter__  s     MM 	DJ	s   c                     t        ddd | j                  D              }t        d| j                  |      }t        d|| j                  j                        S )N
z<tbody>{}</tbody>c              3   >   K   | ]  }|j                         f  y wr*   )as_table).0r   s     r&   	<genexpr>z.ArrayFormBoundField.__str__.<locals>.<genexpr>  s!      ( mmo (s   z1
<table class="{}-array-model-field">
{}
</table>z{}
{})r   r   r   r:   management_form)r9   tables     r&   __str__zArrayFormBoundField.__str__  s[     %(()  II 8UDMM,I,IJJr(   c                 ,    t        | j                        S r*   )lenr   rB   s    r&   __len__zArrayFormBoundField.__len__  s    4==!!r(   )	rC   rD   rE   r^   r  r  r  r  rH   rI   s   @r&   r   r     s    Y""
K"r(   r   c                   :     e Zd Zd fd	ZddZd Zd Zd Z xZS )r   c                 2    || _         t        | 	  |       y r*   )first_field_idr7   r^   )r9   r  attrsr;   s      r&   r^   zArrayFormWidget.__init__  s    ,r(   c                     J r*   r   )r9   r:   rV   r  renderers        r&   renderzArrayFormWidget.render  s    ur(   c                 :    dj                  || j                        S )Nz{}-0-{})formatr  )r9   id_s     r&   id_for_labelzArrayFormWidget.id_for_label  s    T%8%899r(   c                 Z    |D ci c]  }|j                  |      s|||    }}|S c c}w r*   r4   )r9   r   filesr:   keyr   s         r&   value_from_datadictz#ArrayFormWidget.value_from_datadict  s3    )-F#1EsDI~FF
 Gs   ((c                 8    |D ]  }|j                  |      s y y)NFTr  )r9   r   r  r:   r  s        r&   value_omitted_from_dataz'ArrayFormWidget.value_omitted_from_data  s%     	C~~d#	 r(   r*   r   )	rC   rD   rE   r^   r  r  r   r"  rH   rI   s   @r&   r   r     s     :r(   r   c                       e Zd Zy)EmbeddedFieldNrC   rD   rE   r   r(   r&   r$  r$  
      r(   r$  c                   4     e Zd Z	 d fd	Zd Zd Zd Z xZS )r   c                    g }	g }
g }|j                         }	 |d   dz   |z   |d<   |j                  dd       }|r||d<   t        ||||      | _        || _        || _        || _        ddi} | j                  di || _        | j                  j                  j                         D ]  \  }}t        |t        j                  t        j                  f      r1t        |t              r | j                  j                   d||_        |	j%                  |       |
j%                  |       |j%                  |j&                          t)        |
|      }t+        | X  |||	|dd| y # t        $ r	 ||d<   Y Rw xY w)	Nr   r   r   r   r   F)r   r   r   require_all_fieldsr   )copyrl   r   r   r   r   r   r   
model_formr   r   r,   r   ModelChoiceFieldModelMultipleChoiceFieldr   r   r:   r   r   EmbeddedFormWidgetr7   r^   )r9   r:   r   r   r[   r   r   r_   r`   form_fieldsmdl_form_field_nameswidgetsr   r   r   r$   r%   r   r;   s                     r&   r^   zEmbeddedFormField.__init__  s   !)..0	/*;H*E*Kd*Rh' **Y-+2i( 5oug!?!2
 6
 0$//D2CD!%!7!7!=!=!? 	)J%%"8"8%:X:X!YZE>2(,(>(>
K
u% ''
3NN5<<(	) $$8'BCG )7{ &5	SKQ	S9  	/*.h'	/s   E( (E:9E:c                     t        t        | j                  j                  j	                         |            } | j                  j
                  j                  di |S r|   )rR   zipr+  r   keysr   r"   )r9   clean_data_valsmodel_fields      r&   compresszEmbeddedFormField.compress7  sF    3t55::<oNO*t$$**9[99r(   c                     |j                   r?dj                  |j                   | j                  j                         | j                  _         t        || |      S N{}-{})r   r  r+  EmbeddedFormBoundFieldr   s      r&   r   z!EmbeddedFormField.get_bound_field;  s=    ;;%,^^DKKAWAW%XDOO"%dD*==r(   c                 @    | j                   r|S | j                  |      S r*   )disabledr7  )r9   r   r   s      r&   
bound_datazEmbeddedFormField.bound_data@  s    ==N}}T""r(   r   )rC   rD   rE   r^   r7  r   r>  rH   rI   s   @r&   r   r     s    %)&SP:>
#r(   r   c                       e Zd Zd Zy)r;  c                     | j                         } | j                  j                  dd|i| j                  j                  }t	        d|j                          d      S )Ninstancez<table>
z	
</table>r   )rV   r%   r   r   r   r  )r9   rA  r+  s      r&   r  zEmbeddedFormBoundField.__str__M  sS    ::<0TZZ00c(cdjjFbFbc
9j&9&9&;$=ZHIIr(   N)rC   rD   rE   r  r   r(   r&   r;  r;  F  s    Jr(   r;  c                   0     e Zd Z fdZd Zd Zd Z xZS )r.  c                 2    || _         t        |   |i | y r*   )field_namesr7   r^   )r9   rD  r_   r`   r;   s       r&   r^   zEmbeddedFormWidget.__init__U  s    &$)&)r(   c                     |g S t        |t              r|S t        |t              r$| j                  D cg c]  }t	        ||       c}S t        j                  d      c c}w )NzExpected model-form)r,   rS   r
   rD  r5   r   r   )r9   rV   f_ns      r&   
decompresszEmbeddedFormWidget.decompressY  s[    =It$Lu%373C3CDCGE3'DD''(=>> Es   A c                     g }t        | j                        D ]F  \  }}dj                  || j                  |         }|j	                  |j                  |||             H |S r9  )	enumerater1  r  rD  r   r   )r9   r   r  r:   r   iwidrF  s           r&   r   z&EmbeddedFormWidget.value_from_datadictc  se    - 	FAs..t'7'7':;CJJs..eS 	
 
r(   c                 ^     t         fdt         j                        D              S )Nc           
   3      K   | ]7  \  }}|j                  d j                  j                  |                9 yw)r:  N)r"  r  rD  )r	  rJ  r   r   r  r:   r9   s      r&   r
  z=EmbeddedFormWidget.value_omitted_from_data.<locals>.<genexpr>m  sG      
 6 **eW^^D$2B2B12EF
s   =A )allrI  r1  )r9   r   r  r:   s   ````r&   r"  z*EmbeddedFormWidget.value_omitted_from_datal  s(     
 't||4	
 
 	
r(   )rC   rD   rE   r^   rG  r   r"  rH   rI   s   @r&   r.  r.  T  s    *?
r(   r.  c                   @    e Zd Z ed      ZdZd	dZd Zd Zd Z	d Z
y)
ObjectIdFieldMixinr   Fc                 $    | j                  |      S r*   r   r9   rV   r   prepareds       r&   get_db_prep_valuez$ObjectIdFieldMixin.get_db_prep_valuey  r   r(   c                 <    t        |t              rt        |      S |S r*   )r,   rs   r   rU   s     r&   r!   zObjectIdFieldMixin.to_python|  s    eS!E?"r(   c                      y)NObjectIdFieldr   rB   s    r&   get_internal_typez$ObjectIdFieldMixin.get_internal_type  s    r(   c                 $    | j                  |      S r*   )db_type)r9   r   s     r&   rel_db_typezObjectIdFieldMixin.rel_db_type  s    ||J''r(   c                     |S r*   r   rU   s     r&   rW   z!ObjectIdFieldMixin.get_prep_value  s    r(   NF)rC   rD   rE   _descriptionrL   rT  r!   rX  r[  rW   r   r(   r&   rP  rP  u  s*    J-K!%
(r(   rP  c                       e Zd Zy)GenericObjectIdFieldNr%  r   r(   r&   ra  ra    r&  r(   ra  c                       e Zd Zy_ObjectIdFieldNr%  r   r(   r&   rd  rd        r(   rd  )	metaclassc                       e Zd Zyrc  r%  r   r(   r&   rd  rd    re  r(   c                   "     e Zd ZdZ fdZ xZS )rW  z
    For every document inserted into a collection MongoDB internally creates an field.
    The field can be referenced from within the Model as _id.
    c                 P    ddd}|j                  |       t        |   |i | y )NT)primary_keyauto_created)r   r7   r^   )r9   r_   r`   id_field_argsr;   s       r&   r^   zObjectIdField.__init__  s2     
 	V$$0-0r(   )rC   rD   rE   rF   r^   rH   rI   s   @r&   rW  rW    s    
1 1r(   rW  c                   l     e Zd Zd Z fdZ fdZde_         fdZde_         fdZde_         xZ	S )ArrayReferenceManagerMixinc                     |j                  | j                         | j                  r|j                  | j                        } |j                  di | j
                  }|S )zP
        Filter the queryset for the instance this manager is bound to.
        rA  r   )
_add_hintsrA  _dbusingfiltercore_filters)r9   querysets     r&   _apply_rel_filtersz-ArrayReferenceManagerMixin._apply_rel_filters  sP     	T]]388~~dhh/H"8??7T%6%67r(   c                     	 | j                   j                  | j                  j                            S # t        t
        f$ r" t        |          }| j                  |      cY S w xY wr*   	rA  _prefetched_objects_cacher%   related_query_nameAttributeErrorrl   r7   get_querysetrw  r9   rv  r;   s     r&   r}  z'ArrayReferenceManagerMixin.get_queryset  s\    	5==::4::;X;X;Z[[) 	5w+-H**844	5   04 .A%$A%c                     t        j                  | j                  j                  | j                        }t	        t
        | j                  |        di |\  }}|r| j                  |       ||fS Nrp  r   )	r   db_for_writerA  r;   r7   rn  
db_managerupdate_or_createaddr9   r`   r>   rw   createdr;   s        r&   r  z+ArrayReferenceManagerMixin.update_or_create  s`      !8!84==Q79L^haghW HHSMG|r(   Tc                     t        j                  | j                  j                  | j                        }t	        t
        | j                  |        di |\  }}|r| j                  |       ||fS r  )	r   r  rA  r;   r7   rn  r  get_or_creater  r  s        r&   r  z(ArrayReferenceManagerMixin.get_or_create  s`      !8!84==Q79L[e^deW HHSMG|r(   c                     t        j                  | j                  j                  | j                        }t	        t
        | j                  |        di |}| j                  |       |S r  )	r   r  rA  r;   r7   rn  r  creater  )r9   r`   r>   new_objr;   s       r&   r  z!ArrayReferenceManagerMixin.create  sS      !8!84==Q2DOOB4GOYRXYr(   )
rC   rD   rE   rw  r}  r  alters_datar  r  rH   rI   s   @r&   rn  rn    s>    	5 $(  !%M Fr(   rn  c                 x    t        | t              r| }nt        dt        | fi       } G fddt        |      }|S )N	baseclassc                        e Zd Z fdZfdZdZ fdZd Zd Zde_	        d Z
de
_	        d Zde_	        d	d
dZde_	        d Zde_	         xZS )Lcreate_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManagerc                     t         |           || _        j                  | _        j
                  | _        j
                  j                  }||i| _        y r*   )	r7   r^   rA  related_modelr"   remote_fieldr%   r:   ru  )r9   rA  r:   r;   rels      r&   r^   zUcreate_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManager.__init__  sM    G$DM**DJ))DJ##((D!%x 0Dr(   c                    t        | j                  |      }t        |j                        } || j                        S Nrp  )r5   r"   &create_reverse_array_reference_managerr;   rA  r9   managermanager_classr  s      r&   __call__zUcreate_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManager.__call__  5    djj'2GB7CTCTVYZM $--88r(   Tc                    t         |   |      }| j                  xs+ t        j                  | j
                  | j                        }t        |   j                  j                  }| j                  j                  D ]>  }t        | j                  |j                        }|	|dk(  s+|s.|j                         c S  |S )Nrp   )r7   rw  rr  r   db_for_readr"   rA  r   features!interprets_empty_strings_as_nullsr%   foreign_related_fieldsr5   rf   none)r9   rv  r>   empty_strings_as_nullr%   valr;   s         r&   rw  z_create_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManager._apply_rel_filters  s    w1(;HSV//

T]]SB$/O$<$<$^$^!:: +dmmU]];;3"91F#==?*+ Or(   c                     t        d |D              }| j                  j                  j                  j                  dt        |      iiS )Nc              3   4   K   | ]  }|j                     y wr*   )pk)r	  rw   s     r&   r
  zlcreate_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManager._make_filter.<locals>.<genexpr>  s     -cff-s   $in)setr"   r   r  r:   rS   )r9   objsidss      r&   _make_filterzYcreate_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManager._make_filter  sC    ---C

  ##((49+ r(   c           
          | j                   | }| j                  j                  d   \  }}| j                  |d|j	                         t        | j                  |j	                               ii       |D ]O  }t        ||j	                               }|j                  t        | j                  |j	                                      Q y )Nr   	$addToSet)r  r%   related_fieldsmongo_updateget_attnamer5   rA  r  )r9   r  _filterlh_fieldrh_fieldrw   fk_fields          r&   r  zPcreate_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManager.add  s    'd''.G!%!:!:1!=Hh ,,.#DMM83G3G3IJ"  M"3(<(<(>?WT]]H4H4H4JKLMr(   c                      y r*   r   )r9   r  s     r&   removezScreate_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManager.remove      r(   c                      y r*   r   rB   s    r&   clearzRcreate_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManager.clear  r  r(   Fr  c                     y r*   r   )r9   r  r  s      r&   r  zPcreate_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManager.set  r  r(   c                      y r*   r   )r9   r`   s     r&   r  zScreate_reverse_array_reference_manager.<locals>.ReverseArrayReferenceManager.create$  r  r(   )rC   rD   rE   r^   r  do_not_call_in_templatesrw  r  r  r  r  r  r  r  rH   r;   r  s   @r&   ReverseArrayReferenceManagerr    so    	1	9
 $( 				M  	 "	 !%* 	 	 "r(   r  
issubclassr0   re   rn  )
superclassr  r  r  s    `  r&   r  r    s?    *m,	}j&A2F	H"'A9 H"T ('r(   c                 x    t        | t              r| }nt        dt        | fi       } G fddt        |      }|S )Nr  c                        e Zd Z fdZfdZdZ fdZ fdZd Zd Z	de	_
        d Zde_
        d	 Zd
 Zde_
        dddZde_
         xZS )Ecreate_forward_array_reference_manager.<locals>.ArrayReferenceManagerc                 `   t         |           || _        j                  | _        j                  | _        t               | _        || j                  _        | j
                  j                  d   d   j                  }t        || j
                  j                        xs g }| d|i| _        y )Nr      __in)r7   r^   rA  r"   r  r%   r0   instance_managerr  rf   r5   ru  )r9   rA  r:   r  r;   r  s       r&   r^   zNcreate_forward_array_reference_manager.<locals>.ArrayReferenceManager.__init__4  s    G$DMDJ))DJ$1OD!*2D!!'::,,Q/2::D(DJJ$6$67=2C$(6 4Dr(   c                    t        | j                  |      }t        |j                        } || j                        S r  )r5   r"   &create_forward_array_reference_managerr;   rA  r  s      r&   r  zNcreate_forward_array_reference_manager.<locals>.ArrayReferenceManager.__call__A  r  r(   Tc                     t         |   |      }t        | j                  | j                  j
                        s|j                         S |S r*   )r7   rw  r5   rA  r%   rf   r  r~  s     r&   rw  zXcreate_forward_array_reference_manager.<locals>.ArrayReferenceManager._apply_rel_filtersH  s;    w1(;H4==$***<*<=}}&Or(   c                     	 | j                   j                  | j                  j                            S # t        t
        f$ r" t        |          }| j                  |      cY S w xY wr*   ry  r~  s     r&   r}  zRcreate_forward_array_reference_manager.<locals>.ArrayReferenceManager.get_querysetN  s\    9}}>>tzz?\?\?^__"H- 9 7/1..x889r  c                     | j                   j                  j                  j                  | j                   j                  iS r*   )rA  r   r  r:   rB   s    r&   r  zRcreate_forward_array_reference_manager.<locals>.ArrayReferenceManager._make_filterU  s-    MM''**//1A1ABBr(   c           	         t        | j                  | j                  j                               }|9t	               }t        | j                  | j                  j                         |       t	               }| j                  j                  d   }|D ]+  }|j                  t        ||j                                      - |j                  |       t        j                  | j                  j                  | j                        }| j                  j                  |      j                  | j                         d| j                  j                   dt#        |      iii       y )Nr   rp  r  z$each)r5   rA  r%   r  r  setattrr  r  r   r   r  r;   r  r  r  r  rf   rS   )r9   r  fksnew_fksr  rw   r>   s          r&   r  zIcreate_forward_array_reference_manager.<locals>.ArrayReferenceManager.addX  s   $--)?)?)ABC{etzz'='='?EeGzz88;H BGC)=)=)?@ABJJw$$T]]%<%<t}}UB!!,,R0==!!#

**#T']-"	r(   c                 P     t         fd|D              } j                  |       y )Nc              3   x   K   | ]1  }t        |j                  j                  d    j                         3 yw)r   N)r5   r%   r  rf   )r	  rw   r9   s     r&   r
  z_create_forward_array_reference_manager.<locals>.ArrayReferenceManager.remove.<locals>.<genexpr>s  s5       TZZ>>qAIIJs   7:)r  _remove)r9   r  to_dels   `  r&   r  zLcreate_forward_array_reference_manager.<locals>.ArrayReferenceManager.remover  s(      F LL r(   c           	         t        | j                  | j                  j                        }|j	                  |       | j
                  xs5 t        j                  | j                  j                  | j                        }| j                  j                  |      j                  | j                         d| j                  j                  dt        |      iii       y )Nrp  z$pullr  )r5   rA  r%   rf   difference_updaterr  r   r  r;   r  r  r  r  rS   )r9   r  r  r>   s       r&   r  zMcreate_forward_array_reference_manager.<locals>.ArrayReferenceManager._remove{  s    $--););<C!!&)aV001H1HSWS`S`aB!!,,R0==!!#

**!4<-	r(   c                 v   t        j                  | j                  j                  | j                        }| j                  j                  |      j                  | j                         d| j                  j                  g ii       t        | j                  | j                  j                  t                      y )Nrp  z$set)r   r  rA  r;   r  r  r  r  r%   rf   r  r  )r9   r>   s     r&   r  zKcreate_forward_array_reference_manager.<locals>.ArrayReferenceManager.clear  s    $$T]]%<%<t}}UB!!,,R0==!!#

**B DMM4::#5#5su=r(   Fr  c                  	 t        |      }t        j                  | j                  j                  | j                        }t        j                  |d      5  |r | j                           | j                  |  nt        | j                  | j                  j                        }| j                  j                  d   	t        	fd|D              }||z
  }| j                  |       t        | j                  | j                  j                        }g }|D ]0  }t        |	j                               |vs |j!                  |       2 | j                  |       d d d        y # 1 sw Y   y xY w)Nrp  F)rs  	savepointr   c              3   R   K   | ]  }t        |j                                  y wr*   )r5   r  )r	  rw   r  s     r&   r
  z\create_forward_array_reference_manager.<locals>.ArrayReferenceManager.set.<locals>.<genexpr>  s!     !W3'#x/C/C/E"F!Ws   $')tupler   r  rA  r;   r   atomicr  r  r5   r%   rf   r  r  r  r  r   )
r9   r  r  r>   r  r  r  to_addrw   r  s
            @r&   r  zIcreate_forward_array_reference_manager.<locals>.ArrayReferenceManager.set  s   ;D$$T]]%<%<t}}UB##"> %JJLDHHdO!$--1C1CDC#zz@@CH!!WRV!WWG 7]FLL(!$--1C1CDCF# /"3(<(<(>?sJ"MM#./ HHV$% % %s   CE$7$E$$E-)rC   rD   rE   r^   r  r  rw  r}  r  r  r  r  r  r  r  rH   r  s   @r&   ArrayReferenceManagerr  2  si    	5	9
 $( 		9	C	0 	! "	
	> !%* 	%* r(   r  r  )r  r  r  r  s    `  r&   r  r  ,  s?    *m,	}j&A2F	{ :I {z ! r(   c                   *    e Zd Zd Zed        ZddZy)ArrayReferenceDescriptorc                     || _         y r*   r-   )r9   field_with_rels     r&   r^   z!ArrayReferenceDescriptor.__init__  s	    #
r(   c                     | j                   j                  }t        |j                  j                  | j                   j
                        S r*   )r%   r  r  _default_managerr;   r  r9   r  s     r&   related_manager_clsz,ArrayReferenceDescriptor.related_manager_cls  s:    

005**44JJ##
 	
r(   Nc                 ,    || S | j                  |      S )a9  
        Get the related objects through the reverse relation.

        With the example above, when getting ``parent.children``:

        - ``self`` is the descriptor managing the ``children`` attribute
        - ``instance`` is the ``parent`` instance
        - ``cls`` is the ``Parent`` class (unused)
        r  r9   rA  clss      r&   __get__z ArrayReferenceDescriptor.__get__        K''11r(   r*   rC   rD   rE   r^   r   r  r  r   r(   r&   r  r    s     $ 
 
2r(   r  c                   *    e Zd Zd Zed        ZddZy)ReverseArrayReferenceDescriptorc                     || _         y r*   )r  )r9   relateds     r&   r^   z(ReverseArrayReferenceDescriptor.__init__  s	    r(   c                     | j                   j                  }t        |j                  j                  | j                         S r*   )r  r  r  r  r;   r  s     r&   r  z3ReverseArrayReferenceDescriptor.related_manager_cls  s4    ..5**44HH
 	
r(   Nc                 ,    || S | j                  |      S )a1  
        Get the related objects through the relation.

        With the example above, when getting ``parent.children``:

        - ``self`` is the descriptor managing the ``children`` attribute
        - ``instance`` is the ``parent`` instance
        - ``cls`` is the ``Parent`` class (unused)
        r  r  s      r&   r  z'ReverseArrayReferenceDescriptor.__get__  r  r(   r*   r  r   r(   r&   r  r    s      
 
2r(   r  c                        e Zd ZdZdZdZdZdZeZ	e
Z	 	 	 d fd	Zed        ZddZd Zdd	Zd
 Zd Zd Zdd fd
Z xZS )ArrayReferenceFieldz
    When the entry gets saved, only a reference to the primary_key of the model is saved in the array.
    For all practical aspects, the ArrayReferenceField behaves like a Django ManyToManyField.
    FTNc	                 d    |xs | j                   }t        
|   |f|||||||d|	 d| _        y )N)	on_deleterelated_namer{  limit_choices_toparent_linkto_fielddb_constraintF)
_on_deleter7   r^   r+   )r9   tor  r  r{  r  r  r   r  r`   r;   s             r&   r^   zArrayReferenceField.__init__  sO     0	 	@y|,>*:%08'4		@ 9?		@ r(   c                     | j                   j                         D ]>  \  }}|D ]4  } t        ||j                        j	                  |      j
                  |  6 @ y r*   )r   r   r5   r:   r  r  )	collectorr%   sub_objsrs  r"   	instancesrw   s          r&   r  zArrayReferenceField._on_delete  s\     ) 4 4 6 	NE9 NAUZZ(33E:AA9MN	Nr(   c                 $    | j                  |      S r*   r   )r9   rV   
expressionr   contexts        r&   r   z!ArrayReferenceField.from_db_value  r   r(   c                 0    |
t               S t        |      S r*   )r  rU   s     r&   r!   zArrayReferenceField.to_python  s    =5L5zr(   c                 D    |g S t        |t              rt        |      S |S r*   )r,   r  rS   rR  s       r&   rT  z%ArrayReferenceField.get_db_prep_value  s%    =Is#;r(   c                 &    | j                  ||      S r*   )rT  )r9   rV   r   s      r&   r   z$ArrayReferenceField.get_db_prep_save&  s    %%eZ88r(   c                      y r*   r   )r9   rV   r   s      r&   r   zArrayReferenceField.validate,  s    r(   c                 d    t        || j                        j                  t        |      d       y )NTr  )r5   r:   r  rS   )r9   rA  r   s      r&   save_form_dataz"ArrayReferenceField.save_form_data0  s$    $))$((d4(@r(   )rs  c                :   t         j                  | j                  j                  j                  j                  |      d|}|j                  d      4|d   }t        |      r |       }|D cg c]  }|j                   c}|d<   t        | (  di |S c c}w )N)r   rv  r   r   )r   r-  r  r"   r  rs  r   callabler  r7   r   )r9   rs  r`   r   r   rJ  r;   s         r&   r   zArrayReferenceField.formfield3  s    88))//@@FFuM
 
 <<	".y)G !)18"9A144"9HYw ,8,, #:s   0B)NNNNFNTr*   r]  )rC   rD   rE   rF   many_to_manymany_to_oneone_to_many
one_to_oner  related_accessor_classr  forward_related_accessor_classr^   staticmethodr  r   r!   rT  r   r   r  r   rH   rI   s   @r&   r  r    s|    
 LKKJ<%="QUDH# N N
%
9A "& - -r(   r  )QrF   r   r   r   bsonr   djangor   django.core.exceptionsr   	django.dbr   r=   r   r   django.db.modelsr	   r
   r   r   r   r   django.utilsr   django.db.models.fields.relatedr   django.formsr   django.utils.functionalr   django.utils.htmlr   r   django.utils.safestringr   django.utils.translationr   r^  djongo.exceptionsr   r   r   get_versionsplitdjango_majordjango.db.models.fieldsr   r   r'   r.   r0   rK   rN   rZ   r   r   r   formsetsBaseFormSetr   r   
BoundFieldr   Widgetr   r$  MultiValueFieldr   r;  MultiWidgetr.  rP  ra  rd  rW  rn  r  r  r  r  r  r   r(   r&   <module>r1     s        2 8 6 6  ! 8 * 3 ; - 6 ;&7&&(..s3A671EO5G 5," "
 "b bJ -*  -FFK FKR ;ENN.. ;7;U[[ 7;t)"%** )"Xell ,	K 	5#-- 5#pJU-- J
** 
B ,	-u 	 1)= +Y 1N 10 0fP(fC!L2 2<2 2JK-* K-r(   