3
gUD                 @   s2  d dl mZ d dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d d	lmZ eeefZG d
d dZG dd deeZG dd deZ G dd dZ!G dd dZ"G dd de"eZ#G dd deZ$G dd deZ%G dd deZ&G dd deZ'G dd deZ(G d d! d!eZ)G d"d# d#eZ*G d$d% d%e"e Z+G d&d' d'e"e Z,G d(d) d)e"e Z-G d*d+ d+Z.G d,d- d-e.e"eZ/G d.d/ d/e Z0G d0d1 d1e Z1G d2d3 d3eZ2G d4d5 d5eZ3G d6d7 d7e"e Z4ej5G d8d9 d9e"eeZ6G d:d; d;e.e"eZ7G d<d= d=eZ8G d>d? d?e Z9G d@dA dAeZ:G dBdC dCeZ;G dDdE dEeZ<G dFdG dGe.e"eZ=G dHdI dIe"e Z>G dJdK dKeZ?G dLdM dMe!e Z@G dNdO dOe!e ZAG dPdQ dQe"e ZBG dRdS dSe ZG dTdU dUe@ZCG dVdW dWe"e ZDdXS )Y    )Decimal)BaseSpatialFieldGeometryField)	AreaFieldDistanceField)GEOSGeometry)
FieldError)NotSupportedError)BinaryFieldBooleanField
FloatFieldFuncIntegerField	TextField	TransformValue)Cast)cached_propertyc                   s`   e Zd ZdZdZ fddZedd Zedd Z	d fd	d
	Z
 fddZdddZ  ZS )GeoFuncMixinNr   c                s   t  j|| x| jD ]}| j| }t|ts0qy
|j}W n tk
rR   d }Y nX |j}t|t	 sv|rt|t
 rtd| j|d f |j r| rtd|st|t
|jdd| j|< qW d S )Nz9%s function requires a geometric argument in position %d.   z$SRID is required for all geometries.)srid)output_field)super__init__geom_param_possource_expressions
isinstancer   r   r   valuer   r   	TypeErrornamer   
ValueError)selfexpressionsextraposexprr   Zgeom)	__class__ d/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/contrib/gis/db/models/functions.pyr      s     



zGeoFuncMixin.__init__c             C   s   | j jS )N)r&   __name__)r!   r'   r'   r(   r   *   s    zGeoFuncMixin.namec             C   s   | j | jd  jS )Nr   )r   r   field)r!   r'   r'   r(   	geo_field.   s    zGeoFuncMixin.geo_fieldc                s:   | j d kr |d kr |jj| j}t j||fd|i|S )Nfunction)r,   opsspatial_function_namer   r   as_sql)r!   compiler
connectionr,   extra_context)r&   r'   r(   r/   2   s    zGeoFuncMixin.as_sqlc       
         s   t  j||}|j }x>| jD ]4}|| }t|tstd| j|d t|j	f qW |j
j}xH| jdd  D ]6}|j| }|jj}	|	|krnt||j|||j|< qnW |S )Nz<%s function requires a GeometryField in position %s, got %s.r   )r   resolve_expressionget_source_fieldsr   r   r   r   r   typer)   r+   r   r   r   r   )
r!   argskwargsresZsource_fieldsr$   r*   Z	base_sridr%   Z	expr_srid)r&   r'   r(   r3   7   s    

zGeoFuncMixin.resolve_expression c             C   s.   t |ds*|r*t|| r*td||f |S )Nr3   z2The %s parameter has the wrong type: should be %s.)hasattrr   r   )r!   r   
param_nameZcheck_typesr'   r'   r(   _handle_paramN   s    
zGeoFuncMixin._handle_param)r   )N)r9   N)r)   
__module____qualname__r,   r   r   propertyr   r   r+   r/   r3   r<   __classcell__r'   r'   )r&   r(   r      s   r   c               @   s   e Zd ZdS )GeoFuncN)r)   r=   r>   r'   r'   r'   r(   rA   X   s   rA   c               @   s   e Zd Zedd ZdS )GeomOutputGeoFuncc             C   s   t | jjdS )N)r   )r   r+   r   )r!   r'   r'   r(   r   ]   s    zGeomOutputGeoFunc.output_fieldN)r)   r=   r>   r   r   r'   r'   r'   r(   rB   \   s   rB   c               @   s   e Zd ZdZdd ZdS )SQLiteDecimalToFloatMixinz
    By default, Decimal values are converted to str by the SQLite backend, which
    is not acceptable by the GIS functions expecting numeric values.
    c             K   s0   | j  }|jdd |j D  |j||f|S )Nc             S   s4   g | ],}t |d r,t|jtr,tt|jn|qS )r   )r:   r   r   r   r   float).0r%   r'   r'   r(   
<listcomp>j   s   z7SQLiteDecimalToFloatMixin.as_sqlite.<locals>.<listcomp>)copyset_source_expressionsget_source_expressionsr/   )r!   r0   r1   r2   rG   r'   r'   r(   	as_sqliteg   s
    z#SQLiteDecimalToFloatMixin.as_sqliteN)r)   r=   r>   __doc__rJ   r'   r'   r'   r(   rC   b   s   rC   c               @   s   e Zd ZdZdd ZdS )OracleToleranceMixing?c             K   sJ   t | j| jjd| jdt}| j }|j| j |f |j	||f|S )N	tolerance)
r   r<   r#   getrM   NUMERIC_TYPESrG   rH   rI   r/   )r!   r0   r1   r2   rM   cloner'   r'   r(   	as_oraclet   s    zOracleToleranceMixin.as_oracleN)r)   r=   r>   rM   rQ   r'   r'   r'   r(   rL   q   s   rL   c                   s4   e Zd ZdZedd Z fddZdd Z  ZS )Arear   c             C   s
   t | jS )N)r   r+   )r!   r'   r'   r(   r      s    zArea.output_fieldc                s0   |j j r| jj|rtdt j||f|S )Nz2Area on geodetic coordinate systems not supported.)featuresZsupports_area_geodeticr+   geodeticr	   r   r/   )r!   r0   r1   r2   )r&   r'   r(   r/      s    zArea.as_sqlc             K   s,   | j j|rd|d< d|d< | j||f|S )Nz+%(function)s(%(expressions)s, %(spheroid)d)templateTspheroid)r+   rT   r/   )r!   r0   r1   r2   r'   r'   r(   rJ      s    zArea.as_sqlite)	r)   r=   r>   arityr   r   r/   rJ   r@   r'   r'   )r&   r(   rR      s   rR   c               @   s   e Zd Ze ZdZdZdS )Azimuth   r   r   N)r   r   )r)   r=   r>   r   r   rW   r   r'   r'   r'   r(   rX      s   rX   c                   s0   e Zd Ze Zd fdd	Z fddZ  ZS )	AsGeoJSONF   c                sf   |g}|d k	r"|j | j|dt d}|r4|r4d}n|r>d}n|rFd}|rT|j | t j|| d S )N	precisionr      r   rY   )appendr<   intr   r   )r!   
expressionZbboxZcrsr\   r#   r"   options)r&   r'   r(   r      s    
zAsGeoJSON.__init__c                s8   | j  }| j }|j|d d  tt|j||f|S )Nr   )rI   rG   rH   r   rZ   r/   )r!   r0   r1   r2   r   rP   )r&   r'   r(   rQ      s    zAsGeoJSON.as_oracle)FFr[   )r)   r=   r>   r   r   r   rQ   r@   r'   r'   )r&   r(   rZ      s   rZ   c                   s4   e Zd ZdZe Zd	 fdd	Z fddZ  ZS )
AsGMLr   rY   r[   c                s6   ||g}|d k	r$|j | j|dt t j|| d S )Nr\   )r^   r<   r_   r   r   )r!   r`   versionr\   r#   r"   )r&   r'   r(   r      s    zAsGML.__init__c                sT   | j  }|d }| j }|j|d g |jdkr6dnd|d< tt|j||f|S )Nr   r   r]   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr,   )rI   rG   rH   r   r   rb   r/   )r!   r0   r1   r2   r   rc   rP   )r&   r'   r(   rQ      s    zAsGML.as_oracle)r   )rY   r[   )	r)   r=   r>   r   r   r   r   rQ   r@   r'   r'   )r&   r(   rb      s   rb   c                   s$   e Zd Ze Zd fdd	Z  ZS )AsKMLr[   c                s4   |g}|d k	r"|j | j|dt t j|| d S )Nr\   )r^   r<   r_   r   r   )r!   r`   r\   r#   r"   )r&   r'   r(   r      s    zAsKML.__init__)r[   )r)   r=   r>   r   r   r   r@   r'   r'   )r&   r(   rd      s   rd   c                   s$   e Zd Ze Zd fdd	Z  ZS )AsSVGFr[   c                s<   t |dr|nt|}||| j|dtg}t j|| d S )Nr3   r\   )r:   r_   r<   r   r   )r!   r`   Zrelativer\   r#   r"   )r&   r'   r(   r      s
    zAsSVG.__init__)Fr[   )r)   r=   r>   r   r   r   r@   r'   r'   )r&   r(   re      s   re   c               @   s   e Zd Ze ZdZdS )AsWKBr   N)r)   r=   r>   r
   r   rW   r'   r'   r'   r(   rf      s   rf   c               @   s   e Zd Ze ZdZdS )AsWKTr   N)r)   r=   r>   r   r   rW   r'   r'   r'   r(   rg      s   rg   c                   s*   e Zd Zd fdd	Z fddZ  ZS )BoundingCircle0   c                s   t  j||f| d S )N)r   r   )r!   r`   Znum_segr#   )r&   r'   r(   r      s    zBoundingCircle.__init__c                s2   | j  }|j| j d g tt|j||f|S )Nr   )rG   rH   rI   r   rh   rQ   )r!   r0   r1   r2   rP   )r&   r'   r(   rQ      s    zBoundingCircle.as_oracle)ri   )r)   r=   r>   r   rQ   r@   r'   r'   )r&   r(   rh      s   rh   c               @   s   e Zd ZdZdS )Centroidr   N)r)   r=   r>   rW   r'   r'   r'   r(   rj      s   rj   c               @   s   e Zd ZdZdZdS )
DifferencerY   r   r   N)r   r   )r)   r=   r>   rW   r   r'   r'   r'   r(   rk      s   rk   c               @   s    e Zd Zedd Zdd ZdS )DistanceResultMixinc             C   s
   t | jS )N)r   r+   )r!   r'   r'   r(   r      s    z DistanceResultMixin.output_fieldc             C   s   | j jo| j jdkS )Ni  )r+   	geographyr   )r!   r'   r'   r(   source_is_geography   s    z'DistanceResultMixin.source_is_geographyN)r)   r=   r>   r   r   rn   r'   r'   r'   r(   rl      s   rl   c                   s>   e Zd Zd
ZdZd fdd	Z fddZ fdd	Z  ZS )Distancer   r   Nc                s2   ||g}|d k	r | j |dt| _t j|| d S )NrV   )r<   boolrV   r   r   )r!   expr1expr2rV   r#   r"   )r&   r'   r(   r     s    zDistance.__init__c                s   | j  }d }|jd }| j }|jj|krZt|tr>||j_nt|t|jj	|d|jd< | r| j
j|r| jr|jjd}|jjt| j
j| n|jjd}tt|j||fd|i|S )Nr   )r   rm   ZDistanceSpheroidZDistanceSpherer,   )rG   r   rn   r   rm   r   r   r   r   r   r+   rT   rV   r-   r.   r^   r   ro   r/   )r!   r0   r1   r2   rP   r,   rr   rm   )r&   r'   r(   as_postgresql  s     


zDistance.as_postgresqlc                s8   | j j|r&d|d< tt| j|d< t j||f|S )Nz8COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)rU   rV   )r+   rT   r_   rp   rV   r   r/   )r!   r0   r1   r2   )r&   r'   r(   rJ   $  s    zDistance.as_sqlite)r   r   )N)	r)   r=   r>   r   rV   r   rs   rJ   r@   r'   r'   )r&   r(   ro     s
   ro   c               @   s   e Zd ZdZdS )Enveloper   N)r)   r=   r>   rW   r'   r'   r'   r(   rt   ,  s   rt   c               @   s   e Zd ZdZdS )ForcePolygonCWr   N)r)   r=   r>   rW   r'   r'   r'   r(   ru   0  s   ru   c                   s,   e Zd Ze Zd fdd	Zdd Z  ZS )GeoHashNc                s4   |g}|d k	r"|j | j|dt t j|| d S )Nr\   )r^   r<   r_   r   r   )r!   r`   r\   r#   r"   )r&   r'   r(   r   7  s    zGeoHash.__init__c             K   s6   | j  }t|jdk r&|jjtd |j||f|S )NrY   d   )rG   lenr   r^   r   r/   )r!   r0   r1   r2   rP   r'   r'   r(   as_mysql=  s    zGeoHash.as_mysql)N)r)   r=   r>   r   r   r   ry   r@   r'   r'   )r&   r(   rv   4  s   rv   c               @   s"   e Zd Ze ZdZdZdZdZdS )GeometryDistancerY   r9   z <-> r   r   N)r   r   )	r)   r=   r>   r   r   rW   r,   Z
