
    4Ei7                     `   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mZmZ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mZmZ d dlmZ d dlmZ d dlmZmZ ddlm Z  d dl!Z!d dl"Z"d dl#m$Z$  eedeidgd       G d dejJ                               Z& edgddddddddd dd!d"d#gd$id%dd&did&did'd(i)       G d* d+e             Z' edgd,dd%dd-d&diid(i.       G d/ d0e             Z( edgd1d2ddd"d&diid"gd$idd-d&diid(dd3d&diid(d4)       G d5 d6e             Z)y)7    )APIView)Responsestatus)TokenObtainPairView)logout)RegisterSerializerUserSerializerEmailLoginSerializerEnhancedRegisterSerializerSignupResponseSerializerUserProfileDetailSerializer)PasswordResetForm)settingsUser)genericsr   permissions)login)timezone)extend_schemaOpenApiResponse   LoginSessionN)transaction   AuthenticationzSign up new user)request	responsestagssummaryc            
       h    e Zd ZdZeZ edgddee ed      d      d	        Z	d
 Z
d Zd Zd Zy)
SignupViewz5Enhanced user registration with complete profile datar   zCreate new user accountzcRegister a new user with complete profile information including company details and property count.zValidation errorsdescription)r     r!   r"   r&   r   r    c                    | j                  |j                        }	 t        j                         5  |j	                         r|j                         }| j                  ||       |j                  |j                  |j                  |j                  |j                  |j                   d|j                   j                         |j                  j                  |j                  j                  |j                  j                   |j"                  j%                         D cg c]  }|j&                   c}d
}t)        dd|dt*        j,                        cd d d        S t)        dd	|j.                  d
t*        j0                        cd d d        S c c}w # 1 sw Y   y xY w# t2        $ r2}t)        ddt5        |      dt*        j6                        cY d }~S d }~ww xY w)Ndata )
idusernameemail
first_name	last_name	full_namecompanyphone_numberproperty_countrolesTzGAccount created successfully! You can now log in with your credentials.)successmessageuserr   FzAccount creation failedr7   r8   errorsz+Account creation failed due to server error)r7   r8   error)get_serializerr+   r   atomicis_validsavetrack_signup_sessionr-   r.   r/   r0   r1   stripprofiler3   r4   r5   groupsallnamer   r   HTTP_201_CREATEDr;   HTTP_400_BAD_REQUEST	ExceptionstrHTTP_500_INTERNAL_SERVER_ERROR)	selfr   argskwargs
serializerr9   group	user_dataes	            /backend/users/views/auth.pycreatezSignupView.create%   s    ((gll(;
'	=##%&&(%??,D --gt< #gg$(MM!%&*oo%)^^(,'8$..9I%J%P%P%R#'<<#7#7(,(A(A*.,,*E*E:>++//:K!L:K%**:K!L!I $#'#l )% %55	7+ &%6 $#(#<","3"3% %99	;7 &%$ "M% &%B  	= HQ ;;	= =	=sY   F# C.F F3#F	F#  (F	F# FF F#  F# #	G,'GGGc                    	 |j                   j                  dd      }t        j                  |      }| j	                  |      }d|j
                   dt        j                         j                          dt        j                         j                  dd  }t        j                  j                  ||||| j                  |      |j                   j"                   d|j                   j$                   |j&                  j"                   d|j&                  j$                   | j)                  |      d		       y# t*        $ r}t-        d
|        Y d}~yd}~ww xY w)zTrack signup as initial sessionHTTP_USER_AGENT signup__N   r,   F	r9   session_key
ip_address
user_agentdevice_typebrowseroperating_systemlocation	is_activez Signup session tracking failed: METAgetuser_agentsparseget_client_ipr-   r   now	timestampuuiduuid4hexr   objectsrT   get_device_typer`   familyversion_stringosget_locationrI   printrL   r   r9   user_agent_stringr^   r]   r\   rR   s           rS   rA   zSignupView.track_signup_session[   s;   	: ' 0 01BB G$**+<=J++G4J $DGG9Ahlln.F.F.H-I4::<K[K[\^]^K_J`aK   '''%, 00<%--445Qz7I7I7X7X6YZ$.MM$8$8#9:==;W;W:X!Y**:6 ( 
  	:4QC899	:   D6D9 9	EEEc                     |j                   j                  d      }|r$|j                  d      d   j                         }|S |j                   j                  dd      }|S zGet client IP addressHTTP_X_FORWARDED_FOR,r   REMOTE_ADDRUnknownre   rf   splitrB   rL   r   x_forwarded_forips       rS   ri   zSignupView.get_client_ipv   \    !,,**+AB &&s+A.446B 	 !!-;B	    c                 R    |j                   ry|j                  ry|j                  ryyzDetermine device typeMobileTabletDesktopr~   	is_mobile	is_tabletis_pcrL   r^   s     rS   rp   zSignupView.get_device_type   )    !!r   c                 l    |j                  d      s"|j                  d      s|j                  d      ryyzGet approximate locationz192.168.z10.z127.zLocal NetworkzUnknown Location
