o
    lj                     @  s   d dl mZ d dlZd dl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mZ d dlmZ d dlmZ d'ddZd(ddZd)d*ddZd+ddZd,ddZd-d!d"Zed#d$geegd%d& ZdS ).    )annotationsN)datetime	timedeltatimezone)Any)DatabaseErrorconnections)api_viewpermission_classes)AllowAny)Responsenamestrreturnc                 C  s   d|  dd dS )N`z``)replace)r    r   "backend/config/mcube_data_views.py_q_ident   s   r   valuer   defaultintc                 C  s4   zt | }|dkr|W S |W S  ty   | Y S w )Nr   )r   	Exception)r   r   vr   r   r   _require_int   s   r      prefixnc                   s,   t jt j  | d fddt|D  S )N c                 3  s    | ]}t  V  qd S N)randomchoice).0_alphabetr   r   	<genexpr>   s    z_rand_token.<locals>.<genexpr>)stringascii_lowercasedigitsjoinrange)r   r   r   r$   r   _rand_token   s    r,   biddict[str, Any]c                 C  sZ  t tjjdd}|ttddd }|ttddd }tdd}i d	td
ddtdddtddd| d|dd| ddtdd ddtdd dtdddddddtddd d!td"d# d$d!td"d# d%td&d'd(td)d'd*||t	dt
||  d+ dd,d-td.d/gd||d0	S )1Nr   )microsecond   iX  )seconds
         callidcall_   calidcal_refidref_r-   gid	groupnamezGroup 	agentnamezAgent 2   assigntoeidi  sourcemcubelandingnumber
1800123456hidi callfromz+91l    <AK l   c(	 calltoagi_uniqueidagi_   agi_linkedidlink_	starttime<   	completedANSWEREDinboundoutbound)	endtimepulsempulsestatus
dialstatus	direction	abandoned
created_on
updated_on)r   nowr   utcr   r   r    randintr,   maxr   total_secondsr!   )r-   r]   startendr<   r   r   r   _dummy_payload!   sb   



	


rd   c                 C  s   t t| ddtrt| jS t| ddpd}|si S z|jddd }|s)i W S t|}t |tr6|W S i W S  tyC   i  Y S w )zz
    DRF will parse JSON into request.data for application/json.
    For safety, also handle raw bodies / form posts.
    dataNbody    zutf-8ignore)errors)	
isinstancegetattrdictre   decodestripjsonloadsr   )requestrawdecodedobjr   r   r   _parse_bodyD   s   

ru   tableset[str]c                 C  s$   |  d|g dd |  pg D S )Nz
        SELECT COLUMN_NAME
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s
        c                 S  s$   h | ]}|r|d  rt |d  qS )r   )r   )r"   rr   r   r   	<setcomp>a   s   $ z!_table_columns.<locals>.<setcomp>)executefetchall)cursorrv   r   r   r   _table_columnsX   s
   r}   GETPOSTc              
     s  t | jddd}| jdpd }|p| d}|ds)tddd	d
dS t| s4t|nd| 	dd zt
d }| v}t||  setdd| d	ddW  d   W S  fdd D }|stdd|dd
dW  d   W S fdd|D }ddd |D }ddgt| }	dt| d| d|	 d}
||
| |j}W d   n1 sw   Y  W n ty } ztdt||dddW  Y d}~S d}~ww td|||d S )!a  
    URL: /api/mcube-data

    - GET: inserts one dummy row (default bid=2000) into `{bid}_mcubecallhistory`
    - POST: inserts provided JSON payload; missing/empty payload falls back to dummy

    Query params:
      - bid: business id (default 2000) -> table name `{bid}_mcubecallhistory`
      - table: override full table name (optional). If provided, it must end with `_mcubecallhistory`.
    r-   i  )r   rv   r   _mcubecallhistoryFzInvalid table.)successmessagei  )rW   call_history_idNclusterzTable not found: i  c                   s   g | ]}| v r|qS r   r   )r"   k)colsr   r   
<listcomp>   s    zmcube_data.<locals>.<listcomp>z1No valid columns found in payload for this table.)r   r   rv   c                   s   g | ]} | qS r   r   r"   c)payloadr   r   r      s    z, c                 s  s    | ]}t |V  qd S r   )r   r   r   r   r   r&      s    zmcube_data.<locals>.<genexpr>z%szINSERT INTO z (z
) VALUES ()i  T)r   rv   inserted_idinserted_columns)r   query_paramsgetrn   endswithr   ru   rd   
setdefaultpopr   r|   r}   keysr*   lenr   rz   	lastrowidr   r   )rq   r-   table_overriderv   connr|   insert_colsvaluescol_sqlphsqlr   er   )r   r   r   
mcube_datad   sh   



	r   )r   r   r   r   )r   r   r   r   r   r   )r   )r   r   r   r   r   r   )r-   r   r   r.   )r   r.   )rv   r   r   rw   )
__future__r   ro   r    r'   r   r   r   typingr   	django.dbr   r   rest_framework.decoratorsr	   r
   rest_framework.permissionsr   rest_framework.responser   r   r   r,   rd   ru   r}   r   r   r   r   r   <module>   s&    



#

