a
    xd D                     @   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 )GeoFuncMixinN)r   c              	      s   t  j|i | | jD ]}| j| }t|ts2qz
|j}W n tyR   d }Y n0 |j}t|t	rr|rt|t
std| j|d f |js|std|st|t
|jdd| j|< q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__ ^/var/www/html/Ranjet/env/lib/python3.9/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   fieldr-   r)   r)   r*   	geo_field.   s    zGeoFuncMixin.geo_fieldc                    s:   | j d u r |d u r |j| j}t j||fd|i|S )Nfunction)r1   opsspatial_function_namer    r   as_sql)r"   compiler
connectionr1   extra_contextr'   r)   r*   r4   2   s    zGeoFuncMixin.as_sqlc           
         s   t  j|i |}| }| jD ]4}|| }t|ts td| j|d t|j	f q |j
j}| jdd  D ]:}|j| }|jj}	|	|krlt||j|i ||j|< ql|S )Nz<%s function requires a GeometryField in position %s, got %s.r   )r   resolve_expressionget_source_fieldsr   r   r   r   r    typer,   r0   r   r   r   r   )
r"   argskwargsresZsource_fieldsr%   r/   Z	base_sridr&   Z	expr_sridr'   r)   r*   r8   7   s"    


zGeoFuncMixin.resolve_expression c                 C   s,   t |ds(|r(t||s(td||f |S )Nr8   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)N)r>   N)r,   
__module____qualname__r1   r   r   propertyr    r   r0   r4   r8   rA   __classcell__r)   r)   r'   r*   r      s   

r   c                   @   s   e Zd ZdS )GeoFuncNr,   rB   rC   r)   r)   r)   r*   rF   X   s   rF   c                   @   s   e Zd Zedd ZdS )GeomOutputGeoFuncc                 C   s   t | jjdS )Nr   )r   r0   r   r-   r)   r)   r*   r   ]   s    zGeomOutputGeoFunc.output_fieldN)r,   rB   rC   r   r   r)   r)   r)   r*   rH   \   s   rH   c                       s    e Zd ZdZ fddZ  Z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                    sF   |   D ]&}t|drt|jtrt|j|_qt j||fi |S )Nr   )get_source_expressionsr?   r   r   r   floatr   r4   )r"   r5   r6   r7   r&   r'   r)   r*   	as_sqliteg   s    z#SQLiteDecimalToFloatMixin.as_sqlite)r,   rB   rC   __doc__rL   rE   r)   r)   r'   r*   rI   b   s   rI   c                   @   s   e Zd ZdZdd ZdS )OracleToleranceMixing?c                 K   sP   t | | jd| jdt}|  }|g |  | |j	||fi |S )N	tolerance)
r   rA   r$   getrO   NUMERIC_TYPEScopyset_source_expressionsrJ   r4   )r"   r5   r6   r7   rO   cloner)   r)   r*   	as_oracleq   s    zOracleToleranceMixin.as_oracleN)r,   rB   rC   rO   rU   r)   r)   r)   r*   rN   n   s   rN   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 r+   )r   r0   r-   r)   r)   r*   r      s    zArea.output_fieldc                    s2   |j js| j|rtdt j||fi |S )Nz2Area on geodetic coordinate systems not supported.)featuresZsupports_area_geodeticr0   geodeticr	   r   r4   r"   r5   r6   r7   r'   r)   r*   r4      s    zArea.as_sqlc                 K   s0   | j |rd|d< d|d< | j||fi |S )Nz+%(function)s(%(expressions)s, %(spheroid)d)templateTspheroid)r0   rX   r4   rY   r)   r)   r*   rL      s    zArea.as_sqlite)	r,   rB   rC   arityr   r   r4   rL   rE   r)   r)   r'   r*   rV   |   s
   