startswithrL   r]   s     rS   rt   zSignupView.get_location   s2      ,
0E0Ee0LPZPePeflPm"!r   N)__name__
__module____qualname____doc__r   serializer_classr   r   r   rT   rA   ri   rp   rt    r   rS   r$   r$      sZ     @1)y*) -@A
	*=	*=X:6	"r   r$   authz	JWT loginz>Use username and password to get JWT access and refresh tokenszapplication/jsonobjectstringzadmin@aimantis.com)typeexamplez
Admin@1927)r/   passwordr/   r   )r   
propertiesrequired   r   )refreshaccess)r   r   r(   c            	       t    e Zd ZdZeZ edgdd ed       ed      d	      d
        Zd Z	d Z
d Zd Zy)	LoginViewz,
    User login with email and password
    r   z
User loginz/Login with email and password to get JWT tokensLogin successfulr%   zInvalid credentialsr   r'   r!   r"   r&   r    c           	         | j                  |j                        }	 |j                  d       t        |d      r|j                  nd }|s]|j
                  j                  d      xs |j                  j                  d      }|r#ddlm} 	 |j                  j                  |      }|j
                  }|r1	 t        |d	|i
      j                  }	|	|d<   | j                  ||       t        dd|dt        j                         S # |j                  $ r Y ow xY w# t        $ r Y Qw xY w# t        $ rJ}
t        ddt        |d      r|j"                  n
t%        |
      dt        j&                        cY d }
~
S d }
~
ww xY w)Nr*   T)raise_exceptionr9   r/   r   r   r/   r   )contextr   )r7   r8   r+   r   FzLWere sorry, we couldn't log you in with those credentials. Please try again.r;   r:   )r=   r+   r?   hasattrr9   validated_datarf   django.contrib.auth.modelsr   ro   DoesNotExistr   rI   track_login_sessionr   r   HTTP_200_OKr;   rJ   rH   )rL   r   rM   rN   rO   r9   r/   r   response_data	full_userrR   s              rS   postzLoginView.post   s    ((gll(;
*	35 '.j&&A:??tD"1155g>[',,BRBRSZB[?#||//e/<
 '55M  ;D9V]J^ _ d dI,5M&) (($7-% ((	* *'  ,,  !   	3 i/6z8/L*++RUVWRX 11	3 3	3sf   A.D+ D )D+ 8D 0D+ DD+ DD+ 	D(%D+ 'D((D+ +	E>4?E93E>9E>c                    	 |j                   j                  dd      }t        j                  |      }| j	                  |      }d|j
                   dt        j                         j                          dt        j                         j                  dd  }t        j                  j                  ||||| j                  |      |j                   j"                   d|j                   j$                   |j&                  j"                   d|j&                  j$                   | j)                  |      d		       y# t*        $ r}t-        d
