o
    G߻i)                     @   s   d dl 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 ddlmZmZ dd	lmZmZ d
d 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dS )    N)viewsetsstatus)APIView)Response)IsAuthenticatedIsAdminUserAllowAny)RegisteredMember   )RaffleEventRaffleEntry)RaffleEventSerializerRaffleEntrySerializerc                 C   s0   | j d}|r|dd  S | j ddS )NHTTP_X_FORWARDED_FOR,r   REMOTE_ADDRunknown)METAgetsplitstrip)requestxff r   8/var/www/html/smartRegister/backend/apps/raffle/views.py_get_client_ip   s   $r   c                   @   s    e Zd Zej ZeZe	gZ
dS )RaffleEventViewSetN)__name__
__module____qualname__r   objectsallquerysetr   serializer_classr   permission_classesr   r   r   r   r      s    

r   c                   @      e Zd ZdZegZdd ZdS )PublicActiveRaffleEventViewz9Returns the currently active (non-archived) raffle event.c                 C   sH   t jjddd }|stdditjdS t|j|j|j	|j
|jdS )NTF	is_activeis_archiveddetailNo active raffle event.r   )idnameslugdescriptionentry_count)r   r    filterfirstr   r   HTTP_404_NOT_FOUNDr-   r.   r/   r0   r1   )selfr   eventr   r   r   r      s   zPublicActiveRaffleEventView.getN)r   r   r   __doc__r   r$   r   r   r   r   r   r&          r&   c                   @   r%   )PublicRaffleRegisterViewu   
    Public endpoint — records a member's entry in the raffle.
    Looks up the member's name from RegisteredMember if available.
    Deduplicates: one entry per registration_code per event.
    c           	      C   s:  |j dpd  }|j d}|r|s tdddtjdS ztjj|ddd	}W n tj	y?   tdd
dtj
d Y S w d}ztjj|d}|j}W n tj	yc   tddddtj
d Y S w tjj|||t|dd\}}|stdd|jp}|d|jp| ddS tdd|p|d|p| ddtjdS )Nregistration_code event_idFz)Registration code and event are required.successmessager,   T)r-   r(   r)   zRaffle is not currently active.)registration_code__iexactzBRegistration code not found. Please check your code and try again.	NOT_FOUND)r>   r?   code)	full_name
ip_address)r6   r:   defaultszYou are already in the draw, !)r>   already_enteredrC   r?   zYou're in the draw, z! Good luck!)datar   r   upperr   r   HTTP_400_BAD_REQUESTr   r    DoesNotExistr4   r	   rC   r   get_or_creater   HTTP_201_CREATED)	r5   r   r:   r<   r6   rC   memberentrycreatedr   r   r   post0   s^   




	zPublicRaffleRegisterView.postN)r   r   r   r7   r   r$   rQ   r   r   r   r   r9   (   s    r9   c                   @   r%   )RaffleEntriesViewu7   Admin — list all entries for the active raffle event.c                 C   sn   |j d}|rtjj|dd}ntjjddd }|r)tjj|ddntj }t	t
|ddjS )	Nr<   )r<   z-scanned_atTFr'   )r6   )many)query_paramsr   r   r    r2   order_byr   r3   noner   r   rH   )r5   r   r<   entriesr6   r   r   r   r   i   s   "zRaffleEntriesView.getN)r   r   r   r7   r   r$   r   r   r   r   r   rR   e   r8   rR   c                   @   r%   )RafflePickWinnerViewuF   Admin — pick a random winner from the active raffle event's entries.c                 C   s   |j d}z#|rtjj|d}ntjjddd }|s(tdddtjdW S W n tj	y=   tdd	dtjd Y S w t
|j }|sQtdd
dtjdS t|}td|jp]|j|j|jdt|dS )Nr<   )r-   TFr'   r+   r=   r,   zRaffle event not found.zNo entries in this raffle yet.)rC   r:   
scanned_at)r>   winnertotal_entries)rH   r   r   r    r2   r3   r   r   r4   rK   listrW   r!   rJ   randomchoicerC   r:   rY   len)r5   r   r<   r6   rW   rZ   r   r   r   rQ   w   s.   

zRafflePickWinnerView.postN)r   r   r   r7   r   r$   rQ   r   r   r   r   rX   s   r8   rX   )r]   rest_frameworkr   r   rest_framework.viewsr   rest_framework.responser   rest_framework.permissionsr   r   r   apps.attendance.modelsr	   modelsr   r   serializersr   r   r   ModelViewSetr   r&   r9   rR   rX   r   r   r   r   <module>   s    =