
    9 f4/                     l   d Z ddlZddl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mZmZ  ej        d          Zd	Zi Zd
 Zd Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d de          Z G d d          Z dS )z9factory_boy extensions for use with the Django framework.    N)make_password)files)IntegrityError   )basedeclarationserrorszfactory.generatedefaultc                 b    dt           vrt                       t           d         } || |          S )z"Wrapper around django's get_model.	get_model)_LAZY_LOADS_lazy_load_get_model)appmodel
_get_models      D/var/www/equiseq/venv/lib/python3.11/site-packages/factory/django.pyr   r      s5    +%%[)J:c5!!!    c                  :    ddl m}  | j        j        t          d<   dS )zLazy loading of get_model.

    get_model loads django.conf.settings, which may fail if
    the settings haven't been configured yet.
    r   )appsr   N)djangor   r   r   )django_appss    r   r   r   %   s,     +******/9Kr   c                   .     e Zd Z fdZ fdZd Z xZS )DjangoOptionsc                     t                                                      t          j        ddd          t          j        dt          d          t          j        ddd          gz   S )Ndjango_get_or_create T)inheritdatabaseskip_postgeneration_saveF)super_build_default_optionsr   OptionDefaultDEFAULT_DB_ALIAS)self	__class__s    r   r!   z$DjangoOptions._build_default_options0   sg    ww--//5r4HHHz+;TJJJ95$OOO3
 
 	
r   c                     t                                                      }|| j        k    rK| j        j        j        :| j        j        j        j        j        r| j        | j        j        j        s| j        S |S N)r    _get_counter_referencebase_factory_metar   abstractfactory)r$   counter_referencer%   s     r   r(   z$DjangoOptions._get_counter_reference7   su    !GG::<<!222%+1=%+17@ >J*
(1 + <  r   c                     t          | j        t                    r<d| j        v r3| j                            dd          \  }}t	          ||          | _        | j        S N.r   )
isinstancer   strsplitr   )r$   r   
model_names      r   get_model_classzDjangoOptions.get_model_classC   sV    dj#&& 	43$*+<+<"j..sA66OC"3
33DJzr   )__name__
__module____qualname__r!   r(   r5   __classcell__r%   s   @r   r   r   /   s`        
 
 
 
 

! 
! 
! 
! 
!      r   r   c                        e Zd ZdZeZdZ G d d          Zed             Z	ed             Z
e fd            Zed             Zed	             Zedd
            Z xZS )DjangoModelFactoryzFactory for Django models.

    This makes sure that the 'sequence' field of created objects is a new id.

    Possible improvement: define a new 'attribute' type, AutoField, which would
    handle those for non-numerical primary keys.
    Nc                       e Zd ZdZdS )DjangoModelFactory.MetaTN)r6   r7   r8   r+   r   r   r   Metar>   W   s        r   r?   c                     t          |t                    r-d|v r)|                    dd          \  }}t          ||          S |S r/   )r1   r2   r3   r   )cls
definitionr   r   s       r   _load_model_classz$DjangoModelFactory._load_model_classZ   sO     j#&& 	)3*+<+<#))#q11JCS%(((r   c                     |%t          j        d| j         d| j         d          	 |j        }n# t
          $ r
 |j        }Y nw xY w| j        j        t          k    r|
                    | j        j                  }|S )NzNo model set on r0   z.Meta)r	   AssociatedClassErrorr7   r6   objectsAttributeError_default_managerr*   r   r#   using)rA   model_classmanagers      r   _get_managerzDjangoModelFactory._get_managerc   s    -G3>GGCLGGGI I I	3!)GG 	3 	3 	3 "2GGG	3
 9!111mmCI$677Gs   1 AAc                 V    || _         t                                          ||          S r'   )_original_paramsr    	_generate)rA   strategyparamsr%   s      r   rO   zDjangoModelFactory._generatet   s'      &ww  6222r   c                 $                          |          }d j        j        vsJ d d j        j        d            i } j        j        D ]=}||vrt          j        d|d j                  |                    |          ||<   >||d<   	  |j        |i |\  }}nm# t          $ r`}	 j	        |	 fd j	        
                                D             }
