
    fV&                         d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ  G d de      Z G d	 d
e      Zy)    N)
ForeignKeyManyToManyFieldOneToOneField)SeederException)NameGuesserFieldTypeGuesser)IntegrityError)transactionc                   P    e Zd Zd Zed        Zed        Zed        ZddZd Z	y)	ModelSeederc                 .    || _         i | _        i | _        y)z)
        :param model: Generator
        N)modelfield_formattersmany_relations)selfr   s     f/var/www/teaching_timetable/msuas_timetable/my_venv/lib/python3.12/site-packages/django_seed/seeder.py__init__zModelSeeder.__init__   s     
 "     c                       fd}|S )Nc                     | v r9|    r4t        j                  |          }j                  j                  |      S j                  sdj                        }t        |      y NpkField {} cannot be null)randomchoiceobjectsgetnullformatr   )insertedr   messagefieldrelated_models      r   funcz(ModelSeeder.build_relation.<locals>.func   sf    (Xm-D]]8M#:;$,,00B077ZZ3::5A%g..  r    r#   r$   r%   s   `` r   build_relationzModelSeeder.build_relation   s    	/ r   c                       fd}|S )Nc                 $   | v rc|    r^t        t        |          z
        }|rBt        j                  |      }j	                  |       j
                  j                  |      S j                  sdj                        }t        |      y r   )
listsetr   r   addr   r   r   r    r   )r!   unusedr   r"   existingr#   r$   s       r   r%   z,ModelSeeder.build_one_relation.<locals>.func"   s    (Xm-Dc(="9:XEFv.BLL$(00444;;::3::5A%g.. r   r&   )r#   r$   r/   r%   s   ``` r   build_one_relationzModelSeeder.build_one_relation    s    
	/ r   c                       fd}|S )Nc           	         | v r|    rt        dt        t        |          dz        dz         }g }t        t	        j
                  d|            D ]E  }t	        j                  |          }|j                  j                  j                  |             G |S j                  sdj                        }t        |      t        j                  dj                               g S )N
         r   r   z?Could not build many-to-many relationship for between {} and {})minroundlenranger   randintr   appendr   r   blankr    r   loggingwarn)r!   max_relationsreturn_list_r   r"   r#   r$   s         r   r%   z-ModelSeeder.build_many_relation.<locals>.func2   s    (Xm-D #Bc(=2I.JQ.N(ORS(S T v~~a?@ MA#]]8M+BCF&&}'<'<'@'@F'@'KLM #"[[3::5A%g..U\\% 	r   r&   r'   s   `` r   build_many_relationzModelSeeder.build_many_relation0   s    	, r   Nc                 
   |si }t        |      }t        |      }| j                  j                  j                  D ]  }|j
                  }|j                  r||v r!|j                         r|j                         ||<   Et        |t              r+t               }| j                  ||j                  |      ||<   t        |t              r | j                  ||j                        ||<   |j                  s|j!                  |      }|r|||<   |j!                  |      }|s|||<    | j                  j                  j"                  D ]5  }| j%                  ||j                        | j&                  |j
                  <   7 |S )a<  
        Gets the formatter methods for each field using the guessers
        or related object fields
        :param faker: Faker factory object
        :param formatters: this is 'customFieldFormatters' - optional dict with field as key and
        callable as value
        :type formatters: dict or None
        )r   r   r   _metafieldsnameprimary_keyget_default
isinstancer   r,   r0   r$   r   r(   choicesguess_formatmany_to_manyrB   r   )	r   faker
formattersname_guesserfield_type_guesserr#   
field_namer/   	formatters	            r   guess_field_formattersz"ModelSeeder.guess_field_formattersJ   s    J"5)-e4ZZ%%,, %	EJ  
 Z'  ").):):)<
:&%/5)-)@)@5..*
:& %,)-)<)<UEDWDW)X
:&==(55jA	-6Jz**77>I)2
:&K%	N ZZ%%22 	E.2.F.Fu**/D

+	
 r   c           	         d }d }| j                   j                  j                  |      } ||j                          | j                  j	                         D ci c]  \  }}| |||       }}}|D ]]  }	| j                   j
                  j                  |	      }|j                  s5t        ||	   t              sI||	   d|j                   ||	<   _  |j                  di |}
