o
    <gL                     @   sz  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 Z-G d*d+ d+e"e Z.G d,d- d-Z/G d.d/ d/e/e"eZ0G d0d1 d1e Z1G d2d3 d3e Z2G d4d5 d5eZ3G d6d7 d7e3Z4G d8d9 d9eZ5G d:d; d;eZ6G d<d= d=e"e Z7ej8G d>d? d?eeZ9ej8G d@dA dAe"eeZ:G dBdC dCe/e"eZ;G dDdE dEeZ<G dFdG dGe Z=G dHdI dIeZ>G dJdK dKeZ?G dLdM dMeZ@G dNdO dOe/e"eZAG dPdQ dQe"e ZBG dRdS dSeZCG dTdU dUe!e ZDG dVdW dWe!e ZEG dXdY dYe"e ZFG dZd[ d[e ZG d\d] d]eDZGG d^d_ d_e"e ZHd`S )a    )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 ]P}| j| }t|tsqz|j}W n ty)   d }Y nw |j}t|t	r9|rDt|t
sDtd| j|d f |jsM|sMt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   geom	__class__ Y/var/www/html/venv/lib/python3.10/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!   9   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)r3   opsspatial_function_namer!   r   as_sql)r#   compiler
connectionr3   extra_contextr)   r+   r,   r6   A   s   zGeoFuncMixin.as_sqlc           
         s   t  j|i |}| js|S | }| jD ]}|| }t|ts/td| j|d t|j	f q|j
j}| jdd  D ]}|j| }|jj}	|	|krXt||j|i ||j|< q;|S )Nz<%s function requires a GeometryField in position %s, got %s.r   )r   resolve_expressionr   get_source_fieldsr   r   r    r!   typer.   r2   r   r   r   r   )
r#   argskwargsressource_fieldsr&   r1   	base_sridr'   	expr_sridr)   r+   r,   r:   F   s<   



zGeoFuncMixin.resolve_expression c                 C   s,   t |ds|rt||std||f |S )Nr:   z2The %s parameter has the wrong type: should be %s.)hasattrr   r    )r#   r   
param_namecheck_typesr+   r+   r,   _handle_paramd   s   
zGeoFuncMixin._handle_paramr-   rC   N)r.   
__module____qualname__r3   r   r   propertyr!   r   r2   r6   r:   rG   __classcell__r+   r+   r)   r,   r      s    

r   c                   @      e Zd ZdS )GeoFuncNr.   rI   rJ   r+   r+   r+   r,   rN   n       rN   c                   @   s   e Zd Zedd ZdS )GeomOutputGeoFuncc                 C   s   t | jjdS )Nr   )r   r2   r   r/   r+   r+   r,   r   s   s   zGeomOutputGeoFunc.output_fieldN)r.   rI   rJ   r   r   r+   r+   r+   r,   rQ   r   s    rQ   c                   @      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   s4   |   }|dd | D  |j||fi |S )Nc                 S   s4   g | ]}t |d rt|jtrtt|jn|qS )r   )rD   r   r   r   r   float).0r'   r+   r+   r,   
<listcomp>   s    
z7SQLiteDecimalToFloatMixin.as_sqlite.<locals>.<listcomp>)copyset_source_expressionsget_source_expressionsr6   )r#   r7   r8   r9   rW   r+   r+   r,   	as_sqlite~   s   
z#SQLiteDecimalToFloatMixin.as_sqliteN)r.   rI   rJ   __doc__rZ   r+   r+   r+   r,   rS   x   s    rS   c                   @   rR   )OracleToleranceMixing?c                 K   sP   t | | jd| jdt}|  }|g |  | |j	||fi |S )N	tolerance)
r   rG   r%   getr]   NUMERIC_TYPESrW   rX   rY   r6   )r#   r7   r8   r9   r]   cloner+   r+   r,   	as_oracle   s   zOracleToleranceMixin.as_oracleN)r.   rI   rJ   r]   ra   r+   r+   r+   r,   r\      s    r\   c                       s4   e Zd ZdZedd Z fddZdd Z  ZS )Arear   c                 C   
   t | jS r-   )r   r2   r/   r+   r+   r,   r         