|
r$	  |j        d	i |
}n# |j        j        $ r |	w xY w|	Y d}	~	nd}	~	ww xY w|S )
z>Create an instance of the model through objects.get_or_create.defaultsz7'defaults' is a reserved keyword for get_or_create (in z._meta.django_get_or_create=)z@django_get_or_create - Unable to find initialization value for 'z' in factory Nc                 8    i | ]\  }}|j         j        v ||S r   )r*   r   ).0lookupvaluerA   s      r   
<dictcomp>z5DjangoModelFactory._get_or_create.<locals>.<dictcomp>   s9     $ $ $!FESY;;; ;;;r   r   )rL   r*   r   r	   FactoryErrorr6   popget_or_creater   rN   itemsgetr   DoesNotExist)rA   rJ   argskwargsrK   
key_fieldsfieldinstance_createdeget_or_create_paramss   `          r   _get_or_createz!DjangoModelFactory._get_or_create{   s    "";//!????? ssCI2224 @??
 
Y3 	2 	2EF"")) UUCLL*+ + + !'

5 1 1Ju!'
:	!6!6!K
!K!KHhh 	 	 	#+$ $ $ $%(%9%?%?%A%A$ $ $ 
 $ *w{BB-ABBHH}1    G
  HHHH	( s0   B# #
D-0DC,+D,C>>DDc                     | j         j        r | j        |g|R i |S |                     |          } |j        |i |S )z=Create an instance of the model, and save it to the database.)r*   r   rh   rL   create)rA   rJ   r`   ra   rK   s        r   _createzDjangoModelFactory._create   s_     9) 	D%3%kCDCCCFCCC"";//w~t.v...r   c                     |rN|rN| j         j        sDt          j        | j         d| j         dt
                     |                                 dS dS dS dS )z>Save again the instance if creating and at least one hook ran.z._after_postgeneration will stop saving the instance after postgeneration hooks in the next major release.
If the save call is extraneous, set skip_postgeneration_save=True in the zv.Meta.
To keep saving the instance, move the save call to your postgeneration hooks or override _after_postgeneration.N)r*   r   warningswarnr6   DeprecationWarningsave)rA   rd   rj   resultss       r   _after_postgenerationz(DjangoModelFactory._after_postgeneration   s      	g 	ci&H 	M< J J ,J J J #   MMOOOOO	 	 	 	 	 	r   r'   )r6   r7   r8   __doc__r   _options_classrN   r?   classmethodrC   rL   rO   rh   rk   rr   r9   r:   s   @r   r<   r<   K   s         #N          [   [  3 3 3 3 [3 ) ) [)V / / [/    [    r   r<   c                   "     e Zd Zef fd	Z xZS )Passwordc                 @     t                      j        |fd|i| d S )N	transform)r    __init__)r$   passwordry   ra   r%   s       r   rz   zPassword.__init__   s-    AAYA&AAAAAr   )r6   r7   r8   r   rz   r9   r:   s   @r   rw   rw      sJ        +8 B B B B B B B B B Br   rw   c                   (    e Zd ZdZdZd Zd Zd ZdS )	FileFieldz<Helper to fill in django.db.models.FileField from a Factory.zexample.datc                 .    |                     dd          S )zCreate data for the field.datar   )r^   )r$   rQ   s     r   
_make_datazFileField._make_data   s    zz&#&&&r   c                    d}|                     d          }|                     d          }|                     d          }t          d |||fD                       dk    rt          d          |r\|}t          |d          5 }t          j                            |                                          }d d d            n# 1 swxY w Y   n||r|}t	          j        |          }|j	        }n\|r&|}t	          j         |                      }|j	        }n4| 
                    |          }	t          j                            |	          }|r t          j                            |          }
n| j        }
|                     d	|
          }||fS )
N 	from_path	from_file	from_funcc                     g | ]}||S r   r   )rV   ps     r   
<listcomp>z+FileField._make_content.<locals>.<listcomp>   s    BBBaBBBBr   r   z~At most one argument from 'from_file', 'from_path', and 'from_func' should be non-empty when calling factory.django.FileField.rbfilename)r^   len
ValueErroropendjango_filesr   ContentFilereadFilenamer   ospathbasenameDEFAULT_FILENAME)r$   rQ   r   r   r   r   fcontentfuncr   default_filenamer   s               r   _make_contentzFileField._make_content   s   JJ{++	JJ{++	JJ{++	BBIy)<BBBCCaGGF  
  	:DdD!! BQ&+77AAB B B B B B B B B B B B B B B  	:A"'**G<DD 	:D"'//G<DD ??6**D"'33D99G 	5!w//55#4::j*:;;  s   2CC
Cc                 f    |                      |          \  }}t          j        |j        |          S )zFill in the field.)r   r   r   file)r$   rd   stepextrar   r   s         r   evaluatezFileField.evaluate   s/     ..u55' x888r   N)r6   r7   r8   rs   r   r   r   r   r   r   r   r}   r}      sN        FF$' ' '&! &! &!P9 9 9 9 9r   r}   c                       e Zd ZdZd ZdS )
ImageFieldzexample.jpgc                    ddl m} |                    dd          }|                    d|          }|                    dd          }|                    dd	          }|                    d
d          }t          j                    }|                    |||f|          5 }	|	                    ||           d d d            n# 1 swxY w Y   |                                S )Nr   )Imagewidthd   heightcolorblueformatJPEGpaletteRGB)r   )PILr   r^   ioBytesIOnewrp   getvalue)
r$   rQ   r   r   r   r   image_formatimage_palettethumb_iothumbs
             r   r   zImageField._make_data  s    	

