o
    ahnH                     @   sx  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 d dlmZ d dlmZm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mZ d dlZG dd de
Zeedgdd ZeeddG dd de
Zeeedgdd Z G dd de
Z!eedgdd Z"eeddG dd de
Z#eeedgdd  Z$G d!d" d"e
Z%dS )#    )renderget_object_or_404)JsonResponse)csrf_exempt)require_http_methods)TemplateView)staff_member_required)method_decorator)CountQ)timezone   )ICICTRegistrantAttendanceDayDailyAttendanceAttendanceConfigurationWorkshopFeedbackFeedbackConfiguration)Avgr
   Nc                       $   e Zd ZdZdZ fddZ  ZS )AttendanceCheckInViewz+View for users to check in their attendancezicict_attendance/check_in.htmlc                    s0   t  jdi |}t }||d< |j|d< |S )Nconfigcurrent_day )superget_context_datar   
get_configr   )selfkwargscontextr   	__class__r   5/var/www/html/smartRegister/icict_attendance/views.pyr      s
   
z&AttendanceCheckInView.get_context_data__name__
__module____qualname____doc__template_namer   __classcell__r   r   r    r"   r          r   POSTc                 C   s  zt | j}|dd }|stdddW S t }|js(tdddW S |j	s3tdddW S d}|
 rOztjjt|d	}W n
 tjyN   Y nw |sez	tjj|d
}W n
 tjyd   Y nw |sotdddW S tjj||j	d }|rtddd|j	j |j|j|j| |jdddW S tjj||j	| jd| jddd}tddd|j	j d|j|j|j| |j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 )z#AJAX endpoint to confirm attendance
identifier Fz%Please enter your ID or email addresssuccessmessagez)Attendance checking is currently disabledz)No attendance day is currently configuredN)registration_idemail__iexactz>Registration not found. Please check your ID or email address.)
registrantattendance_dayTz*You have already confirmed attendance for z%Y-%m-%d %H:%M:%S)nameemailr1   payment_statusattended_at)r/   already_attendedr0   r4   REMOTE_ADDRHTTP_USER_AGENT)r4   r5   
ip_address
user_agentzAttendance confirmed for !Invalid request formatz$An error occurred. Please try again.)jsonloadsbodygetstripr   r   r   attendance_enabledr   isdigitr   objectsintDoesNotExistr   filterfirsttitler6   r7   r1   get_payment_status_displaychecked_in_atstrftimecreateMETAJSONDecodeError	Exception)requestdatar,   r   r4   existing_attendance
attendanceer   r   r"   confirm_attendance   s   








rZ   dispatch)r6   c                       r   )AttendanceAdminViewzGAdmin view for managing attendance configuration and viewing statisticsz%icict_attendance/admin_dashboard.htmlc              
      s   t  jdi |}t }tj }tj }tjj	dd }tjj	dd }g }|D ]!}	t
jj	|	d }
||	|
t|dkrG|
| d nddd q-t
jd	d
dd d }||||||||d |S )Nawaiting_payment)r8   	completedr5   r   d   r   )dayattendance_count
percentager4   r5   z-checked_in_at   )r   attendance_daystotal_registrantsr]   completed_paymentdaily_statsrecent_attendancer   )r   r   r   r   r   rH   allr   countrK   r   appendroundselect_relatedorder_byupdate)r   r   r   r   re   rf   r]   rg   rh   ra   rb   ri   r    r   r"   r      s2   



z$AttendanceAdminView.get_context_datar#   r   r   r    r"   r\          r\   c              
   C   s   z?t | j}t }d|v r"|d rtt|d d}||_nd|_d|v r+|d |_d|v r4|d |_	|
  tdddW S  tyZ } ztd	t|dW  Y d}~S d}~ww )
z0AJAX endpoint to update attendance configurationcurrent_day_ididNrF   welcome_messageTz"Configuration updated successfullyr.   F)rA   rB   rC   r   r   r   r   r   rF   ru   saver   rT   strrU   rV   r   r   rY   r   r   r"   update_attendance_config   s0   


