o
    fsiW.                     @   s<  d dl 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mZmZ ddlmZmZmZmZ dd	lmZmZmZmZmZ G d
d dejZG dd dejZG dd dej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Z$G dd deZ%G dd dej&Z'dS )    )AvgCount)viewsetsstatusgenerics)action)Response)APIView)IsAuthenticatedIsAdminUserAllowAny   )FeedbackEventFeedbackCategoryFeedbackFeedbackConfiguration)FeedbackEventSerializerFeedbackCategorySerializerFeedbackSerializerPublicFeedbackSerializerFeedbackConfigSerializerc                   @   sz   e Zd ZeZegZdd Zdd Ze	ddge
gddd	d
Ze	ddge
gddddZe	ddge
gddddZdS )FeedbackEventViewSetc                 C   sb   t j }| jjd}| jjd}|d ur!|j| dkd}|d ur/|j| dkd}|S )N	is_activeis_archivedtruer   r   )r   objectsallrequestquery_paramsgetfilterlower)selfqsr   r    r&   :/var/www/html/smartRegister/backend/apps/feedback/views.pyget_queryset   s   
z!FeedbackEventViewSet.get_querysetc                 C      | j dv r	t gS t gS N)listretriever   r
   r   r$   r&   r&   r'   get_permissions      
z$FeedbackEventViewSet.get_permissionsTpost)detailmethodspermission_classesNc                 C   sD   |   }|  t }|j|krd |_|  tdt|jdS )Narchivedr   event)	
get_objectarchiver   
get_configactive_eventsaver   r   datar$   r   pkr7   configr&   r&   r'   r9   "   s   
zFeedbackEventViewSet.archivec                 C   s$   |   }|  tdt|jdS )N
unarchivedr6   )r8   	unarchiver   r   r=   )r$   r   r?   r7   r&   r&   r'   rB   -   s   zFeedbackEventViewSet.unarchivec                 C   s8   |   }t }||_d|_|  tdt|jdS )NTzactive event setr6   )	r8   r   r:   r;   feedback_enabledr<   r   r   r=   r>   r&   r&   r'   
set_active3   s   zFeedbackEventViewSet.set_activeN)__name__
__module____qualname__r   serializer_classr
   r4   r(   r/   r   r   r9   rB   rD   r&   r&   r&   r'   r      s    

r   c                   @   s(   e Zd Zej ZeZe	gZ
dd ZdS )FeedbackCategoryViewSetc                 C   r)   r*   )r   r   r   r.   r&   r&   r'   r/   B   r0   z'FeedbackCategoryViewSet.get_permissionsN)rF   rG   rH   r   r   r   querysetr   rI   r
   r4   r/   r&   r&   r&   r'   rJ   =   s
    
rJ   c                   @   s&   e Zd ZeZegZdd Zdd ZdS )FeedbackViewSetc                 C   s   t jdd }| jjd}| jjd}| jjd}| jjd}| jjd}|r4|j|d}|r<|j|d	}|rD|j|d
}|rL|j|d}|d urZ|j| dkd}|S )Nfeedback_eventcategoryevent_idcategory_idratingsearchis_published)feedback_event_id)rP   )rQ   )comment__icontainsr   rS   )	r   r   select_relatedr   r   r    r!   r"   r#   )r$   r%   rO   rP   rQ   rR   rS   r&   r&   r'   r(   L   s"   zFeedbackViewSet.get_querysetc                 C   r)   r*   r-   r.   r&   r&   r'   r/   `   r0   zFeedbackViewSet.get_permissionsN)	rF   rG   rH   r   rI   r
   r4   r(   r/   r&   r&   r&   r'   rL   H   s
    rL   c                   @      e Zd ZdZegZdd ZdS )PublicEventStatsViewz@Public endpoint: live stats for a published event (no comments).c                 C   s  zt jj|ddd}W n t jy   tdditjd Y S w |js+tdditjdS t	jj
|dd}| }|jtd	d
d pBd}dd |d	jtd	dd	D }g }tjj
ddD ]}	|j
|	d }
||	j|	j|
d q_td|j|j|t|d|t|dd ddS )NTFslugr   r   errorEvent not found.r   	published)rM   rS   rQ   avgra   r   c                 S      i | ]	}|d  |d qS rQ   countr&   .0itemr&   r&   r'   
<dictcomp>w       z,PublicEventStatsView.get.<locals>.<dictcomp>rd   r   rN   idnamerd   r   c                 S   s
   | d  S )Nrd   r&   )xr&   r&   r'   <lambda>   s   
 z*PublicEventStatsView.get.<locals>.<lambda>)key)r_   
