o
    bUD                     @   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 ]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   Zgeom	__class__ e/var/www/secure340b-portal/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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_paramr+   r>   N)r,   
__module____qualname__r1   r   r   propertyr    r   r0   r4   r8   rA   __classcell__r)   r)   r'   r*   r      s    

r   c                   @      e Zd ZdS )GeoFuncNr,   rC   rD   r)   r)   r)   r*   rH   X       rH   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,   rC   rD   r   r   r)   r)   r)   r*   rK   \   s    rK   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   )r?   r   r   r   r   float).0r&   r)   r)   r*   
<listcomp>i   s
    $z7SQLiteDecimalToFloatMixin.as_sqlite.<locals>.<listcomp>)copyset_source_expressionsget_source_expressionsr4   )r"   r5   r6   r7   rQ   r)   r)   r*   	as_sqliteg   s
   
z#SQLiteDecimalToFloatMixin.as_sqliteN)r,   rC   rD   __doc__rT   r)   r)   r)   r*   rM   b   s    rM   c                   @   rL   )OracleToleranceMixing?c                 K   sP   t | | jd| jdt}|  }|g |  | |j	||fi |S )N	tolerance)
r   rA   r$   getrW   NUMERIC_TYPESrQ   rR   rS   r4   )r"   r5   r6   r7   rW   cloner)   r)   r*   	as_oraclet   s   zOracleToleranceMixin.as_oracleN)r,   rC   rD   rW   r[   r)   r)   r)   r*   rV   q   s    rV   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.)featuresZ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   r`   r4   ra   r)   r)   r*   rT      s   zArea.as_sqlite)	r,   rC   rD   arityr   r   r4   rT   rF   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,   rC   rD   r   r   re   r   r)   r)   r)   r*   rg          rg   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}|r|rd}n	|rd}n|r#d}|r*| | t j|i | d S )N	precisionr      r   rh   appendrA   intr   r   )r"   
expressionZbboxZcrsrn   r$   r#   optionsr'   r)   r*   r      s   
zAsGeoJSON.__init__c                    s<   |   }|  }||d d  tt|j||fi |S )Nr   )rS   rQ   rR   r   rl   r4   )r"   r5   r6   r7   r   rZ   r'   r)   r*   r[      s   zAsGeoJSON.as_oracle)FFrm   )r,   rC   rD   r   r   r   r[   rF   r)   r)   r'   r*   rl      s    rl   c                       s4   e Zd ZdZe Zd fdd	Z fddZ  ZS )	AsGML)r   rh   rm   c                    s:   ||g}|d ur| | |dt t j|i | d S Nrn   rp   )r"   rs   versionrn   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   ro   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr1   )rS   rQ   rR   r   r   ru   r4   )r"   r5   r6   r7   r   rw   rZ   r'   r)   r*   r[      s   zAsGML.as_oracle)rh   rm   )	r,   rC   rD   r   r   r   r   r[   rF   r)   r)   r'   r*   ru      s
    ru   c                       s$   e Zd Ze Zd fdd	Z  ZS )AsKMLrm   c                    8   |g}|d ur| | |dt t j|i | d S rv   rp   r"   rs   rn   r$   r#   r'   r)   r*   r         zAsKML.__init__)rm   r,   rC   rD   r   r   r   rF   r)   r)   r'   r*   rx          rx   c                       s$   e Zd Ze Zd fdd	Z  ZS )AsSVGFrm   c                    s@   t |dr|nt|}||| |dtg}t j|i | d S )Nr8   rn   )r?   rr   rA   r   r   )r"   rs   Zrelativern   r$   r#   r'   r)   r*   r      s   zAsSVG.__init__)Frm   r|   r)   r)   r'   r*   r~      r}   r~   c                   @      e Zd Ze ZdZdS )AsWKBr   N)r,   rC   rD   r
   r   re   r)   r)   r)   r*   r          r   c                   @   r   )AsWKTr   N)r,   rC   rD   r   r   re   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"   rs   Znum_segr$   r'   r)   r*   r      s   zBoundingCircle.__init__c                    s6   |   }||  d g tt|j||fi |S r.   )rQ   rR   rS   r   r   r[   r"   r5   r6   r7   rZ   r'   r)   r*   r[      s   zBoundingCircle.as_oracle)r   )r,   rC   rD   r   r[   rF   r)   r)   r'   r*   r      s    r   c                   @      e Zd ZdZdS )Centroidr   Nr,   rC   rD   re   r)   r)   r)   r*   r          r   c                   @      e Zd ZdZdZdS )
