
    P1if                         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Zd dlmZ ddlmZ d d	lmZ dd
Zd Zd Zd Zd ZddZddZd Zy)    )render)datetime	timedeltadate)
monthrange)bzlunar_calendarbz24N)timezone   TongshuCalendar)Personc                    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   十二mdleapFr   u   正月   u   月    闰
   u   初      r      u   二十      u   廿   u   三十1line)r   r   l)getstr)	
lunar_dataformatchinese_numbersmonthdayis_leap	month_stris_leap_strday_strs	            //home/cursorai/projects/iching/tongshu/views.pyformat_lunar_dater-      s    qOsOE
S/CnnVU+G z		
e	r	&uQw/04		 K 	C~2~A./0	sbB/01		sbB/01	c(WI&&W;??    c                    t        | |d      }t        | |      \  }}|j                         }g }|dkD  r|t        d      z
  }t        |j                  |j
                        \  }}t        |      D ]?  }	||z
  |	z   dz   }
|j                  t        |j                  |j
                  |
      df       A t        d|dz         D ]   }
|j                  t        | ||
      df       " ||z   }d|z
  }|dkD  rv|t        d      z   }t        |j                  |j
                  d      }t        d|dz         D ]4  }
|j                  t        |j                  |j
                  |
      df       6 t        j                         j                         }t        j                  | d      }d	}|dk(  s|d
k(  s
|dkD  r|dk(  rt        j                  | dz
  d      }g d}ddddddddddddd}i }i }|rOt        |      D ]@  \  }}t        j                  |d   d   j                  dd            t        d      z   }t        j                  |d   d   j                  dd            t        d      z   }|dz  ||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   ||j                         <   |j                         |j                         f|| dz
   d| <   C t        |      D ]=  \  }}t        j                  |d   d   j                  dd            t        d      z   }t        j                  |d   d   j                  dd            t        d      z   }|dz  ||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   ||j                         <   |j                         |j                         f||  d| <   @ g }|D ]  \  }}d	}d	}t        |       } ||v r||   }|dz  }nO|j!                         D ]<  \  }!\  }"}#|"|cxk  r|#k  sn |!j#                  d      \  } }t%        |      }|dz  } n |||dz   d
z     }$|j'                  |$d      }%nd}$d}%t)        j*                  |j                  |j
                  |j,                  ddd      }&t/        j0                  t        |j                  |j
                  |j,                              }'t3        |'      }(t3        |'d      })t)        j4                  |j                  |j
                  |j,                  |&      }*t(        j6                  |*   }+t)        j8                  |j                  |j
                  |j,                  |&       },d	}-d	}.d}/|g}0|rA|j                  | dz
  k(  s|j
                  dk(  s|j
                  dk(  r|0j                  |       |0D ]  }1|1D ]t  }d!D ]i  }2||2   }3t        j                  |3d   j                  dd            t        d      z   }4|4j                         |k(  sQ|3d"   }-|4j;                  d#      }.d}/ n |/st n |/s n |j                  i d$|d%|j,                  d&|d'||k(  d(t(        j<                  |&d)   d*      t(        j>                  |&d)   d+      d,t(        j<                  |&d-   d*      t(        j>                  |&d-   d+      d,t(        j<                  |&d%   d*      t(        j>                  |&d%   d+      d,t(        j<                  |&d.   d*      t(        j>                  |&d.   d+      d,d/d0|'d1|-s|(n|- d2|. d3|-s|)d4   n|-d5|-stA        |)d4         d6k\  rdndd7|-s|)d   n|.d8|)d9   d:|+d;|,d<|/d=|d>|$d?|%        t        dtA        |      d@      D 	cg c]
  }	||	|	d@z     c}	S c c}	w )Az/Generate calendar data for the specified month.r   r   )daysTF*       groupByMonthNr      子   丑   寅   卯   辰   巳   午   未   申   酉   戌   亥woodfireearthmetalwater)r8   r9   r;   r<   r:   r=   r@   r7   r>   r?   rA   r6   firstr   Z+00:00   hoursnext   second-r      ;   data	bazi_datarG   rO   c%H:%Mr   r'   is_adjacent_monthis_todaybaziyeargegodrD   r&   hourr\   r&   r'   ra   lunarlunar_formatted lunar_titler   lunar_title_3char   
lunar_desc
lunar_leapr    jianchuyellow_black_pathhas_solar_termsolar_term_indexmonth_earthmonth_element   )!r   r   weekdayr   r\   r&   rangeappendr   nowr
   calc24CycleAdjustedYear	enumeratefromisoformatreplacer"   itemssplitintr!   r   getCalendar10kGodEarthStemr'   r	   convertLunarr-   calcJianChu12GodgJianChu12GodcalcYellowBlackPathstrftimegGodstem