event_nameevent_descriptiontotal_feedbackaverage_ratingrating_distributioncategory_breakdown)r   r   r!   DoesNotExistr   r   HTTP_404_NOT_FOUNDis_stats_publishedHTTP_403_FORBIDDENr   r"   rd   	aggregater   valuesannotater   order_byr   appendrm   rn   descriptionroundsorted)r$   r   r[   r7   	feedbackstotal
avg_ratingrating_distrw   catrd   r&   r&   r'   r!   j   s4   zPublicEventStatsView.getNrF   rG   rH   __doc__r   r4   r!   r&   r&   r&   r'   rY   f       rY   c                   @   rX   )PublicEventDetailViewz=Public endpoint: get event details by slug for feedback form.c                 C   sJ   zt jj|ddd}tt|jW S  t jy$   tdditjd Y S w )NTFrZ   r\   Event not found or inactive.r^   )	r   r   r!   r   r   r=   rx   r   ry   )r$   r   r[   r7   r&   r&   r'   r!      s   zPublicEventDetailView.getNr   r&   r&   r&   r'   r      r   r   c                   @   rX   )PublicEventCategoriesViewz4Public endpoint: get active categories for an event.c                 C   s\   zt jj|ddd}tjjdd}tt|ddjW S  t jy-   tddit	j
d Y S w )	NTFrZ   r   manyr\   r]   r^   )r   r   r!   r   r"   r   r   r=   rx   r   ry   )r$   r   r[   r7   
categoriesr&   r&   r'   r!      s   zPublicEventCategoriesView.getNr   r&   r&   r&   r'   r      r   r   c                   @   s&   e Zd ZdZegZdd Zdd ZdS )PublicFeedbackSubmitViewz>Public endpoint: submit feedback for a specific event by slug.c                 C   s   |j d}|stdditjdS ztjj|ddd}W n tjy/   tdditjd Y S w |j 	 }|j
|d	< t|d
}| rY| |}|j||d}tdddtjdS t|jtjdS )N
event_slugr\   zevent_slug is required.r^   TFrZ   r   rM   r=   )
ip_addressrM   zThank you for your feedback!successmessage)r=   r!   r   r   HTTP_400_BAD_REQUESTr   r   rx   ry   copyrm   r   is_valid_get_client_ipr<   HTTP_201_CREATEDerrors)r$   r   r   r7   r=   
serializeripfeedbackr&   r&   r'   r1      s*   



zPublicFeedbackSubmitView.postc                 C   .   |j d}|r|dd  S |j dS NHTTP_X_FORWARDED_FOR,r   REMOTE_ADDRMETAr!   splitstripr$   r   x_forwarded_forr&   r&   r'   r         z'PublicFeedbackSubmitView._get_client_ipN)rF   rG   rH   r   r   r4   r1   r   r&   r&   r&   r'   r      s
    r   c                   @   s.   e Zd ZdZegZdd Zdd Zdd ZdS )	PublicFeedbackViewzJPublic endpoint: submit feedback (legacy - uses active event from config).c                 C   sp   t  }|jstd|jdS |j}|r|jstd|jdS tjj	dd}td|j
t|jt|ddjdS )z3Return current feedback configuration for the form.F)enabledr   Tr   r   )r   welcome_messager;   r   )r   r:   rC   r   disabled_messager;   r   r   r   r"   r   r   r=   r   )r$   r   r@   r;   r   r&   r&   r'   r!      s   
zPublicFeedbackView.getc                 C   s   t  }|jstd|jdtjdS |j }|j	r |j	j
|d< t|d}| r?| |}|j|d}td|jdtjdS t|jtjdS )NFr   r^   rM   r   )r   T)r   r:   rC   r   r   r   r{   r=   r   r;   rm   r   r   r   r<   thank_you_messager   r   r   )r$   r   r@   r=   r   r   r   r&   r&   r'   r1      s"   


zPublicFeedbackView.postc                 C   r   r   r   r   r&   r&   r'   r      r   z!PublicFeedbackView._get_client_ipN)	rF   rG   rH   r   r   r4   r!   r1   r   r&   r&   r&   r'   r      s    r   c                   @   s   e Zd ZegZdd ZdS )FeedbackDashboardViewc                 C   s@  |j d}tjjdd}d }|r+ztjj|d}|j|d}W n
 tjy*   Y nw | }|jt	ddd p:d	}d
d |
djtdddD }g }tjjddD ]}	|j|	d }
||	j|	j|
d qWt|dd d ddj}tjjddd}t|t|d||||rt|jnd t|ddjdS )NrO   TrV   )rm   )rM   rQ   r`   ra   r   c                 S   rb   rc   r&   re   r&   r&   r'   rh   
  ri   z-FeedbackDashboardView.get.<locals>.<dictcomp>rj   r   rk   rl   z-created_at
   r   Fr   r   )rt   ru   rv   rw   recent_feedbackselected_eventavailable_events)r    r!   r   r   r"   r   rx   rd   r|   r   r}   r~   r   r   r   r   rm   rn   r   r=   r   r   r   )r$   r   rO   r   r   r   r   r   rw   r   rd   recentr   r&   r&   r'   r!      s<   zFeedbackDashboardView.getN)rF   rG   rH   r
   r4   r!   r&   r&   r&   r'   r      s    r   c                   @   s   e Zd ZeZegZdd ZdS )FeedbackConfigViewc                 C   s   t  S rE   )r   r:   r.   r&   r&   r'   r8   '  s   zFeedbackConfigView.get_objectN)rF   rG   rH   r   rI   r   r4   r8   r&   r&   r&   r'   r   #  r   r   N)(django.db.modelsr   r   rest_frameworkr   r   r   rest_framework.decoratorsr   rest_framework.responser   rest_framework.viewsr	   rest_framework.permissionsr
   r   r   modelsr   r   r   r   serializersr   r   r   r   r   ModelViewSetr   rJ   rL   rY   r   r   r   r   r   RetrieveUpdateAPIViewr   r&   r&   r&   r'   <module>   s$    .&"0,