
    P1iP)                        d dl mZ d dlmZ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
ZddZddZddZ eee      dd       Z eee      dd       Z eee      dd       Zy)    )annotations)	post_savepost_deletepre_save)receiver)transaction)cacheget_user_model)timezone   )Personc                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     ./home/cursorai/projects/iching/bazi/signals.py_cache_keysr      sR    	#F'!|+|+Z'/1I%'!     c                    t               }	 |j                  j                  |       }||_        |dk(  rt	        j
                         |_        |j                  ddg       y # |j                  $ r Y y w xY w)Nid
processinggroup_relations_stategroup_relations_started_atupdate_fields)	r   objectsgetr"   dj_tznowr#   saveDoesNotExist)r   r   Userusrs       r   _set_group_stater.      sq    Dll'*$)!L -2YY[C* 79UVW s   AA" "A43A4c           	         ddl }ddl}ddlm} d } |       r	 ddlm ddlm  d d	       y	 	 ddlm ddlm ddl} fd}	|j                  |	d      }
|
j!                          y# t        $ rC}ddl	}|j                  t              }|j                  d
  dt        |              Y d}~yd}~ww xY w# t        $ r
}Y d}~yd}~ww xY w# t        $ r Y yw xY w)z#Spawn background recalculation taskr   Nsettingsc                    dd l } dd l}ddlm} t	        d | j
                  D              ryt        |d      r|j                  ryt        |dd      ry|j                  j                  d      d	v ryt        |d
      r#g dt	        fd|j                  D              ryt        |d      rBd|j                  v r4|j                  d   j                  dd      t	        fddD              ryy)Nr   r0   c              3  @   K   | ]  }d |j                         v   yw)testNlower).0args     r   	<genexpr>zM_spawn_recalc_task.<locals>._is_non_production_environment.<locals>.<genexpr>4   s     9v$s   TUAT_ENVIRONMENTDEBUGF
DJANGO_ENV)developmentuatstagingALLOWED_HOSTS)r>   r?   r4   c              3  H   K   | ]  t        fd D                yw)c              3  B   K   | ]  }|j                         v   y wNr5   )r7   hostallowed_hosts     r   r9   zW_spawn_recalc_task.<locals>._is_non_production_environment.<locals>.<genexpr>.<genexpr>F   s      J	t|1133	   N)any)r7   rE   	uat_hostss    @r   r9   zM_spawn_recalc_task.<locals>._is_non_production_environment.<locals>.<genexpr>F   s$      ?'=| J	JJ'=s   "	DATABASESdefaultNAME c              3  B   K   | ]  }|j                         v   y wrC   r5   )r7   rD   db_names     r   r9   zM_spawn_recalc_task.<locals>._is_non_production_environment.<locals>.<genexpr>M   s     R7Qt47==?*7QrF   )sysosdjango.confr1   rG   argvhasattrr:   getattrenvironr'   r@   rI   )rO   rP   r1   rN   rH   s      @@r   _is_non_production_environmentz:_spawn_recalc_task.<locals>._is_non_production_environment.   s    ( 999 8./H4L4L 8We, ::>>,'+LL 8_-2I ?'/'='=? ? 8[)i8;M;M.M((377CGR7QRRr   )call_command)CommandErrorrecalc_bazi_relationsr   user	verbosityz@Failed to run BaZi relations calculation synchronously for user : c            	        	 ddl } | j                         }d|_        ddlm}  |       }	 |j
                  j                  
      }d|_        t        j                         |_
        |j                  ddg	        	d

d       	 |j                          d|_        t        j                         |_        |j                  ddg	       y# |j                  $ r Y yw xY w# |j                  $ r Y yw xY w# $ r}ddl}|j!                  t"              }|j%                  d
 dt'        |              	 j                          d|_        t        j                         |_        |j                  ddg	       n# j                  $ r Y nw xY wY d}~yY d}~yd}~wt*        $ r}ddl}|j!                  t"              }|j%                  d
 dt'        |       d       	 j                          d|_        t        j                         |_        |j                  ddg	       n# j                  $ r Y nw xY wY d}~yY d}~yd}~ww xY w)zJRun the management command in a separate thread with proper Django contextr   NTr
   r   r!   r"   r#   r$   rY   r   rZ   	completedgroup_relations_updated_atz?CommandError in background BaZi relations calculation for user r]   errorgroup_relations_error_atzCUnexpected error in background BaZi relations calculation for user )exc_info)	threadingcurrent_thread_bazi_recalc_threaddjango.contrib.authr   r&   r'   r"   r(   r)   r#   r*   r+   refresh_from_dbr`   logging	getLogger__name__ra   strrb   	Exception)rd   re   r   r,   r-   eri   loggerrX   rW   r   s           r   run_management_commandz2_spawn_recalc_task.<locals>.run_management_commandh   sG   8$%.%=%=%?N9=N6 C)+D"ll..'.:4@19>60GIe/fg
 !!8wRST++-4?19>60GIe/fg  ,,   ,,  $ "$..x8FLL#bcjbkkmnqrsntmu!vw++-4;17<yy{40GIc/de,,  f ! "$..x8FLL#fgnfooqruvwrxqy!z  FJL  K++-4;17<yy{40GIc/de,,  fs   (C7 AC <C7 AC" CC7 CC7 "C41C7 3C44C7 7I<9F6AE;:F;F
