
    P1i#2                     z    d dl mZ d dlmZmZmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ  G d dej                        Zy)	    )models)datetime	timedeltadate)
monthrange)bzlunar_calendarbz24)timezonec                   D    e Zd Z G d d      Zedd       Zedd       Zy)TongshuCalendarc                       e Zd ZdZy)TongshuCalendar.MetaFN)__name__
__module____qualname__managed     0/home/cursorai/projects/iching/tongshu/models.pyMetar   	   s    r   r   Nc                   1 | |4t        j                         }| xs |j                  } |xs |j                  }t	        | |d      }t        | |      \  }}t	        | ||      }|t        |      z
  }	|t        |      z   }
g }|	}||
k  rH|j                  |k7  xs |j                  | k7  }|j                  ||f       |t        d      z   }||
k  rHt        j                         j	                         }t               }|D ]   \  }}|j                  |j                         " |D ]S  \  }}|j                  dk(  s |j                  dk(  s%|j                  dk  s5|j                  |j                  dz
          n i }|D ]  }t        j                  |d      ||<    t        j                  | |d      }t        j                  |d	   d
      }t        j                   t        j"                  |d	   d
               }i }|j%                         D ]`  \  }}t'        |      D ]K  \  }}t        j(                  |d   d   j+                  dd            t        d      z   }t        j(                  |d   d   j+                  dd            t        d      z   }|dz  |d   d   |j-                  d      ||d||j	                         <   t        j(                  |d   d   j+                  dd            t        d      z   }t        j(                  |d   d   j+                  dd            t        d      z   }|dz  dz   |d   d   |j-                  d      ||d||j	                         <   N c g 1|j%                         D ]  \  }}1j                  ||d   |d   f       ! 1j/                          1fd}g } |D ]f  \  }}t        j0                  |j                  |j                  |j                  ddd      }!t3        j4                  t        |j                  |j                  |j                              }"t6        j9                  |"      }#t6        j9                  |"d      }$t        j:                  |j                  |j                  |j                  |!      }%t        j<                  |j                  |j                  |j                  |!      }&|&d   dz
  }'d}(d})d}*d}+||v r||   }|d   }(|d    })|d   }+d}*|j-                  d!      |j                  ||k(  rdnd"|!d#   d$   |!d#   d
   |!d	   d$   |!d	   d
   |!d%   d$   |!d%   d
   g|"d   |"d&   |"d'   |"j?                  d(d      rdnd"gg},|rA|,j                  |(s|#n|( d)|) |(s|$d&   n|(|(stA        |$d&         d*k\  rdnd"|(s|$d   n|)g       |,jC                  |%|*r) ||      |*rdnd"t        jD                   ||            |)gn# ||      d"t        jD                   ||            g|'g       | j                  |,       i g }-|j%                         D ]D  \  }.}|	|.cxk  r|
k  sn |-j                  |d   |d+   jG                         |d   |d#   d,       F |-j/                  d- .       |dk(  r	| dz
  d/d0}/n| |dz
  d0}/|d/k(  r	| dz   dd0}0n| |dz   d0}0| ||d#   d$   |d#   d
   |d	   d$   |d	   d
   g|| |/d#   |/d	   g|0d#   |0d	   ggS )1a  
        Generate calendar data for the specified month.
        If no year/month provided, uses current month.
        
        Args:
            year: Year (defaults to current year)
            month: Month (1-12, defaults to current month)
            extra_days: Number of days to include before and after month (default 10)
            include_lunar_title_desc: Whether to include lunar formatted strings in output (default True)
        N   )days      T)groupByMonth   monthefirstdZz+00:00   )hoursnextcz%H:%M)indexnametimer   yearsecondr(   r)   c                 6    d}D ]  \  }}}|| kD  r |S |} |S )N   r   )date_objcurrent_term_index	term_date
term_index	term_namesorted_solar_termss        r   get_solar_term_periodz=TongshuCalendar.get_month_data.<locals>.get_solar_term_periodk   s>    !#4F0	:yx' &% &0" 5G
 &%r      ;   data)format)	bazi_datapositionFr*   z%Y-%m-%dr   r+   gdaymyleap    r   )r)   r   r(   r+   c                     | d   S )Nr   r   )xs    r   <lambda>z0TongshuCalendar.get_month_data.<locals>.<lambda>   s    AfIr   )key   )r+   r   )$r   nowr+   r   r   r   r   appendsetaddr=   r
   calc24CycleAdjustedYearr   calcBazi
gEarthstemfindElementIgetEarthElementitems	enumeratefromisoformatreplacestrftimesortgetCalendar10kGodEarthStemr	   convertLunarr   format_lunar_datecalcJianChu12GodcalcYellowBlackPathgetlenextendfindSolar5ElementI	isoformat)2r+   r   
extra_daysinclude_lunar_title_desctoday	first_day_num_dayslast_day
start_dateend_date	all_datescurrent_dateis_adjacentrequired_yearsr/   cycles_by_yearreq_year
month_bazimonth_earthmonth_element_indexsolar_term_datesyear_valcycles	month_idxcyclefirst_start	first_endsecond_start
second_end	term_datar5   	days_datar:   lunarlunar_formattedlunar_data_formattedjianchu_indexyellow_black_path	ybp_index
solar_termsolar_term_timehas_solar_termsolar_term_indexday_datasolar_terms_listdate_key
prev_month
next_monthr4   s2                                                    @r   get_month_datazTongshuCalendar.get_month_data   s    <5=LLNE%5::D(U[[E ua(	 u-8eX. 
!;;
iZ88 	!h&&,,5R9J9Jd9RKlK89')*;;L h&
 ##% $KHax}}- %
 %KHa~~"x~~':x||a?O""8==1#45	 % &H'+'C'CH[_'`N8$ ' [[ub1
