o
    [h1                     @   sx   d Z ddlmZ ddlmZ g dZeeefZdZ	dd Z
eG dd	 d	ZG d
d deZG dd deZeZeZdS )a  
Distance and Area objects to allow for sensible and convenient calculation
and conversions.

Authors: Robert Coup, Justin Bronn, Riccardo Di Virgilio

Inspired by GeoPy (https://github.com/geopy/geopy)
and Geoff Biggs' PhD work on dimensioned units for robotics.
    )Decimal)total_ordering)AAreaDDistanceZsq_c                 C   s   | j tkr| jS | j jS N)	__class__type__name__)obj r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/contrib/gis/measure.pypretty_name/   s   r   c                   @   s   e Zd ZdZi Zi Zi Zd,ddZdd Zdd Z	e
ee	Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zed*d+ ZdS )-MeasureBaseNc                 K   s>   |  |\}| _t| | j| |rt|tr|| _d S d S d S r   )default_units_default_unitsetattrSTANDARD_UNIT
isinstancestr)selfdefault_unitkwargsvaluer   r   r   __init__:   s
   
zMeasureBase.__init__c                 C   s   t | | jS r   )getattrr   r   r   r   r   _get_standard@   s   zMeasureBase._get_standardc                 C   s   t | | j| d S r   )r   r   )r   r   r   r   r   _set_standardC   s   zMeasureBase._set_standardc                 C   s&   || j v r| j| j |  S td| )NUnknown unit type: %s)UNITSstandardAttributeError)r   namer   r   r   __getattr__H   s   
zMeasureBase.__getattr__c                 C   s   dt | | jt| | jf S )Nz	%s(%s=%s))r   r   r   r   r   r   r   __repr__N   s
   
zMeasureBase.__repr__c                 C   s   dt | | j| jf S )Nz%s %s)r   r   r   r   r   r   __str__U   s   zMeasureBase.__str__c                 C   s   t || jr| j|jkS tS r   r   r	   r"   NotImplementedr   otherr   r   r   __eq__Z      zMeasureBase.__eq__c                 C   
   t | jS r   )hashr"   r   r   r   r   __hash__`      
zMeasureBase.__hash__c                 C   s   t || jr| j|jk S tS r   r(   r*   r   r   r   __lt__c   r-   zMeasureBase.__lt__c                 C   sD   t || jr| jdd| ji| j| j|j iS tddt| i )Nr   &%(class)s must be added with %(class)sclassr   r   r	   r   r   r"   	TypeErrorr   r*   r   r   r   __add__k   s   zMeasureBase.__add__c                 C   s4   t || jr|  j|j7  _| S tddt| i )Nr3   r4   r   r	   r"   r6   r   r*   r   r   r   __iadd__v   s   zMeasureBase.__iadd__c                 C   sD   t || jr| jdd| ji| j| j|j iS tddt| i )Nr   +%(class)s must be subtracted from %(class)sr4   r   r5   r*   r   r   r   __sub__   s   
zMeasureBase.__sub__c                 C   s4   t || jr|  j|j8  _| S tddt| i )Nr:   r4   r8   r*   r   r   r   __isub__   s   
zMeasureBase.__isub__c                 C   s@   t |tr| jdd| ji| j| j| iS tddt| i )Nr   (%(class)s must be multiplied with numberr4   r   r   NUMERIC_TYPESr	   r   r   r"   r6   r   r*   r   r   r   __mul__   s   

zMeasureBase.__mul__c                 C   s4   t |tr|  jt|9  _| S tddt| i )Nr=   r4   r   r?   r"   floatr6   r   r*   r   r   r   __imul__   s   

zMeasureBase.__imul__c                 C   s   | | S r   r   r*   r   r   r   __rmul__   s   zMeasureBase.__rmul__c                 C   sX   t || jr| j|j S t |tr"| jdd| ji| j| j| iS tddt| i )Nr   z2%(class)s must be divided with number or %(class)sr4   r   )r   r	   r"   r?   r   r   r6   r   r*   r   r   r   __truediv__   s   

zMeasureBase.__truediv__c                 C   s4   t |tr|  jt|  _| S tddt| i )Nz%%(class)s must be divided with numberr4   rA   r*   r   r   r   __itruediv__   s   
zMeasureBase.__itruediv__c                 C   r.   r   )boolr"   r   r   r   r   __bool__   r1   zMeasureBase.__bool__c                 C   s   d}| j }| D ]d\}}t|tst|}|| jv r'|| j| | 7 }|}q	|| jv r=| j| }|| j| | 7 }|}q	| }|| jv rR|| j| | 7 }|}q	|| jv rh| j| }|| j| | 7 }|}q	td| ||fS )z|
        Return the unit value and the default units specified
        from the given keyword arguments dictionary.
        g        r    )	r   itemsr   rB   r!   ALIASlowerLALIASr#   )r   r   valr   unitr   urK   r   r   r   r      s,   






