
    c0/                         U d Z dZddlZddlZddlZddlmZmZ ddlm	Z	m
Z
mZmZ ddl
mZ ddlmZmZ ddlmZmZmZmZmZ dd	lmZ 	 dd
lmZmZmZ  edd      Zdddddddd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/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdC
Z dwdDee	ef   dEe!dFefdGZ"dHe!dIe!dJe!dKee	ef   dFee	ef   f
dLZ#dDee	ef   dFe!fdMZ$dNe%dKee	ef   dFee	ef   fdOZ&dPee	ef   dQee	ef   dFe!fdRZ'dSee	ef   dQee	ef   dFeee	   ee   f   fdTZ(dPe	dUe!dFe	fdVZ)dPee	ef   dQee	ef   dFe!fdWZ*	 dxdSe	dQe	dXee   dYee+   dFee	edf   f
dZZ, ed[      Z-ee.d\<    ed][      Z/ee.d^<     ed_      ej                        Zdyd`Z0dae	dFe	fdbZ1dc Z2dd Z3daee	ef   dFe!fdeZ4dfe!dFefdgZ5dae	dFe!fdhZ6di Z7dwdjZ8dwdae	dke!dFe	fdlZ9dm Z:dae	dFe	fdnZ;dzdaedoe%dFe%fdpZ<dqedFefdrZ=ds Z>dt Z?du Z@dv ZAy# e$ r dZeZY w xY w){z#Date manipulation helper functions.zrestructuredtext en    N)	getlocaleLC_TIME)datetimedatetime	timedelta)strptime)
monthrangetimegm)UnionListAnyOptional	Generator)callable_deprecated)RelativeDateTimeDateDateTimeType   )monthsdayz%s-01-01z%s-05-01z%s-05-08z%s-07-14z%s-08-15z%s-11-01z%s-11-11z%s-12-25)jour_anfete_travailarmistice1945fete_nat
assomption	toussaintarmistice1918noel
paques2004z
2004-04-12ascension2004z
2004-05-20pentecote2004z
2004-05-31
paques2005z
2005-03-28ascension2005z
2005-05-05pentecote2005z
2005-05-16
paques2006z
2006-04-17ascension2006z
2006-05-25pentecote2006z
2006-06-05
paques2007z
2007-04-09ascension2007z
2007-05-17pentecote2007z
2007-05-28
paques2008z
2008-03-24ascension2008z
2008-05-01pentecote2008z
2008-05-12
paques2009z
2009-04-13ascension2009z
2009-05-21z
2009-06-01z
2010-04-05z
2010-05-13z
2010-05-24z
2011-04-25z
2011-06-02z
2011-06-13z
2012-04-09z
2012-05-17z
2012-05-28)
pentecote2009
paques2010ascension2010pentecote2010
paques2011ascension2011pentecote2011
paques2012ascension2012pentecote2012dateobjnbdaysreturnc                 8    t        | t              r	t        |z  S |S N)
isinstancer   ONEDAY)r<   r=   s     5/usr/lib/python3/dist-packages/logilab/common/date.pyget_steprD   X   s    '4 M    yearmonthr   
sampledatec                     t        |t              rt        | ||      S t        |t              rt        | ||      S t        | ||      S r@   )rA   r   r   r   )rF   rG   r   rH   s       rC   datefactoryrJ   _   sE     *h'eS))*d#D%%%eS!!rE   c                 Z    t        | t              r| j                         S | j                  S r@   )rA   r   weekdayday_of_week)r<   s    rC   rL   rL   j   s%    '4   rE   datestrc                     | j                  d      D cg c]  }t        |       c}\  }}}t        ||||      S c c}w )N-)splitintrJ   )rN   rH   chunkrF   rG   r   s         rC   str2daterT   q   s=    07c0BCuE
CD%tUC44 Ds   ;startendc                     t        | t              r>t        |t              sJ || z
  }|j                  r|j                  dz   S |j                  S t	        t        j                  || z
  j                              S Nr   )rA   r   secondsdaysrR   mathceil)rU   rV   deltas      rC   days_betweenr^   w   sd    % #t$$$e==::>!zz499cEk//011rE   beginc                 &   t        | j                  | j                  | j                  |       } t        |j                  |j                  |j                  |      }t        j                         D cg c]  }t        ||        }}t        | j                  |j                  dz         D ]@  }t        j                         D ]'  }t        ||z  |       }||vs|j                  |       ) B |D cg c]  }| |cxk  r|k  sn n| c}S c c}w c c}w )z5return french national days off between begin and endr   )
rJ   rF   rG   r   FRENCH_MOBILE_HOLIDAYSvaluesrT   rangeFRENCH_FIXED_HOLIDAYSappend)r_   rV   rN   holidaysrF   r   r   s          rC   get_national_holidaysrg      s     

EKKEBE
chh		377C
8C8N8U8U8WXW%(XHXejj#((Q,/ &,335 	&GGdNE2D8#%	&&
 $:Cu'9c'9C:: Y ;s   /D	.D?DrZ   c           	      .   t        |       }t        |d      \  }}| |dz  |z   |z  z   }t        |      dk\  r|d|z  z  }|t        t	        | ||z         D cg c]  }t        |      dk  s| c}      |z  z  }t        |      dk\  r|d|z  z  }|S c c}w )z7adds date but try to only take days worked into account         )rD   divmodrL   lenrg   )rU   rZ   stepweeksplusrV   xs          rC   add_days_workedrr      s    E?Dq/KE4
EAI%-
-Cs|qq4x30d
CVawqzTU~VWZ^^^Cs|qq4xJ Ws   B
*B
c                 f   | |k  sJ t        |       }t        | |      }t        |d      \  }}t        |       t        |      kD  r|dz  }nt        |      dk(  r|dz  }|dz  |z   }t	        t        | ||z         D cg c]  }t        |      dk  s||k  s| c}      }||z  }|dk  ry|S c c}w )Nrj   rk      r   ri   r   )rD   r^   rl   rL   rm   rg   )	rU   rV   rn   rZ   ro   rp   	open_daysrq   nb_week_holidayss	            rC   nb_open_daysrw      s    C<<E?Ds#Dq/KE4u~$					D I)%t<[q
QSTWZSZ[ !!I1} 	\s   <B.B.B.incdayincmonthc              #      K   |r|rJ t        |       } t        |      }|r| |k  r|  t        | |      } | |k  ryyt        | |xs d      }| |k  r|  | |z  } | |k  ryyw)a;  yields each date between begin and end

    :param begin: the start date
    :param end: the end date
    :param incr: the step to use to iterate over dates. Default is
                 one day.
    :param include: None (means no exclusion) or a function taking a
                    date as parameter, and returning True if the date
                    should be included.

    When using mx datetime, you should *NOT* use incmonth argument, use instead
    oneDay, oneHour, oneMinute, oneSecond, oneWeek or endOfMonth (to enumerate
    months) as `incday` argument
    r   N)todate
next_monthrD   )r_   rV   rx   ry   incrs        rC   
date_ranger~      sy     " 8$$5ME
+CckKuh/E ck v{+ckKTME cks   9A$%A$"A$)rZ   rB   rj   ONEWEEKz+Use strptime from datetime.datetime insteadc                 ,    t        t        | |      dd  S )N   rt   )r   time_strptime)valueformats     rC   strptime_timer      s    uf-a233rE   somedatec                     t        | t              r+t        | j                  | j                  | j
                        S t        | t        t        f      sJ t        |              | S z;return a date from a date (leaving unchanged) or a datetime)rA   r   r   rF   rG   r   r   reprr   s    rC   r{   r{      sJ    (H%HMM8>>8<<@@h| 45EtH~E5OrE   c                     t        | t              s+t        | j                  | j                  | j                        S t        | t              sJ t        |              | S )z?return a time from a time (leaving unchanged), date or datetime)rA   r   hourminutesecondr   r   s    rC   totimer      sG     h%HMM8??HOODDh'7h7'OrE   c                     t        | t              r| S t        | t        t        f      sJ t	        |              t        | j
                  | j                  | j                        S r   )rA   r   r   r   r   rF   rG   r   r   s    rC   
todatetimer      sL     (H%h| 45EtH~E5HMM8>>8<<@@rE   c                 n    t        | j                               dz  t        t        | dd      dz        z   S )N  microsecondr   )r   	timetuplerR   getattrr   s    rC   datetime2ticksr      s5    ($$&'$.WX}VW5X[_5_1```rE   ticksc                     t        | d      \  }}	 t        j                  |      S # t        t        f$ rX t        j                  d      }t        t        |      d      \  }}t        |||      }	 ||z   cY S # t        t        f$ r  w xY ww xY w)Nr   r   Q )rY   microseconds)rl   r   fromtimestamp
ValueErrorOverflowErrorrR   r   )r   milisecondsr   epochnb_daysrY   r]   s          rC   ticks2datetimer      s     &ud 3K	%%k22& &&q)!#k"2E:'7N	5= M* 		s"   & A
B1A85B8B		Bc                 H    t        | j                  | j                        d   S rX   )r
   rF   rG   r   s    rC   days_in_monthr     s    hmmX^^4Q77rE   c                 P    t        | j                  dd      }t        |      dk(  ryy)Nrk   r      in  im  )r   rF   r   )r   febs     rC   days_in_yearr     s'    
