o
    [h                     @   s^   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 dgZG dd deZd	S )
    )checks)connectionsrouter)Query)cached_property   )NOT_PROVIDEDFieldGeneratedFieldc                       s   e Zd ZdZdZdZdZdd fdd
Zedd Z	d fdd		Z
 fd
dZdd Z fddZdd Zdd Z fddZdd Zdd Zdd Z  ZS )r
   TN)
db_persistc                   s   | ddr
td| ddstd|dttur td|d	ttur,td
|dvr4td|| _|| _|| _t jdi | d S )NeditableFz"GeneratedField cannot be editable.blankTzGeneratedField must be blank.defaultz%GeneratedField cannot have a default.Z
db_defaultz.GeneratedField cannot have a database default.)TFz0GeneratedField.db_persist must be True or False. )	
setdefault
ValueErrorgetr   
expressionoutput_fieldr   super__init__)selfr   r   r   kwargs	__class__r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/db/models/fields/generated.pyr      s   zGeneratedField.__init__c                 C   s    ddl m} || jjj| | jS )Nr   )Col)Zdjango.db.models.expressionsr   model_metadb_tabler   )r   r   r   r   r   
cached_col#   s   zGeneratedField.cached_colc                    s.   || j jjkr|d | fv r| j}t ||S N)r   r   r   r   r   get_col)r   aliasr   r   r   r   r"   )   s   zGeneratedField.get_colc                    sL   t  j|i | t| jdd| _| j  D ]\}}| j||d qd S )NF)r   Z
alias_cols)lookup_name)	r   contribute_to_classr   r   _queryr   Zget_class_lookupsitemsZregister_lookup)r   argsr   r$   lookupr   r   r   r%   .   s
   z"GeneratedField.contribute_to_classc                 C   sb   |j d| j|d d}| jj| jdd}||\}}t| jddr-|jjs-d| d}||fS )NZSQLCompiler)
connectionusingF)Zallow_joinsZconditionalz
CASE WHEN z THEN 1 ELSE 0 END)	opscompilerr&   r   Zresolve_expressioncompilegetattrfeaturesZ&supports_boolean_expr_in_select_clause)r   r*   r-   Zresolved_expressionsqlparamsr   r   r   generated_sql6   s   
zGeneratedField.generated_sqlc           	         s   | dpg }g t jdi || || |}| j }| j|_|j|d}|rgd}|dd |D }|rK|	t
jd| | | dd |d	d |D }|rg|	t
jd
| | | dd |S )N	databases)r4   z
    c                 s   0    | ]}t |tjr|j d |j dV  qdS z ()N)
isinstancer   Errormsgid.0Zoutput_checkr   r   r   	<genexpr>Q       

z'GeneratedField.check.<locals>.<genexpr>z'GeneratedField.output_field has errors:zfields.E223objr;   c                 s   r5   r6   )r8   r   Warningr:   r;   r<   r   r   r   r>   _   r?   z)GeneratedField.output_field has warnings:zfields.W224r   )r   r   check_check_supported_check_persistencer   cloner   joinappendr   r9   rB   )	r   r   r4   errorsZoutput_field_cloneZoutput_field_checks	separatorZerror_messagesZwarning_messagesr   r   r   rC   E   sX   


zGeneratedField.checkc                 C   s   g }|D ]A}t || jsqt| }| jjjr | jjj|jkr q|jjsEd| jjj	v sE|jj
sEd| jjj	v sE|tj|j d| dd q|S )N!supports_stored_generated_columns"supports_virtual_generated_columnsz" does not support GeneratedFields.zfields.E220r@   )r   allow_migrate_modelr   r   r   required_db_vendorvendorr0   rL   required_db_featuresrK   rH   r   r9   display_namer   r4   rI   dbr*   r   r   r   rD   o   s8   
zGeneratedField._check_supportedc              	   C   s   g }|D ]X}t || jsqt| }| jjjr | jjj|jkr q| js>|jj	s>d| jjj
v s>|tj|j d| ddd | jr\|jjs\d| jjj
v s\|tj|j d| dd	d q|S )
NrL   z0 does not support non-persisted GeneratedFields.zfields.E221z!Set db_persist=True on the field.)rA   r;   hintrK   z, does not support persisted GeneratedFields.zfields.E222z"Set db_persist=False on the field.)r   rM   r   r   r   rN   rO   r   r0   rL   rP   rH   r   r9   rQ   rK   rR   r   r   r   rE      sN   
	
	z!GeneratedField._check_persistencec                    sH   t   \}}}}|d= |d= | j|d< | j|d< | j|d< ||||fS )Nr   r   r   r   r   )r   deconstructr   r   r   )r   namepathr(   r   r   r   r   rU      s   


zGeneratedField.deconstructc                 C   s
   | j  S r!   )r   get_internal_type)r   r   r   r   rX      s   
z GeneratedField.get_internal_typec                 C      | j |S r!   )r   db_parametersr   r*   r   r   r   rZ         zGeneratedField.db_parametersc                 C   rY   r!   )r   db_type_parametersr[   r   r   r   r]      r\   z!GeneratedField.db_type_parametersr!   )__name__
__module____qualname__	generatedZdb_returningr&   r   r   r   r    r"   r%   r3   rC   rD   rE   rU   rX   rZ   r]   __classcell__r   r   r   r   r
      s$    
*)	N)Zdjango.corer   Z	django.dbr   r   Zdjango.db.models.sqlr   Zdjango.utils.functionalr    r   r	   __all__r
   r   r   r   r   <module>   s    