FFFI&;I"AH'&I'H96I8H99IIT)targetdaemon)
subprocessrO   rQ   r1   django.core.managementrW   django.core.management.baserX   rm   ri   rj   rk   ra   rl   rd   Threadstart)r   rs   rO   r1   rV   rn   ri   ro   rd   rp   threadrX   rW   s   `          @@r   _spawn_recalc_taskry   '   s    $"J &'
	q;@ 0w!L 	LG	;@:z %%-CD%QFLLNY  	q&&x0FLL[\c[ddfgjklgmfnopp	q\  		  s@   A2 :C 2	B>;9B99B>	C
C CC 	C#"C#c                    	 | rX| j                   rL| j                   j                  d      r1| j                   d   }|j                  d      |j                  d      fS y# t        $ r Y yw xY w)NdaygodearthNN)bazi_resultr'   rm   )personds     r   _day_pillarr      sl    f((V-?-?-C-CE-J""5)A55<w//   s   AA 	A)(A))senderc                &   |j                   r^	 t        j                  j                  |j                         }t	        |      |_        |j                  |_        |j                  |_	        y d|_        y # t        j                  $ r
 d|_        Y y w xY w)N)pkr~   )r   r   r&   r'   r   _prev_day_pillar
birth_date_prev_birth_date
birth_time_prev_birth_timer+   )r   instancekwargsprevs       r   pre_save_personr      sy     {{	5>>%%%5D(3D(9H%(,H%(,H% %1! "" 	5(4H%	5s   AA3 3BBc                   |j                   sy t        |dd      r8fddd l}fd}|j                  |      }d|_        |j                          y |r1t        j                  fd       t        j                  fd	       y t        |d
d      \  }}t        |      \  }	}
||f|	|
fk7  r1t        j                  fd       t        j                  fd       y y )N_skip_relation_calculationFc                 T    	 t         d       t                y # t        $ r Y y w xY wNr!   )r.   ry   rm   r   s   r   delayed_calculationz-post_save_person.<locals>.delayed_calculation   s.     !,7"7+ s    	''r   c                 t    dd l } dd l}|j                         }d|_        | j	                  d                y )Nr   Tg      ?)timerd   re   rf   sleep)r   rd   re   r   s      r   run_delayedz%post_save_person.<locals>.run_delayed   s0    &557N15N.JJsO!r   )rq   Tc                     t         d      S r   r.   r   s   r   <lambda>z"post_save_person.<locals>.<lambda>       &6w&Mr   c                     t               S rC   ry   r   s   r   r   z"post_save_person.<locals>.<lambda>       &8&Ar   r   r~   c                     t         d      S r   r   r   s   r   r   z"post_save_person.<locals>.<lambda>   r   r   c                     t               S rC   r   r   s   r   r   z"post_save_person.<locals>.<lambda>   r   r   )	created_by_idrT   rd   rv   rr   rw   r   	on_commitr   )r   r   createdr   rd   r   rx   prev_gprev_ecur_gcur_er   r   s              @@r   post_save_personr      s    $$G x5u=	 		" !!!5 MNAB X'9<HNFFx(LE5E5>)MNAB *r   c                    |j                   sy t        j                  fd       t        j                  fd       y )Nc                     t         d      S r   r   r   s   r   r   z$post_delete_person.<locals>.<lambda>   s    "27L"Ir   c                     t               S rC   r   r   s   r   r   z$post_delete_person.<locals>.<lambda>   s    "4W"=r   )r   r   r   )r   r   r   r   s      @r   post_delete_personr      s2    $$GIJ=>r   N)r   int)r   r   r   rl   )r   r   )r   r   )r   r   r   bool)
__future__r   django.db.models.signalsr   r   r   django.dispatchr   	django.dbr   django.core.cacher	   rg   r   django.utilsr   r(   modelsr   r   r.   ry   r   r   r   r   r   r   r   <module>r      s    " E E $ ! # . * 

FR 
(6"1 #1 
)F#,C $,C^ 
+f%? &?r   