U
    sc9                     @   sz   d dl mZ d dlmZmZmZmZ d dlmZ d dlm	Z	 d dl
mZmZ G dd dZG dd	 d	ZG d
d dZdS )    )serializers) QUESTION_TYPE_SERIALIZER_CHOICES"QUESTION_FORMAT_SERIALIZER_CHOICESQUESTION_TYPE_MULTIPLE_CHOICEQUESTION_TYPE_DESCRIPTIVE)Question)const)dic_validetoruuid_checkerc                   @   s:   e Zd Zdd Zedd ZeedddZdd	 Zd
S )Rulec                 C   s   || _ || _d S N)
retrieversgroups)selfr   r    r   //var/www/wikiazma_server/quiz/blueprint/rule.py__init__   s    zRule.__init__c                 C   s@   |  |r8dd |d D }dd |d D }| ||S d S d S )Nc                 S   s   g | ]}t |qS r   )RuleRetriever	from_dict).0	retrieverr   r   r   
<listcomp>   s     z"Rule.from_dict.<locals>.<listcomp>r   c                 S   s   g | ]}t |qS r   )	RuleGroupr   )r   groupr   r   r   r      s     r   )dict_validator)clsinputr   r   r   r   r   r      s
    

zRule.from_dict)returnc           	      C   s<  t |tk	rtddidtdd dd}dtd	}||g}t||dd
ddd |d D ]}tj|d
d qZ|d D ]}tj|d
d qvt	|d dkr|d d d dkrtddid}|d D ]&}|d |k rtddi|d }qg }|d D ]:}|d |kr(tdd|d  di|
|d  qdS )Nrulezrule should be a json objectr   c                 S   s   t | dkS Nr   len)r   r   r   r   <lambda>#       z%Rule.dict_validator.<locals>.<lambda>z&At least one retriever should be addedkeytype	validatorvalidator_error_messager   r%   r&   FTrequired_items	error_keymanycontainer_nameraise_error_for_unexpected_key)r-   r   start_atz>If groups is not empty, the first group should have start_at=0z)group start_at values should be ascendingnamezDuplicate group name "")r&   dictr   ValidationErrorlistr	   r   r   r   r!   append)	r   datar   r   r+   r   r   Zlast_start_atZgroup_namesr   r   r   r      sP      
zRule.dict_validatorc                 C   s   | j D ]}|| qdS )NT)r   permission_checker)r   context_instituer   r   r   r   r9   H   s    
zRule.permission_checkerN)	__name__
__module____qualname__r   classmethodr   boolr   r9   r   r   r   r   r   
   s   
/r   c                   @   sp   e Zd Zdd Zdd Zedd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd ZdS )r   c
           
      C   s:   || _ || _|| _|| _|| _|| _|| _|| _|	| _d S r   	insert_typedurationnegative_scorepositive_scoreexact_question_dataquestion_bank_idquestion_idcounttag_filters)
r   rA   rB   rC   rD   rE   rF   rG   rH   rI   r   r   r   r   O   s    zRuleRetriever.__init__c              	   C   s   | j tjkrn| j tjkrztjj| jd}W n$   t	dd| j diY nX |j
}|svt	d| j din*||st	dd|j d| j did S )	N)idr   z
Question "z" not foundz is not available for now!z0Sorry! you do not have access to question bank "z" (question_id: ))rA   r   QUIZ_RULE_EXACT_QUESTIONQUIZ_RULE_REFERENCED_QUESTIONr   objectsgetrG   r   r5   question_bankcan_read_question_bankr2   )r   r:   questionrP   r   r   r   r9   [   s$    

z RuleRetriever.permission_checkerc                 C   sP   | | d| d| d| d| d| d| d| d| d	d
	S )NrA   rB   rC   rD   r8   rF   rG   rH   rI   r@   rO   r   r   r   r   r   r   o   s    zRuleRetriever.from_dictc                 C   s   |t kr:dtd}dtd}||g}t||ddddd nD|tkrpdtd	d
 dd}|g}t||ddddd ntddidS )Nmax_charactersr)   
attachment
input_ruleFTr8   r+   r,   r-   r.   r/   max_selectable_choicesc                 S   s   d| kS )N   r   )rY   r   r   r   r"      r#   z5RuleRetriever._input_rule_validator.<locals>.<lambda>zKmax_selectable_choices should be an integer between 1 and number of choicesr$   z	bad state)r   intr?   r	   r   r   r5   )r   r   question_typerU   rV   r+   rY   r   r   r   _input_rule_validator}   sB           z#RuleRetriever._input_rule_validatorc                 C   sF   dt dd |d dd}|g}t||dddtj d	d
d d S )NrG   c                 S   s   t | S r   r
   )rG   r   r   r   r"      r#   zMRuleRetriever._didicated_referenced_question_dict_validator.<locals>.<lambda>z is not a valid UUID.r$   r   Tretrievers(with insert_type=rK   Fr*   )strrO   r	   r   rM   )r   r8   rG   r+   r   r   r   -_didicated_referenced_question_dict_validator   s     z;RuleRetriever._didicated_referenced_question_dict_validatorc              	      s  dt d}t |gdddtj ddd d	td}d