zArea.output_fieldc                    s2   |j js| j|rtdt j||fi |S )Nz2Area on geodetic coordinate systems not supported.)featuressupports_area_geodeticr2   geodeticr	   r   r6   r#   r7   r8   r9   r)   r+   r,   r6      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)r2   rg   r6   rh   r+   r+   r,   rZ      s   zArea.as_sqlite)	r.   rI   rJ   arityr   r   r6   rZ   rL   r+   r+   r)   r,   rb      s    
	rb   c                   @      e Zd Ze ZdZdZdS )Azimuth   r   r   Nr.   rI   rJ   r   r   rk   r   r+   r+   r+   r,   rm          rm   c                       s0   e Zd Ze Zd fdd	Z fddZ  ZS )	AsGeoJSONF   c                    sf   |g}|d ur| | |dt d}|r|rd}n	|rd}n|r#d}| | t j|i | d S )N	precisionr      r   rn   appendrG   intr   r   )r#   
expressionbboxcrsrt   r%   r$   optionsr)   r+   r,   r      s   
zAsGeoJSON.__init__c                    <   |   }|  }||d d  tt|j||fi |S Nr   )rY   rW   rX   r   rr   r6   r#   r7   r8   r9   r   r`   r)   r+   r,   ra      s   zAsGeoJSON.as_oracle)FFrs   )r.   rI   rJ   r   r   r   ra   rL   r+   r+   r)   r,   rr      s    rr   c                       s4   e Zd ZdZe Zd fdd	Z fddZ  ZS )	AsGML)r   rn   rs   c                    s:   ||g}|d ur| | |dt t j|i | d S Nrt   rv   )r#   ry   versionrt   r%   r$   r)   r+   r,   r      s   zAsGML.__init__c                    sX   |   }|d }|  }||d g |jdkrdnd|d< tt|j||fi |S )Nr   r   ru   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr3   )rY   rW   rX   r   r   r   r6   )r#   r7   r8   r9   r   r   r`   r)   r+   r,   ra      s   
zAsGML.as_oracle)rn   rs   )	r.   rI   rJ   r   r   r   r   ra   rL   r+   r+   r)   r,   r      s
    r   c                       s$   e Zd Ze Zd fdd	Z  ZS )AsKMLrs   c                    8   |g}|d ur| | |dt t j|i | d S r   rv   r#   ry   rt   r%   r$   r)   r+   r,   r         zAsKML.__init__)rs   r.   rI   rJ   r   r   r   rL   r+   r+   r)   r,   r          r   c                       s$   e Zd Ze Zd fdd	Z  ZS )AsSVGFrs   c                    s@   t |dr|nt|}||| |dtg}t j|i | d S )Nr:   rt   )rD   rx   rG   r   r   )r#   ry   relativert   r%   r$   r)   r+   r,   r      s   zAsSVG.__init__)Frs   r   r+   r+   r)   r,   r      r   r   c                   @      e Zd Ze ZdZdS )AsWKBr   N)r.   rI   rJ   r
   r   rk   r+   r+   r+   r,   r         r   c                   @   r   )AsWKTr   N)r.   rI   rJ   r   r   rk   r+   r+   r+   r,   r     r   r   c                       s6   e Zd Zd fdd	Z fddZ fddZ  ZS )	BoundingCircle0   c                    s   t  j||fi | d S r-   )r   r   )r#   ry   num_segr%   r)   r+   r,   r     s   zBoundingCircle.__init__c                    6   |   }||  d g tt|j||fi |S r0   )rW   rX   rY   r   r   ra   r#   r7   r8   r9   r`   r)   r+   r,   ra        