arg_joinerr   r'   r'   r'   r(   rz   E  s
   rz   c               @   s   e Zd ZdZdZdS )IntersectionrY   r   r   N)r   r   )r)   r=   r>   rW   r   r'   r'   r'   r(   r{   M  s   r{   c                   s&   e Zd ZdZe Z fddZ  ZS )IsValidZisvalidc                s"   t  j||f|\}}d| |fS )Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   rQ   )r!   r0   r1   r2   Zsqlparams)r&   r'   r(   rQ   W  s    zIsValid.as_oracle)r)   r=   r>   lookup_namer   r   rQ   r@   r'   r'   )r&   r(   r|   R  s   r|   c                   sB   e Zd Zd
 fdd	Z fddZ fddZ fdd	Z  ZS )LengthTc                s   || _ t j|f| d S )N)rV   r   r   )r!   rq   rV   r#   )r&   r'   r(   r   ]  s    zLength.__init__c                s0   | j j|r|jj rtdt j||f|S )Nz6This backend doesn't support Length on geodetic fields)r+   rT   rS   Zsupports_length_geodeticr	   r   r/   )r!   r0   r1   r2   )r&   r'   r(   r/   a  s    zLength.as_sqlc                s   | j  }d }| j r(|jjt| j nX| jj|rZ|jj	d}|jjt| jj| n&t
