o
    `"<f0                     @   s   d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlZd	d
lmZ G dd deZG dd deeZG dd deZG dd deeZdS )av  
UnixTimeStampField

release |release|, version |version|

.. versionadded:: 0.4.0

    Import Six library from https://pypi.org/project/six/.

.. versionadded:: 0.3.7

    Check minimum value.

.. versionadded:: 0.3.6

    Fix timezone problem. All records are stored UTC timezone and convert while retrive.

.. versionadded:: 0.3.5.1

    Integer compatibility and fix timezone problem

.. versionadded:: 0.3.5

    Parse time format: YYYY-mm-dd HH:MM:SS[.FFFFFF]

.. versionadded:: 0.3.4

    Bugs fixed.

.. versionadded:: 0.3.3

    Add sub-middleware and template tags

.. versionadded:: 0.3

    Add ordinal time field and change field options **use_float** to **use_numeric**!!!

.. versionadded:: 0.1

    Initial


Contents
--------

Classes:

* :class:`TimestampPatchMixin`
* :class:`UnixTimeStampField`
* :class:`OrdinalPatchMixin`
* :class:`OrdinalField`

Members
-------

    )unicode_literalsN)Field)timezone)
exceptions)settings)fields   field_value_middlewarec                   @   sh   e Zd ZdZd\Z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S )TimestampPatchMixini)gMBic                 C   s<   t |r|t jdddt jd  S |t ddd  S )z2
        Py2 doesn't supports timestamp()
          r   )tzinfo)r   is_awaredatetimeutctotal_secondsselfv r   P/var/www/html/kck/venv/lib/python3.10/site-packages/unixtimestampfield/fields.py_datetime_to_timestampO   s   
z*TimestampPatchMixin._datetime_to_timestampc                 C   s.   t j }tjrt t |t jt  }|S zG
        get datetime now according to USE_TZ and default time
        )	r   r   utcnowr   USE_TZ	localtime
make_awarer   get_default_timezoner   valuer   r   r   get_datetimenowZ   s   
z#TimestampPatchMixin.get_datetimenowc                 C   s   |  tj S )z(
        get utc unix timestamp
        )r   r   r   r   r   r   r   r   get_timestampnowf   s   z$TimestampPatchMixin.get_timestampnowc                 C   s   t |tjttjfrzt|W S  ty   | |}Y nw t |tjr)| |S |du r:zt| j	W S    Y dS t
jd| dd)z7
        from value to timestamp format(float)
        N        *Unable to convert value: '%s' to timestampinvalid_timestampcode)
isinstancesixinteger_typesfloatstring_types
ValueErrordatetime_str_to_datetimer   r   defaultr   ValidationErrorr   r   r   r   to_timestampl   s"   

z TimestampPatchMixin.to_timestampc              
   C   s   t |tjttjfrz| |W S  ty   | | Y S w t |tjr'|S |du rAz| | j	W S    t
ddddd Y S tjd| dd)X
        from value to datetime with tzinfo format (datetime.datetime instance)
        Nr   r   r   1Unable to convert value: '%s' to python data typeinvalid_datetimer&   )r(   r)   r*   r+   r,   from_numberr-   r.   r   r/   r   r   r0   r   r   r   r   to_naive_datetime   s"   z%TimestampPatchMixin.to_naive_datetimec                 C   s8   |  |}t|rt|tj}|S t|tj}|S )r2   )r6   r   is_naiver   r   r   r   r   r   r   to_utc_datetime   s   

z#TimestampPatchMixin.to_utc_datetimec                 C   s   t | |t  S )z6
        convert to default timezone datetime
        )r   r   r8   r   r   r   r   r   to_default_timezone_datetime   s   z0TimestampPatchMixin.to_default_timezone_datetimec                 C   s.   t jrt jdkr| |S | |S | |S )NUTC)r   r   	TIME_ZONEr9   r8   r6   r   r   r   r   to_datetime   s
   



zTimestampPatchMixin.to_datetimec                 C   sH   z| ddkrtj|dW S tj|dW S    tjd| dd)N.r   z%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%SzKUnable to convert value: '%s' to datetime, please use 'YYYY-mm-dd HH:MM:SS'r%   r&   )findr   r   strptimer   r0   r   r   r   r   r.      s   z,TimestampPatchMixin.datetime_str_to_datetimec                 C   sT   t |}|| jks|| jk rtjd| j| jf ddtdddddtj|d S )NzMValue out of range,acceptable: %s ~ %s (1/1/1 00:00:00 ~ 9999/12/31 23:59:59)out_of_rnager&   r   r   r   )seconds)r+   MAX_TSMIN_TSr   r0   r   r   	timedeltar   r   r   r   r5      s   
zTimestampPatchMixin.from_numberN)__name__
__module____qualname__INT32rB   rC   r   r    r"   r1   r6   r8   r9   r<   r.   r5   r   r   r   r   r   J   s    
r   c                       s   e Zd ZdZdZdZ		d fdd	Z fdd	Zd
d Zdd Z	dd Z
dd Zdd Z fddZdddZdd Z fddZ fddZ  ZS ) UnixTimeStampField
    Copy and mimic django.db.models.fields.DatetimeField
    Stored as float in database and used as datetime object in Python

    FzUnix POSIX timestampN   c                    sR   ||| _ | _||| _| _|s|rd|d< d|d< tt| j||fi | d S NFeditableTblank)auto_nowauto_now_addround_touse_numericsuperrI   __init__)r   verbose_namenamerO   rP   rQ   rR   kwargs	__class__r   r   rT      s   zUnixTimeStampField.__init__c                    sV   t t|  \}}}}| jrd|d< | jrd|d< | js| jr%|d= |d= ||||fS )NTrO   rP   rM   rN   )rS   rI   deconstructrO   rP   )r   rV   pathargsrW   rX   r   r   rZ      s   zUnixTimeStampField.deconstructc                 C      dS N
FloatFieldr   r!   r   r   r   get_internal_type      z$UnixTimeStampField.get_internal_typec                 C   s>   | j s| jr|r|  }nt|| j}t|| jt| | |S N)rO   rP   r    getattrattnamesetattrr
   )r   model_instanceaddr   r   r   r   pre_save   s
   
zUnixTimeStampField.pre_savec                 C   
   t | |S rb   r	   r   r   r   r   	to_python      
zUnixTimeStampField.to_pythonc                 C   sD   | j s| jr|  }nd}|  r| j}t| jr|  }| |S )Nr#   )rO   rP   r    has_defaultr/   callablerj   r   r   r   r   get_default   s   


zUnixTimeStampField.get_defaultc                 C   s   |  |}|d u rdS |S )N )_get_val_from_obj)r   objvalr   r   r   value_to_string	  s   
z"UnixTimeStampField.value_to_stringc                    s   t t| |}| |S rb   )rS   rI   get_prep_valuer1   r   rX   r   r   rt     s   
z!UnixTimeStampField.get_prep_valuec                 C   s   |s|  |}| |S rb   )rt   r1   )r   r   
connectionpreparedr   r   r   get_db_prep_value  s   

z$UnixTimeStampField.get_db_prep_valuec                 C   ri   rb   r	   )r   r   
expressionru   r   r   r   from_db_value  rk   z UnixTimeStampField.from_db_valuec                    s   t tt| || jS rb   )roundrS   rI   r1   rQ   r   rX   r   r   r1     s   zUnixTimeStampField.to_timestampc                    *   dt ji}|| tt| jdi |S N
form_classr   )r   	CharFieldupdaterS   rI   	formfieldr   rW   defaultsrX   r   r   r        

zUnixTimeStampField.formfield)NNFFrK   F)F)rE   rF   rG   __doc__empty_strings_alloweddescriptionrT   rZ   r`   rh   rj   rn   rs   rt   rw   ry   r1   r   __classcell__r   r   rX   r   rI      s$    		
rI   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )OrdinalPatchMixini۹7 c                 C   s   |  S )z,
        overwrite to use toordinal
        )	toordinalr   r   r   r   r   &  s   z(OrdinalPatchMixin._datetime_to_timestampc                 C   s:   t jt j  }tjrt t |t j	t 
 }|S r   )r   r   fromordinalr   r   r   r   r   r   r   r   r   r   r   r   r    ,  s   z!OrdinalPatchMixin.get_datetimenowc                 C   s|   t |tjttjfrzt|W S  ty   | |}Y nw t |tjr5t	