zBoundingCircle.as_oraclec                    r   r0   )rW   rX   rY   r   r   rZ   r   r)   r+   r,   rZ     r   zBoundingCircle.as_sqlite)r   )r.   rI   rJ   r   ra   rZ   rL   r+   r+   r)   r,   r     s    r   c                   @      e Zd ZdZdS )Centroidr   Nr.   rI   rJ   rk   r+   r+   r+   r,   r         r   c                   @      e Zd ZdZdZdS )ClosestPointrn   ro   Nr.   rI   rJ   rk   r   r+   r+   r+   r,   r   #      r   c                   @   r   )
Differencern   ro   Nr   r+   r+   r+   r,   r   (  r   r   c                   @   s    e Zd Zedd Zdd ZdS )DistanceResultMixinc                 C   rc   r-   )r   r2   r/   r+   r+   r,   r   .  rd   z DistanceResultMixin.output_fieldc                 C   s   | j jo	| j jdkS )Ni  )r2   	geographyr   r/   r+   r+   r,   source_is_geography2  s   z'DistanceResultMixin.source_is_geographyN)r.   rI   rJ   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 )
Distancero   Nc                    s6   ||g}|d ur|  |dt| _t j|i | d S )Nrj   )rG   boolrj   r   r   )r#   expr1expr2rj   r%   r$   r)   r+   r,   r   :  s   zDistance.__init__c                    s   |   }d }|jd }|  }|jj|kr-t|tr||j_nt|t|jj	|d|jd< |sQ| j
|rQ| jrK|jd}|jt| j
| n|jd}tt|j||fd|i|S )Nr   )r   r   DistanceSpheroidDistanceSpherer3   )rW   r   r   r   r   r   r   r   r   r   r2   rg   rj   r4   r5   rw   r   r   r6   )r#   r7   r8   r9   r`   r3   r   r   r)   r+   r,   as_postgresql@  s2   




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)ri   rj   )r2   rg   rx   r   rj   r   r6   rh   r)   r+   r,   rZ   _  s
   zDistance.as_sqliter-   )	r.   rI   rJ   r   rj   r   r   rZ   rL   r+   r+   r)   r,   r   6  s    r   c                   @   r   )Enveloper   Nr   r+   r+   r+   r,   r   i  r   r   c                   @   r   )ForcePolygonCWr   Nr   r+   r+   r+   r,   r   m  r   r   c                       s2   e Zd ZdZdZd fdd	Z fddZ  ZS )	FromWKBrn   r+   r   c                    >   ||  |dtg}d|vrt|d|d< t j|i | d S Nr   r   r   rG   rx   r   r   r   r#   ry   r   r%   r$   r)   r+   r,   r   u     zFromWKB.__init__c                    r}   r~   )rY   rW   rX   r   r   r6   r   r)   r+   r,   ra   ~  s   zFromWKB.as_oracler   )r.   rI   rJ   rk   r   r   ra   rL   r+   r+   r)   r,   r   q  s
    	r   c                   @   rM   )FromWKTNrO   r+   r+   r+   r,   r     rP   r   c                       s,   e Zd Ze Zd fdd	Zdd Z  ZS )GeoHashNc                    r   r   rv   r   r)   r+   r,   r     r   zGeoHash.__init__c                 K   s:   |   }t|jdk r|jtd |j||fi |S )Nrn   d   )rW   lenr   rw   r   r6   r   r+   r+   r,   as_mysql  s   zGeoHash.as_mysqlr-   )r.   rI   rJ   r   r   r   r   rL   r+   r+   r)   r,   r     s    r   c                   @   s"   e Zd Ze ZdZdZdZdZdS )GeometryDistancern   rC   z <-> ro   N)	r.   rI   rJ   r   r   rk   r3   
arg_joinerr   r+   r+   r+   r,   r     s    r   c                   @   r   )Intersectionrn   ro   Nr   r+   r+   r+   r,   r     r   r   c                   @   s   e Zd ZdZe ZdS )IsEmptyisemptyN)r.   rI   rJ   lookup_namer   r   r+   r+   r+   r,   r     s    
r   c                       s&   e Zd ZdZe Z fddZ  ZS )IsValidisvalidc                    s&   t  j||fi |\}}d| |fS )Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   ra   )r#   r7   r8   r9   sqlparamsr)   r+   r,   ra     s   zIsValid.as_oracle)r.   rI   rJ   r   r   r   ra   rL   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i | d S r-   )rj   r   r   )r#   r   rj   r%   r)   r+   r,   r     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)r2   rg   re   supports_length_geodeticr	   r   r6   rh   r)   r+   r,   r6     s   
zLength.as_sqlc                    s   |   }d }|  r|jt| j n,| j|r-|j	d}|jt| j| nt
dd |  D }|dkr@|jj}tt|j||fd|i|S )NLengthSpheroidc                 s   s    | ]}|r|j V  qd S r-   dimrU   fr+   r+   r,   	<genexpr>  s    z'Length.as_postgresql.<locals>.<genexpr>rn   r3   )rW   r   r   rw   r   rj   r2   rg   r4   r5   minr;   length3dr   r   r6   )r#   r7   r8   r9   r`   r3   r   r)   r+   r,   r     s"   
zLength.as_postgresqlc                    s8   d }| j |r| jrdnd}t j||fd|i|S )NGeodesicLengthGreatCircleLengthr3   )r2   rg   rj   r   r6   )r#   r7   r8   r9   r3   r)   r+   r,   rZ     s   zLength.as_sqlite)T)r.   rI   rJ   r   r6   r   rZ   rL   r+   r+   r)   r,   r     s
    