gEarthstemlen)5r\   r&   	first_day_num_daysfirst_weekday	all_dates
prev_monthprev_num_daysir'   
total_daysremaining_days
next_monthtodaycyclesprev_year_cyclesearth_brancheselement_mapsolar_term_datesmonth_periods	month_idxcyclefirst_start	first_endsecond_start
second_endprocessed_datesdate_objis_adjacentcurrent_month_indexrn   year_str
period_keyperiod_start
period_endro   rp   r[   rc   rd   lunar_data_formattedjianchu_indexrk   rl   
solar_termsolar_term_timerm   cycles_to_check
cycle_listterm	term_data	term_dates5                                                        r,   get_month_calendarr   5   sU	    T5!$IT5)KAx %%'M I q!22
%jooz7G7GH=}%A-/!3a7Cd:??J4D4DcJDQR &
 Q1%$tUC0%89 & )J*_N!33
*//:+;+;Q?
NQ./Cd:??J4D4DcJDQR 0 LLN!E ))$TBF zUb[]Q%65A:77qtT jN ffwwwwwK M  )*: ;Iu"00w1D1L1LSRZ1[\_hop_qqK ..uW~f/E/M/McS[/\]`ipq`rrI3<q=[--/0 $11%/#2F2N2NsT\2]^ajqrassL!//h0G0O0OPSU]0^_bkrsbttJ4=MA4E\..01 7B6F6F6H*//J[5\MT!VHAi[12 !< &f-	5,,U7^C-@-H-Hh-WX[dkl[mm**5>&+A+I+I#x+XY\elm\nn	/81}))+,  --eHoc.B.J.J3PX.YZ]fmn]oo++E(OF,C,K,KCQY,Z[^gno^pp
09A0A**,- 1<0@0@0BJOODU/Va	{+, . O!*+"t9 ''/9"2a"7 ;H:M:M:O6
6\:88j8*4*:*:3*?'Hi*-i.'':Q'>$ ;P *(*=*AR)GHK'OOK<M KM ,,X]]HNNHLLZ\^`bde ++HX]]HNNT\T`T`,ab+E20? ++HMM8>>8<<Y]^""=1 228==(..RZR^R^jno 
 "($(!:hnnPQ>QU]UcUcghUh""#34)J#/D %dI ( 6 6y~7M7McS[7\ ]`ipq`r rI ~~'83%.s^
*3*<*<W*E)- 0 " $  * 	  
H 
8<< 
   
 E)	 

  "DL,= >W[\bWcdgWhIij!#T']3-?!@2==Y]^eYfgjYkKlm!{{4;s+;<r}}UYZ_U`adUeGfg "DL,= >W[\bWcdgWhIij	 
 U 
 jTUVeUfFg 
 J/4J 
  ZC@TUX@Y<Z^_<_ej 
 :.s3? 
  .s3! 
" w# 
$  !2% 
& n' 
(  0) 
* ;+ 
, ]- 
 	I "+| /4As?7KQ.OP.OOAa!e$.OPPPs   %a7c                     |dk(  rt        j                  | dz
  d      }|d   S t        j                  | d      }||dz
     S )z$Get solar terms for the given month.r   Tr3   r   rN   )r
   rv   )r\   r&   r   s      r,   get_solar_termsr      sL     z--dQhTJbz--dFeai  r.   c                 h    | y	 t        |       dz  }g d}||dz     S # t        t        f$ r Y yw xY w)u   
    Convert solar term index to month's earth branch.
    Solar terms come in pairs for each month:
    0,1 = 寅 (first month)
    2,3 = 卯 (second month)
    ...and so on
    r   rN   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   r6   r7   r   )r|   
ValueError	TypeError)rn   month_indexr   s      r,   get_month_earth_branchr      sQ     *+q0 nkB.//	" s    11c                 |    ddddddddd	d
ddd}|j                  |       }|y|dv ry|dv ry|dv ry|dv ry|dv ryy)z2Convert earth branch to its corresponding element.r   r   rN   rh            rq   rJ   	   r   r   r5   r   )rN   rh   rB   )r   r   rC   )r   rq   r   r   rD   )rJ   r   rE   )r   r   rF   )r!   )earth_branchearth_to_indexindexs      r,   get_month_elementr     sx     1Qq1Qr"N |,E} 	&	-		&	'	r.   c                    t        j                         j                         }| |k(  }t        j                  | j
                  | j                  | j                  ddd      }t        j                  |d   d      t        j                  |d   d      dt        j                  |d   d      t        j                  |d   d      dt        j                  |d   d      t        j                  |d   d      dt        j                  |d	   d      t        j                  |d	   d      dd
}t        j                  t        | j
                  | j                  | j                              }t        |      }t        |d      }t        j                  | j
                  | j                  | j                  |      }	t        j                  |	   }