tdd ddt d}dtdd ddt d}dt  fddd}dtd}dt d}dtdd dd}	||||g}
|g} 	dt
kr|
||	g7 }
t d |
|ddddd tj 	d	d 	d	dd d S )Nr8   r)   r   Tr_   rK   Fr*   question_textformatc                 S   s   | t kS r   )r   )fr   r   r   r"      r#   zCRuleRetriever._didicated_exact_question_validator.<locals>.<lambda>zformat should be one of , r$   r\   c                 S   s   | t kS r   r   tr   r   r   r"      r#   zquestion_type should be one of rW   c                    s   t |  d d S )Nr8   r\   )r   r]   )Zirr8   r   r   r"      r#   )r%   r&   r'   solutionchoicescorrect_choicesc                 S   s   t | dkS r   r    )itemsr   r   r   r"      r#   z correct_choices can not be emptyzretrievers.datar+   optional_itemsr,   r-   r.   r/   )r   r\   )r4   r	   r   rL   r`   joinr   r   r6   rO   r   r   r]   )r   r8   Z
data_fieldtextrc   r\   rW   Zanswer_sheetrk   rl   r+   ro   r   ri   r   #_didicated_exact_question_validator   s`    
   z1RuleRetriever._didicated_exact_question_validatorc              
   C   s   t |dkrd S ddi}t|tk	r.t||D ]T}t|tk	rLt|dtd}dtd}||g}|D ]}t||ddddd	 qlq2d S )
Nr   r   zbtag_filters should be a list of lists(ex. [[{"key":"a", "value":"b"}],[{"key":"c", "value":"d"}]])r%   r)   valueTrI   rX   )r!   r&   r6   r   r5   r`   r	   )r   rI   msg
tag_filterr%   rs   r+   itemr   r   r   _tag_filters_validator   s2     
  z$RuleRetriever._tag_filters_validatorc              	   C   s   dt dd d|d dd}dtd}d	td
d dd}dt dd ddt d}|||g}|g}t|||ddddd t|d  d S )NrF   c                 S   s   t | S r   r^   )rF   r   r   r   r"     r#   zCRuleRetriever._didicated_query_question_validator.<locals>.<lambda>r3   z" is not a valid UUID.r$   rI   r)   rH   c                 S   s   d|   kodkS   S )NrZ      r   )cr   r   r   r"   )  r#   z4count should be integer and should be between 1, 200type_filterc                 S   s   | t kS r   rf   )rz   r   r   r   r"   0  r#   z1In each retrievers, type_filter should be one of re   r   Tz+retrievers(with insert_type=QUERY_QUESTION)Frn   )	r`   rO   r6   r[   rp   r   r	   r   rw   )r   r8   rF   rI   rH   rz   r+   ro   r   r   r   #_didicated_query_question_validator  s6    
  z1RuleRetriever._didicated_query_question_validatorc                 C   s   t |tk	rtddidtdd ddtj d}d	td
}dtd
}dtdd dd}t	|||||gd|ddd |d tj
krt| n2|d tjkrt| n|d tjkrt| dS )Nr   z.each "retriever" should be a valid json objectrA   c                 S   s
   | t jkS r   )r   QUIZ_RULE_INSERT_TYPESrg   r   r   r   r"   F  r#   z.RuleRetriever.dict_validator.<locals>.<lambda>z0in each retriever, insert_type should be one of re   r$   rD   r)   rC   rB   c                 S   s   | dkS )Ng      @r   )rB   r   r   r   r"   W  r#   zGin each retriever, duration should be a float number and greater than 5r   Fr*   T)r&   r4   r   r5   r`   rp   r   r|   floatr	   rM   r   ra   QUIZ_RULE_QUERY_QUESTIONr{   rL   rr   )r   r8   r-   rA   rD   rC   rB   r   r   r   r   <  sF       
zRuleRetriever.dict_validatorN)r;   r<   r=   r   r9   r>   r   r]   ra   rr   rw   r{   r   r   r   r   r   r   N   s    

(

B

&r   c                   @   s,   e Zd Zdd Zedd Zedd ZdS )r   c                 C   s   || _ || _d S r   r2   r0   )r   r2   r0   r   r   r   r   j  s    zRuleGroup.__init__c                 C   s   | | d| ddS )Nr2   r0   r   rS   rT   r   r   r   r   n  s    zRuleGroup.from_dictc                 C   sT   t |tk	rtddidtdd dd}dtd	d
}t|||gd|ddd dS )Nr   z*each "group" should be a valid json objectr2   c                 S   s   t | dkot | dk S )N   i  r    )r2   r   r   r   r"   ~  r#   z*RuleGroup.dict_validator.<locals>.<lambda>z5In each group, name should be at most 1000 charactersr$   r0   z-in each group, start_at should be an integer.)r%   r&   r(   r   Fr*   T)r&   r4   r   r5   r`   r[   r	   )r   r8   r-   r2   r0   r   r   r   r   u  s(    
   zRuleGroup.dict_validatorN)r;   r<   r=   r   r>   r   r   r   r   r   r   r   i  s
   
r   N)rest_frameworkr   question.modelsr   r   r   r   r   Zquiz.blueprintr   utils.validatorsr	   r
   r   r   r   r   r   r   r   <module>   s   D  