7C((He,,

7F++zz(F33

9e44:<<YY}ufou== 	6JJxJ555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6  """s   !CC	C	N)r6   r7   r8   r   r   r   r   r   r   r      s)        $# # # # #r   r   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	mute_signalsa  Temporarily disables and then restores any django signals.

    Args:
        *signals (django.dispatch.dispatcher.Signal): any django signals

    Examples:
        with mute_signals(pre_init):
            user = UserFactory.build()
            ...

        @mute_signals(pre_save, post_save)
        class UserFactory(factory.Factory):
            ...

        @mute_signals(post_save)
        def generate_users():
            UserFactory.create_batch(10)
    c                 "    || _         i | _        d S r'   )signalspaused)r$   r   s     r   rz   zmute_signals.__init__&  s    r   c                     | j         D ]8}t                              d|j                   |j        | j        |<   g |_        9d S )Nz*mute_signals: Disabling signal handlers %r)r   loggerdebug	receiversr   )r$   signals     r   	__enter__zmute_signals.__enter__*  sX    l 	" 	"FLLE)+ + + #)"2DK!F	" 	"r   c                    | j                                         D ]h\  }}t                              d|           |xj        |z  c_        |j        5  |j                                         d d d            n# 1 swxY w Y   ii | _         d S )Nz*mute_signals: Restoring signal handlers %r)r   r]   r   r   r   locksender_receivers_cacheclear)r$   exc_type	exc_value	tracebackr   r   s         r   __exit__zmute_signals.__exit__5  s    !%!2!2!4!4 		6 		6FILLE"$ $ $ 	) 6 6 -33555	6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
 s   A77A;	>A;	c                     t          | j         S r'   )r   r   )r$   s    r   copyzmute_signals.copyB  s    T\**r   c                 Z    t          t          j                  rn                     j        j                  _                             j        j                  _                             j        j                  _        S t          j	                   fd            }|S )Nc                  p                                     5   | i |cd d d            S # 1 swxY w Y   d S r'   r   )r`   ra   callable_objr$   s     r   wrapperz&mute_signals.__call__.<locals>.wrapperP  s     YY[[ 9 9'<8889 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9   +//)
r1   r   FactoryMetaClasswrap_methodrk   __func__rO   rr   	functoolswraps)r$   r   r   s   `` r   __call__zmute_signals.__call__E  s    lD$9:: 	#'#3#3L4H4Q#R#RL %)%5%5l6L6U%V%VL"151A1A2;2 2L.   _\**9 9 9 9 9 +*9 Nr   c                 d     t           t          j                   fd                        }|S )Nc                  p                                     5   | i |cd d d            S # 1 swxY w Y   d S r'   r   )r`   ra   methodr$   s     r   wrapped_methodz0mute_signals.wrap_method.<locals>.wrapped_methodX  s      / /vt.v../ / / / / / / / / / / / / / / / / /r   )ru   r   r   )r$   r   r   s   `` r   r   zmute_signals.wrap_methodW  sI    			 	 	/ 	/ 	/ 	/ 	/ 
!	  
	/ r   N)
r6   r7   r8   rs   rz   r   r   r   r   r   r   r   r   r   r     sx         &  	" 	" 	"  + + +  $    r   r   )!rs   r   r   loggingr   rm   django.contrib.auth.hashersr   django.corer   r   	django.dbr   r   r   r   r	   	getLoggerr   r#   r   r   r   FactoryOptionsr   Factoryr<   Transformerrw   BaseDeclarationr}   r   r   r   r   r   <module>r      s   @ ?     				  				  5 5 5 5 5 5 - - - - - - $ $ $ $ $ $ ( ( ( ( ( ( ( ( ( (		-	.	.   " " ": : :    D'   8t t t t t t t tnB B B B B|' B B B
49 49 49 49 49, 49 49 49n# # # # # # # #(L L L L L L L L L Lr   