o
    [h!                     @   s   d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZ dd Zdd	 Zd
d Zdd ZG dd deZG dd deZG dd deZdd Zdd Zdd ZG dd dejZdd Zdd ZdS )     )	dngettextN)DecimalROUND_HALF_UP)settings)CURRENCY_SYMBOLSget_currency_formatformat_numberc                 C   s*   t | tr| S t | trt| S t| S N)
isinstancer   float
from_float)amount r   u/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/otree/currency.py_to_decimal   s
   


r   c                    s   t t| d  d fdd	S )Nc                    s   |   | S r	   	__class__)selfcontextmethodr   r   <lambda>   s    z&_make_unary_operator.<locals>.<lambda>r	   getattrr   )namer   r   r   _make_unary_operator   s   r   c              	   C   s,   zt |W S    tdt| t|d )Nz1Cannot do arithmetic operation between {} and {}.)r   	TypeErrorformatreprr   otherr   r   r   _prepare_operand   s   
r!   c                    s   t t| d  d fdd	}|S )Nc                    s   t | |}|  | |S r	   )r!   r   )r   r    r   r   r   r   binary_function+   s   
z._make_binary_operator.<locals>.binary_functionr	   r   )r   r"   r   r   r   _make_binary_operator(   s   r#   c                   @   s<  e Zd ZdZdd Zedd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zd3ddZdd Zdd Zdd ZejZd3ddZedZedZedZed Zed!Zed"Zed#Zed$Zed%Zed&Zed'Z ed(Z!ed)Z"e#ed*red*Z$ed+Z%ed,Z&ed-Z'ed.Z(ed/Z)ed0Z*ed1d2 Z+dS )4BaseCurrency   c                 C   s"   |d u rt dt| | |S )NzCannot convert None to currency)
ValueErrorr   __new__	_sanitize)clsr   r   r   r   r'   :   s   zBaseCurrency.__new__c                 C   s0   t || r|S td|   }t|j|tdS )Nz0.1)rounding)r
   r   get_num_decimal_placesr   quantizer   )r)   r   Zquantr   r   r   r(   ?   s   
zBaseCurrency._sanitizec                 C   s   | j t| ffS r	   )r   r   __str__r   r   r   r   
__reduce__G   s   zBaseCurrency.__reduce__c                 C      | S r	   r   r.   r   r   r   __copy__K      zBaseCurrency.__copy__c                 C   r0   r	   r   )r   memor   r   r   __deepcopy__N   r2   zBaseCurrency.__deepcopy__c                 C   s   t t| S )zFloat representation.)r   r   r.   r   r   r   	__float__Q   s   zBaseCurrency.__float__c                 C   s   |   S r	   _format_currencyr.   r   r   r   __unicode__U      zBaseCurrency.__unicode__c                 C   s   |   }|S r	   r6   )r   stringr   r   r   r-   X   s   zBaseCurrency.__str__Nc                 C   sT   |d u r|   }t| }tj}d|v r|d\}}n|d}}t|||tj|dS )N- )lcLOCURplaces)r+   r   r   LANGUAGE_CODEsplitformat_currencyZREAL_WORLD_CURRENCY_CODE)r   r@   numberrA   r=   r>   r   r   r   r7   \   s   
zBaseCurrency._format_currencyc                 C   s8   |dv r	t | }ntt| |}t|tr|dS |S )z+needed if you use eg. f-strings in .py code>   r<   szutf-8)strr   r   r
   bytesencode)r   format_spec	formattedr   r   r   
__format__i   s   


