
    k"g"                         d Z ddlZddlZddl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	gZ	 ddlZd
Zeddgz  Z G d de      Z G d d      Zy# e$ r dZY w xY w)aU  
This module houses the GeoIP2 object, a wrapper for the MaxMind GeoIP2(R)
Python API (https://geoip2.readthedocs.io/). This is an alternative to the
Python GeoIP2 interface provided by MaxMind.

GeoIP(R) is a registered trademark of MaxMind, Inc.

For IP-based geolocation, this module requires the GeoLite2 Country and City
datasets, in binary format (CSV will not work!). The datasets may be
downloaded from MaxMind at https://dev.maxmind.com/geoip/geoip2/geolite2/.
Grab GeoLite2-Country.mmdb.gz and GeoLite2-City.mmdb.gz, and unzip them in the
directory corresponding to settings.GEOIP_PATH.
    N)settings)ValidationError)validate_ipv46_address)to_path)RemovedInDjango60Warning)cached_property
HAS_GEOIP2TGeoIP2GeoIP2ExceptionFc                       e Zd Zy)r   N)__name__
__module____qualname__     R/var/www/html/djangosite/lib/python3.12/site-packages/django/contrib/gis/geoip2.pyr   r   %   s    r   c                       e Zd ZdZdZdZdZdZ eeeeeef      Z	dZ
dZddZd Zd	 Zed
        ZdddZd Zd Zd Zd ZddZd Zd Zd Zed        Zy)r
   r               Nc                    || j                   vrt        d|z        |xs t        t        dd      }|xs t        t        dd      }|xs t        t        dd      }|st        d      t	        |      }|||z  ||z  fD ]A  }|j                         s|| _        t        j                  j                  ||	      | _
         n t        d
      | j                  j                  }|j                  d      st        d|       y)aI  
        Initialize the GeoIP object. No parameters are required to use default
        settings. Keyword arguments may be passed in to customize the locations
        of the GeoIP datasets.

        * path: Base directory to where GeoIP data is located or the full path
            to where the city or country data files (*.mmdb) are located.
            Assumes that both the city and country data sets are located in
            this directory; overrides the GEOIP_PATH setting.

        * cache: The cache settings when opening up the GeoIP datasets. May be
            an integer in (0, 1, 2, 4, 8) corresponding to the MODE_AUTO,
            MODE_MMAP_EXT, MODE_MMAP, MODE_FILE, and MODE_MEMORY,
            `GeoIPOptions` C API settings,  respectively. Defaults to 0,
            meaning MODE_AUTO.

        * country: The name of the GeoIP country data file. Defaults to
            'GeoLite2-Country.mmdb'; overrides the GEOIP_COUNTRY setting.

        * city: The name of the GeoIP city data file. Defaults to
            'GeoLite2-City.mmdb'; overrides the GEOIP_CITY setting.
        z Invalid GeoIP caching option: %s
GEOIP_PATHN
GEOIP_CITYzGeoLite2-City.mmdbGEOIP_COUNTRYzGeoLite2-Country.mmdbzDGeoIP path must be provided via parameter or the GEOIP_PATH setting.)modez@Path must be a valid database or directory containing databases.)CityCountryz#Unable to handle database edition: )cache_optionsr   getattrr   r   is_file_pathgeoip2databaseReader_reader	_metadatadatabase_typeendswith)selfpathcachecountrycityr(   s         r   __init__zGeoIP2.__init__<   s   . ***!"Du"LMM<wxt<Lwx7KLXWX@WX!V  t} 4$;w7 	D||~!
%55d5G		 "R  44%%&9:!$G"WXX ;r   c                 R    | j                   r| j                   j                          y y N)r&   closer*   s    r   __del__zGeoIP2.__del__p   s    <<LL  r   c                     | j                   }d|j                   d|j                   }d| j                  j                   d| d| j
                   dS )Nv.<z [z	] _path='z'>)r'   binary_format_major_versionbinary_format_minor_version	__class__r   r"   )r*   mversions      r   __repr__zGeoIP2.__repr__u   sU    NNa334Aa6S6S5TU4>>**+2gYi

|2NNr   c                 6    | j                   j                         S r1   )r&   metadatar3   s    r   r'   zGeoIP2._metadataz   s    ||$$&&r   Frequire_cityc                   t        |t        t        j                  t        j                  f      s!t        dt        |      j                  z        | j                  j                  j                  d      }|r|st        d| j                         	 t        |       |r| j"                  j$                  n| j"                  j&                  } ||      S # t        $ r t        j                   |      }Y Vw xY w)NzSGeoIP query must be a string or instance of IPv4Address or IPv6Address, not type %sr   zInvalid GeoIP city data file: )
isinstancestr	ipaddressIPv4AddressIPv6Address	TypeErrortyper   r'   r(   r)   r   r"   r   r   socketgethostbynamer&   r.   r-   )r*   queryrB   is_cityfunctions        r   _queryzGeoIP2._query~   s    %#y'<'<i>S>S!TU+-1%[-A-AB 
 ....77?!$B4::,"OPP	0"5)
 )04<<$$T\\5I5I  	0((/E	0s   C C54C5c                 $   | j                  |d      }|j                  r|j                  d   nd}i d|j                  j                  d|j                  j
                  d|j                  j                  d|j                  j
                  d	|j                  j                  d
