o
    b#                     @   s   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mZ eeddeed	d
eedddZG dd deZG dd dZdS )    N)settings)ValidationError)validate_ipv46_address)to_path   )CityCountry
GEOIP_PATH
GEOIP_CITYzGeoLite2-City.mmdbGEOIP_COUNTRYzGeoLite2-Country.mmdb)r	   r
   r   c                   @   s   e Zd ZdS )GeoIP2ExceptionN)__name__
__module____qualname__ r   r   ]/var/www/secure340b-portal/env/lib/python3.10/site-packages/django/contrib/gis/geoip2/base.pyr      s    r   c                   @   s   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ZdZd*dd	Zed
d Zedd Zdd Zdd Zd+ddZdd Zdd Zdd Zdd Zd,ddZd d! Zd"d# Zd$d% Zed&d' Zed(d) ZdS )-GeoIP2r   r             Nc           	      C   s2  || j v r	|| _ntd| |ptd }|stdt|}| rb||p)td  }| r=tjj	t
||d| _|| _||pCtd  }| rWtjj	t
||d| _|| _| js`td| dS | rtjj	t
||d}| j}|dr|| _|| _dS |d	r|| _|| _dS td
| td)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: %sr	   zDGeoIP path must be provided via parameter or the GEOIP_PATH setting.r   )moder
   z"Could not load a database from %s.r   r   z(Unable to recognize database edition: %sz-GeoIP path must be a valid file or directory.N)cache_options_cacher   GEOIP_SETTINGSr   is_diris_filegeoip2ZdatabaseReaderstr_country_country_file_city
_city_file_readermetadataZdatabase_typeendswith)	selfpathcachecountrycityZ
country_dbZcity_dbreaderZdb_typer   r   r   __init__.   s<   





zGeoIP2.__init__c                 C   s   | j p| jS N)r    r"   r'   r   r   r   r$   t      zGeoIP2._readerc                 C   s   | j r| j jS | jjS r.   )r    r*   r"   r+   r/   r   r   r   _country_or_cityx   s   zGeoIP2._country_or_cityc                 C   s   | j r
| j   d S d S r.   )r$   closer/   r   r   r   __del__   s   zGeoIP2.__del__c                 C   s4   | j  }d|j|jf }d| jj|| j| jd S )Nz[v%s.%s]zH<%(cls)s %(version)s _country_file="%(country)s", _city_file="%(city)s">)clsversionr*   r+   )r$   r%   binary_format_major_versionbinary_format_minor_version	__class__r   r!   r#   )r'   metar5   r   r   r   __repr__   s   
zGeoIP2.__repr__Fc                 C   s   t |tstdt|j |r| js| jstd|r&| js&td| j |r2| js2td| j	 zt
| W |S  tyH   t|}Y |S w )z*Check the query and database availability.z)GeoIP query must be a string, not type %sz*Invalid GeoIP country and city data files.z#Invalid GeoIP country data file: %sz Invalid GeoIP city data file: %s)
isinstancer   	TypeErrortyper   r    r"   r   r!   r#   r   r   socketgethostbyname)r'   queryr*   r+   city_or_countryr   r   r   _check_query   s   



zGeoIP2._check_queryc                 C   s   | j |dd}t| j|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).
        T)r+   )rB   r   r"   r+   r'   r@   Z	enc_queryr   r   r   r+      s   zGeoIP2.cityc                 C      | j |dd}| |d S )z9Return the country code for the given IP Address or FQDN.TrA   country_coderB   r*   rC   r   r   r   rF         zGeoIP2.country_codec                 C   rD   )z9Return the country name for the given IP Address or FQDN.TrE   country_namerG   rC   r   r   r   rI      rH   zGeoIP2.country_namec                 C   s   | j |dd}t| |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.
        TrE   )rB   r   r1   rC   r   r   r   r*      s   zGeoIP2.country	longitudelatitudec                    s,   |  |  d u rd S t fdd|D S )Nc                 3   s    | ]} | V  qd S r.   r   ).0oZcdictr   r   	<genexpr>   s    z GeoIP2.coords.<locals>.<genexpr>)r+   tuple)r'   r@   Zorderingr   rO   r   coords   s   
zGeoIP2.coordsc                 C   s
   |  |S )z@Return a tuple of the (longitude, latitude) for the given query.rR   r'   r@   r   r   r   lon_lat      
zGeoIP2.lon_latc                 C   s   |  |dS )z@Return a tuple of the (latitude, longitude) for the given query.)rL   rK   rS   rT   r   r   r   lat_lon   r0   zGeoIP2.lat_lonc                 C   s*   |  |}|rddlm} ||ddS dS )z/Return a GEOS Point object for the given query.r   )Pointi  )ZsridN)rU   Zdjango.contrib.gis.geosrX   )r'   r@   llrX   r   r   r   geos   s
   
zGeoIP2.geosc                 C   s   | j  }d|j|jf S )z@Return information about the GeoIP library and databases in use.zGeoIP Library:
	%s.%s
)r$   r%   r6   r7   )r'   r9   r   r   r   info   s   
zGeoIP2.infoc                 C   s
   t ||S r.   )r   )r4   	full_pathr)   r   r   r   open   rV   zGeoIP2.open)Nr   NN)FFF)rJ   ) r   r   r   Z	MODE_AUTOZMODE_MMAP_EXTZ	MODE_MMAPZ	MODE_FILEZMODE_MEMORY	frozensetr   r#   r!   r"   r    r-   propertyr$   r1   r3   r:   rB   r+   rF   rI   r*   rR   rU   rW   rZ   r[   classmethodr]   r   r   r   r   r      s>    
F



	


r   )r>   Zgeoip2.databaser   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.core.validatorsr   Zdjango.utils._osr   	resourcesr   r   getattrr   	Exceptionr   r   r   r   r   r   <module>   s    


