o
    h                     @   sD   d dl mZ d dlmZ ddlmZmZ d dlZG dd deZdS )    )MiddlewareMixin)timezone   )
VisitorLogPageViewNc                       s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )AnalyticsMiddlewarec                    s    || _ g d| _t | d S )N)
botcrawlerspiderscraper	googlebotbingbotfacebookexternalhit
twitterbotlinkedinbotwhatsapp)get_responsebot_patternssuper__init__)selfr   	__class__ )/var/www/html/pos/analytics/middleware.pyr   	   s   
zAnalyticsMiddleware.__init__c                    s   t  fdddD rd S |  } jdd}  } jdd} jj}| |}ztj	j
||||||d | || W d S  tyL   Y d S w )Nc                 3   s    | ]	} j |V  qd S N)path
startswith).0r   requestr   r   	<genexpr>       z6AnalyticsMiddleware.process_request.<locals>.<genexpr>)z/admin/z/static/z/media/z/api/HTTP_USER_AGENT HTTP_REFERER)
ip_address
user_agentpage_visitedreferrersession_keyis_bot)anyget_client_ipMETAgetget_full_pathsessionr*   r+   r   objectscreateupdate_page_views	Exception)r   r    r&   r'   r(   r)   r*   r+   r   r   r   process_request   s.   


z#AnalyticsMiddleware.process_requestc                 C   s6   |j d}|r|dd  }|S |j d}|S )z%Get the real IP address of the clientHTTP_X_FORWARDED_FOR,r   REMOTE_ADDR)r.   r/   splitstrip)r   r    x_forwarded_foripr   r   r   r-   5   s   z!AnalyticsMiddleware.get_client_ipc                    s    |   t fdd| jD S )z'Check if the user agent indicates a botc                 3   s    | ]	}t | V  qd S r   )research)r   patternuser_agent_lowerr   r   r!   A   r"   z-AnalyticsMiddleware.is_bot.<locals>.<genexpr>)lowerr,   r   )r   r'   r   rA   r   r+   >   s   zAnalyticsMiddleware.is_botc                 C   s   t   }tjj||dddd\}}| jd7  _|rAddlm} d| d| d| }|	|sA| j
d7  _
||dd	 |  d
S )zUpdate page view statisticsr   )views_countunique_views)	page_pathdatedefaultsr   )cache
page_view__TiQ N)r   nowrG   r   r2   get_or_createrD   django.core.cacherI   r/   rE   setsave)r   rF   r*   today	page_viewcreatedrI   	cache_keyr   r   r   r4   C   s   

z%AnalyticsMiddleware.update_page_views)	__name__
__module____qualname__r   r6   r-   r+   r4   __classcell__r   r   r   r   r      s    
"	r   )	django.utils.deprecationr   django.utilsr   modelsr   r   r>   r   r   r   r   r   <module>   s
   