B
    ¥0H[I#  ã               @   s’   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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é   )Ú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   úbC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\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   sJ  || j kr|| _ntd| ƒ‚|s6td }|s6tdƒ‚t|tƒsRtdt|ƒj ƒ‚t	j
 |¡rÔt	j
 ||pptd ¡}t	j
 |¡r˜tjj||d�| _|| _t	j
 ||pªtd ¡}t	j
 |¡rÒtjj||d�| _|| _nrt	j
 |¡�r>tjj||d�}| ¡ j}| d¡�r|| _|| _n&| d	¡�r0|| _|| _ntd
| ƒ‚ntdƒ‚dS )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.zInvalid path type: %sr
   )Úmoder	   r   r   z(Unable to recognize database edition: %sz-GeoIP path must be a valid file or directory.N)Úcache_optionsÚ_cacher   ÚGEOIP_SETTINGSÚ
isinstanceÚstrÚ	TypeErrorÚtyper   ÚosÚpathÚisdirÚjoinÚisfileÚgeoip2ZdatabaseÚReaderÚ_countryÚ_country_fileÚ_cityÚ
_city_fileÚmetadataZdatabase_typeÚendswith)	Úselfr   ÚcacheÚcountryÚcityZ
country_dbZcity_dbÚreaderZdb_typer   r   r   Ú__init__.   s:    


zGeoIP2.__init__c             C   s   | j r| j S | jS d S )N)r%   r'   )r+   r   r   r   Ú_readert   s    zGeoIP2._readerc             C   s   | j r| j jS | jjS d S )N)r%   r-   r'   r.   )r+   r   r   r   Ú_country_or_city{   s    zGeoIP2._country_or_cityc             C   s   | j r| j  ¡  d S )N)r1   Úclose)r+   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.   )r1   r)   Úbinary_format_major_versionÚbinary_format_minor_versionÚ	__class__r   r&   r(   )r+   Úmetar6   r   r   r   Ú__repr__‡   s    
zGeoIP2.__repr__Fc             C   s˜   t |tƒstdt|ƒj ƒ‚|r6| js6| js6tdƒ‚n2|rP| jsPtd| j ƒ‚n|rh| jshtd| j	 ƒ‚yt
|ƒ W n tk
r’   t |¡}Y nX |S )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)r   r   r   r   r   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.   )r@   r   r'   r.   )r+   r>   Ú	enc_queryr   r   r   r.   §   s    zGeoIP2.cityc             C   s   | j |dd�}|  |¡d S )z9Return the country code for the given IP Address or FQDN.T)r?   Úcountry_code)r@   r-   )r+   r>   rA   r   r   r   rB   °   s    zGeoIP2.country_codec             C   s   | j |dd�}|  |¡d S )z9Return the country name for the given IP Address or FQDN.T)r?   Úcountry_name)r@   r-   )r+   r>   rA   r   r   r   rC   µ   s    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.
        T)r?   )r@   r   r2   )r+   r>   rA   r   r   r   r-   º   s    zGeoIP2.country©Ú	longitudeÚlatitudec                s0   |   |¡‰ ˆ d krd S t‡ fdd„|D ƒƒS d S )Nc             3   s   | ]}ˆ | V  qd S )Nr   )Ú.0Úo)Úcdictr   r   ú	<genexpr>Ê   s    z GeoIP2.coords.<locals>.<genexpr>)r.   Útuple)r+   r>   Zorderingr   )rI   r   ÚcoordsÅ   s    
zGeoIP2.coordsc             C   s
   |   |¡S )z@Return a tuple of the (longitude, latitude) for the given query.)rL   )r+   r>   r   r   r   Úlon_latÌ   s    zGeoIP2.lon_latc             C   s   |   |d¡S )z@Return a tuple of the (latitude, longitude) for the given query.)rF   rE   )rL   )r+   r>   r   r   r   Úlat_lonÐ   s    zGeoIP2.lat_lonc             C   s.   |   |¡}|r&ddlm} ||dd�S dS dS )z/Return a GEOS Point object for the given query.r   )ÚPointiæ  )ZsridN)rM   Zdjango.contrib.gis.geosrO   )r+   r>   ZllrO   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
)r1   r)   r7   r8   )r+   r:   r   r   r   ÚinfoÞ   s    
zGeoIP2.infoc             C   s
   t ||ƒS )N)r   )r5   Ú	full_pathr,   r   r   r   Úopenä   s    zGeoIP2.open)Nr   NN)FFF)rD   ) r   r   r   Z	MODE_AUTOZMODE_MMAP_EXTZ	MODE_MMAPZ	MODE_FILEZMODE_MEMORYÚ	frozensetr   r(   r&   r'   r%   r0   Úpropertyr1   r2   r4   r;   r@   r.   rB   rC   r-   rL   rM   rN   rP   rQ   ÚclassmethodrS   r   r   r   r   r      s4   
F

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