o
    :ZcBB                     @   s  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mZmZ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 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"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 Z.G d-d. d.e Z/G d/d0 d0eZ0G d1d2 d2eZ1G d3d4 d4e"e Z2ej3G d5d6 d6e"eeZ4G d7d8 d8e,e"eZ5G d9d: d:eZ6G d;d< d<eZ7G d=d> d>eZ8G d?d@ d@eZ9G dAdB dBeZ:G dCdD dDe,e"eZ;G dEdF dFe"e Z<G dGdH dHeZ=G dIdJ dJe!e Z>G dKdL dLe!e Z?G dMdN dNe"e Z@G dOdP dPe ZG dQdR dRe>ZAG dSdT dTe"e ZBdUS )V    )Decimal)BaseSpatialFieldGeometryField)	AreaFieldDistanceField)GEOSGeometry)
FieldError)BooleanField
FloatFieldIntegerField	TextField	Transform)FuncValue)Cast)NotSupportedError)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__ \/var/www/chikooza/env/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   *   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 ]}|| }t|ts*td| j|d t|j	f q|j
j}| jdd  D ]}|j| }|jj}	|	|krSt||j|i ||j|< q6|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ressource_fieldsr$   r/   	base_sridr%   	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_namecheck_typesr)   r)   r*   _handle_paramN   s   
zGeoFuncMixin._handle_paramr+   rA   N)r,   
__module____qualname__r1   r   r   propertyr   r   r0   r4   r8   rE   __classcell__r)   r)   r'   r*   r      s    

r   c                   @      e Zd ZdS )GeoFuncNr,   rG   rH   r)   r)   r)   r*   rL   X       rL   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,   rG   rH   r   r   r)   r)   r)   r*   rO   \   s    rO   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_expressionsrB   r   r   r   floatr   r4   )r!   r5   r6   r7   r%   r'   r)   r*   	as_sqliteg   s
   z#SQLiteDecimalToFloatMixin.as_sqlite)r,   rG   rH   __doc__rS   rJ   r)   r)   r'   r*   rP   b   s    rP   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   rE   r#   getrV   NUMERIC_TYPEScopyset_source_expressionsrQ   r4   )r!   r5   r6   r7   rV   cloner)   r)   r*   	as_oracleq   s   zOracleToleranceMixin.as_oracleN)r,   rG   rH   rV   r\   r)   r)   r)   r*   rU   n   s    rU   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   r0   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_geodeticr0   geodeticr   r   r4   r!   r5   r6   r7   r'   r)   r*   r4         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   rb   r4   rc   r)   r)   r*   rS      s   zArea.as_sqlite)	r,   rG   rH   arityr   r   r4   rS   rJ   r)   r)   r'   r*   r]   |   s    
r]   c                   @      e Zd Ze ZdZdZdS )Azimuth   r   r   Nr,   rG   rH   r
   r   rg   r   r)   r)   r)   r*   ri          ri   c                       $   e Zd Ze Zd fdd	Z  ZS )	AsGeoJSONF   c                    sj   |g}|d ur| | |dt d}|r|rd}n	|rd}n|r#d}|r*| | t j|i | d S )N	precisionr      r   rj   appendrE   intr   r   )r!   
expressionbboxcrsrq   r#   r"   optionsr'   r)   r*   r      s   
zAsGeoJSON.__init__)FFrp   r,   rG   rH   r   r   r   rJ   r)   r)   r'   r*   ro          ro   c                       s4   e Zd ZdZe Zd fdd	Z fddZ  ZS )	AsGML)r   rj   rp   c                    s:   ||g}|d ur| | |dt t j|i | d S Nrq   rs   )r!   rv   versionrq   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   rr   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr1   )rQ   rY   rZ   r   r   r|   r4   )r!   r5   r6   r7   r   r~   r[   r'   r)   r*   r\      s   zAsGML.as_oracle)rj   rp   )	r,   rG   rH   r   r   r   r   r\   rJ   r)   r)   r'   r*   r|      s
    r|   c                   @   s   e Zd Zdd ZdS )AsKMLc                 K   s2   |   }||  dd   |j||fi |S )Nr   )rY   rZ   rQ   r4   r!   r5   r6   r7   r[   r)   r)   r*   rS      s   zAsKML.as_sqliteN)r,   rG   rH   rS   r)   r)   r)   r*   r      s    r   c                       rn   )AsSVGFrp   c                    s@   t |dr|nt|}||| |dtg}t j|i | d S )Nr8   rq   )rB   ru   rE   r   r   )r!   rv   relativerq   r#   r"   r'   r)   r*   r      s   zAsSVG.__init__)Frp   rz   r)   r)   r'   r*   r      r{   r   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!   rv   num_segr#   r'   r)   r*   r      s   zBoundingCircle.__init__c                    s6   |   }||  d g tt|j||fi |S r.   )rY   rZ   rQ   r   r   r\   r   r'   r)   r*   r\      s   zBoundingCircle.as_oracle)r   )r,   rG   rH   r   r\   rJ   r)   r)   r'   r*   r      s    r   c                   @      e Zd ZdZdS )Centroidr   Nr,   rG   rH   rg   r)   r)   r)   r*   r          r   c                   @      e Zd ZdZdZdS )
