o
    ó·iêH  ã                   @   sj  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ƒZ4G d8d9„ d9eƒZ5G d:d;„ d;e"e ƒZ6ej7G d<d=„ d=eeƒƒZ8ej7G d>d?„ d?e"eeƒƒZ9G d@dA„ dAe.e"eƒZ:G dBdC„ dCeƒZ;G dDdE„ dEe ƒZ<G dFdG„ dGeƒZ=G dHdI„ dIeƒZ>G dJdK„ dKeƒZ?G dLdM„ dMe.e"eƒZ@G dNdO„ dOe"e ƒZAG dPdQ„ dQeƒZBG dRdS„ dSe!e ƒZCG dTdU„ dUe!e ƒZDG dVdW„ dWe"e ƒZEG dXdY„ dYe ƒZG dZd[„ d[eCƒZFG d\d]„ d]e"e ƒZGd^S )_é    )Ú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__© úlC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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)r1   ÚopsÚspatial_function_namer    r   Úas_sql)r"   ÚcompilerÚ
connectionr1   Úextra_contextr'   r)   r*   r4   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,   r0   r   r   r   r   )
r"   ÚargsÚkwargsÚresZsource_fieldsr%   r/   Z	base_sridr&   Z	expr_sridr'   r)   r*   r8   F   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_paramd   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   n   ó    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   s   zGeomOutputGeoFunc.output_fieldN)r,   rC   rD   r   r   r)   r)   r)   r*   rK   r   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>�   s    þÿ
ÿýz7SQLiteDecimalToFloatMixin.as_sqlite.<locals>.<listcomp>)ÚcopyÚset_source_expressionsÚget_source_expressionsr4   )r"   r5   r6   r7   rQ   r)   r)   r*   Ú	as_sqlite~   s   üÿz#SQLiteDecimalToFloatMixin.as_sqliteN)r,   rC   rD   Ú__doc__rT   r)   r)   r)   r*   rM   x   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_oracleŽ   s   ýÿzOracleToleranceMixin.as_oracleN)r,   rC   rD   rW   r[   r)   r)   r)   r*   rV   ‹   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   ¢   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   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   rd   r   r)   r)   r)   r*   rf   ²   ó    rf   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   rg   ©ÚappendrA   Úintr   r   )r"   Ú
expressionZbboxZcrsrm   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   rk   r4   )r"   r5   r6   r7   r   rZ   r'   r)   r*   r[   Ê   s   zAsGeoJSON.as_oracle)FFrl   )r,   rC   rD   r   r   r   r[   rF   r)   r)   r'   r*   rk   ¸   s    rk   c                       s4   e Zd ZdZeƒ Zd‡ fdd„	Z‡ fdd„Z‡  ZS )	ÚAsGML)r   rg   rl   c                    s:   ||g}|d ur|  |  |dt¡¡ tƒ j|i |¤Ž d S ©Nrm   ro   )r"   rr   Úversionrm   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   rn   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr1   )rS   rQ   rR   r   r   rt   r4   )r"   r5   r6   r7   r   rv   rZ   r'   r)   r*   r[   Û   s   ÿýzAsGML.as_oracle)rg   rl   )	r,   rC   rD   r   r   r   r   r[   rF   r)   r)   r'   r*   rt   Ñ   s
    rt   c                       s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsKMLrl   c                    ó8   |g}|d ur|  |  |dt¡¡ tƒ j|i |¤Ž d S ru   ro   ©r"   rr   rm   r$   r#   r'   r)   r*   r   ë   ó   zAsKML.__init__)rl   ©r,   rC   rD   r   r   r   rF   r)   r)   r'   r*   rw   è   ó    rw   c                       s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsSVGFrl   c                    s@   t |dƒr|nt|ƒ}|||  |dt¡g}tƒ j|i |¤Ž d S )Nr8   rm   )r?   rq   rA   r   r   )r"   rr   Zrelativerm   r$   r#   r'   r)   r*   r   õ   s   ÿýzAsSVG.__init__)Frl   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   rd   r)   r)   r)   r*   r     ó    r   c                   @   r~   )ÚAsWKTr   N)r,   rC   rD   r   r   rd   r)   r)   r)   r*   r�     r€   r�   c                       s*   e Zd Zd‡ fdd„	Z‡ fdd„Z‡  ZS )ÚBoundingCircleé0   c                    s   t ƒ j||fi |¤Ž d S r+   )r   r   )r"   rr   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   rd   r)   r)   r)   r*   r†     ó    r†   c                   @   ó   e Zd ZdZdZdS )Ú