ry   c                       r   )FeedbackFormViewz(View for participants to submit feedbackz#icict_attendance/feedback_form.htmlc                    sD   t  jdi |}t }||d< |j|d< tj d|d< |S )Nfeedback_configr   
day_numberre   r   )	r   r   r   r   current_feedback_dayr   rH   rj   ro   )r   r   r   r{   r    r   r"   r      s   
z!FeedbackFormView.get_context_datar#   r   r   r    r"   rz      r*   rz   c                 C   s$  zt | j}t }|jstdddW S |dd }|dd}t	|dd}t	|d	d}t	|d
d}t	|dd}|dd }	|dd }
|s`|s`tdddW S t
||||gsptdddW S d}d}|s|rztjj|d}|j}W n tjy   |dd  }Y nw |r|rz	tjj|d}W n tjy   Y nw dt   d}d}tjj|||d||||||	pd|
pddd| jd|d}tdd|jt|j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 )z AJAX endpoint to submit feedbackFz)Feedback collection is currently disabledr.   participant_emailr-   is_anonymousoverall_ratingr   content_qualitypresenter_effectivenessvenue_facilitieswhat_liked_mostsuggestions_improvementz4Email address is required for non-anonymous feedbackz)Please provide ratings for all categoriesNzAnonymous Participantr2   @
anonymous_z@feedback.localgeneralr;   )r4   participant_namer~   r5   session_typer   r   r   r   r   r   additional_topicsgeneral_commentsr=   r   Tz=Thank you for your feedback! Your response has been recorded.r   )r/   r0   feedback_idaverage_ratingr@   z>An error occurred while submitting feedback. Please try again.)rA   rB   rC   r   r   feedback_enabledr   rD   rE   rI   rj   r   rH   r6   rJ   splitrM   r   now	timestampr   rQ   rR   rt   rm   r   rS   rT   )rU   rV   r{   r~   r   r   r   r   r   r   r   r4   r   r   feedbackrY   r   r   r"   submit_feedback   s   






r   c                       r   )FeedbackDashboardViewz8Admin view for viewing feedback statistics and responsesz(icict_attendance/feedback_dashboard.htmlc                    sP  t  jdi |}| jjd}| jjd}tj }|r$|j|d}|r,|j|d}|	 }|dkrF|j
tdtdtdtd	d
}nddddd
}g }tj dD ]}	tjj|	d}
||	|
	 |
j
tddd pqdd qW|dd d }|djtddd}||||||tj dtj||t d
 |S )Nra   session)attendance_day_id)r   r   r   r   r   r   overallcontent	presentervenuer|   r_   )avgr   )ra   feedback_count
avg_ratingz-submitted_atrd   )rk   )
total_feedbackavg_ratingsrh   recent_feedbackrating_distributionre   session_typesselected_dayselected_sessionr{   r   )r   r   rU   GETrD   r   rH   rj   rK   rk   	aggregater   r   ro   rl   valuesannotater
   rp   SESSION_TYPE_CHOICESr   r   )r   r   r   
day_filtersession_filter	feedbacksr   r   rh   ra   day_feedbacksr   r   r    r   r"   r   M  sX   


z&FeedbackDashboardView.get_context_datar#   r   r   r    r"   r   H  rq   r   c              
   C   s   zQt | j}t }d|v r"|d rtt|d d}||_nd|_d|v r+|d |_d|v r4|d |_	d|v r=|d |_
d|v rF|d |_|  tdd	d
W S  tyl } ztdt|d
W  Y d}~S d}~ww )z.AJAX endpoint to update feedback configurationcurrent_feedback_day_idrs   Nr   feedback_messageallow_anonymous_feedbackrequire_attendanceTz+Feedback configuration updated successfullyr.   F)rA   rB   rC   r   r   r   r   r}   r   r   r   r   rv   r   rT   rw   rx   r   r   r"   update_feedback_config  s8   




r   c                       r   )PublicFeedbackResultsViewz8Public view for displaying feedback results to all usersz-icict_attendance/public_feedback_results.htmlc                    s  t  jdi |}tj }| }|dkrp|jtdtdtdtdd}g }tddD ]"}|j	|d	 }|dkrB|| d
 nd}	|
||t|	dd q.d|d ddd|d ddd|d ddd|d ddg}
nddddd}g }g }
|||||
d |S )Nr   r   r   r   r   r   r      )r   r`   )ratingrk   rc   zOverall Experiencer   zfas fa-star)r6   r   iconzContent Qualityr   zfas fa-bookzPresenter Effectivenessr   zfas fa-user-tiezVenue & Facilitiesr   zfas fa-building)r   r   r   
categoriesr   )r   r   r   rH   rj   rk   r   r   rangerK   rl   rm   rp   )r   r   r   r   r   r   r   irk   rc   r   r    r   r"   r     sD   

z*PublicFeedbackResultsView.get_context_datar#   r   r   r    r"   r     r*   r   )&django.shortcutsr   r   django.httpr   django.views.decorators.csrfr   django.views.decorators.httpr   django.views.genericr   %django.contrib.admin.views.decoratorsr   django.utils.decoratorsr	   django.db.modelsr
   r   django.utilsr   modelsr   r   r   r   r   r   r   rA   r   rZ   r\   ry   rz   r   r   r   r   r   r   r   r"   <module>   sB     
f*!
gB'