Differencerh   ri   Nr,   rC   rD   re   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,   rC   rD   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 )
Distanceri   Nc                    s6   ||g}|d ur|  |dt| _t j|i | d S )Nrd   )rA   boolrd   r   r   )r"   expr1expr2rd   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   ZDistanceSpheroidZDistanceSpherer1   )rQ   r   r   r   r   r   r   r   r   r   r0   r`   rd   r2   r3   rq   r   r   r4   )r"   r5   r6   r7   rZ   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)rc   rd   )r0   r`   rr   r   rd   r   r4   ra   r'   r)   r*   rT   $  s   zDistance.as_sqliter+   )	r,   rC   rD   r   rd   r   r   rT   rF   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   0  r   r   c                       s,   e Zd Ze Zd fdd	Zdd Z  ZS )GeoHashNc                    ry   rv   rp   rz   r'   r)   r*   r   7  r{   zGeoHash.__init__c                 K   s:   |   }t|jdk r|jtd |j||fi |S )Nrh   d   )rQ   lenr   rq   r   r4   r   r)   r)   r*   as_mysql=  s   zGeoHash.as_mysqlr+   )r,   rC   rD   r   r   r   r   rF   r)   r)   r'   r*   r   4  s    r   c                   @   s"   e Zd Ze ZdZdZdZdZdS )GeometryDistancerh   r>   z <-> ri   N)	r,   rC   rD   r   r   re   r1   Z
arg_joinerr   r)   r)   r)   r*   r   E  s    r   c                   @   r   )Intersectionrh   ri   Nr   r)   r)   r)   r*   r   M  r   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   r[   )r"   r5   r6   r7   sqlparamsr'   r)   r*   r[   W  s   zIsValid.as_oracle)r,   rC   rD   lookup_namer   r   r[   rF   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i | d S r+   )rd   r   r   )r"   r   rd   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)r0   r`   r_   Zsupports_length_geodeticr	   r   r4   ra   r'   r)   r*   r4   a  rb   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 )NZLengthSpheroidc                 s   s    | ]}|r|j V  qd S r+   dimrO   fr)   r)   r*   	<genexpr>p  s    z'Length.as_postgresql.<locals>.<genexpr>rh   r1   )rQ   r   r   rq   r   rd   r0   r`   r2   r3   minr9   Zlength3dr   r   r4   )r"   r5   r6   r7   rZ   r1   r   r'   r)   r*   r   f  s   zLength.as_postgresqlc                    s8   d }| j |r| jrdnd}t j||fd|i|S )NZGeodesicLengthZGreatCircleLengthr1   )r0   r`   rd   r   r4   )r"   r5   r6   r7   r1   r'   r)   r*   rT   u  s   zLength.as_sqlite)T)r,   rC   rD   r   r4   r   rT   rF   r)   r)   r'   r*   r   \  s
    r   c                   @   rf   )LineLocatePointrh   ri   Nrj   r)   r)   r)   r*   r   |  rk   r   c                   @   rG   )	MakeValidNrI   r)   r)   r)   r*   r     rJ   r   c                   @   r   )MemSizer   Nr,   rC   rD   r   r   re   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>rh   r1   )
r0   r`   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   r`   r	   r   r4   ra   r'   r)   r*   rT     s   zPerimeter.as_sqlite)r,   rC   rD   re   r   rT   rF   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)rA   rY   rq   r   r   )r"   rs   r   r   r   r$   r#   r'   r)   r*   r     s   zScale.__init__)r   r,   rC   rD   r   rF   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   rh   c                    s   g | ]	}  |d tqS )r>   rA   rY   rO   argr-   r)   r*   rP     s    z'SnapToGrid.__init__.<locals>.<listcomp>   c                 3       | ]
}  |d tV  qdS rB   r   r   r-   r)   r*   r         z&SnapToGrid.__init__.<locals>.<genexpr>rh   c                 3   r   rB   r   r   r-   r)   r*   r     r   r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r   extendr!   r   r   )r"   rs   r;   r$   nargsr#   r'   r-   r*   r     s   zSnapToGrid.__init__r   r)   r)   r'   r*   r         r   c                   @   r   )SymDifferencerh   ri   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   )rA   rr   r   r   r   )r"   rs   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   )rQ   r   r   rq   r   r   r   rT   r   r'   r)   r*   rT     s   zTranslate.as_sqlite)r,   rC   rD   rT   rF   r)   r)   r'   r*   r     r   r   c                   @   r   )Unionrh   ri   Nr   r)   r)   r)   r*   r     r   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   rr   rN   rY   r   rH   rK   rM   rV   r\   rg   rl   ru   rx   r~   r   r   r   r   r   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>   sd    (
F

	+	 	