
    ci                     8   d dl mZ d dlmZ 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  eedd      Z eed	d
      Z eedd      Z eedd      Z eedd      ZdZd ZefdZd Zd ZeZdefdZdedefdZd dlmZm Z  d dl!m"Z" dZ#d Z$ddd ed!e%fd"Z&y)#    )	AdsManual)settings)cacheN)InactiveAdPayloadSerializer)AdsInactiveSyncADS_INACTIVE_CLOUD_URLz0https://www.hously.cloud/space/receive-inactive/ADS_INACTIVE_BATCH_SIZE   ADS_INACTIVE_RETRY_LIMIT   ADS_INACTIVE_BASE_DELAYg      ?ADS_INACTIVE_TIMEOUT   i  c                       y)Nsend_inactive_ads_lock r       3/var/www/extractly/houslyspace/utils/qs_inactive.py_inactive_lock_keyr      s    #r   c                 0    t        j                  | d|      S )N1)r   add)keyttls     r   _acquire_lockr      s    eiiS#6N/Nr   c                 8    t        j                  | t               y N)r   touchINACTIVE_LOCK_TTLr   s    r   _refresh_lockr!      s    C):;r   c                 .    t        j                  |        y r   )r   deleter    s    r   _release_lockr$      s    S)r   returnc                     	 t        |       } | r| dkD  r| S t        t        xs d      S # t        t        f$ r d} Y /w xY w)Nr   r
   )int	TypeError
ValueErrorINACTIVE_DEFAULT_LIMIT)limits    r   _normalize_limitr,       sK    E
 uqy5Qs3I3PS/QQ z" s   ) ==itemc                     t        j                  | j                  d      | j                  d      | j                  d      ddd      }t        j                  |j                  d            j                         S )	Nurlinactive_dateinactive_reason)r/   r0   r1   FT)ensure_ascii	sort_keyszutf-8)jsondumpsgethashlibsha256encode	hexdigest)r-   raws     r   _payload_hashr<   '   sc    
**((5/((?388$56 T	+C
 >>#**W-.88::r   )QF)timezone   c                      t         j                  j                  dd      j                  d      j	                  d      j                  t        d      t        t        d            z        j                  d	      S )
u   
    Zwraca tylko:
    - nieaktywne z ustawioną inactive_date i url,
    - które nigdy nie były wysłane (brak inactive_sync)
      LUB mają nowszą wartość inactive_date niż ostatnio wysłana.
    F)	is_activeinactive_date__isnullT)url__isnullinactive_sync)inactive_sync__isnull"inactive_sync__last_inactive_value)inactive_date__gtid)r   objectsfilterexcludeselect_relatedr=   r>   order_byr   r   r   _inactive_qsrO   :   sp     		"' 
 

 
T	"		(	D)"F GHI

 
$r   F)forcer+   rP   c                    t        |       } g }t        j                         }t        dz  }t	               j                  d      D ]5  }t        |      j                  }|j                  d      r|j                  d      s<t        |      }t        |dd       }d}	|s|d}	n|j                  xr( |j                   xs |j                  |j                  kD  }
|j                  |k7  }|
s|rd}	nd|j                  xr |j                  |j                  k(  }|j                  xr  ||j                  z
  j                         |k\  }t!        |xr |      }	|	s|j#                  |||f       t%        |      | k\  s5 |S  |S )	N<   i  )
chunk_sizer/   r0   rE   FT)r,   r?   now"INACTIVE_RESEND_EQUAL_TS_AFTER_MINrO   iteratorr   datar6   r<   getattrr0   last_inactive_valuelast_payload_hashlast_sent_attotal_secondsboolappendlen)r+   rP   itemsrT   	equal_ageadpayloadhsyncshould_sendnewer_valuehash_changed	equal_valsent_enough_time_agos                 r   take_inactive_batchrk   Q   s|   U#EE
,,.C2R7In%%%6-b166{{5!_)E'"r?D1DLK
    ^---\1A1ADD\D\1\ 
 !22a7Ll" "55f":J:JdNfNf:f	%%`31B1B+B*Q*Q*SW`*` % #9#E1EFLL"gq)*5zU"LI 7H Lr   )'extractly.modelsr   django.confr   django.core.cacher   r7   r4   timehouslyspace.serializersr   houslyspace.modelsr   rX   INACTIVE_CLOUD_URLINACTIVE_BATCH_SIZEINACTIVE_RETRY_LIMITINACTIVE_BASE_DELAYINACTIVE_TIMEOUTr   r   r   r!   r$   r*   r'   r,   dictstrr<   django.db.modelsr=   r>   django.utilsr?   rU   rO   r]   rk   r   r   r   <module>r{      s    &   #   ? . x)ACuv x)BCH x)CQG x)BCH x)?D   $, N ; ) - Rs R; ; ; " !%( ". 6; *s *d *r   