o
    [hA                     @   sd  d dl mZmZmZ d dlmZ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 d dlmZ d d	lmZ d d
lmZmZmZ d dlmZ d dlm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) G dd deZ*edd Z+G dd deZ,G dd deZ-G dd deZ.G dd deZ/G dd  d eZ0d!d" Z1dS )#    )renderredirectget_object_or_404)
CreateViewListViewTemplateView)messages)reverse_lazy)JsonResponse)login_required)LoginRequiredMixin)method_decorator)csrf_exempt)QCountAvg)timezone)dateN   )FeedbackFeedbackConfigurationFeedbackCategory)FeedbackForm)EventRegistration)RegisteredUserc                       sH   e Zd ZeZdZg dZedZ fddZ	 fddZ
dd	 Z  ZS )
FeedbackFormViewzfeedback/feedback_form.html)categoryratingcommenttagsnameemailregistration_codezfeedback:thank_youc                    s   t  jdi |}t }||d< |r\| }||d< |jtjk|d< | jj	d|d< t
|dkr9|d |d< n#|d r\ztjj	|d d	}||rP||d< W n
 tjy[   Y nw tjjd
d|d< |S )Nconfigavailable_eventsis_multi_eventeventselected_event_idr   r   default_eventidT	is_active
categories )superget_context_datar   get_active_configget_available_eventsevent_selection_modeMULTI_EVENTrequestGETgetlenr   objectsis_event_activeDoesNotExistr   filter)selfkwargscontextr$   r%   selected_event	__class__r/   -/var/www/html/smartRegister/feedback/views.pyr1      s*   
z!FeedbackFormView.get_context_datac                    s  | j jd}t }|rFz"tjj|d}|r!||r!||j_	nt
| j d | |W S W n1 tjyE   t
| j d | | Y S w |ra| }|rU|d |j_	nt
| j d | |S | j jddk}||j_|ryd |j_d |j_n| j jd	d
 |j_| j jdd
 |j_| j jdd
 |j_|  |j_|jj	r|jj	j| j jd< |jj	j| j jd< t
| j d t |S )Nevent_idr*   z*Selected event is not active for feedback.zSelected event does not exist.r   z(No active events available for feedback.	anonymousonr!    r"   r#   feedback_event_namefeedback_event_idzThank you for your feedback!)r6   POSTr8   r   r2   r   r:   r;   instancer'   r   errorform_invalidr<   r3   is_anonymousr!   r"   stripr#   get_client_ip
ip_addresssessionr+   successr0   
form_valid)r>   formrE   r$   r'   r%   rO   rB   r/   rD   rU   9   sD   


zFeedbackFormView.form_validc                 C   s6   | j jd}|r|dd }|S | j jd}|S )NHTTP_X_FORWARDED_FOR,r   REMOTE_ADDR)r6   METAr8   split)r>   x_forwarded_foripr/   r/   rD   rQ   m   s   zFeedbackFormView.get_client_ip)__name__
__module____qualname__r   modeltemplate_namefieldsr	   success_urlr1   rU   rQ   __classcell__r/   r/   rB   rD   r      s    4r   c              
   C   sD  | j dkrzlt| j}|dd }|stdddW S d}ztjj|d}|j	|j
|jjd	d
}W n
 tjy>   Y nw |s_ztjj|d}|j	|j
|jdd
}W n
 tjy^   Y nw |rjtd|ddW S tdddW S  tjy   tddd Y S  ty } ztdddW  Y d}~S d}~ww tdddS )zAAJAX endpoint to verify registration code and return user detailsrK   r#   rH   FzRegistration code is requiredrT   messageNr#   registration)r!   r"   
event_namesource
attendanceTz'Registration code verified successfully)rT   	user_datarg   z8Registration code not found. Please check and try again.zInvalid request formatz%An error occurred during verificationzInvalid request method)methodjsonloadsbodyr8   rP   r
   r   r:   	full_namer"   r'   r!   r<   r   rj   JSONDecodeError	Exception)r6   datar#   rm   ri   registered_userer/   r/   rD   verify_registration_codeu   sZ   




rx   c                   @   s   e Zd Zdd ZdS )VerifyRegistrationCodec                 O   s   |j d}|rGztjj|d}td|j|j|jdW S  tjy&   Y nw zt	jj|d}td|j|j|j
jdW S  t	jyF   Y nw tddiS )Nr#   rh   T)validr!   r"   r'   rz   F)rK   r8   r   r:   r
   rr   r"   rj   r<   r   r'   r!   )r>   r6   argsr?   r#   userri   r/   r/   rD   post   s2   