rV   c                   @   s   e Zd Ze ZdZdZdS )Azimuth   r   r   Nr,   rB   rC   r   r   r\   r   r)   r)   r)   r*   r]      s   r]   c                       s0   e Zd Ze Zd fdd	Z fddZ  ZS )	AsGeoJSONF   c                    sj   |g}|d ur"| | |dt d}|r4|r4d}n|r>d}n|rFd}|rT| | t j|i | d S )N	precisionr      r   r^   appendrA   intr   r   )r"   
expressionZbboxZcrsrc   r$   r#   optionsr'   r)   r*   r      s    
zAsGeoJSON.__init__c                    s<   |   }|  }||d d  tt|j||fi |S )Nr   )rJ   rR   rS   r   ra   r4   )r"   r5   r6   r7   r   rT   r'   r)   r*   rU      s    zAsGeoJSON.as_oracle)FFrb   )r,   rB   rC   r   r   r   rU   rE   r)   r)   r'   r*   ra      s   ra   c                       s4   e Zd ZdZe Zd fdd	Z fddZ  ZS )	AsGML)r   r^   rb   c                    s:   ||g}|d ur$| | |dt t j|i | d S Nrc   re   )r"   rh   versionrc   r$   r#   r'   r)   r*   r      s    zAsGML.__init__c                    sX   |   }|d }|  }||d g |jdkr6dnd|d< tt|j||fi |S )Nr   r   rd   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr1   )rJ   rR   rS   r   r   rj   r4   )r"   r5   r6   r7   r   rl   rT   r'   r)   r*   rU      s    zAsGML.as_oracle)r^   rb   )	r,   rB   rC   r   r   r   r   rU   rE   r)   r)   r'   r*   rj      s   rj   c                       s$   e Zd Ze Zd fdd	Z  ZS )AsKMLrb   c                    s8   |g}|d ur"| | |dt t j|i | d S rk   re   r"   rh   rc   r$   r#   r'   r)   r*   r      s    zAsKML.__init__)rb   r,   rB   rC   r   r   r   rE   r)   r)   r'   r*   rm      s   rm   c                       s$   e Zd Ze Zd fdd	Z  ZS )AsSVGFrb   c                    s@   t |dr|nt|}||| |dtg}t j|i | d S )Nr8   rc   )r?   rg   rA   r   r   )r"   rh   relativerc   r$   r#   r'   r)   r*   r      s    zAsSVG.__init__)Frb   ro   r)   r)   r'   r*   rp      s   rp   c                   @   s   e Zd Ze ZdZdS )AsWKBr   N)r,   rB   rC   r
   r   r\   r)   r)   r)   r*   rr      s   rr   c                   @   s   e Zd Ze ZdZdS )AsWKTr   N)r,   rB   rC   r   r   r\   r)   r)   r)   r*   rs      s   rs   c                       s*   e Zd Zd fdd	Z fddZ  ZS )BoundingCircle0   c                    s   t  j||fi | d S r+   )r   r   )r"   rh   Znum_segr$   r'   r)   r*   r      s    zBoundingCircle.__init__c                    s6   |   }||  d g tt|j||fi |S r.   )rR   rS   rJ   r   rt   rU   r"   r5   r6   r7   rT   r'   r)   r*   rU      s    zBoundingCircle.as_oracle)ru   )r,   rB   rC   r   rU   rE   r)   r)   r'   r*   rt      s   rt   c                   @   s   e Zd ZdZdS )Centroidr   Nr,   rB   rC   r\   r)   r)   r)   r*   rw      s   rw   c                   @   s   e Zd ZdZdZdS )
Differencer^   r_   Nr,   rB   rC   r\   r   r)   r)   r)   r*   ry      s   ry   c                   @   s    e Zd Zedd Zdd ZdS )DistanceResultMixinc                 C   s
   t | jS r+   )r   r0   r-   r)   r)   r*   r      s    z DistanceResultMixin.output_fieldc                 C   s   | j jo| j jdkS )Ni  )r0   	geographyr   r-   r)   r)   r*   source_is_geography   s    z'DistanceResultMixin.source_is_geographyN)r,   rB   rC   r   r   r}   r)   r)   r)   r*   r{      s   