r   c                   @   rl   )LineLocatePointrn   ro   Nrp   r+   r+   r+   r,   r     rq   r   c                   @   rM   )	MakeValidNrO   r+   r+   r+   r,   r     rP   r   c                   @   r   )MemSizer   Nr.   rI   rJ   r   r   rk   r+   r+   r+   r,   r     r   r   c                   @   r   )NumGeometriesr   Nr   r+   r+   r+   r,   r     r   r   c                   @   r   )	NumPointsr   Nr   r+   r+   r+   r,   r     r   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r#|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     s    z*Perimeter.as_postgresql.<locals>.<genexpr>rn   r3   )
r2   rg   r   r	   r   r;   r4   perimeter3dr   r6   )r#   r7   r8   r9   r3   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.)r2   rg   r	   r   r6   rh   r)   r+   r,   rZ     s   zPerimeter.as_sqlite)r.   rI   rJ   rk   r   rZ   rL   r+   r+   r)   r,   r     s    r   c                   @   r   )PointOnSurfacer   Nr   r+   r+   r+   r,   r     r   r   c                   @   r   )Reverser   Nr   r+   r+   r+   r,   r     r   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)rG   r_   rw   r   r   )r#   ry   r   r   r   r%   r$   r)   r+   r,   r     s   zScale.__init__)r   r.   rI   rJ   r   rL   r+   r+   r)   r,   r     s    r   c                          e Zd Z fddZ  ZS )
SnapToGridc                    s   t |}|g}|dv r| fdd|D  n'|dkr;|g  fdd|dd  D  fdd|d	d D 7 }ntd
t j|i | d S )N)r   rn   c                    s   g | ]	}  |d tqS )rC   rG   r_   rU   argr/   r+   r,   rV   &  s    z'SnapToGrid.__init__.<locals>.<listcomp>   c                 3       | ]
}  |d tV  qdS rH   r   r   r/   r+   r,   r   +      z&SnapToGrid.__init__.<locals>.<genexpr>rn   c                 3   r   rH   r   r   r/   r+   r,   r   ,  r   r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r   extendr"   r   r   )r#   ry   r=   r%   nargsr$   r)   r/   r,   r   !  s   zSnapToGrid.__init__r   r+   r+   r)   r,   r          r   c                   @   r   )SymDifferencern   ro   Nr   r+   r+   r+   r,   r   3  r   r   c                       r   )r   c                    r   r   r   r   r)   r+   r,   r   9  r   zTransform.__init__r   r+   r+   r)   r,   r   8  r   r   c                       r   )	Translatec                    s@   |   }t| jdk r|jtd tt|j||fi |S )Nr   r   )rW   r   r   rw   r   r   r   rZ   r   r)   r+   r,   rZ   D  s   zTranslate.as_sqlite)r.   rI   rJ   rZ   rL   r+   r+   r)   r,   r   C  r   r   c                   @   r   )Unionrn   ro   Nr   r+   r+   r+   r,   r   L  r   r   N)Idecimalr   #django.contrib.gis.db.models.fieldsr   r    django.contrib.gis.db.models.sqlr   r   django.contrib.gis.geosr   django.core.exceptionsr   	django.dbr	   django.db.modelsr
   r   r   r   r   r   r   r   django.db.models.functionsr   django.utils.functionalr   rx   rT   r_   r   rN   rQ   rS   r\   rb   rm   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   register_lookupr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r+   r+   r,   <module>   sn    (

V
	3	'	