zVerifyRegistrationCode.postN)r^   r_   r`   r}   r/   r/   r/   rD   ry      s    ry   c                           e Zd ZdZ fddZ  ZS )ThankYouViewzfeedback/thank_you.htmlc                    s6   t  jdi |}t }|r|j|d< |j|d< |S )Nthank_you_messageactive_eventr/   )r0   r1   r   r2   r   r   )r>   r?   r@   r$   rB   r/   rD   r1      s   

zThankYouView.get_context_datar^   r_   r`   rb   r1   re   r/   r/   rB   rD   r          r   c                       r~   )FeedbackDashboardViewzfeedback/dashboard.htmlc                    s  t  jd$i |}| jjd}| jjdd dk}tjjdd}|rCzt	jj|d}|j|d}||d	< W n t	j
yB   Y nw |rP|jdd
}d|d< n	 | |d< |tdd pad|d< |djtddd}dd |D |d< ddlm} g }	|jjddD ]}
|j|
d }|	|
j||
jd q|	|d< |dd d |d< t	jjddd |d!< tjjddd" |d#< |S )%Nr'   legacyfalsetrueTis_publishedr*   r'   rA   )event__isnullshowing_legacytotal_feedbackr   rating__avgr   average_rating)countc                 S   s   i | ]	}|d  |d qS )r   r   r/   ).0itemr/   r/   rD   
<dictcomp>   s    z:FeedbackDashboardView.get_context_data.<locals>.<dictcomp>rating_distributionr   )r   r,   )r   )r!   r   r+   category_breakdown-created_at
   recent_feedbackF)is_archived-start_dater%   )r   r   has_legacy_feedbackr/   )r0   r1   r6   r7   r8   lowerr   r:   r=   r   r<   r   	aggregater   valuesannotater   order_bymodelsr   appendr!   r+   exists)r>   r?   r@   rE   show_legacy	feedbacksr'   r   r   r.   r   r   rB   r/   rD   r1      sD   

z&FeedbackDashboardView.get_context_datar   r/   r/   rB   rD   r      r   r   c                       s4   e Zd ZeZdZdZdZdd Z fddZ	  Z
S )FeedbackListViewzfeedback/feedback_list.htmlr      c           
      C   s   t jjddddd}| jjd}|r/ztjj|d}|j|d}W n tjy.   Y nw t	
 }|r<|j|jd}| jjd}|rK|j|d}| jjd	}|rZ|j|d
}| jjd}|rk|j|dkd}| jjd}|r||j|dkd}| jjd}	|	r|j|	d}|dS )NTr   r   rv   r'   r*   r   )category__namer   )r   rO   r   )rO   r   search)comment__icontainsr   )r   r:   r=   select_relatedr6   r7   r8   r   r<   r   r2   r   r   )
r>   querysetrE   r'   r$   r   r   rO   r   r   r/   r/   rD   get_queryset  s8   
zFeedbackListView.get_querysetc              	      s   t  jdi |}tjjdd|d< tjjdd d|d< | jj	
dd	| jj	
d
d	| jj	
dd	| jj	
dd	| jj	
dd	| jj	
dd	d|d< |S )NTr,   r.   F)feedbacks__isnullr   r%   r'   rH   r   r   rO   r   r   )r'   r   r   rO   r   r   current_filtersr/   )r0   r1   r   r:   r=   r   distinctr   r6   r7   r8   )r>   r?   r@   rB   r/   rD   r1   C  s   
	z!FeedbackListView.get_context_data)r^   r_   r`   r   ra   rb   context_object_namepaginate_byr   r1   re   r/   r/   rB   rD   r     s    ,r   c                       s$   e Zd ZdZdZ fddZ  ZS )EventArchiveViewzCView to manage event archives and switch active feedback collectionzfeedback/event_archive.htmlc                    sb   t  jdi |}tjjtddjddd}||d< t	 |d< tjjdd	d|d
< |S )Nr   )feedback_countr   )feedback_count__gtr   events_with_feedbackactive_configTr,   r%   r/   )
r0   r1   r   r:   r   r   r=   r   r   r2   )r>   r?   r@   r   rB   r/   rD   r1   X  s   z!EventArchiveView.get_context_data)r^   r_   r`   __doc__rb   r1   re   r/   r/   rB   rD   r   T  s    r   c                 C   sZ  | j dkr| jjr| jd}| jdd}| jdd}zwtjj|d}t }|dkrktj	|_
|d	krC|j| d
|j d}n;|dkrU|j| d|j d}n)|j  |j| ||_d|j d}ntj|_
||_|j  d|j d}d|_|  td||j|j
|j dW S  tjy   tddd Y S w tdddS )z<AJAX view to switch the active event for feedback collectionrK   rE   modesingleactionsetr*   multiaddzAdded z to active eventsremovezRemoved z from active eventszSet z as active event (multi-mode)z Feedback collection switched to z (single mode)T)rT   rg   rj   r   active_events_countFzEvent not foundrf   zUnauthorized or invalid request)rn   r|   is_staffrK   r8   r   r:   r   r2   r5   r4   active_eventsr   r!   r   clearr   SINGLE_EVENTfeedback_enabledsaver
   r   r<   )r6   rE   r   r   r'   r$   rg   r/   r/   rD   switch_active_eventf  sT   


r   )2django.shortcutsr   r   r   django.views.genericr   r   r   django.contribr   django.urlsr	   django.httpr
   django.contrib.auth.decoratorsr   django.contrib.auth.mixinsr   django.utils.decoratorsr   django.views.decorators.csrfr   django.db.modelsr   r   r   django.utilsr   datetimer   ro   r   r   r   r   formsr   registration.modelsr   r   attendance.modelsr   r   rx   ry   r   r   r   r   r   r/   r/   r/   rD   <module>   s4    a
89C