o
    0=g:                     @   s8  d dl mZ d dlZd dlZd dl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Zd dlmZ d dl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dZdd Zdd Ze Z G dd deZ!dd Z"dd Z#dd Z$dd Z%dd  Z&d!d" Z'dS )$    )JsonResponseNResponsestatus)LimitOffsetPagination)ValidationError)datetime	timedelta)Listing)timezone)validation_msg)APIView)get_user_modelis_emailSuccessc                 C   s   t d|| dtjdS )Nsuccess)r   msgdatar   )r   r   HTTP_200_OK)r   r    r   +/var/www/html/django-vendor/utils/helper.pysuccess_response   s   r   c                 C   s   t d| d|dS )Nfailure)r   r   r   r   r   coder   r   r   failed_response   s   r   c                    s0   t jt jdd    d fddt| D S )N    c                 3   s    | ]}t  V  qd S N)randomchoice).0_
charactersr   r   	<genexpr>'   s    z'generate_random_text.<locals>.<genexpr>)stringascii_lowercasedigitsjoinrange)lengthr   r%   r   generate_random_text$   s   r.   c                   @   s   e Zd Zdd Zdd ZdS )!CheckUniqueUsernameOrEmailAPIViewc              
   O   s   zK|j }d|v r,|d}| |r$tjj|d r#tdtj	dW S ntdtj	dW S d|v rF|d}tjj|d rFtdtj	dW S t
d	d
W S  tyi } ztdt| tjdW  Y d }~S d }~ww )Nemail)r0   zEmail is already registered.r   zInvalid email format.username)r1   zUsername is already taken.z&Both email and username are available.)r   zAn unexpected error occurred: )r   getr   Userobjectsfilterexistsr   r   HTTP_400_BAD_REQUESTr   	ExceptionstrHTTP_500_INTERNAL_SERVER_ERROR)selfrequestargskwargsr   r0   r1   er   r   r   post+   s$   


$z&CheckUniqueUsernameOrEmailAPIView.postc                 C   s   t |S r    r   )r;   valuer   r   r   r   <      z*CheckUniqueUsernameOrEmailAPIView.is_emailN)__name__
__module____qualname__r@   r   r   r   r   r   r/   *   s    r/   c                 C   s   | d S N8   r   )bs_yearr   r   r   bs_to_ad@   rB   rI   c                 C   s   | d S rF   r   )ad_yearr   r   r   ad_to_bsC   rB   rK   c                 C   s  t d}t d}t d}|| r7t|| d}t j}|dk s-||d kr5td| dd S || rdt|| d}t	|}|dk sW|t jd krbtd| d	| d
d S || r|| 
 \}}}	t|}t|}|	dkr||krtd|dk s|t jd krtd| d| dd S |	dkrt	|}
t	|}|
|krtd|
dk s|t jd krtd| d| dd S d S td)Nz^(\d{4}) AD$z^(\d{4}) BS$z^(\d{4}) - (\d{4}) (AD|BS)$r   il  
   zYear z is out of rangez BS (converted to z AD) is out of plausible rangeADz%Start year must be less than end yearzYear range z - z AD is out of rangeBSz'Start year should be less than end yearz BS is out of rangezRFiscal year format must be 'YYYY AD', 'YYYY BS', 'YYYY-YYYY AD', or 'YYYY-YYYY BS')recompilematchintgroupr	   nowyearr   rI   groups)fiscal_year
ad_pattern
bs_patternrange_patternrU   current_yearrJ   
start_yearend_year	year_typestart_adend_adr   r   r   validate_fiscal_yearF   sF   






ra   c                 C   s   t d}zt| dd}W n ty   tdw |jd u r(t j	|} n|
t j} | 
|}|t k r@td| |S )NzAsia/KathmanduZz+00:00z<Invalid date format. Please provide a valid ISO date string.z3Deadline cannot be in the past. Provided deadline: )pytzr   r	   fromisoformatreplace
ValueErrorr   tzinfoutclocalize
astimezonerT   )deadline_utckathmandu_tzdeadline_naivedeadline_kathmandur   r   r   validate_and_convert_deadlinei   s   


ro   c                 C   s   | j dkr9| jd}|r1zt|d}t|}td|iW S  ty0   ttd  dd Y S w tdd	iddS tdd
iddS )NPOSTdeadlinez%Y-%m-%d %H:%M:%Sremaining_timer	   i  r   errorzDeadline not providedz!Invalid request method. Use POST.i  )	methodrp   r2   r	   strptimeget_deadline_remaining_timer   rf   r   )r<   deadline_strrq   rr   r   r   r   calculate_remaining_timex   s   
rx   c                 C   s   | t   }|tdkrdS |j|j}}|d }|d d }|d }g }|dkr1|| d |dkr=|| d |dkrI|| d |dkrU|| d d	|S )
Nr   zDeadline has passedi  <   z day(s)z hour(s)z
 minute(s)z
 second(s)z, )r	   rT   r
   dayssecondsappendr+   )rq   time_remainingrz   r{   hoursminutes
time_partsr   r   r   rv      s"   
rv   )Nr   )(django.httpr   jsonr!   r(   rest_framework.responser   rest_frameworkr   rest_framework.paginationr   utils.exceptionr   r	   r
   rO   listing.modelsr   rc   django.utilsr   
utils.datar   rest_framework.viewsr   django.contrib.authr   utils.validationr   r   r   r.   r3   r/   rI   rK   ra   ro   rx   rv   r   r   r   r   <module>   s<    
#