Differencerj   rk   Nr,   rG   rH   rg   r   r)   r)   r)   r*   r          r   c                   @   s    e Zd Zedd Zdd ZdS )DistanceResultMixinc                 C   r^   r+   )r   r0   r-   r)   r)   r*   r      r_   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,   rG   rH   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 )
Distancerk   Nc                    s6   ||g}|d ur|  |dt| _t j|i | d S )Nrf   )rE   boolrf   r   r   )r!   expr1expr2rf   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DistanceSpherer1   )rY   r   r   r   r   r   r   r   r   r   r0   rb   rf   r2   r3   rt   r   r   r4   )r!   r5   r6   r7   r[   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)re   rf   )r0   rb   ru   r   rf   r   r4   rc   r'   r)   r*   rS     s   zDistance.as_sqliter+   )	r,   rG   rH   r   rf   r   r   rS   rJ   r)   r)   r'   r*   r      s    r   c                   @   r   )Enveloper   Nr   r)   r)   r)   r*   r     r   r   c                   @   r   )ForcePolygonCWr   Nr   r)   r)   r)   r*   r     r   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 r}   rs   )r!   rv   rq   r#   r"   r'   r)   r*   r   "  s   zGeoHash.__init__c                 K   s:   |   }t|jdk r|jtd |j||fi |S )Nrj   d   )rY   lenr   rt   r   r4   r   r)   r)   r*   as_mysql(  s   zGeoHash.as_mysqlr+   )r,   rG   rH   r   r   r   r   rJ   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 )GeometryDistancerj   rA   z <-> rk   N)	r,   rG   rH   r
   r   rg   r1   
arg_joinerr   r)   r)   r)   r*   r   0  s    r   c                   @   r   )Intersectionrj   rk   Nr   r)   r)   r)   r*   r   8  r   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   r\   )r!   r5   r6   r7   sqlparamsr'   r)   r*   r\   B  s   zIsValid.as_oracle)r,   rG   rH   lookup_namer	   r   r\   rJ   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+   )rf   r   r   )r!   r   rf   r#   r'   r)   r*   r   H  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   rb   r`   supports_length_geodeticr   r   r4   rc   r'   r)   r*   r4   L  rd   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.0fr)   r)   r*   	<genexpr>[  s    z'Length.as_postgresql.<locals>.<genexpr>rj   r1   )rY   r   r   rt   r   rf   r0   rb   r2   r3   minr9   length3dr   r   r4   )r!   r5   r6   r7   r[   r1   r   r'   r)   r*   r   Q  s   zLength.as_postgresqlc                    s8   d }| j |r| jrdnd}t j||fd|i|S )NGeodesicLengthGreatCircleLengthr1   )r0   rb   rf   r   r4   )r!   r5   r6   r7   r1   r'   r)   r*   rS   `  s   zLength.as_sqlite)T)r,   rG   rH   r   r4   r   rS   rJ   r)   r)   r'   r*   r   G  s
    r   c                   @   rh   )LineLocatePointrj   rk   Nrl   r)   r)   r)   r*   r   g  rm   r   c                   @   rK   )	MakeValidNrM   r)   r)   r)   r*   r   m  rN   r   c                   @      e Zd Ze ZdZdS )MemSizer   Nr,   rG   rH   r   r   rg   r)   r)   r)   r*   r   q      r   c                   @   r   )NumGeometriesr   Nr   r)   r)   r)   r*   r   v  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>rj   r1   )
r0   rb   r   r   r   r9   r2   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   rb   r   r   r4   rc   r'   r)   r*   rS     s   zPerimeter.as_sqlite)r,   rG   rH   rg   r   rS   rJ   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)rE   rX   rt   r   r   )r!   rv   r   r   r   r#   r"   r'   r)   r*   r     s   zScale.__init__)r   r,   rG   rH   r   rJ   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   rj   c                    s   g | ]	}  |d tqS )rA   rE   rX   r   argr-   r)   r*   
<listcomp>  s    z'SnapToGrid.__init__.<locals>.<listcomp>   c                 3       | ]
}  |d tV  qdS rF   r   r   r-   r)   r*   r         z&SnapToGrid.__init__.<locals>.<genexpr>rj   c                 3   r   rF   r   r   r-   r)   r*   r     r   r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r   extendr    r   r   )r!   rv   r;   r#   nargsr"   r'   r-   r*   r     s   zSnapToGrid.__init__r   r)   r)   r'   r*   r         r   c                   @   r   )SymDifferencerj   rk   Nr   r)   r)   r)   r*   r     r   r   c                       r   )r   c                    s>   ||  |dtg}d|vrt|d|d< t j|i | d S )Nr   r   r   )rE   ru   r   r   r   )r!   rv   r   r#   r"   r'   r)   r*   r     s   zTransform.__init__r   r)   r)   r'   r*   r     r   r   c                       r   )	Translatec                    s@   |   }t| jdk r|jtd tt|j||fi |S )Nr   r   )rY   r   r   rt   r   r   r   rS   r   r'   r)   r*   rS     s   zTranslate.as_sqlite)r,   rG   rH   rS   rJ   r)   r)   r'   r*   r     r   r   c                   @   r   )Unionrj   rk   Nr   r)   r)   r)   r*   r     r   r   N)Cdecimalr   #django.contrib.gis.db.models.fieldsr   r    django.contrib.gis.db.models.sqlr   r   django.contrib.gis.geosr   django.core.exceptionsr   django.db.modelsr	   r
   r   r   r   django.db.models.expressionsr   r   django.db.models.functionsr   django.db.utilsr   django.utils.functionalr   ru   rR   rX   r   rL   rO   rP   rU   r]   ri   ro   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*   <module>   sb    
F
	+	 	