
    V
h/                        S SK r S SKrS SKrS SKrS SKJrJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJrJrJr  S SKJr  S SKJr  S S	KJr  S S
KJr  SSKJrJrJrJr  SSKJrJrJ r J!r!J"r"J#r#J$r$  \" 5         \" S/SS9r%\" SS9r&Sr'Sr(Sr)Sr*Sr+\," \RZ                  " SS5      5      r. " S S\ R^                  5      r0S\S\14S jr2S/S\#S \\1   S\14S! jjr3S"\4S#\,S$\,S%\\4   S&\\5   S\14S' jr6S(\4S\14S) jr7S(\4S*\!S\14S+ jr8S(\4S\14S, jr9S-\$S\14S. jr:g)0    N)datetime	timedelta)CryptContext)ObjectId)DuplicateKeyError)HTTPExceptionstatusRequest)load_dotenv)Optional)create_access_token)str_to_objectid   )send_verification_emailsend_invite_emailsend_forgot_password_emailsend_welcome_email)UserUserBase	UserLogin
UserUpdateUserResponseListEmailActionResetPasswordRequestbcryptauto)schemes
deprecatedi7  )minutesusersrolesaccountssubscriptionsprojectsALLOWED_FREE_AGENTS2c                   (   ^  \ rS rSrU 4S jrSrU =r$ )CustomJSONEncoder&   c                    > [        U[        5      (       a  UR                  5       $ [        U[        5      (       a  [	        U5      $ [
        TU ]  U5      $ N)
isinstancer   	isoformatr   strsuperdefault)selfobj	__class__s     HC:\Suresh\moveshuttle\MDcreated\moveengine\app\v1\services\saas\users.pyr0   CustomJSONEncoder.default'   sA    c8$$==?"c8$$s8Ows##     )__name__
__module____qualname____firstlineno__r0   __static_attributes____classcell__)r3   s   @r4   r(   r(   &   s    $ $r6   r(   userreturnc                    U[            nUS   nUR                  SU R                  05      (       a
  [        SSS9eUR                  SU R                  05      nU(       a  SU;  d  US   U R                  :w  a
  [        SSS9e[
        R                  U R                  5      n0 U R                  5       EUSSS	.En[        US
'   SUS'   UR                  S5      (       Ga<  US   US'   UR                  SS5      US'   U[           nUR                  S[        UR                  S5      5      05      n	U	(       a  U	R                  SS5      US'   U	R                  SS5      US'   U	R                  SS5      US'   U	R                  S5      (       aj  U[           n
U
R                  S[        U	R                  S5      5      05      nU(       a.  UR                  SS5      US'   UR                  S[        5      US
'   O&U[           nUR                  US   SS.5      nXS'   O [         R"                  " 5       US'   [         R"                  " 5       US'   UR%                  S5        [&        R(                  " SU R                  5      R+                  S5      US '    UR-                  5        VVs0 s H  u  pUS!;  d  M  X_M     nnn[/        S"U R                  0[0        S#9nUR3                  U5      n[5        UR6                  5      US'   UR9                  [:        U R                  US    5        [>        R@                  " [>        RB                  " U[D        S$95      nUUS%.$ s  snnf ! [<         a    [        SSS9ef = f)&Nemailsemail  $User with this email already exists.status_codedetailverificationCodeInvalid verification code.T)hashed_password	is_activeis_verifiedsubscription_agentsr   active_agents
account_idroler   r!   _idaccount_typeactive_subscription_id subscription_idsubscription_statusactive_agents_countsubscription_agents_countACTIVE)rO   r	   created_date
last_loginpasswordz^([^@]+)   name)rR   rU   rV   rN   rM   sub)dataexpires_delta)cls)	user_datatoken)#COLLECTION_NAMEfind_onerB   r   rH   pwd_contexthashr\   dictr%   getACCOUNT_COLLECTION_NAMEr   SUBSCRIPTION_COLLECTION_NAMEPROJECT_COLLECTION_NAMEcount_documentsr   utcnowpopresearchgroupitemsr   ACCESS_TOKEN_EXPIRES
insert_oner.   inserted_idadd_taskr   r   jsonloadsdumpsr(   )r>   background_tasksdbusers_collectionemails_collectionemail_entryrJ   new_user_dataaccounts_collectionaccount_infosubscription_collectionsubscriptionproject_collectionactive_projects_countkvinsert_user_datard   new_userjson_compatible_user_datas                       r4   create_user_servicer   .   s   /*8   '4::!6774Z[[ $,,gtzz-BCK,K?;OaCbfjf{f{C{4PQQ "&&t}}5Ootyy{oUYjnoM+>M'(%&M/" |$$&1,&?l#!,!;g !89*33UOKOO\hLi<j4kl,8,<,<^Q,OM.)/;/?/?@XZ\/]M+,3?3C3CDY[]3^M/0 899*,-I*J'6??XdXhXh  jB  YC  ID  AE   F5A5E5EF[]^5_M/2;G;K;KLgi|;}M"78%'(?%@"(:(J(JZghtZu  BJ  LK  )L%1Fo. 	$,OO$5M.!"*//"3M,j!IIk4::>DDQGM&\-:-@-@-B  s-BTQa  Pr  GrDAD-B  s#%)<L`a#../?@"8#7#78e!!"4djj-PVBWX
 !%

4::mIZ+[ \2UCC s
  \4Z[[\s%   M #M3M9A*M M M0email_actioncurrent_userc           	         U[            nUS   nU[           nU[           nU R                  R	                  S5       Vs/ s H)  oR                  5       (       d  M  UR                  5       PM+     n	nU	(       a  U R                  (       d  SSS.$ U(       a  UR                  S5      OS n
U R                  S;   a  U	S   nUR                  SU05      S LnU R                  S	:X  a  U(       a  S
SS.$ U R                  S:X  a  U(       d  SSS.$ [        R                  " SS5      nUR                  SU0SSU00SS9  U R                  S	:X  a  UR                  [        X5        OUR                  [        X5        SU S3SS.$ U R                  S:X  GaV  SnU
(       a5  UR                  S[        U
5      05      nU(       a  UR                  SS5      n/ n/ nU	 H  nUR                  SU05      S LnU(       a  UR!                  U5        M2  [        R                  " SS5      nUR                  SU R"                  05      nU(       a  UR                  SS5      OSnUUU R"                  S.nU R$                  (       a  U R$                  US'   UR                  SU0SU0SS9  UR                  [&        XU R"                  UU5        UR!                  U5        M     S [)        U5       S!3UUSS".$ [+        S#S$S%9es  snf )&NrA   ,z!Email(s) and action are required.r   )messager	   rO   )signupforgotrB   r   rD   r]   r   zEmail not found.   i i?B $setrH   T)upsertzVerification code sent to .r   inviteMOVEXrQ   account_namerole_idr^   r   )rB   rH   rP   zInvitations sent to z	 user(s).)r   invitedskippedr	   rC   zInvalid action.rE   )re   rk   COLLECTION_ROLErA   splitstripactionrj   rf   randomrandint
update_onerx   r   r   r   appendrP   rO   r   lenr   )r   r|   r}   r   r~   r   r   roles_collectionrB   
email_listrO   user_existsverification_coder   account_detailsr   r   roledetails	role_name
email_datas                       r4   send_email_verification_servicer   n   s   /*845/*-9-@-@-F-Fs-K]-KE{{}-%++--KJ]\00>!LL3?!!,/TJ 221&//%0@AM(*{EQRSS(*;1Q??"NN66:$$e(*;<= 	% 	
 (*%%&=uX%%&@%[7wa@ANN				( 1::E?S]C^;_`O.22>7KE*33We4DETQKu% !'vv >*33Y@Q@Q4RSK;F7FI $5$))J
 &&+7+B+B
<((('5)9FJ;OX\(]%%&7S_SdSdfoq}~NN5!/  4 .c'l^9E	
 	
 4EFFY ^s   K.K.rO   skiplimitqrK   c                 4   U[            n0 n[        S5        U S:X  a#  UR                  SS:g  5      (       a
  [        SSS9eU S:w  a  XS'   U(       a  US	S
.n	SU	0SU	0SU	0/US'   Ub  XHS'   [	        UR                  U5      R                  U5      R                  U5      5      n
U
 HQ  n[        US   5      US'   S H7  nX;   d  M
  [        X   [        5      (       d  M#  X   R                  5       X'   M9     MS     UR                  U5      n[        S5        XS.$ )Nzhello BoOSSallr!   1i  z Not permitted to view all users.rE   rO   i)z$regexz$optionsr^   rB   mobilez$orrK   rQ   user_id)rZ   r[   date_of_birthzhey boss)total_countr    )re   printrj   r   listfindr   r   r.   r,   r   r-   rn   )rO   r   r   r   rK   r}   r   r~   queryregex_queryr    r>   fieldr   s                 r4   get_users_servicer      s*   /*E	-U|//3??4VWWU(l!"4-/ER]G^_e&k!&&u-2248>>uEFEd5k*YDE}DK!B!B"k335 E 
 #2259K	*&77r6   r   c                     U[            R                  S[        U 5      05      nU(       a#  [        US   5      US'   UR	                  SS 5        U$ )NrQ   idrJ   )re   rf   r   r.   rp   )r   r}   r>   s      r4   read_user_servicer      sJ    o''0H(IJDe%T
"D)Kr6   rc   c                    U[            nUR                  S[        U 5      05      nU(       d
  [        SSS9eUR	                  5       R                  5        VVs0 s H  u  pVUc  M
  XV_M     nnnUR                  S[        U 5      0SU05      nUR                  S:X  a
  [        SSS9eUR                  S[        U 5      05      n	U	(       a  U	R                  SS 5        U	$ [        SSS9es  snnf )	NrQ     User not foundrE   r   r   rJ   zUser not found after update)	re   rf   r   r   ri   rt   r   matched_countrp   )
r   rc   r}   r~   existing_userkeyvalueupdate_dataresultupdated_users
             r4   update_user_servicer      s    /*$--uog6N.OPM4DEE090@0F0F0H^0H*#E:3:0HK^((%1I)JVU`LabFq 4DEE#,,e_W5M-NOL*D1
C0M
NN _s   	C(%C(c                     U[            nUR                  S[        U 5      05      nU(       d
  [        SSS9eUR	                  S[        U 5      05        U$ )NrQ   r   r   rE   )re   rf   r   r   
delete_one)r   r}   r~   r>   s       r4   delete_user_servicer      sU    /*$$e_W-E%FGD4DEE(@ ABKr6   request_bodyc                    U R                   nU R                  nU R                  nU[           nUS   nUR	                  SU05      nU(       d
  [        SSS9eUR	                  SU05      nU(       a  SU;  d  [        US   5      U:w  a
  [        SSS9e[        R                  U5      n	UR                  S	US	   0S
SU	005        UR                  SU0SSS005        SS0$ )NrA   rB   r   r   rE   rH   rC   rI   rQ   r   rJ   z$unsetrT   r   zPassword reset successfully)
rB   rH   r\   re   rf   r   r.   rg   rh   r   )
r   r}   rB   coder\   r~   r   r>   r   rJ   s
             r4   reset_password_servicer      s   E((D$$H/*8$$gu%56D4DEE#,,gu-=>K,K?3{SeGfCgkoCo4PQQ!&&x0OU 4v@QSb?c6de  '5!1H?QSU>V3WX455r6   r+   );ry   osrq   r   r   r   passlib.contextr   bsonr   pymongo.errorsr   fastapir   r	   r
   dotenvr   typingr   app.v1.dependencies.authr   app.v1.libraries.objectr   libraries.email_templatesr   r   r   r   models.saas.usersmodelr   r   r   r   r   r   r   rg   ru   re   r   rk   rl   rm   intgetenvr%   JSONEncoderr(   ri   r   r   r.   boolr   r   r   r   r   r7   r6   r4   <module>r      s    	 	  ( (  , 2 2   8 3   
 H:&A /  $ . $ "))$93?@ $(( $<Dh <D <D@QG+ QGcklpcq QG  ~B QGf8# 8S 8 8# 8[cdh[i 8  AE 82s 4 O O OD O T 6)= 6d 6r6   