zMeasureBase.default_unitsc                 C   sF   |  }|| jv r|S || jv r|S || jv r| j| S td| )z
        Retrieve the unit attribute name for the given unit string.
        For example, if the given unit string is 'metre', return 'm'.
        Raise an AttributeError if an attribute cannot be found.
        zUnknown unit type: )rK   r!   rL   r#   )clsZunit_strrK   r   r   r   unit_attname   s   



zMeasureBase.unit_attnamer   )r   
__module____qualname__r   rJ   r!   rL   r   r   r   propertyr"   r%   r&   r'   r,   r0   r2   r7   r9   r;   r<   r@   rC   rD   rE   rF   rH   r   classmethodrQ   r   r   r   r   r   3   s8    

	

	r   c                   @   s  e Zd ZdZi dddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3Zi d4dd5dd6d7d8d9d:d9d;dd<dd=d>d?d>d@dAdBdAdCdDdEdFdGddHd
dIddJdi dKddLddMddNddOddPddQddRddSddTddUd dVd"dWdXdYdZd[d\d]d^d_d`d`d"dadbZdcdd e D Zdedf ZdgS )hr   mchaing=,Ԛ4@Zchain_benoitgl4@Zchain_searsgs<G4@Zbritish_chain_benoitg|1"u4@Zbritish_chain_searsgᕪQ4@Zbritish_chain_sears_truncatedg4@cmg{Gz?Z
british_ftgGՁ?Z
british_ydglGvB?Z	clarke_ftg)hć?Zclarke_linkg#Zп?ZfathomgB?ftgׁ?ZfurlonggL7A`%i@Zgerman_mg]A ?Zgold_coast_ftgäց?Z	indian_ydg/!B?g
F%u?g     @@g8~߿?g,ݿ?gܿ?g      ?gL7A`%@gMbP?g     @g~j@g=,Ԛ@g\NtB?g`jځ?gư>gB?)inchkmlinklink_benoit
link_searsrV   mimmnmnm_ukZrodsears_yd	survey_ftumydZ
centimeterfootZinchesrZ   Z	kilometerr[   Z	kilometreZmeterZmetreZ
micrometerre   Z
micrometreZ
millimeterr`   Z
millimetreZmiler_   Zyardrf   zBritish chain (Benoit 1895 B)zBritish chain (Sears 1922)z$British chain (Sears 1922 truncated)zBritish foot (Sears 1922)zBritish footzBritish yard (Sears 1922)zBritish yardzClarke's FootzClarke's linkzChain (Benoit)zChain (Sears)zFoot (International)zFurrow LongzGerman legal metrezGold Coast footzIndian yardzLink (Benoit)r]   zLink (Sears)r^   zNautical Milera   zNautical Mile (UK)rb   zUS survey footrd   rc   )z	U.S. FootzYard (Indian)zYard (Sears)c                 C      i | ]	\}}|  |qS r   rK   .0kvr   r   r   
<dictcomp>E      zDistance.<dictcomp>c                 C   sx   t || jrtddt| j it| j | j|j iS t |tr1| jdd| ji| j| j| iS tddt	| ji )Nr   z;%(distance)s must be multiplied with number or %(distance)sZdistancer   )
r   r	   r   AREA_PREFIXr   r   r"   r?   r6   r   r*   r   r   r   r@   G  s$   

zDistance.__mul__N)	r   rR   rS   r   r!   rJ   rI   rL   r@   r   r   r   r   r      s    	
$	
 !"#'r   c                   @   sh   e Zd Zeej Zdd ej D ddiB Zdd ej D ddiB Zdd e D Z	dd	 Z
d
S )r   c                 C   s"   i | ]\}}d t |f |d qS )%s%s   rp   rj   r   r   r   rn   ^  s   " zArea.<dictcomp>Zhai'  c                 C   s   i | ]\}}|d t |f qS )rq   rs   rj   r   r   r   rn   a  s    Zhectarec                 C   rh   r   ri   rj   r   r   r   rn   e  ro   c                 C   s@   t |tr| jdd| ji| j| j| iS tddt| i )Nr   z%%(class)s must be divided by a numberr4   r   r>   r*   r   r   r   rE   g  s   
zArea.__truediv__N)r   rR   rS   rp   r   r   r!   rI   rJ   rL   rE   r   r   r   r   r   [  s    
r   N)__doc__decimalr   	functoolsr   __all__intrB   r?   rp   r   r   r   r   r   r   r   r   r   r   <module>   s   	
 Ec