Differencerg   rh   N©r,   rC   rD   rd   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 )
ÚDistancerh   Nc                    s6   ||g}|d ur|   |dt¡| _tƒ j|i |¤Ž d S )Nrc   )rA   Úboolrc   r   r   )r"   Úexpr1Úexpr2rc   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`   rc   r2   r3   rp   r   r�   r4   )r"   r5   r6   r7   rZ   r1   r“   rŽ   r'   r)   r*   Úas_postgresql3  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)rb   rc   )r0   r`   rq   r‘   rc   r   r4   ra   r'   r)   r*   rT   R  s   þÿzDistance.as_sqliter+   )	r,   rC   rD   r   rc   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–   `  rˆ   r–   c                   @   ó   e Zd Zedd�ZdZdZdS )ÚFromWKBr   r   r   r)   N©r,   rC   rD   r   r   rd   r   r)   r)   r)   r*   r˜   d  ó    
r˜   c                   @   r—   )ÚFromWKTr   r   r   r)   Nr™   r)   r)   r)   r*   r›   j  rš   r›   c                       s,   e Zd Zeƒ Zd‡ fdd„	Zdd„ Z‡  ZS )ÚGeoHashNc                    rx   ru   ro   ry   r'   r)   r*   r   s  rz   zGeoHash.__init__c                 K   s:   |   ¡ }t|jƒdk r|j tdƒ¡ |j||fi |¤ŽS )Nrg   éd   )rQ   Úlenr   rp   r   r4   r„   r)   r)   r*   Úas_mysqly  s   zGeoHash.as_mysqlr+   )r,   rC   rD   r   r   r   rŸ   rF   r)   r)   r'   r*   rœ   p  s    rœ   c                   @   s"   e Zd Zeƒ ZdZdZdZdZdS )ÚGeometryDistancerg   r>   z <-> rh   N)	r,   rC   rD   r   r   rd   r1   Z
arg_joinerr   r)   r)   r)   r*   r    �  s    r    c                   @   r‰   )ÚIntersectionrg   rh   Nr‹   r)   r)   r)   r*   r¡   ‰  rŒ   r¡   c                   @   s   e Zd ZdZeƒ ZdS )ÚIsEmptyZisemptyN)r,   rC   rD   Ú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 )Ú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   ZsqlÚparamsr'   r)   r*   r[   ™  s   zIsValid.as_oracle)r,   rC   rD   r£   r   r   r[   rF   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+   )rc   r   r   )r"   r’   rc   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   £  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 )NZLengthSpheroidc                 s   s   � | ]}|r|j V  qd S r+   ©Údim©rO   Úfr)   r)   r*   Ú	<genexpr>·  s   € z'Length.as_postgresql.<locals>.<genexpr>rg   r1   )rQ   r�   r   rp   r   rc   r0   r`   r2   r3   Úminr9   Zlength3dr   r¦   r4   )r"   r5   r6   r7   rZ   r1   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 )NZGeodesicLengthZGreatCircleLengthr1   )r0   r`   rc   r   r4   )r"   r5   r6   r7   r1   r'   r)   r*   rT   ¾  s   zLength.as_sqlite)T)r,   rC   rD   r   r4   r”   rT   rF   r)   r)   r'   r*   r¦   ž  s
    
r¦   c                   @   re   )ÚLineLocatePointrg   rh   Nri   r)   r)   r)   r*   r­   Å  rj   r­   c                   @   rG   )Ú	MakeValidNrI   r)   r)   r)   r*   r®   Ë  rJ   r®   c                   @   r~   )ÚMemSizer   N©r,   rC   rD   r   r   rd   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>rg   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   rd   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   rp   r   r   )r"   rr   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   rg   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>rg   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"   rr   r;   r$   Únargsr#   r'   r-   r*   r     s   ÿÿþzSnapToGrid.__init__r»   r)   r)   r'   r*   r½     ó    r½   c                   @   r‰   )ÚSymDifferencerg   rh   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   rq   r   r   r   )r"   rr   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   rp   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‰   )ÚUnionrg   rh   Nr‹   r)   r)   r)   r*   rÉ   2  rŒ   rÉ   N)HÚ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   rq   rN   rY   r   rH   rK   rM   rV   r\   rf   rk   rt   rw   r}   r   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)   r*   Ú<module>   sl    (

V
	3	'	