r{   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_   Nc                    s6   ||g}|d ur |  |dt| _t j|i | d S )Nr[   )rA   boolr[   r   r   )r"   expr1expr2r[   r$   r#   r'   r)   r*   r     s    zDistance.__init__c                    s   |   }d }|jd }|  }|jj|krZt|tr>||j_nt|t|jj	|d|jd< |s| j
|r| jr|jd}|jt| j
| n|jd}tt|j||fd|i|S )Nr   )r   r|   ZDistanceSpheroidZDistanceSpherer1   )rR   r   r}   r   r|   r   r   r   r   r   r0   rX   r[   r2   r3   rf   r   r~   r4   )r"   r5   r6   r7   rT   r1   r   r|   r'   r)   r*   as_postgresql  s"    



zDistance.as_postgresqlc                    s<   | j |r&d|d< tt| j|d< t j||fi |S )Nz8COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)rZ   r[   )r0   rX   rg   r   r[   r   r4   rY   r'   r)   r*   rL   !  s    zDistance.as_sqlite)N)	r,   rB   rC   r   r[   r   r   rL   rE   r)   r)   r'   r*   r~      s
   r~   c                   @   s   e Zd ZdZdS )Enveloper   Nrx   r)   r)   r)   r*   r   )  s   r   c                   @   s   e Zd ZdZdS )ForcePolygonCWr   Nrx   r)   r)   r)   r*   r   -  s   r   c                       s,   e Zd Ze Zd fdd	Zdd Z  ZS )GeoHashNc                    s8   |g}|d ur"| | |dt t j|i | d S rk   re   rn   r'   r)   r*   r   4  s    zGeoHash.__init__c                 K   s:   |   }t|jdk r&|jtd |j||fi |S )Nr^   d   )rR   lenr   rf   r   r4   rv   r)   r)   r*   as_mysql:  s    zGeoHash.as_mysql)N)r,   rB   rC   r   r   r   r   rE   r)   r)   r'   r*   r   1  s   r   c                   @   s"   e Zd Ze ZdZdZdZdZdS )GeometryDistancer^   r>   z <-> r_   N)	r,   rB   rC   r   r   r\   r1   Z
arg_joinerr   r)   r)   r)   r*   r   B  s
   r   c                   @   s   e Zd ZdZdZdS )Intersectionr^   r_   Nrz   r)   r)   r)   r*   r   J  s   r   c                       s&   e Zd ZdZe Z fddZ  ZS )IsValidZisvalidc                    s&   t  j||fi |\}}d| |fS )Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   rU   )r"   r5   r6   r7   Zsqlparamsr'   r)   r*   rU   T  s    zIsValid.as_oracle)r,   rB   rC   lookup_namer   r   rU   rE   r)   r)   r'   r*   r   O  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i | d S r+   )r[   r   r   )r"   r   r[   r$   r'   r)   r*   r   Z  s    zLength.__init__c                    s2   | j |r|jjstdt j||fi |S )Nz6This backend doesn't support Length on geodetic fields)r0   rX   rW   Zsupports_length_geodeticr	   r   r4   rY   r'   r)   r*   r4   ^  s    zLength.as_sqlc                    s   |   }d }|  r(|jt| j nX| j|rZ|j	d}|jt| j| n&t