t        j                  | j
                  | j                  | j                  |      }t!        | j
                  | j                        }d}d}t#        j$                         }dD ]o  }||v st        j&                  ||   d   j)                  dd            }|t+        d      z   }|j                         | k(  sV||   d   }|j-                  d      } n d}t/        |      }t1        |      }i d| d| j                  d|d|d|d|d|s|n| d| d|s|d   n|d |st3        |d         d!k\  r|d   n|rt3        |      d!k\  r|ndd"|s|d   n|d#|d$   d%|
d&|d'|dud(|d)|d*|S )+z$Get all the data for a specific day.rQ   rR   r\   r]   r^   r_   r&   r'   ra   rb   rS   r$   rT   NrV   r   rH   rI   rJ   rK   rW   rX   r   rY   rZ   r[   rc   rd   re   rf   r   rg   rh   ri   rj   r    rk   rl   rm   rn   ro   rp   )r   ru   r   r   r}   r\   r&   r'   r   r   r	   r~   r-   r   r   r   r   r   get_current_timezonerx   ry   r   r   r   r   r   )r   rY   r   rZ   r[   mapped_bazirc   rd   r   r   rk   rl   solar_termsr   r   	system_tzr   utc_time
local_timern   ro   rp   s                         r,   get_day_datar   /  s    LLN!E5 H ((VXZ\^`aD
 ;;tF|C01]]4<#45

 ;;tG}S12]]4=#56

 ;;tE{3/0]]4;s#34

 ;;tF|C01]]4<#45
K( ''PXP\P\(]^E'.O,U6B ''x~~x||UYZM}-G ..x}}hnnhllfjk "(--@KJO --/I $;--k$.?.D.L.LSRZ.[\H "IA$66J  H,(.s3
","5"5g"> $  ()9:K%k2Mx|| 	. 	H	
 	 	 	*?ZLPQRaQbBc 	
+C0
 	jSQefiQjMkopMp1#6  EO  TW  Xb  Tc  gh  Th  wA  nr 	z*3/ 	*3/ 	7 	. 	*D0 	,  	{!" 	# r.   c                   + ||,t        j                         }|j                  }|j                  }t	        ||d      }|j                         }t        ||      \  }}t	        |||      }|j                         }	|}
d|	z
  }|dk  r|dz  }t        j                  ||t        |
|            }|\  }}}}}}}g }g }g }g }|D ]  }|d   }|j                  d      }t        |d         }t        |d         }t        |d	         }t        |||      }||k(  r||k(  r|j                  |       l||k  s
||k(  r||k  r|j                  |       |j                  |        |j                  d
        |j                  d        |j                  d        |
dkD  r||
 d ng }|dkD  r|d| ng }|D ]  }d|d<   	 |D ]  }d|d<   	 ||z   |z   }t        dt!        |      d      D cg c]
  }|||dz     }}|\  } }!|\  }"}#t        dd      }$|||| |!|"|#t        ||d      j#                  d      |$d	}%	 | j$                  j&                  rt(        j*                  j-                  | j$                  d      j/                  d      j1                         ++r+j2                  r+fd}& |&d       |&d       |&d      d}'d+j2                  v r |&d      |'d<   |'d   j5                  d      }(d})|((t7        j8                  |(      }*|*r|*j5                  d      })+j:                  |'|)d|%d<   t?        | d |%      S c c}w # t<        $ r Y w xY w)!z\Display the tongshu calendar for a specific month using the optimized TongshuCalendar model.Nr   r   rh   rq   )
extra_daysr   rP   rN   c                     | d   S Nr    xs    r,   <lambda>zmonth_view.<locals>.<lambda>      qyr.   )keyc                     | d   S r   r   r   s    r,   r   zmonth_view.<locals>.<lambda>  s    !F)r.   c                     | d   S r   r   r   s    r,   r   zmonth_view.<locals>.<lambda>  r   r.   TrY   il  i4  z%B)	weeksr\   r&   	prev_yearr   	next_yearr   
month_name
year_range)
created_byownerz-created_atc                 "   j                   j                  |       }|sdddS |j                  d      }|j                  d      }| t        j                  j                  |d      nd| t        j                  j                  |d      nd||dS )NrP   )r]   r^   r`   rD   )r]   r^   giei)bazi_resultr!   r   r   r   )r   pr]   r^   persons       r,   pillzmonth_view.<locals>.pill  s    **..s3A%(s33eAgA<=MC!8s>?m!2!21c!:QT"#1. .r.   r\   r&   r'   )r\   r&   r'   ra   r   r^   )namepillarsday_element	user_baziztongshu/month.html) r   ru   r\   r&   r   rr   r   r   get_month_datamaxr{   r|   transform_day_datart   sortrs   r   r   useris_authenticatedr   objectsfilterorder_byrG   r   r!   r   findGodstem5Er   	Exceptionr   ),requestr\   r&   r   r   r   r   r   last_daylast_weekdaydays_before
days_aftercalendar_data
month_bazimonth_element_index	days_datar   r   transformed_dayscurrent_month_daysprev_month_daysnext_month_daysr'   date_str	day_partsday_year	day_monthday_daytransformed_dayall_daysr   r   r   prev_month_numr   next_month_numr   contextr   r   day_g_indexr   fer   s,                                              @r,   
month_viewr    s   |u}zz T5!$I%%'M T5)KAxD%*H##%L  K \!J Qa
 $2243{\fKghM WdSD%0)Z  OOq6NN3'	y|$	!%	il#,S$> (d"2%%o6o8t#3	E8I""?3""?3 $ 01 3401 9Dao{lm4RO 7A1nokz2"O #'   #'   !33oEH ',As8}a&@A&@Xa!_&@EA !+I~ *I~ tT"J $$tUA.77= 