| j                  j	                         D ]2  \  }} ||      }|s|D ]  }t        |
|      j                  |        4 |
j                  S c c}}w )zo
        Execute the stages entities to insert
        :param using:
        :param inserted_entities:
        c                 ,    t        |       r | |      S | S N)callable)r    inserted_entitiess     r   format_fieldz)ModelSeeder.execute.<locals>.format_field   s    /00Mr   c                     | j                   j                  D ]+  }t        |dd      rd|_        t        |dd      s%d|_        - y )Nauto_nowFauto_now_add)rD   rE   getattrr[   r\   )r   r#   s     r   turn_off_auto_addz.ModelSeeder.execute.<locals>.turn_off_auto_add   sB    ++ /5*e4%*EN5.%8).E&	/r   )usingNr&   )r   r   
db_managerr   itemsrD   	get_field
max_lengthrI   strcreater   r]   r-   r   )r   r_   rX   rY   r^   managerr#   field_format
faker_data
data_fieldobjr+   related_objs                r   executezModelSeeder.execute   sP   	
	/ **$$//e/<'--( (,'<'<'B'B'D
#| <.?@@

 
 % 	TJJJ$$..z:EJz*/Es$K)3J)?@R%BRBR)S
:&		T gnn*z*..446 	9KE4)*D#' 9KC'++K89	9 vv)
s   ErV   )
__name__
__module____qualname__r   staticmethodr(   r0   rB   rS   rl   r&   r   r   r   r      sN    ! 	 	    2;z*r   r   c                   ,    e Zd Zd ZddZdi fdZd Zy)Seederc                      || _         g | _        y)z)
        :param faker: Generator
        N)rM   orders)r   rM   s     r   r   zSeeder.__init__   s     
r   Nc                     t        |      }|j                  | j                  |      |_        |j                  ||d}| j
                  j                  |       y)a  
        Add an order for the generation of $number records for $entity.
        :param model: mixed A Django Model classname,
        or a faker.orm.django.EntitySeeder instance
        :type model: Model
        :param number: int The number of entities to seed
        :type number: integer
        :param customFieldFormatters: optional dict with field as key and
        callable as value
        :type customFieldFormatters: dict or None
        )rN   )klassquantityentityN)r   rS   rM   r   r   rt   r;   )r   r   numbercustomFieldFormattersorders        r   
add_entityzSeeder.add_entity   sZ     E"!&!=!=JJ#8 "> "

 [[

 	5!r   c           
         |s| j                         }i }t        | j                        r| j                  j                  d      }|d   }|d   }|d   }t	        j
                  dj                  ||             ||vrg ||<   |dz  }d}d}	|dkD  rZ	 t        j                         5  |j                  ||      }
ddd       ||   j                  
       |dz  }||k(  rn|dz  }|dkD  rZ|dk(  rt        d	|j                   d
|	       ||k7  r!t        d| d| d|j                   d|	        t        | j                        r|S # 1 sw Y   xY w# t        $ r}|}	Y d}~d}~ww xY w)z
        Populate the database using all the Entity classes previously added.
        :param using A Django database connection name
        :rtype: A list of the inserted PKs
        r   rw   rv   rx   zCreating {} of {}   Nr5   z+Error: could not generate any instances of z
Internal error: zWarning: could only generate z out of z instances of z, the rest errored with; )get_connectionr8   rt   popr=   debugr    r
   atomicrl   r;   r	   rm   print)r   r_   rX   r{   ry   rv   rx   attemptscompleted_count
last_errorexecuted_entityerrs               r   rl   zSeeder.execute   s    '')E$++KKOOA&E:&F'NE8_FMM-44VUCD--+-!%( zHO JQ,	% %++- S*0..@Q*RS &e,33OD#q(O
 #f,A! Q,$ !#$'RSXSaSaRbbtu  uA  &B  C  C F*5o5FhvhVdejesesdt  uN  OY  NZ  [  \Q $++T ! 'S S
 & %!$J%s0   E &E
9!E 
EE 	E+E&&E+c                     | j                   D cg c]  }|d   	 }}|sd}t        |      t        |      d   }|j                  j                  S c c}w )zO
        use the first connection available
        :rtype: Connection
        rv   z5No classes found. Did you add entities to the Seeder?r   )rt   r   r+   r   _db)r   r{   klassesr"   rv   s        r   r   zSeeder.get_connection  sU     04{{;e5>;;MG!'**Wa }}    <s   ArV   )rm   rn   ro   r   r|   rl   r   r&   r   r   rr   rr      s    "8 !B 4!l!r   rr   )r   r=   django.db.modelsr   r   r   django_seed.exceptionsr   django_seed.guessersr   r   django.db.utilsr	   	django.dbr
   objectr   rr   r&   r   r   <module>r      s7     G G 2 > * !f& fRf!V f!r   