
    (\i'"                         d 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gZ	 ddlZd	Zed
dgz  Zh d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)cached_property
HAS_GEOIP2TGeoIP2GeoIP2ExceptionF>   GeoIP2-CityGeoLite2-CityDBIP-City-LiteGeoIP2-CountryGeoLite2-CountryDBIP-Country-Litec                       e Zd Zy)r
   N)__name__
__module____qualname__     i/home/devuser/fomin/mqttuser/mqtt_project/myenv/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ed        Zed        ZdddZd Zd Zd Zd Zd Zd Z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                  }|t        vrt        d|       y)aH  
        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.z#Unable to handle database edition: )cache_optionsr
   getattrr   r   is_file_pathgeoip2databaseReader_reader	_metadatadatabase_typeSUPPORTED_DATABASE_TYPES)selfpathcachecountrycityr+   s         r   __init__zGeoIP2.__init__F   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 88!$G"WXX 9r   c                 R    | j                   r| j                   j                          y y N)r)   closer-   s    r   __del__zGeoIP2.__del__z   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__   sU    NNa334Aa6S6S5TU4>>**+2gYi

|2NNr   c                 6    | j                   j                         S r4   )r)   metadatar6   s    r   r*   zGeoIP2._metadata   s    ||$$&&r   c                 2    d| j                   j                  v S )NCityr*   r+   r6   s    r   is_cityzGeoIP2.is_city   s    5555r   c                 2    d| j                   j                  v S )NCountryrF   r6   s    r   
is_countryzGeoIP2.is_country   s    DNN8888r   Frequire_cityc                   t        |t        t        j                  t        j                  f      s!t        dt        |      j                  z        |r$| j                  st        d| j                         t        |t              r	 t        |       | j                  r| j                  j                   n| j                  j"                  } ||      S # t        $ r t        j                  |      }Y `w xY w)NzSGeoIP query must be a string or instance of IPv4Address or IPv6Address, not type %szInvalid GeoIP city data file: )
isinstancestr	ipaddressIPv4AddressIPv6Address	TypeErrortyper   rG   r
   r%   r   r   socketgethostbynamer)   r1   r0   )r-   queryrL   functions       r   _queryzGeoIP2._query   s    %#y'<'<i>S>S!TU+-1%[-A-AB 
 !$B4::,"OPPeS!4&u-
 )-4<<$$$,,:N:N # 4,,U34s   C C43C4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).
        TrK   r   Naccuracy_radiusr1   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)rY   subdivisionslocationr[   r1   name	continentcoder0   iso_coder`   ra   rb   rc   postalrg   )r-   rW   responseri   s       r   r1   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.r^   r0   r-   rW   s     r   r^   zGeoIP2.country_code       ||E">22r   c                 *    | j                  |      d   S )z9Return the country name for the given IP Address or FQDN.r_   rs   rt   s     r   r_   zGeoIP2.country_name   ru   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.
        FrK   )r\   r]   r^   r_   r`   )rY   rm   rn   rl   r0   ro   r`   )r-   rW   rq   s      r   r0   zGeoIP2.country   sk     ;;u5;9&0055&0055$,,55$,,11$,$4$4$I$I
 	
r   c                 8    | j                  |      }|d   |d   fS )z@Return a tuple of the (longitude, latitude) for the given query.rb   ra   r1   r-   rW   datas      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.ra   rb   ry   rz   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-   rW   r   s      r   geoszGeoIP2.geos   s     	2T\\%(t44r   )Nr   NN)r   r   r   	MODE_AUTOMODE_MMAP_EXT	MODE_MMAP	MODE_FILEMODE_MEMORY	frozensetr"   r%   r)   r2   r7   rA   r   r*   rG   rJ   rY   r1   r^   r_   r0   r|   r~   r   r   r   r   r	   r	   3   s     IMIIK	M9iEM EG2Yh!
O
 ' ' 6 6 9 9 -2 (
833
3
3
5r   )__doc__rP   rU   django.confr   django.core.exceptionsr   django.core.validatorsr   django.utils._osr   django.utils.functionalr   __all__geoip2.databaser&   r   ImportErrorr,   	Exceptionr
   r	   r   r   r   <module>r      s}        2 9 $ 3.- J+,,G
 	i 	s5 s5/  Js   A AA