|        Y d}~yd}~ww xY w)z*Track login session for JWT authenticationrV   rW   jwt_rY   NrZ   r,   Tr[   zFailed to track login session: rd   rv   s           rS   r   zLoginView.track_login_session   s;   	9 ' 0 01BB G$**+<=J++G4J !	8<<>+C+C+E*Fa

HXHXY[Z[H\G]^K   '''%, 00<%--445Qz7I7I7X7X6YZ$.MM$8$8#9:==;W;W:X!Y**:6 ( 
  	93A3788	9rx   c                     |j                   j                  d      }|r$|j                  d      d   j                         }|S |j                   j                  dd      }|S rz   r   r   s       rS   ri   zLoginView.get_client_ip  r   r   c                 R    |j                   ry|j                  ry|j                  ryyr   r   r   s     rS   rp   zLoginView.get_device_type  r   r   c                 l    |j                  d      s"|j                  d      s|j                  d      ryyr   r   r   s     rS   rt   zLoginView.get_location  s4       ,
0E0Ee0LPZPePeflPm"!r   N)r   r   r   r   r   r   r   r   r   r   ri   rp   rt   r   r   rS   r   r      s^    8 ,E -?@ -BC
	,3,3\98	"r   r   zLogout userr8   )r!   r"   r   r    c            	       ^    e Zd Zej                  gZ edgddd ed      i      d        Zy	)

LogoutViewr   zUser logoutz"Logout user and invalidate sessionr   zLogout successfulr%   r   c                 T   t        |d      ru|j                  j                  r_ddlm} |j
                  j                  |j                  d      j                  d      j                  dt        j                                t        |       t        d	d
it        j                        S )Nr9   r   r   T)r9   rc   z-login_timeF)rc   logout_timer8   zLogged out successfullyr   )r   r9   is_authenticatedmodelsr   ro   filterorder_byupdater   rj   r   r   r   r   )rL   r   r   s      rS   r   zLogoutView.post*  s     7F#(E(E-   ''\\ (  h}%ff$LLN '- ' 	w12%%
 	
r   N)	r   r   r   r   IsAuthenticatedpermission_classesr   r   r   r   r   rS   r   r      sD     &55684GHI	

r   r   zForgot passwordz'Send a password reset email to the userr<   r   c                       e Zd Zd Zy)ForgotPasswordViewc                    |j                   j                  d      }|st        ddit        j                        S t
        j                  j                  |      j                         st        ddit        j                        S t        d|i      }|j                         r@|j                  |dd	t        j                  
       t        ddit        j                        S t        ddit        j                        S )Nr/   r<   zEmail is requiredr   r   z No account found with this emailr*   Tz&registration/password_reset_email.html)r   	use_httpsemail_template_name
from_emailr8   z&Password reset email sent successfullyzInvalid email address)r+   rf   r   r   rH   r   ro   r   existsr   r?   r@   r   DEFAULT_FROM_EMAILr   )rL   r   r/   forms       rS   r   zForgotPasswordView.postW  s      )-.v7R7R 
 ||"""/668<=22  !w&67==?II$L#66	   DE))  -.v7R7R
 	
r   N)r   r   r   r   r   r   rS   r   r   F  s    "
r   r   )*rest_framework.viewsr   rest_framework.responser   rest_frameworkr   rest_framework_simplejwt.viewsr   django.contrib.authr   users.serializersr	   r
   r   r   r   r   django.contrib.auth.formsr   django.confr   r   r   r   r   r   django.utilsr   drf_spectacular.utilsr   r   r   r   rg   rl   	django.dbr   CreateAPIViewr$   r   r   r   r   r   rS   <module>r      s   ( , ! > &  8   + 8 8 % ! @ !   !&N#
		m"'' m"m"^ 
P %3
 %+	 !*-
" 	'-x&8VXDVW
)6s"# s"76s"j 
Xi&(AS5TUV	
 

> 
	9"VX$67 	
 y68:L.MNw8J.KL 
 
! 
r   