U
    ldbT                     @   sZ  d dl mZ d dlmZ d dlmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ 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mZ d dlm Z m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) e	e)Z*e	eZ+e	eZ,e	eZ-ee,ddddee*ej.ddee+ej/ge ddddG dd deZ0ee,ddddee*ej1ddee+ej/ge ddddG dd deZ2ee,ddddee*ej3ddee+ej/geddddG dd deZ4ee,ddddee*ej5ddee+ej/geddddG dd  d eZ6ee,ddddee*ej7ddee+ej8ej9gedd!ddee-e ddddG d"d# d#eZ:ee,ddddee*ej;ddee+ej8ej9gedd!ddee-eddddG d$d% d%eZ<ee,ddddee*ej=ddee+ej/ge ddddG d&d' d'eZ>d(S ))    Q)reduce)and_or_)method_decorator#decorator_from_middleware_with_argsstatus)APIView)AuthorizatorMiddleware)defined_roles)CollaborationAccessMiddlewareSubscriptionAccessMiddleware)	Institute)serializers)QuestionQUESTION_TYPE_MULTIPLE_CHOICEget_query_from_tag_filters_list)QuestionBankmodify_question_bank_filters)check_institute_limitations)
MyResponse)sort_by_translator)SerializerValidationMiddlewareT)accept_user_tokenpost)nameidquestion_bank_idc                   @   s   e Zd Zdd ZdS )CreateQuestionc                 C   sD  |j d}|j d}|j d}|j d}|j d}|j d}|j}|j d}	|j d}
|j d	}|j d
}tt|j|dst|dddtjdS tj	j
|||||||
|||	|tk|d}tj	j|jd}t|j|ddd|_t|j|dddd|_| jd7  _|  t|j}t|ddd|idtjdS )Nkeywordsquestion_textformatquestion_typeinput_rulestagssolutionchoicescorrect_choices	meta_dataquestion_bankerrorUpgrade Requiredr
   messager	   )r,   r!   r"   r#   r$   r%   r(   r)   r&   r'   auto_correctabler*   )pkT   filtersr&   add_missed_values
stock_stepr5   r&   r6   add_missed_keysr7   ok
Successfulquestionr
   r0   data)middleware_serializer_datagetmiddleware_model_recordr   r   middleware_instituter   r
   HTTP_426_UPGRADE_REQUIREDobjectscreater   r2   r   r5   r&   questions_countsavequestion_serializersQuestionModelSerializerr>   HTTP_200_OK)selfrequestr!   r"   r#   r$   r%   r&   r,   r'   r(   r)   r*   r<   question_data rN   */var/www/wikiazma_server/question/views.pyr   &   sv           zCreateQuestion.postN__name__
__module____qualname__r   rN   rN   rN   rO   r       s   r    c                   @   s   e Zd Zdd ZdS )BulkCreateQuestionc                    s   |j d}|j tt|j ds8t|dddtjdS  fdd|D }tj	
| |D ]2}t j|jd	d
d _t j|jd	d	d
d _qZ  jt|7  _   t|dddtjdS )N	questionsr+   r-   r.   r/   r	   c                    sl   g | ]d}t  d |kr|d  nd|d |d |d |d |d |d |d |d	|d
|d tkdqS )r!   Nr"   r#   r$   r%   r(   r)   r&   r'   r*   )r,   r!   r"   r#   r$   r%   r(   r)   r&   r'   r*   r1   )r   r@   r   ).0r<   r+   rN   rO   
<listcomp>z   s   
z+BulkCreateQuestion.post.<locals>.<listcomp>Tr3   r4   r8   r:   r;   )r?   r@   rA   r   r   rB   r   r
   rC   rD   bulk_creater   r5   r&   rF   lenrG   rJ   )rK   rL   rU   r<   rN   r+   rO   r   n   s6    
       
zBulkCreateQuestion.postNrP   rN   rN   rN   rO   rT   e   s   	rT   question_idc                   @   s   e Zd Zdd ZdS )EditQuestionc                 C   sv  |j d}|j d}|j d}|j d}|j d}|j d}|j d}|j d}	|j d	}
|j d
}|j}|jrt|dddtjdS |j}|f|_||_	||_
||_||_|	|_|
|_||_||_|tk|_||_|  |j}t|j|ddd|_t|j|dddd|_t|j|ddd|_t|j|dddd|_|  t|dddt|jidtjdS )Nr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r-   z&An archived question cannot be edited.r/   r	   Fr4   Tr8   r3   r:   r;   r<   r=   )r?   r@   rA   archivedr   r
   HTTP_400_BAD_REQUESTr&   r!   r"   r#   r$   r%   r(   r)   r'   r   r1   r*   rG   r,   r   r5   rH   rI   r>   rJ   )rK   rL   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   Zquestion_recordZprevious_tagsr,   rN   rN   rO   r      s    
               zEditQuestion.postNrP   rN   rN   rN   rO   r[      s   r[   c                   @   s   e Zd Zdd ZdS )ArchiveQuestionc                 C   s~   |j }|jshd|_|  |j}t|j|jddd|_t|j|jdddd|_td|jd |_|  t	|dd	d