dd |  D }|dkr|jj}tt|j||fd|i|S )NZLengthSpheroidc                 s   s   | ]}|r|j V  qd S r+   dim.0fr)   r)   r*   	<genexpr>m      z'Length.as_postgresql.<locals>.<genexpr>r^   r1   )rR   r}   r   rf   r   r[   r0   rX   r2   r3   minr9   Zlength3dr   r   r4   )r"   r5   r6   r7   rT   r1   r   r'   r)   r*   r   c  s    zLength.as_postgresqlc                    s8   d }| j |r| jrdnd}t j||fd|i|S )NZGeodesicLengthZGreatCircleLengthr1   )r0   rX   r[   r   r4   )r"   r5   r6   r7   r1   r'   r)   r*   rL   r  s    zLength.as_sqlite)T)r,   rB   rC   r   r4   r   rL   rE   r)   r)   r'   r*   r   Y  s   r   c                   @   s   e Zd Ze ZdZdZdS )LineLocatePointr^   r_   Nr`   r)   r)   r)   r*   r   y  s   r   c                   @   s   e Zd ZdS )	MakeValidNrG   r)   r)   r)   r*   r     s   r   c                   @   s   e Zd Ze ZdZdS )MemSizer   Nr,   rB   rC   r   r   r\   r)   r)   r)   r*   r     s   r   c                   @   s   e Zd Ze ZdZdS )NumGeometriesr   Nr   r)   r)   r)   r*   r     s   r   c                   @   s   e Zd Ze ZdZdS )	NumPointsr   Nr   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                    s`   d }| j |r |  s tdtdd |  D }|dkrF|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 r+   r   r   r)   r)   r*   r     r   z*Perimeter.as_postgresql.<locals>.<genexpr>r^   r1   )
r0   rX   r}   r	   r   r9   r2   Zperimeter3dr   r4   )r"   r5   r6   r7   r1   r   r'   r)   r*   r     s    zPerimeter.as_postgresqlc                    s*   | j |rtdt j||fi |S )Nz+Perimeter cannot use a non-projected field.)r0   rX   r	   r   r4   rY   r'   r)   r*   rL     s    zPerimeter.as_sqlite)r,   rB   rC   r\   r   rL   rE   r)   r)   r'   r*   r     s   	r   c                   @   s   e Zd ZdZdS )PointOnSurfacer   Nrx   r)   r)   r)   r*   r     s   r   c                   @   s   e Zd ZdZdS )Reverser   Nrx   r)   r)   r)   r*   r     s   r   c                       s   e Zd Zd fdd	Z  ZS )Scale        c                    sP   ||  |dt|  |dtg}|dkr:||  |dt t j|i | d S )Nxyr   z)rA   rQ   rf   r   r   )r"   rh   r   r   r   r$   r#   r'   r)   r*   r     s    zScale.__init__)r   r,   rB   rC   r   rE   r)   r)   r'   r*   r     s   r   c                       s   e Zd Z fddZ  ZS )
SnapToGridc                    s   t |}|g}|dv r0| fdd|D  nN|dkrv|g  fdd|dd  D  fdd|d	d D 7 }ntd
t j|i | d S )N)r   r^   c                    s   g | ]}  |d tqS )r>   rA   rQ   r   argr-   r)   r*   
<listcomp>  r   z'SnapToGrid.__init__.<locals>.<listcomp>   c                 3   s   | ]}  |d tV  qdS r>   Nr   r   r-   r)   r*   r     r   z&SnapToGrid.__init__.<locals>.<genexpr>r^   c                 3   s   | ]}  |d tV  qdS r   r   r   r-   r)   r*   r     r   r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r   extendr!   r   r   )r"   rh   r;   r$   nargsr#   r'   r-   r*   r     s    zSnapToGrid.__init__r   r)   r)   r'   r*   r     s   r   c                   @   s   e Zd ZdZdZdS )SymDifferencer^   r_   Nrz   r)   r)   r)   r*   r     s   r   c                       s   e Zd Z fddZ  ZS )r   c                    s>   ||  |dtg}d|vr(t|d|d< t j|i | d S )Nr   r   r   )rA   rg   r   r   r   )r"   rh   r   r$   r#   r'   r)   r*   r     s    zTransform.__init__r   r)   r)   r'   r*   r     s   r   c                       s   e Zd Z fddZ  ZS )	Translatec                    s@   |   }t| jdk r&|jtd tt|j||fi |S )Nr   r   )rR   r   r   rf   r   r   r   rL   rv   r'   r)   r*   rL     s    zTranslate.as_sqlite)r,   rB   rC   rL   rE   r)   r)   r'   r*   r     s   r   c                   @   s   e Zd ZdZdZdS )Unionr^   r_   Nrz   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   rg   rK   rQ   r   rF   rH   rI   rN   rV   r]   ra   rj   rm   rp   rr   rs   rt   rw   ry   r{   r~   r   r   r   r   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

	+	 	