|j                  j
                  d|j                  j                  d|j                  j                  d|j                  j                  d|j                  j                  d|j                  j                  d|r|j                  ndd|r|j
                  ndd|j                  j                  d|j                  j                  d|r|j                  S dS )z
        Return a dictionary of city information for the given IP address or
        Fully Qualified Domain Name (FQDN). Some information in the dictionary
        may be undefined (None).
        TrA   r   Naccuracy_radiusr.   continent_codecontinent_namecountry_codecountry_nameis_in_european_unionlatitude	longitude
metro_codepostal_coderegion_coderegion_name	time_zonedma_coderegion)rP   subdivisionslocationrR   r.   name	continentcoder-   iso_coderW   rX   rY   rZ   postalr^   )r*   rM   responser`   s       r   r.   zGeoIP2.city   s    ;;u4;8-5-B-B&&q)
x00@@
HMM&&
 h0055
 h0055	

 H,,55
 H,,11
 #H$4$4$I$I
 ))22
 **44
 (++66
 8??//
 f6??$
 &6;;d
 **44
  ))44!
" foo#
 	
" 6:#
 	
r   c                 *    | j                  |      d   S )z9Return the country code for the given IP Address or FQDN.rU   r-   r*   rM   s     r   rU   zGeoIP2.country_code       ||E">22r   c                 *    | j                  |      d   S )z9Return the country name for the given IP Address or FQDN.rV   rj   rk   s     r   rV   zGeoIP2.country_name   rl   r   c                     | j                  |d      }|j                  j                  |j                  j                  |j                  j
                  |j                  j                  |j                  j                  dS )z
        Return a dictionary with the country code and name when given an
        IP address or a Fully Qualified Domain Name (FQDN). For example, both
        '24.124.1.80' and 'djangoproject.com' are valid parameters.
        FrA   )rS   rT   rU   rV   rW   )rP   rd   re   rc   r-   rf   rW   )r*   rM   rh   s      r   r-   zGeoIP2.country   sk     ;;u5;9&0055&0055$,,55$,,11$,$4$4$I$I
 	
r   c                     t        j                  dt        d       | j                  |      t	        fd|D              S )Nz<GeoIP2.coords() is deprecated. Use GeoIP2.lon_lat() instead.r   
stacklevelc              3   (   K   | ]	  }|     y wr1   r   ).0odatas     r   	<genexpr>z GeoIP2.coords.<locals>.<genexpr>   s     /T!W/s   )warningswarnr   r.   tuple)r*   rM   orderingru   s      @r   coordszGeoIP2.coords   s9    J$	

 yy/h///r   c                 8    | j                  |      }|d   |d   fS )z@Return a tuple of the (longitude, latitude) for the given query.rY   rX   r.   r*   rM   ru   s      r   lon_latzGeoIP2.lon_lat   s%    yyK $z"222r   c                 8    | j                  |      }|d   |d   fS )z@Return a tuple of the (latitude, longitude) for the given query.rX   rY   r}   r~   s      r   lat_lonzGeoIP2.lat_lon   s%    yyJk!222r   c                 @    ddl m}  || j                  |      d      S )z/Return a GEOS Point object for the given query.r   )Pointi  )srid)django.contrib.gis.geosr   r   )r*   rM   r   s      r   geoszGeoIP2.geos   s     	2T\\%(t44r   c                 R    t        j                  dt        d       t        ||      S )Nz2GeoIP2.open() is deprecated. Use GeoIP2() instead.r   rp   )rw   rx   r   r
   )cls	full_pathr,   s      r   openzGeoIP2.open   s&    @$	

 i''r   )Nr   NN))rY   rX   )r   r   r   	MODE_AUTOMODE_MMAP_EXT	MODE_MMAP	MODE_FILEMODE_MEMORY	frozensetr   r"   r&   r/   r4   r>   r   r'   rP   r.   rU   rV   r-   r{   r   r   r   classmethodr   r   r   r   r
   r
   )   s     IMIIK	M9iEM EG2Yh!
O
 ' ' -2 *
833
03
3
5 ( (r   )__doc__rF   rK   rw   django.confr   django.core.exceptionsr   django.core.validatorsr   django.utils._osr   django.utils.deprecationr   django.utils.functionalr   __all__geoip2.databaser#   r	   ImportError	Exceptionr   r
   r   r   r   <module>r      s{         2 9 $ = 3.- J+,,G	i 	~( ~(  Js   A A$#A$