mmJw$7$<= oob.@.@GATUXAY.Z[  !/ 4 4 6Hf$-f$5 	5&44U7^C5H5P5PQTV^5_`clstcuu$225>&3I3Q3QRUW_3`admtudvv	&]!'N3/'009'$8 !1!1!34  (55eHoc6J6R6RSVX`6abenuveww%33E(OF4K4S4STWYa4bcfovwfxx
&]Q.!(OC0(11':($9 !2!2!45 %6 !72  #3#9#9#;Hi%%x71CYvEV&WX $<!		& 	%.!Hk55hmmX^^U]UaUacegikmnI #//X`XdXd0efE-??FO#2#D#DUSY#D#Z  //x~~x||]fgM !# 6 6x}}hnnV^VbVbnw x **59I J"O"N# ++,X6	&v.
"+F"3#,W#5 !% !!*-&Af%c*f%c*g&s+g&s+e$S)e$S) #J#J#J651Aq	H* (+5Oj\?J[;\5?(-Z'C0DS0I,Ja,OAUV5?(-_	!  OO $	 *(3'AQ++,A(,KL#	 *(3++,A(,KL*
   X&] &/b #3#9#9#;HiX11 ''%f-%f-779&w/%f-	) 	 $< 	"56 A:"&(R8J"&;JB;"&(Q7J"&;J
 $j&8&=z'?RSV?WYcdkYlmpYqrG!45G!45
 	
r   c                    g d}| d   }| d   }| j                  dd      }|dk(  rd}nd|cxk  rdk  rn n||dz
      d	}nd	}d
}|rd}d|cxk  rdk  rn nd||dz
      }nOd|cxk  rdk  rn nd||dz
      }n5|dk(  rd}n-d|cxk  rdk  rn nd||dz
      }n|dk(  rd}nt        |      }|dk(  r| | S |||dS )z(Format lunar date in Chinese characters.)u   一u   二u   三u   四u   五u   六u   七u   八u   九   十u   十一u   十二r>   r"   r@   Fr   u   正月rG   u   月 u   闰
   u   初      r      u   二十      u   廿   u   三十1line)r>   r"   l)r\   str)	
lunar_datar9   chinese_numbersr   r=   is_leap	month_stris_leap_strday_strs	            r   rY   z!TongshuCalendar.format_lunar_date   s    u3o../ A: I%2*5734C8II K >r>OCE234G3_"_OCF345GBYG3_"_OCF345GBYG#hGW[	**"{CCr   )NNr   T)r   )r   r   r   r   staticmethodr   rY   r   r   r   r   r      s9      `
 `
D 'D 'Dr   r   N)	django.dbr   r   r   r   calendarr   iching.utilsr   r	   r
   django.utilsr   Modelr   r   r   r   <module>r      s.     . .  1 1 !ODfll ODr   