G!<<((^^**gll$*OXXYfgmmoF&,,. !L!'];
 V///&*6lGFO%en006"*))+6B&(ffSk"KK&#.($ '/99s Bl  s   ,L<:C5M 	MMc                    t        |       dk(  r| \	  }}}}}}}	}
}n| \  }}}}}}	}
}d}|j                  d      }t        t        |d         t        |d         t        |d               }t        |d         |k7  xs t        |d         |k7  }|
d   }|
d   dk(  }|
d   }g d}|||   nd}t        j
                  |d      t        j                  |d      d	t        j
                  |d      t        j                  |d
      d	t        j
                  |d      t        j                  |d      d	t        j
                  d   t        j                  d   d	d}|d   |d   |d   |d
   dk(  d}t        j                  |	   }t	        j                  |      }t	        j                  |      }||dz   |dk(  rdndd}|r|d   |d   |d   dk(  |d
   d}n^ddl
m} |d   |d   |d   |d
   dk(  d} |j                  |      } |j                  |d      }||d   t        |d         d
k\  |d   d}g d}|||dz  dz   dz     nd} ||||dk(  |||j                  d      rdnd||||| |d|S )a  Transform a day array from the TongshuCalendar model into a dictionary for the template.
    
    Args:
        day_array: [date, day, isToday, bazi, lunar, lunarFormatted (optional), jianchu, solar, ybp_index]
        current_year: The year currently being viewed
        current_month: The month currently being viewed
        
    Returns:
        dict: Dictionary with keys matching the template requirements
    r   NrP   r   r   rN   )rB   rC   rD   rE   rF   r   r_   rh   r   r   rb   )r   r   yr   goodbad)r`   positiontype)rd   rf   rg   ri   r   rS   r   r   r   r   r   r   r   )r   r'   rY   rZ   r[   rc   rj   rk   rl   rm   rn   ro   rp   )r   r{   r   r|   r   r   r   r   getYellowBlackPathGodisYellowBlackPathGoodmodelsr   r-   r!   )!	day_arraycurrent_yearcurrent_monthr   day_numrZ   r[   rc   rd   rk   solar	ybp_index
date_partsr   rY   rn   rm   solar_element_indexelementsrp   r   
lunar_dictjianchu_nameybp_god_nameybp_is_goodrl   formatted_datar   lunar_data_objlunar_formatted_strr   r   ro   s!                                    r,   r   r     s#    9~_h\'8T5/7ES\NWK'8T5'5) $JC
1&JqM(:C
1<NOH JqM*m;as:a=?QUa?a Qx1X]N( ;H5H5TH01Z\M
 ;;tAw']]47+

 ;;tAw']]47+

 ;;tAw']]47+

 ;;q>]]1%
K* 1X1X1XaA	J ##G,L ++I6L**<8KM%/U .q1*1-!0!3q!8)!,	
 	,$QxeAhU1XuUVx[\}]?o??O@@@X^_  3/4!$%9#%>!?1!D.s3	
 jNFVFb."2a"7!";r!ABhjK .M)~~f5e2.(,"&  r.   )r   )F)NN)django.shortcutsr   r   r   r   calendarr   iching.utilsr   r	   r
   pytzdjango.utilsr   r  r   bazi.modelsr   r-   r   r   r   r   r   r  r   r   r.   r,   <module>r,     sU    # . .  1 1  ! # (@TzQx!*>XtI:Xsr.   