o
    [h4*                     @   sP  d dl Z d dlZd dlmZ d dlmZ d dlZd dl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mZmZ d dlmZ ed	g d
Zedg d
ZeZG dd dZeee
eeeeeedZede de!de"dede#ddiZ$defddZ%dd Z&defddZ'defddZ(defddZ)d#dd Z*d!d" Z+dS )$    N)import_module)Path)common)
BasePlayer	BaseGroupBaseSubsessionCurrencyWaitPagePage)settings)get_pages_moduleget_models_moduleget_builtin_constant)
namedtupleError)titleidapp_nameWarningc                   @   sH   e Zd Zdd ZdefddZdefddZdd	 Zd
d Zdd Z	dS )AppCheckHelperc                 C   s    || _ t|| _g | _g | _d S N)r   r   patherrorswarnings)selfr    r   s/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/otree/checks.py__init__   s   

zAppCheckHelper.__init__
numeric_idc                 C      | j t||| jd d S N)r   r   )r   appendr   r   r   r   r   r   r   r   	add_error      zAppCheckHelper.add_errorc                 C   r   r    )r   r!   r   r   r"   r   r   r   add_warning   r$   zAppCheckHelper.add_warningc                 c   sH    | j d }t|D ]\}}}|D ]}|dr |||V  qqd S )NZ	templatesz.html)r   oswalkendswithjoinpath)r   Ztemplates_dirrootdirsfilesnamer   r   r   get_template_names   s   

z!AppCheckHelper.get_template_namesc                 C   s   | j |S r   )r   r)   )r   r-   r   r   r   get_path&   s   zAppCheckHelper.get_pathc                 C   s   | j |d  S )Nz.py)r   r)   exists)r   moduler   r   r   module_exists)   s   zAppCheckHelper.module_existsN)
__name__
__module____qualname__r   intr#   r%   r.   r/   r2   r   r   r   r   r      s    r   )PlayerGroup
SubsessionZIntegerFieldZ
FloatFieldZBooleanFieldZ	CharFieldZCurrencyFieldhelperc                 C   s  t |}dD ]}t||s| jd| dd q|j}|j}|j}t|dr.d}| j|dd |||fD ]M}t|D ]F}	|	t|j vrt	||	}
t
|
}|t v rgdj|j|	t| t|
d	}| j|d
d q9|ttthv rdj|j|	|jd}| j|dd q9q3d S )N)r9   r8   r7   z$MissingModel: Model "%s" not definedn   r   Zbefore_session_startszQbefore_session_starts no longer exists. You should rename it to creating_session.w   zNonModelFieldAttr: {model} has attribute "{attr}", which is not a model field, and will therefore not be saved to the database. Consider changing to "{attr} = models.{FieldType}(initial={attr_value})")modelattrZ	FieldType
attr_valueo   aO  MutableModelClassAttr: {ModelName}.{attr} is a {type_name}. Modifying it during a session (e.g. appending or setting values) will have unpredictable results; you should use session.vars or participant.vars instead. Or, if this {type_name} is read-only, then it's recommended to move it outside of this class (e.g. put it in Constants).)Z	ModelNamer?   	type_namep   )r   hasattrr#   r7   r8   r9   dirbase_model_attrsr3   getattrtypemodel_field_substituteskeysformatreprlistdictset)r:   r   modelsr-   r7   r8   r9   msgZModel	attr_namer@   _typewarningr   r   r   model_classes=   sN   


	rU   c                 C   s2   | dv rdS g d}|D ]
}|  |r dS qdS )N)Zcreating_sessionZcustom_exportZgroup_by_arrival_time_methodZvars_for_admin_reportT)_min_maxZ_choicesZ_error_messageF)r(   )	func_nameZendingsendingr   r   r   
is_builtinz   s   
rZ   c                 C   s   dd l }t|sd S t| dd}|d|D ])}|d}t|r'q||dkrDt	|}t
||rDd| d}| j|dd	 qd S )
Nr   z/__init__.pyutf8zdef (\w+)\(   'z' is defined but not used   r<   )rer   Z	is_noselfr   	read_textfinditergrouprZ   countr   rD   r%   )r:   r   r_   txtmatchrX   ZapprQ   r   r   r   uncalled_functions   s   


rf   c              	   C   s   t |}t|dst|ds| jddd d S g d}|D ]!}zt|| W q ty>   d|}| j||dd Y qw t|d	}|d
ksL|dkrV| jd|dd dt|dv rf| jddd d S d S )NZ	ConstantsCz App is missing a constants class   r<   )name_in_urlplayers_per_groupZ
num_roundsz$Constants class needs to define '{}'   rj   r   r\   zoplayers_per_group cannot be {}. You should set it to None, which makes the group all players in the subsession.    ri   z#name_in_url must not contain spaces   )r   rD   r#   r   AttributeErrorrK   )r:   r   rP   attrsrR   rQ   Zppgr   r   r   	constants   s,   

rq   c                 C   s  t |}z|j}W n   | jddd Y d S t|D ]l\}}|jdkr.d}| j|dd |jdkr@|dkr@d	}| j|d
d t|trv|jru|dkrW| jd	|jdd |j
re| jd	|jdd t|dru| jd	|jdd qt|tr|qd	|}| j|dd qd S )Nz&The variable page_sequence is missing.   r<   r
   z3page_sequence cannot contain a class called 'Page'.   r	   trustz7page_sequence cannot contain a class called 'WaitPage'.   r   zQ"{}" has group_by_arrival_time=True, so it must be placed first in page_sequence.   zZPage "{}" has group_by_arrival_time=True, so it cannot have wait_for_all_groups=True also.   Zget_players_for_groupzPage "{}" defines get_players_for_group, which is deprecated. You should instead define a top-level function called group_by_arrival_time_method.    z"{}" is not a valid page   )r   r   Zpage_sequencer#   	enumerater3   
issubclassr	   Zgroup_by_arrival_timerK   Zwait_for_all_groupsrD   r
   )r:   r   Zpages_moduleZ	page_listiZViewClsrQ   r   r   r   pages_function   sV   






r}   c                 C   s`   | pt j} g }g }ttttfD ]}| D ]}t|}||| ||j ||j	 qq||fS r   )
r   Z
OTREE_APPSrU   rq   r}   rf   r   extendr   r   )Z	app_namesr   r   Zcheck_functionr   r:   r   r   r   get_checks_output   s   

r   c                  C   s@   t  \} }| r| D ]}t| q	td |D ]}t| qd S )N)r   print_functionsysexit)r   r   Zeler   r   r   
run_checks
  s   



r   r   ),inspectr&   	importlibr   pathlibr   r   Zotreer   Z	otree.apir   r   r   r   r	   r
   r   Zotree.commonr   r   r   collectionsr   r   r   printr   r   rO   rE   rF   r6   floatboolstrrH   rI   rU   rZ   rf   rq   r}   r   r   r   r   r   r   <module>   s@     


=
?