
    2fh
                     D    d dl mZ d dlmZ ddlmZ d dlZ G d d      Zy)    )timezone)AnonymousUser   )LoginSessionNc                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	LoginSessionTrackingMiddlewarez'Middleware to track user login sessionsc                     || _         y )N)get_response)selfr
   s     /backend/users/middleware.py__init__z'LoginSessionTrackingMiddleware.__init__	   s
    (    c                     | j                  |      }t        |d      rAt        |j                  t              s'|j
                  j                  r| j                  |       |S )Nuser)r
   hasattr
isinstancer   r   sessionsession_keytrack_session)r   requestresponses      r   __call__z'LoginSessionTrackingMiddleware.__call__   sL    $$W- GV$7<<7OO''w'r   c                 r   |j                   j                  }|j                  }|j                  j	                  dd      }t        j                  |      }| j                  |      }t        j                  j                  ||||| j                  |      |j                  j                   d|j                  j                   |j                  j                   d|j                  j                   | j!                  |      d      \  }}|s-t#        j$                         |_        |j)                  dg       yy)	zTrack or update login sessionHTTP_USER_AGENT  )r   
ip_address
user_agentdevice_typebrowseroperating_systemlocation)r   defaultslast_activity)update_fieldsN)r   r   r   METAgetuser_agentsparseget_client_ipr   objectsget_or_createget_device_typer    familyversion_stringosget_locationr   nowr$   save)	r   r   r   r   user_agent_stringr   r   login_sessioncreateds	            r   r   z,LoginSessionTrackingMiddleware.track_session   s   oo11|| $LL,,->C &&'89
''0
 ".!5!5!C!C#(/#33J?(00778*:L:L:[:[9\]'1}}';';&<Ajmm>Z>Z=[$\ --j9 "D "
w *2,,.M'o->? r   c                     |j                   j                  d      }|r|j                  d      d   }|S |j                   j                  d      }|S )zGet client IP addressHTTP_X_FORWARDED_FOR,r   REMOTE_ADDR)r&   r'   split)r   r   x_forwarded_forips       r   r*   z,LoginSessionTrackingMiddleware.get_client_ip6   sQ    !,,**+AB &&s+A.B 	 !!-0B	r   c                 R    |j                   ry|j                  ry|j                  ryy)zDetermine device typeMobileTabletDesktopUnknown)	is_mobile	is_tabletis_pc)r   r   s     r   r-   z.LoginSessionTrackingMiddleware.get_device_type?   s)    !!r   c                      y)zBGet approximate location (implement geolocation service if needed)zUnknown Location )r   r   s     r   r1   z+LoginSessionTrackingMiddleware.get_locationJ   s     "r   N)
__name__
__module____qualname____doc__r   r   r   r*   r-   r1   rG   r   r   r   r      s$    1)@:	"r   r   )django.utilsr   django.contrib.auth.modelsr   modelsr   r(   r   rG   r   r   <module>rO      s    ! 4   H" H"r   