|r0t	|t	j}| |S tjd| dd)z=
        from value to ordinal timestamp format(int)
        r$   r%   r&   )r(   r)   r*   r+   r,   intr-   r.   r   r   r   r   r   r   r   r0   r   r   r   r   r1   8  s   


zOrdinalPatchMixin.to_timestampc                 C   s`   t |tjttjfrz| |W S  ty   | | Y S w t |tjr'|S t	j
d| ddr2   r3   r4   r&   )r(   r)   r*   r+   r,   r5   r-   r.   r   r   r0   r   r   r   r   r6   L  s   z#OrdinalPatchMixin.to_naive_datetimec                 C   sj   t |tjttjfr| |}t |tjr,t|r#t	|tj
}|S t|tj
}|S tjd| ddr   )r(   r)   r*   r+   r,   r6   r   r   r7   r   r   r   r   r0   r   r   r   r   r8   ^  s   

z!OrdinalPatchMixin.to_utc_datetimec                 C   sP   t |}|| jks|dk rtjd| j ddtdddddtj|d d S )Nr   z;Value out of range, acceptable: 1 ~ %s (1/1/1 ~ 9999/12/31)r@   r&   r   )days)r   MAX_ODr   r0   r   r   rD   r   r   r   r   r5   q  s   "zOrdinalPatchMixin.from_numberN)
rE   rF   rG   r   r   r    r1   r6   r8   r5   r   r   r   r   r   "  s    r   c                       sB   e Zd ZdZdZdZ		d fdd	Zdd Z fd	d
Z  Z	S )OrdinalFieldrJ   FzOrdinal timestampNc                    sL   |||| _ | _| _|s|rd|d< d|d< tt| j||fi | d S rL   )rO   rP   rR   rS   rI   rT   )r   rU   rV   rO   rP   rR   rW   rX   r   r   rT     s
   zOrdinalField.__init__c                 C   r]   r^   r   r!   r   r   r   r`     ra   zOrdinalField.get_internal_typec                    r{   r|   )r   r~   r   rS   r   r   r   rX   r   r   r     r   zOrdinalField.formfield)NNFFF)
rE   rF   rG   r   r   r   rT   r`   r   r   r   r   rX   r   r   {  s    r   )r   
__future__r   r   django.db.modelsr   django.utilsr   django.corer   django.confr   django.formsr   r)   submiddlewarer
   objectr   rI   r   r   r   r   r   r   <module>   s   8 QY