zBaseCurrency.__format__c                 C   s   t |  dS )Ncu)r   r-   r.   r   r   r   __repr__u   s   zBaseCurrency.__repr__c                 C   s<   t |trt| |S t |tttfrt| | |S dS )NF)r
   r$   r   __eq__intr   r(   r   r   r   r   rN   x   s
   
zBaseCurrency.__eq__c                 C   s   t | |}| t| ||S r	   )r!   r   r   __pow__)r   r    Zmodulor   r   r   rP      s   
zBaseCurrency.__pow____abs____pos____neg____add____radd____sub____rsub____mul____rmul____floordiv____rfloordiv____truediv____rtruediv____div____rdiv____mod____rmod__
__divmod____rdivmod____rpow__c                 C   s   t  r	   )NotImplementedErrorr)   r   r   r   r+         z#BaseCurrency.get_num_decimal_placesr	   ),__name__
__module____qualname__ZMIN_DECIMAL_PLACESr'   classmethodr(   r/   r1   r4   r5   r8   r-   r7   rK   rM   rN   r   __hash__rP   r   rQ   rR   rS   r#   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   hasattrr^   r_   r`   ra   rb   rc   rd   r+   r   r   r   r   r$   5   sP    



r$   c                       s2   e Zd Zedd Zdd Zd fdd	Z  ZS )	Currencyc                 C   s   t jrt jS t jS r	   )r   
USE_POINTSPOINTS_DECIMAL_PLACES"REAL_WORLD_CURRENCY_DECIMAL_PLACESrf   r   r   r   r+      s   zCurrency.get_num_decimal_placesc                 C   s    t jrtt| |jd  S | S )NZreal_world_currency_per_point)r   ro   RealWorldCurrencyr   configr   sessionr   r   r   to_real_world_currency   s
   zCurrency.to_real_world_currencyNc                    sT   t | }tjr#|d}ttdd r| dtj S tddd||S t j|dS )NnPOINTS_CUSTOM_NAME djangoz{} pointz	{} pointsr@   )	r   r   ro   r   rx   r   r   superr7   )r   r@   rD   Zformatted_numberr   r   r   r7      s   zCurrency._format_currencyr	   )rh   ri   rj   rk   r+   rv   r7   __classcell__r   r   r   r   rn      s
    
rn   c                   @   s$   e Zd ZdZdd Zedd ZdS )rr   zpayment currencyc                 C   r0   r	   r   rt   r   r   r   rv      r2   z(RealWorldCurrency.to_real_world_currencyc                 C   s   t jS r	   )r   rq   rf   r   r   r   r+      rg   z(RealWorldCurrency.get_num_decimal_placesN)rh   ri   rj   __doc__rv   rk   r+   r   r   r   r   rr      s
    rr   c                 C   s   t | tr	t| S | S r	   )r
   rn   r   )valuer   r   r   to_dec   s   r   c           	      C   sP   t ||}t|||}tt| |d}|d|d|}| dk r&d| S |S )Nr{      ¤#r   r;   )r   getr   r   absreplace)	rD   r=   r>   r?   r@   symbolZc_formatZnumber_partretvalr   r   r   rC      s   rC   c                 C   sp   || ksJ t |dkrtjrd}nd}td||dks!J g }t | }	 ||kr.|S || ||7 }q()Nr   rp   rq   zhcurrency_range() step argument must not be zero. Maybe your {} setting is causing it to be rounded to 0.)rn   r   ro   r&   r   append)firstlast	incrementZsetting_namevaluescurrent_valuer   r   r   currency_range   s$   
r   c                   @   s   e Zd Zdd ZdS )_CurrencyEncoderc                 C   s8   t |ttfr| dkrt|S t|S tj| |S )Nr   )	r
   rn   rr   r+   rO   r   jsonJSONEncoderdefault)r   objr   r   r   r     s
   z_CurrencyEncoder.defaultN)rh   ri   rj   r   r   r   r   r   r     s    r   c                 C   s   t j| tdS )Nrf   )r   dumpsr   r   r   r   r   
json_dumps  s   r   c                 C   s   t | S r	   )r   r   r   r   r   	safe_json  r9   r   )gettextr   r   decimalr   r   Zotreer   Z
otree.i18nr   r   r   r   r   r!   r#   r$   rn   rr   r   rC   r   r   r   r   r   r   r   r   r   <module>   s$    	
q(

