
    P1i*                        d dl mZ d dlmZ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	lmZ dd
ZddZ G d de      Zy)    )annotations)datetime	timedelta)timezone)cache)	send_mail)BaseCommand)settings)Person)get_user_modelc                L    d|  d}|dz   |dz   |dz   |dz   |dz   |dz   |d	z   d
S )Nz	bazi:grp::state
started_at
updated_aterror_atlast_retry_atresultscount)r   r   r   r   r   r   r    )user_idprefixs     X/home/cursorai/projects/iching/main/management/commands/scan_group_relations_timeouts.py_cache_keysr      sR    	#F'!|+|+Z'/1I%'!     c                0    t        d| dz   dz        }|dz  S )N   c   d   
   )max)num_recordsblockss     r   _timeout_secondsr$      s"    [2%#-.FB;r   c                      e Zd ZdZd Zy)CommandznScan BaZi group relations processing states and mark timeouts to error; optionally re-trigger after 5 minutes.c           	        t         j                  j                  d       j                  dd      j	                         }t        j                         }t        t        dd       xs t        t        dd       }|D ]  }t               }	 |j                  j                  |      }|j                  xs d}	|j                  r|j                  j                         nd }
|j                  r|j                  j                         nd }t         j                  j!                  |      j#                         }t%        |      }dd	}|	d
k(  rw|
ru ||
      xs |t'        |dz         z
  }||z
  j)                         |kD  sd|_        ||_        |j+                  ddg       |s)	 t-        dd| d| dd |gd       D|	dk(  sK|sO ||      }|s[||z
  j)                         dkD  ssd
|_        ||_        |j+                  ddg        | j0                  j3                  | j4                  j7                  d             y # |j                  $ r Y w xY w# t.        $ r Y w xY w)N)created_by_idr(   T)flatTECH_CONTACTCONTACT_EMAIL)ididlec                L    	 t        j                  |       S # t        $ r Y y w xY w)N)r   fromisoformat	Exception)ss    r   	parse_isoz!Command.handle.<locals>.parse_iso:   s*     #11!44    s    	##
processingr   )secondserrorgroup_relations_stategroup_relations_error_at)update_fieldszBaZi group relations timeoutzUser z processing exceeded timeout (zs).)subjectmessage
from_emailrecipient_listfail_silentlyi,  group_relations_started_atzScan completed.)r1   str)
BaziPersonobjectsexcludevalues_listdistinctdj_tznowgetattrr
   r   getr6   r>   	isoformatr7   DoesNotExistfilterr   r$   r   total_secondssaver   r0   stdoutwritestyleSUCCESS)selfargsoptions	owner_idsrF   
tech_emailuidUserusrr   r   r   r"   	thresholdr2   dts                   r   handlezCommand.handle$   sL    &&T&:[t[4XXZ 	 iikX~t<hRacg@h
C!#Dll&&#&.11;VKNKiKiS;;EEGos
GJGcGc377AACim %,,33#3FLLNK(5I  $z*VsYyST}5U/U"H++-	907C-36C0HH,CE_+`Ha!	!%(F*/u4RS\R]]`(a+/0:|.2 '!hx(38224s:0<C-58C2HH,CEa+bHcU X 	$**,,->?@K $$ 6  ) ! !s%   	A<I$III	I*)I*N)__name__
__module____qualname__helpr\   r   r   r   r&   r&   !   s    {D5Ar   r&   N)r   int)r"   ra   returnra   )
__future__r   r   r   django.utilsr   rE   django.core.cacher   django.core.mailr   django.core.management.baser	   django.confr
   bazi.modelsr   r@   django.contrib.authr   r   r$   r&   r   r   r   <module>rk      s8    " ( * # & 3   , .

8Ak 8Ar   