dd | j D }|dkr|jj}tt|j||fd|i|S )NZLengthSpheroidc             s   s   | ]}|r|j V  qd S )N)dim)rE   fr'   r'   r(   	<genexpr>p  s    z'Length.as_postgresql.<locals>.<genexpr>rY   r,   )rG   rn   r   r^   r   rV   r+   rT   r-   r.   minr4   Zlength3dr   r   r/   )r!   r0   r1   r2   rP   r,   r   )r&   r'   r(   rs   f  s    zLength.as_postgresqlc                s8   d }| j j|r| jrdnd}t j||fd|i|S )NZGeodesicLengthZGreatCircleLengthr,   )r+   rT   rV   r   r/   )r!   r0   r1   r2   r,   )r&   r'   r(   rJ   u  s    zLength.as_sqlite)T)r)   r=   r>   r   r/   rs   rJ   r@   r'   r'   )r&   r(   r   \  s   r   c               @   s   e Zd Ze ZdZdZdS )LineLocatePointrY   r   r   N)r   r   )r)   r=   r>   r   r   rW   r   r'   r'   r'   r(   r   |  s   r   c               @   s   e Zd ZdS )	MakeValidN)r)   r=   r>   r'   r'   r'   r(   r     s   r   c               @   s   e Zd Ze ZdZdS )MemSizer   N)r)   r=   r>   r   r   rW   r'   r'   r'   r(   r     s   r   c               @   s   e Zd Ze ZdZdS )NumGeometriesr   N)r)   r=   r>   r   r   rW   r'   r'   r'   r(   r     s   r   c               @   s   e Zd Ze ZdZdS )	NumPointsr   N)r)   r=   r>   r   r   rW   r'   r'   r'   r(   r     s   r   c                   s,   e Zd ZdZ fddZ fddZ  ZS )	Perimeterr   c                sb   d }| j j|r"| j  r"tdtdd | j D }|dkrH|jj}t j	||fd|i|S )Nz<ST_Perimeter cannot use a non-projected non-geography field.c             s   s   | ]}|j V  qd S )N)r   )rE   r   r'   r'   r(   r     s    z*Perimeter.as_postgresql.<locals>.<genexpr>rY   r,   )
r+   rT   rn   r	   r   r4   r-   Zperimeter3dr   r/   )r!   r0   r1   r2   r,   r   )r&   r'   r(   rs     s    zPerimeter.as_postgresqlc                s&   | j j|rtdt j||f|S )Nz+Perimeter cannot use a non-projected field.)r+   rT   r	   r   r/   )r!   r0   r1   r2   )r&   r'   r(   rJ     s    zPerimeter.as_sqlite)r)   r=   r>   rW   rs   rJ   r@   r'   r'   )r&   r(   r     s   	r   c               @   s   e Zd ZdZdS )PointOnSurfacer   N)r)   r=   r>   rW   r'   r'   r'   r(   r     s   r   c               @   s   e Zd ZdZdS )Reverser   N)r)   r=   r>   rW   r'   r'   r'   r(   r     s   r   c                   s   e Zd Zd fdd	Z  ZS )Scale        c                sL   || j |dt| j |dtg}|dkr:|j| j |dt t j|| d S )Nxyg        z)r<   rO   r^   r   r   )r!   r`   r   r   r   r#   r"   )r&   r'   r(   r     s    zScale.__init__)r   )r)   r=   r>   r   r@   r'   r'   )r&   r(   r     s   r   c                   s   e Zd Z fddZ  ZS )
SnapToGridc                s   t |}|g}|dkr0|j fdd|D  nJ|dkrr| fdd|dd  D  fdd|d	d D 7 }ntd
t j|| d S )Nr   rY   c                s   g | ]} j |d tqS )r9   )r<   rO   )rE   arg)r!   r'   r(   rF     s    z'SnapToGrid.__init__.<locals>.<listcomp>   c             3   s   | ]} j |d tV  qdS )r9   N)r<   rO   )rE   r   )r!   r'   r(   r     s    z&SnapToGrid.__init__.<locals>.<genexpr>c             3   s   | ]} j |d tV  qdS )r9   N)r<   rO   )rE   r   )r!   r'   r(   r     s    r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r   rY   )rx   extendr    r   r   )r!   r`   r6   r#   nargsr"   )r&   )r!   r(   r     s     zSnapToGrid.__init__)r)   r=   r>   r   r@   r'   r'   )r&   r(   r     s   r   c               @   s   e Zd ZdZdZdS )SymDifferencerY   r   r   N)r   r   )r)   r=   r>   rW   r   r'   r'   r'   r(   r     s   r   c                   s   e Zd Z fddZ  ZS )r   c                s:   || j |dtg}d|kr(t|d|d< t j|| d S )Nr   r   )r   )r<   r_   r   r   r   )r!   r`   r   r#   r"   )r&   r'   r(   r     s
    zTransform.__init__)r)   r=   r>   r   r@   r'   r'   )r&   r(   r     s   r   c                   s   e Zd Z fddZ  ZS )	Translatec                s<   | j  }t| jdk r&|jjtd tt|j||f|S )Nr   r   )rG   rx   r   r^   r   r   r   rJ   )r!   r0   r1   r2   rP   )r&   r'   r(   rJ     s    zTranslate.as_sqlite)r)   r=   r>   rJ   r@   r'   r'   )r&   r(   r     s   r   c               @   s   e Zd ZdZdZdS )UnionrY   r   r   N)r   r   )r)   r=   r>   rW   r   r'   r'   r'   r(   r     s   r   N)Edecimalr   Z#django.contrib.gis.db.models.fieldsr   r   Z django.contrib.gis.db.models.sqlr   r   Zdjango.contrib.gis.geosr   Zdjango.core.exceptionsr   Z	django.dbr	   Zdjango.db.modelsr
   r   r   r   r   r   r   r   Zdjango.db.models.functionsr   Zdjango.utils.functionalr   r_   rD   rO   r   rA   rB   rC   rL   rR   rX   rZ   rb   rd   re   rf   rg   rh   rj   rk   rl   ro   rt   ru   rv   rz   r{   Zregister_lookupr|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r'   r'   r(   <module>   sb   (
F

	+	 	