
    ?wg                     \    d Z ddlZddZddZ G d de      Z G d de      Zdd	Zdd
Zy)zUseful things to do with dates    Nc                 J   t        |t              r.t        j                  j                  | |      j	                         S |g d}|D ]2  }	 t        j                  j                  | |      j	                         c S  t        dj                  |             # t
        $ r Y Zw xY w)zRuns through a few common string formats for datetimes,
    and attempts to coerce them into a datetime. Alternatively,
    format_string can provide either a single string to attempt
    or an iterable of strings to attempt.)z%Y-%m-%dz%m-%d-%Yz%m/%d/%Yz%d/%m/%Yz&Could not produce date from string: {})
isinstancestrdatetimestrptimedate
ValueErrorformat)stringformat_stringr
   s      B/var/www/horilla/myenv/lib/python3.12/site-packages/utils/dates.pydate_from_stringr      s     -%  ))&-@EEGG		
   	$$--ff=BBDD =DDVL
MM  		s   -B	B"!B"c           	          t        | t        j                        r| S t        j                  | j                  | j                  | j                  ||||      S )z5given a datetime.date, gives back a datetime.datetime)r   r   yearmonthday)
plain_datehoursminutessecondsmss        r   to_datetimer      sP     *h//0
     c                   F    e Zd Zd Zd Zd Zd Zd Zd Zd Z	e
d        Zy	)

TimePeriodc                    t        |t        j                        s|t        d      t        |t        j                        s|t        d      |t	        |      }|t	        |ddd      }||||k\  rt        d      || _        || _        y )NzEarliest must be a date or NonezLatest must be a date or None   ;   z$Earliest must be earlier than latest)r   r   r   	TypeErrorr   r	   	_earliest_latest)selfearliestlatests      r   __init__zTimePeriod.__init__1   s    (HMM2x7K=>>&(--0V5G;<< "8,H R4FF$68v;MCDD!r   c                    t        |t        j                        rMt        |      }| j                  d}n|| j                  k  }| j
                  d}n| j
                  |k  }|xr |S t        |t              rt| j                  d}n(|j                  d}n| j                  |j                  k\  }| j
                  d}n(|j
                  d}n| j
                  |j
                  k  }|xr |S y )NTF)r   r   r   r   r!   r    r   )r"   keyupper_boundedlower_boundeds       r   __contains__zTimePeriod.__contains__C   s    c8==)c"C||# $ #t|| 3~~% $ $# 5 2]2Z(||# $$ % $ ;~~% $& % $#-- ? 2]2 )r   c                 
    || v S N r"   others     r   containszTimePeriod.containsd   s    }r   c                 >    | j                   |v xs | j                  |v S )aR  does another datetime overlap with this one? this is a symmetric
        property.

        TP1       |------------|
        -------------------------------------------------> time
        TP2                 |--------------|

        TP1.overlaps(TP2) == TP2.overlaps(TP1) == True

        args:
            other - a TimePeriod
        )r!   r    r.   s     r   overlapszTimePeriod.overlapsg   s!     ||u$?%(??r   c                 j    | j                   |j                   k(  xr | j                  |j                  k(  S r,   )r    r!   r.   s     r   __eq__zTimePeriod.__eq__w   s'    %//1V8UVr   c                 D    t        | j                  | j                  f      S r,   )hashr    r!   r"   s    r   __hash__zTimePeriod.__hash__z   s    T^^T\\233r   c                 x    dj                  | j                  j                  | j                  | j                        S )Nz<{}: {}-{}>)r
   	__class____name__r    r!   r7   s    r   __repr__zTimePeriod.__repr__}   s0    ##NN##NNLL
 	
r   c                    t        d |D              rt        dj                  |            t        j                  j                  }t        j                  j
                  }|D ]\  }|j                  d}n||j                  |kD  r|j                  }|j                  d}>|A|j                  |k  sQ|j                  }^ t        ||      S )zZGiven a bunch of TimePeriods, return a TimePeriod that most closely
        contains them.c              3   >   K   | ]  }t        |t                 y wr,   r   r   .0periods     r   	<genexpr>z3TimePeriod.get_containing_period.<locals>.<genexpr>        Hf:fj11H   #periods must all be TimePeriods: {}N)	anyr   r
   r   minmaxr!   r    r   )clsperiodsr$   r#   rB   s        r   get_containing_periodz TimePeriod.get_containing_period   s    
 HHHAHHQRR""&&$$(( 
	,F~~%#(?'%&*:*:X*E!++
	, (F++r   N)r;   
__module____qualname__r%   r*   r0   r2   r4   r8   r<   classmethodrL   r-   r   r   r   r   /   s<    $3B@ W4
 , ,r   r   c                       e Zd ZdZd Zd Zy)DiscontinuousTimePeriodzA bunch of TimePeriodsc                 d   t        d |D              rt        dj                  |            t        |      }g }|D ]Z  |D ]B  }t	        |      t	              k(  rj                  |      s-t        j                  |      D |j                         \ g }t        |      }|D ]9  t        fd|D              r|j                         )|j                         ; g }|D ]>  d}|D ]!  }t	        |      t	              k(  r|v s d}# |r.|j                         @ || _
        y )Nc              3   >   K   | ]  }t        |t                 y wr,   r?   r@   s     r   rC   z3DiscontinuousTimePeriod.__init__.<locals>.<genexpr>   rD   rE   rF   c              3   4   K   | ]  }|k(  xr |u  y wr,   r-   )rA   other_periodrB   s     r   rC   z3DiscontinuousTimePeriod.__init__.<locals>.<genexpr>   s#     g\<6)Hl&.HHgs   FT)rG   r   r
   setidr2   r   rL   appendremove_periods)	r"   rK   no_overlaps_periodsrU   no_equals_periods	referenceno_contains_periodsskiprB   s	           @r   r%   z DiscontinuousTimePeriod.__init__   sP   HHHAHHQRRg,  		/F ' Tl#r&z1 ??<0'==flSFT  &&v.		/ +,	) 	1Fg]fgg  (!((0	1 !' 	3FD 1  l#r&z1\)D  #**62	3 ,r   c                 t    t        |t        j                  t        f      r| j                  D ]  }||v s y y y )NT)r   r   r   r   rZ   )r"   r/   rB   s      r   r*   z$DiscontinuousTimePeriod.__contains__   s7    ehmmZ89--  F?  :r   N)r;   rM   rN   __doc__r%   r*   r-   r   r   rQ   rQ      s     (,T r   rQ   c                     t        j                  |       }t         j                   j                         |z
  }|r|S |j                         S N)daysr   	timedeltanowr   rd   give_datetimedeltadts       r   days_agorl      ?    D)E						 5	(B	wwyr   c                     t        j                  |       }t         j                   j                         |z   }|r|S |j                         S rc   re   rh   s       r   
days_aheadro      rm   r   r,   )r   r   r   r   )T)	ra   r   r   r   objectr   rQ   rl   ro   r-   r   r   <module>rq      s<    $ N4 l, l,^1 f 1 hr   