x}}a
#CSRrE   c                 >    |rt        |       t        z
  } |dz  }|r| S rX   )	first_dayrB   r   nbmonths     rC   previous_monthr     s)    
X&/1  OrE   r   c                 >    |rt        |       t        z   } |dz  }|r| S rX   )last_dayrB   r   s     rC   r|   r|     s)    
H%.1  OrE   c                 D    t        | j                  | j                  d      S rX   )r   rF   rG   r   s    rC   r   r   %  s    x~~q11rE   c                 V    t        | j                  | j                  t        |             S r@   )r   rF   rG   r   r   s    rC   r   r   )  s    x~~}X/FGGrE   fmtc                 ^   t         j                  dk\  r| j                  |      S 	 t         j                  dk  r:t        t              d   xs d}t        | j                  t        |            |      S | j                  |      S # t        $ r | j                  dk\  r | j                  | j                  | j                  d}t        | t              r3|j                  | j                  | j                  | j                  d       t!        j"                  dd	|      }t        |      |z  cY S w xY w)
zlike strftime, but returns a unicode string instead of an encoded
    string which may be problematic with localized date.
    )r   r   )r   r   r   asciiil  )Ymd)HMSz%([YmdHMS])z%(\1)02d)sysversion_infostrftimer   r   strr   rF   rG   r   rA   r   updater   r   r   resub)r   r   encodingfieldss       rC   	ustrftimer   -  s     6!  %%	%&($W-a0;G8,,SX6AA((-- 	%}}$
 ]]^^\\F
 (H-HMMhoo^_&&S9Cs8f$$	%s   AB 3B B%D,+D,dtc                 d    | j                   | S | j                  d       | j                         z
  S N)tzinfo)r   replace	utcoffsetr   s    rC   utcdatetimer   L  s-    	yy	::T:"R\\^33rE   c                     | j                   | S | | j                         z   | j                         z   j                  d       S r   )r   r   dstr   r   s    rC   utctimer   S  s;    	yy	"&&(*3343@@rE   c                 Z    | j                   d| j                  z  z   d| j                  z  z   S )zHreturn the number of seconds since the begining of the day for that date<   i  )r   r   r   )r   s    rC   datetime_to_secondsr   Y  s(    ;;dkk))D499,<<<rE   c                 :    | j                   | j                  dz  z   S )z,return the time delta as a number of secondsr   rZ   rY   r]   s    rC   timedelta_to_daysr   ^  s    ::333rE   c                 :    | j                   dz  | j                  z   S )z+return the time delta as a fraction of daysr   r   r   s    rC   timedelta_to_secondsr   c  s    ::#emm33rE   )r   )NN)z%H:%M)z%Y-%m-%d)B__doc____docformat__r[   r   r   localer   r   r   r   r   r   r	   r   calendarr
   r   typingr   r   r   r   r   logilab.common.deprecationr   mx.DateTimer   r   r   
endOfMonthImportErrorrd   ra   rR   rD   rJ   rL   r   rT   r^   rg   rr   rw   boolr~   rB   __annotations__r   r   r{   r   r   r   r   r   r   r   r|   r   r   r   r   r   r   r   r    rE   rC   <module>r      sD  $ *%  	 
 % 4 4 * ' 8 8 :4@@
 "3J 	 ,\ \ ,	
 \ \ , \ \ , \ \ , \ \  ,!" \#$ "!!!!!!7 BeD(N+ S  "
"" #"16tX~1F"
4>"U4>* s 5c 5uT8^'< 5tX~AV 52dHn- 2E$.4I 2c 2;x ;',T8^'<;
4:tH~%&;
4 
s 
t 
dHn- E$.4I c ( VZ$,SMDLTNtS$B 1%	 %A& &MLMhN_N_`4T d AaU4>2 as a# ( 8D 8S 8  D 2Ht H H% %s %C %>4H 4 4A=
4
4A
  JLs   	
H   	HH