t
jdS )NTFr\   r4   r8   r   r3   r:   r;   r/   r	   )rA   r]   rG   r,   r   r5   r&   maxrF   r   r
   rJ   )rK   rL   r<   r,   rN   rN   rO   r      s0            zArchiveQuestion.postNrP   rN   rN   rN   rO   r_      s   r_   context_institute_idc                   @   s   e Zd Zdd ZdS )ListQuestionsc                 C   s  |j d}|j d}|j d}|j d}|j d}|j d}|j d}|j d}	t|	}
|j d	}|j}tjj|d
}d}|rd}ttdd |D }||}|rd}t	|}||}|dkrd}|jdd}n|dkrd}|jdd}|d k	rd}|j|d}|r.d}|j|d}|dkrJd}|jdd}n|dkrdd}|jdd}|rt|
 }n|j}||
d|||  }tj|ddj}t|dd||ddtjdS )Nskiptakeqarchived_filtertag_filtersold_tag_filtersr$   sort_byauto_correctable_filterr+   FTc                 s   s0   | ](}|rt td d dd |D D V  qdS )c                 s   s   | ]}t |d V  qdS )tags__containsNr   )rV   itemrN   rN   rO   	<genexpr>  s   z/ListQuestions.post.<locals>.<genexpr>.<genexpr>c                 S   s   g | ]}|d  |d iqS )keyvaluerN   )rV   childrN   rN   rO   rW      s     z0ListQuestions.post.<locals>.<genexpr>.<listcomp>N)r   r   )rV   grouprN   rN   rO   rn     s
    
z%ListQuestions.post.<locals>.<genexpr>exclude)r]   only)Zkeywords__icontains)r$   )r1   r,   )manyr:   r;   )rU   total_countr=   r	   )r?   r@   r   middleware_question_bankr   rD   filterr   r   r   countrF   order_byselect_relatedrH   rI   r>   r   r
   rJ   )rK   rL   rc   rd   re   rf   rg   rh   r$   ri   sort_by_attrrj   r,   rU   Zhas_complex_queryqueryrv   Zquestions_datarN   rN   rO   r   	  s~    







  zListQuestions.postNrP   rN   rN   rN   rO   rb      s   rb   c                   @   s   e Zd Zdd ZdS )GetQuestionc                 C   s.   |j }t|j}t|ddd|idtjdS )Nr:   r;   r<   r=   r	   )middleware_questionrH   rI   r>   r   r
   rJ   )rK   rL   r<   rM   rN   rN   rO   r   W  s     zGetQuestion.postNrP   rN   rN   rN   rO   r~   J  s   r~   c                   @   s   e Zd Zdd ZdS )EditQuestionBulkc                 C   s  |j }|jd}|jd}|jd}|jd}|jd}|jd}tjj|d}	|rv|rv|	j||id}	n$|r|	j|d	}	n|r|	j|gd
}	|	 }
|dkr4|r4|r4|r|	D ]}||j|< qtj|	dg t	|dddt
jdS d|p d d|pd d|
 d}t	|d|dt
jdS nf|dkr|r|r|r|	D ](}|j| }|j|= |pr||j|< qTtj|	dg t	|dddt
jdS d|pd d|pd d|
 d|pd d|pd d}t	|d|dt
jdS n|dkr|r|rH|	D ]}|j|= qtj|	dg t	|dddt
jdS d|pRd d|p^d d|
 d}t	|d|dt
jdS nt	|dddt
jdS d S )Ncommitactioncurrent_keycurrent_valueincoming_keyincoming_valuer+   rk   )Ztags__has_key)Ztags__values__containsaddr&   r:   ZSuccessr/   r	   u   برچسب *u    با مقدار u    به u$    سوال اضافه خواهد شدupdateu    از روی u    سوال حذف و برچب u8    به سوالات مذکور اضافه خواهد شدremoveu     سوال حذف خواهد شدr-   zBad Request)rA   r?   r@   r   rD   rx   ry   r&   bulk_updater   r
   rJ   r^   )rK   rL   Zquestion_bank_recordr   r   r   r   r   r   r}   Zquery_countr<   msgrN   rN   rO   r   k  s    $

<$zEditQuestionBulk.postNrP   rN   rN   rN   rO   r   d  s   r   N)?django.db.modelsr   	functoolsr   operatorr   r   django.utils.decoratorsr   r   rest_frameworkr
   rest_framework.viewsr   authenticate.middlewarer   collaboratorsr   drcollaborators.middlewarer   r   institute.modelsr   r<   r   rH   question.modelsr   r   r   question_bank.modelsr   r   utils.limitationsr   utils.myresponser   utils.utilsr   wikiazma.middlewarer    serializer_validation_middleware"check_access_permission_middlewareZauthorizatorZAcheck_context_institute_accessibility_on_question_bank_middlewareZ CreateQuestionApiInputSerializer__PERMISSION_WRITE_QUESTION__r    Z$CreateQuestionBulkApiInputSerializerrT   ZEditQuestionApiInputSerializerr[   Z DeleteQuestionApiInputSerializerr_   ZQuestionsListApiInputSerializer __PERMISSION_READ_QUESTIONBANK____PERMISSION_READ_QUESTION__rb   ZQuestionsGetApiInputSerializerr~   Z"EditQuestionBulkApiInputSerializerr   rN   rN   rN   rO   <module>   s      A
   *
C

   C
   
