
    4h2                        d dl mZ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 d dlm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 ddl d dlmZ d dlm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) d dl*m+Z+ d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4ed        Z5 ed       d!        Z6 ed       ed"               Z7d# Z8ed$        Z9d% Z: ed       d&        Z;ed'        Z< ed       d(        Z=d) Z>d* Z?ed+        Z@ ed       d,        ZAed-        ZBed.        ZCed/        ZDed0        ZEd1 ZFed2        ZGed3        ZHd4 ZI ed       d5        ZJe j                  d6        ZLe j                  d7        ZM ed       d8        ZNeed9               ZOeed:               ZPd; ZQed<        ZR ed       d=        Zed>        ZSd? ZTed@        ZUedA        ZVeedB               ZWedC        ZXdD ZYe ed       dE               ZZe ed       dF               Z[dG Z\ddHlm]Z] edI        Z^edJ        Z_dK Z`y)L    )renderredirectget_object_or_404)logoutauthenticateloginupdate_session_auth_hash)JsonResponse)csrf_exempt)validate_password)ValidationErrorN)reverse)get_user_model)messages)login_required   )*)require_POST)timezone)transaction)ExistsOuterRefSum)
parse_date)date	timedelta)	send_mailc                     t         j                  j                  d      j                  d      d d }t        j                  j                  dd      j                  d      d d }||d}t        | d	|      S )
Nr   )total_rooms__gt-created_at   userhotel   )
room_typesrecent_reviewszjanka_web_app/home.html)RoomTypeobjectsfilterorder_byReviewselect_relatedr   )requestr%   r&   contexts       6/var/www/html/janka_web_project/janka_web_app/views.pyhomer0      sx    !!(((;DD]STVUVWJ^^2267CLL][\^]^_N (G '4g>>    c                 z   t         j                  j                  ddd      j                         }t        j                  j                         }t         j
                  }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }	|r	 |j                  t        |            }|	r	 |j                  t        |	            }|r|j                  |	      }|r|j                  |
      }|r|j                  |      }|r|j                  |      }|||d}
t        | d|
      S # t        $ r Y w xY w# t        $ r Y }w xY w)N	dzongkhaggewogvillage	room_type	min_rooms	max_rooms)total_rooms__gte)total_rooms__lte)dzongkhag__dzo_id)gewog__gewog_id)village__village_id)r%   )hotels
dzongkhagsroom_choiceszjanka_web_app/rooms.html)Hotelr(   r,   all	Dzongkhagr@   GETgetr)   int
ValueErrorr   )r-   r>   r?   r@   dzongkhag_idgewog_id
village_idr6   r7   r8   r.   s              r/   roomsrK       s   ]]))+w	JNNPF""&&(J%%L ;;??;/L{{w'H+J,I,I,I	]]C	N]CF 	]]C	N]CF >x8:>)4  $G
 '5w??-  		
  		s$   F !F. 	F+*F+.	F:9F:c                     i }t        | d      S )Nzjanka_web_app/room-detail.htmlr   r-   r.   s     r/   room_detailsrO   H   s    G';<<r1   c                     i }t        | d      S )Nzjanka_web_app/dining.htmlrM   rN   s     r/   diningrQ   L   s    G'677r1   c                     i }t        | d      S )Nzjanka_web_app/activities.htmlrM   rN   s     r/   
activitiesrS   P   s    G':;;r1   c                     t        | d      S )Nzjanka_web_app/spa.htmlrM   r-   s    r/   sparV   S   s    '344r1   c                     t        | d      S )Nzjanka_web_app/about-us.htmlrM   rU   s    r/   about_usrX   V   s    '899r1   c                 >   | j                   j                  rt        d      S d }| j                  dk(  r]| j                  j                  d      }| j                  j                  d      }t        | ||      }|t        | |       ddd}nd	d
d}t        | dd|i      S )Nz
/dashboardPOSTusernamepassword)r[   r\   successz Login successful! Redirecting...)statusmessageerrorzInvalid email or password!zjanka_web_app/signin.htmlalert)	r"   is_authenticatedr   methodrZ   rE   r   r   r   )r-   ra   r[   r\   r"   s        r/   sign_inrd   Y   s    ||$$%%E~~<<##J/<<##J/GhJ'4 (5WXE&3OPE'6%8HIIr1   c                 .    t        |        t        d      S )N/)r   r   rU   s    r/   sign_outrg   k   s    
7OC=r1   c                     t        t        || j                        }|j                  sd|_        |j	                  dg       t        |j                  xs d      S )zB
    Mark notification as read and redirect to its action_url
    )idrecipient_userT	is_viewedupdate_fieldsr0   )r   Notificationr"   rk   saver   
action_url)r-   notif_idnotifs      r/   notification_redirectrs   o   sS    
 ||E ??

+
/ E$$.//r1   z	/sign_in/)	login_urlc                 T
   t        j                         }|t        d      z
  }d| j                  i}| j                  j                  dk(  rt
        j                  j                         }t
        j                  j                  d      j                         }t
        j                  j                  d      j                         }t
        j                  j                  d      j                         }t
        j                  j                  |	      j                  dd
      j                  d      d d }t
        j                  j                  dd
      j                  d      d d }	t        j                  j                  dd
      j                  d      d d }
|j                  t        j                  j                         t        j                  j                         |t        j                  j                         |||||	|
d
       n| j                  j                  dk(  rOt        j                  j                  | j                        }|j                  dd      }t
        j                  j                  |      }|j                         }|j                  d      j                         }|j                  d      j                         }|j                  d      j                         }|j                  |	      j                  dd
      j                  d      d d }|j                  dd
      j                  d      d d }|j                  |j                         |||||||d       n| j                  j                  dk(  rt
        j                  j                  | j                        j                  d
d      j                  d      }t        j                  j                  | j                        j                  d
      j                  d      }t         j                  j                  | j                        j                  d      j                  d      d d }|j                  d      j                         }|j                  d      j                         }|j                  d      j                         }t         j                  j                  | j                  d      j                         }|j                  |||||||d       t#        | d|      S )N   )hoursr"   admin	confirmedr^   pending	cancelled)created_at__gter#   r    
      )
total_userstotal_hotelstotal_bookingstotal_reviewsconfirmed_bookingspending_bookingscancelled_bookingsrecent_24h_bookingsrecent_bookingsr&   ownerr"   ri   T)flat)	hotel__in)r   r   r   r   r   r   r   owner_hotelsroom_selectedreceiversenderF)r   read)user_bookingsuser_reviewsrecent_messagesunread_messages_countr   r   r   z!janka_web_app/dashboard/home.html)r   nowr   r"   	user_roleBookingr(   countr)   r,   r*   r+   updateUserrA   values_listMessager   )r-   r   last_24r.   r   r   r   r   r   r   r&   r   owner_hotel_idsowner_bookingstotal_owner_bookingsconfirmed_owner_bookingspending_owner_bookingscancelled_owner_bookingsrecent_24h_owner_bookingsrecent_owner_bookingsr   r   r   r   s                           r/   	dashboardr      s   
,,.CIB''G 	G ||( ..0$__33;3GMMO"??111CIIK$__33;3GMMO%oo44W4M\\]celmvv  xE  F  GJ  HJ  K!//88IRRS`abdcde66vwGPPQ^_`babc<<--/!MM//1,#^^113"4 0"4#6.,
 	 
		7	*}}+++>&224d2C ////J-335#1#8#8#8#L#R#R#T !/!6!6i!6!H!N!N!P#1#8#8#8#L#R#R#T $2$9$9'$9$R$a$abhjq$r${${  }J  %K  LO  MO  %P! . = =fg N W WXe fgihi j(..02": 6":#<4(	
 		 
		6	)..GLL.APPQXZijss  uB  C~~,,',,,?NNwW``ano!//00',,0GVVW_`iijwxy{z{|*111EKKM(//y/AGGI*111EKKM !( 6 6SX 6 Y _ _ a*(.%:"4 0"4
 	 '>HHr1   c           
         | j                   dk(  rz	 | j                  }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  dd      }| j                  j                  dd      }| j                  j                  d	d
      }| j                  j                  d      }	t
        j                  j                  |      j                         rt        dddd      S t
        j                  j                  |      j                         rt        dddd      S 	 t        |       t
        j                  j                  |||||||      }|	r|	|_        |j!                          n|j!                          	 d}d| d| d| d| d	j#                         }t%        ||t&        j(                  |gd       	 t*        j                  j-                  dd |j.                   d!|j.                   d"d#d$|j.                  %       t1        d&       t        dd |j.                   d-t;        d.      d/      S t=        | d1      S # t        $ r6}
t        dddj                  |
j                        z   dd      cY d }
~
S d }
~
ww xY w#  Y xY w# t2        $ rc}
t1        d't5        |
      j6                   d(|
        t        dd)t5        |
      j6                   d*t9        |
      d d+  dd,      cY d }
~
S d }
~
ww xY w# t2        $ r&}
t        dd0t9        |
      z   dd,      cY d }
~
S d }
~
ww xY w)2NrZ   	full_namer[   emailr\   phone addressr   r"   profile_picture)r[   FzUsername already exists.r]   r_     rz   )r   zEmail already exists.
Password: , )r[   r   r\   r   r   r   r   z"Welcome to Janka Resort Dashboard!z
                    Hello z,

                    Welcome! Your account has been successfully created on the Janka Resort Dashboard.

                    Here are your login details:
                    Username: z
                    Email: z
                    Password: z

                    You can now log in and start using your account.

                    Best regards,
                    Janka Resort Team
                                    Tsubjectr_   
from_emailrecipient_listfail_silentlyzNew User CreatedzUser 'z' has been added by .
user_eventrx   )titler_   categoryrole_visibility
created_byu&   ✅ Notification created successfully!u"   ❌ Notification creation failed: z: z
DB Error: z - d     z' created successfully!registered_usersr]   r_   redirect_urlAn error occurred: z9janka_web_app/dashboard/user_management/add_new_user.html)rc   r"   rZ   rE   FILESr   r(   r)   existsr
   r   r   joinr   create_userr   ro   stripr   settingsDEFAULT_FROM_EMAILrn   creater[   print	Exceptiontype__name__strr   r   )r-   creatorr   r[   r   r\   r   r   r   r   er"   r   r_   s                 r/   add_new_userr      s    ~~a	llG((5I||''
3HLL$$W-E||''
3HLL$$Wb1Ell&&y"5G((f=I%mm//0ABO ||""H"5<<>#B\$]fijj||"""/668#BY$Zcfggu!(+
 <<++!!## , D '6$				>$+ &
  (j )!7 #'j )%( ).   ##'::$)7"&$$++,$T]]O3GHXHXGYYZ[)$+&// ,  >?  #DMM?2IJ '(: ;!   'VWW] # u#,QUQZQZ[\[e[eQfBf$gpsttu^  :47;K;K:LBqcRS#$!+DG,<,<+=SQO%    	 03q69!  	s   D$M 7=M 6J AM >K AK  %%M 	K +KKM KM KM  	M)AMMM MM 	M>M93M>9M>c                 z    t         j                  j                         j                  d      }t	        | dd|i      S )Nr    z=janka_web_app/dashboard/user_management/registered_users.htmlusers)r   r(   rB   r*   r   )r-   r   s     r/   r   r   =  s<    LL''6E'Z]  r1   c                     | j                   dk(  r.t        t        |      }|j                          t	        ddi      S t	        ddd      S )NrZ   ri   r]   TFInvalid requestr]   r`   )rc   r   r   deleter
   r-   user_idr"   s      r/   delete_userr   C  sD    ~~ '2Y-..E4EFGGr1   c                    | j                   dk(  r?| j                  j                  d      }t        t        |      }| j                  j                  d      |_        | j                  j                  d      |_        | j                  j                  d      |_        | j                  j                  d      |_        | j                  j                  d      |_	        | j                  j                  d	      |_
        d
| j                  v r| j                  d
   |_        |j                          t        j                  | d       t!        d      S y )NrZ   r   r   r   r[   r   r   r   r   r   zUser updated successfully!r   )rc   rZ   rE   r   r   r   r[   r   r   r   r   r   r   ro   r   r]   r   r   s      r/   update_userr   K  s    ~~,,""9- '2 ))+6((4\\%%g.
\\%%g.
||''	2 ))+6-#*==1B#CD 		">?*++!  r1   c                    | j                   }| j                  dk(  rMt        | j                  | j                  |      }|j                         r'|j                          t        d      S t        |      }||d}t        | d|      S )NrZ   instancez/user-settings/?updated=true)formr"   z:janka_web_app/dashboard/user_management/user_settings.html)	r"   rc   UserProfileFormrZ   r   is_validro   r   r   )r-   r"   r   r.   s       r/   user_settingsr   ^  sy    <<D~~w||W]]TJ==?IIK:;; - G 'WY`aar1   c                    | j                   dk(  r	 t        j                  | j                        }|j	                  d      }|j	                  d      }|j	                  d      }| j
                  }|j                  |      st        dddd	      S ||k7  rt        dd
dd	      S 	 t        ||       |j                  |       |j                          t        | |       t        ddt        d      dz   d      S t        dddd	      S # t        $ r6}t        dddj                  |j                        z   dd	      cY d }~S d }~ww xY w# t         $ r&}t        ddt#        |      z   dd	      cY d }~S d }~ww xY w)NrZ   old_passwordnew_passwordconfirm_new_passwordFzOld password is incorrect.r   r   rz   zNew passwords do not match.r   r   TzPassword changed successfully!r   z?updated=truer   r   r   zInvalid request method  )rc   jsonloadsbodyrE   r"   check_passwordr
   r   r   r   r   set_passwordro   r	   r   r   r   )r-   datar   r   r   r"   r   s          r/   change_passwordr   r  s   ~~1	::gll+D88N3L88N3L#'88,B#C <<D &&|4#$;%   33#$<%  !,5 l+IIK %Wd3; ' 8? J!   E6NOX[\\3 # #$+dii

.CC%  &  	 03q69!  	sU   A>E E &D
 2AE 
	E	+E>E	?E E		E 	E;E60E;6E;c                    t         j                  j                         }t        j                  j	                  d      j                         }t
        j                  j	                  dd      j                         }| j                  j                  dk(  r.t        j                  j                         j                  d      }n9t        j                  j                  | j                        j                  d      }||||d}t        | d|      S )Nr3   r4   rx   r    r   )r>   r?   gewogsvillagesz2janka_web_app/dashboard/hotels/add_edit_hotel.html)rC   r(   rB   Gewogr,   Villager"   r   rA   r*   r)   r   )r-   r?   r   r   r>   r.   s         r/   add_edit_hotelr     s    ""&&(J]]))+6::<F--g{CGGIH ||(""$--m< %%7<<%8AA-P  	G 'OQXYYr1   c                    | j                   dk(  r	 | j                  j                  d      }| j                  j                  d      }| j                  j                  dd      }| j                  j                  d      }| j                  j                  dd      }| j                  j                  dd	      }| j                  j                  d
d	      }| j                  j                  dd      }| j                  j                  d      }	| j                  j                  d      }
| j                  j                  d      }t        ||||	|
|g      st	        ddd      S t        t        |	      }t        t        |
|      }t        t        |||      }t        j                  j                  ||||||||t        |      t        |      || j                        }d| j                  v r| j                  d   |_        d| j                  v r| j                  d   |_        d| j                  v r| j                  d   |_        d| j                  v r| j                  d   |_        |j'                          t	        dd|j(                   d|j*                  |j(                  |j,                  |j.                  j(                  |j0                  j(                  |j2                  j(                  |j4                  |j6                  |j8                  d	d      S t	        dd d      S # t:        $ r$}t	        ddt=        |       d      cY d }~S d }~ww xY w)!NrZ   namelocationdescriptionr   contact_numberr   total_roomsr   available_roomshotel_ownerrH   rI   rJ   FzHPlease fill all required fields including Dzongkhag, Gewog, and Village.r   dzo_idrI   r3   rJ   r4   r3   )r   r   r   r3   r4   r5   r   r   r   r   r  r"   
home_imagehotel_image1hotel_image2hotel_image3THotel "z" created successfully!	ri   r   r   r3   r4   r5   r   r   r   r]   r_   r#   zError creating hotel: Invalid request method.)rc   rZ   rE   rB   r
   r   rC   r   r   rA   r(   r   rF   r"   r   r  r  r  r	  ro   r   ri   r   r3   r4   r5   r   r   r   r   r   )r-   r   r   r   r   r   r   r   r  rH   rI   rJ   r3   r4   r5   r#   r   s                    r/   create_hotelr    s   ~~L	<<##F+D||''
3H!,,**="=K$\\--.>?NLL$$Wb1E!,,**=!<K%ll../@!DO!,,**="=K #<<++N;L||''
3H )),7J hhPZ[\#$i%   *)LII%eh)TE'Je_hiG MM((!'#-, #O 4'\\ ) E  w}},#*==#> .%,]]>%B".%,]]>%B".%,]]>%B"JJL$UZZL0GH((!JJ %!&!5!5"[[--$}}11&+&:&:#(#4#4','<'<
!  , E6OPQQ  	 3CF8<!  	s%   EL! F3L! !	M*M	M	Mc                    | j                   dk(  r3	 | j                  j                  d      }t        t        |      }| j                  j                  d      |_        | j                  j                  d      |_        | j                  j                  dd      |_        | j                  j                  d      |_        | j                  j                  d	d      |_	        t        | j                  j                  d
d            |_        t        | j                  j                  dd            |_        | j                  j                  dd      |_        | j                  j                  d      }| j                  j                  d      }| j                  j                  d      }t        |||g      st        ddd      S t        t         |      }t        t"        ||      }t        t$        |||      }||_        ||_        ||_        d| j,                  v r| j,                  d   |_        d| j,                  v r| j,                  d   |_        d| j,                  v r| j,                  d   |_        d| j,                  v r| j,                  d   |_        |j7                          t        dd|j
                   d|j8                  |j
                  |j                  |j&                  j
                  |j(                  j
                  |j*                  j
                  |j                  |j                  |j                  d	d      S t        dd!d      S # t:        $ r$}	t        dd t=        |	       d      cY d }	~	S d }	~	ww xY w)"NrZ   hotel_idr   r   r   r   r   r   r   r   r   r   r  rH   rI   rJ   Fz+Dzongkhag, Gewog, and Village are required.r   r  r  r  r  r  r  r	  Tr
  z" updated successfully!r  r  zError updating hotel: r  )rc   rZ   rE   r   rA   r   r   r   r   r   rF   r   r   r  rB   r
   rC   r   r   r3   r4   r5   r   r  r  r  r	  ro   ri   r   r   )
r-   r  r#   rH   rI   rJ   r3   r4   r5   r   s
             r/   update_hotelr    s   ~~B	||''
3H%e9E !))&1EJ$\\--j9EN ' 0 0 CE#*<<#3#34D#EE !,,**7B7EK #GLL$4$4]A$F GE$'(8(89JA(N$OE! ' 0 0 CE #<<++N;L||''
3H )),7Jh
;<#$L%   *)LII%eh)TE'Je_hiG'EOEK#EM w}},#*==#> .%,]]>%B".%,]]>%B".%,]]>%B"JJL$UZZL0GH((!JJ %!&!5!5"[[--$}}11&+&:&:#(#4#4','<'<
!  , E6OPQQ  	 3CF8<!  	s%   F/M FM 	M?M:4M?:M?c                    | j                   dk(  r?	 t        j                  j                  |      }|j	                          t        ddd      S t        ddd      S # t        j                  $ r t        ddd      cY S w xY w)	NrZ   r   TzHotel deleted successfully!r   FzHotel not found.zInvalid request.)rc   rA   r(   rE   r   r
   DoesNotExist)r-   r  r#   s      r/   delete_hotelr  \  s    ~~	SMM%%%2ELLND=Z [\\ E6HIJJ !! 	SE>P QRR	Ss   =A !B Bc                    t         j                  j                         j                  d      }t        j                  j                         j                  d      }t
        j                  j                         j                  d      }t        j                  j                         j                  d      }||||d}t        | d|      S )Nr   )r?   r   r   gallery_categoriesz)janka_web_app/dashboard/master_table.html)rC   r(   rB   r*   r   r   GalleryCategoryr   )r-   r?   r   r   r  r.   s         r/   master_tabler  g  s    ""&&(11&9J]] ))&1F""$--f5H(00446??G'6xfxyG'FPPr1   c           	         | j                   j                  d      }| j                   j                  d      }|r+t        t        |      }||_        |j                          d}n5t        j                  j                  |t        j                               }d}t        d||j                  |j                  |j                  j                  d      d	d
      S )z@
    Handles both Create and Edit Dzongkhag in one function
    r  r   pkupdated)r   
created_atcreatedTz%Y-%m-%d %H:%M)ri   r   r  )r]   r^   r3   )rZ   rE   r   rC   r   ro   r(   r   r   r   r
   r  r  strftime)r-   r  r   r3   r^   s        r/   save_dzongkhagr   p  s    
 \\h'F<<F#D%iF;		%%,,||~ - 
	 ""NN#..778HI
  r1   c                     | j                   j                  d      }t        t        |      }t	        d       |j                          t        dd|d      S )Nr  r  z"Reaching here inside the dzonkhag!Tdeleted)r]   r^   r  )rZ   rE   r   rC   r   r   r
   )r-   r  r3   s      r/   delete_dzongkhagr#    sR    \\h'F!)7I	
./  r1   c                    | j                   dk(  r| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }|r|st        ddd      S 	 t        j
                  j                  |      }|r1t        j
                  j                  |	      }||_        ||_        d
}n#t        j
                  j                  ||      }d}|j                          t        d||j                  |j                  dd      S t        ddd      S # t        $ r!}t        dt        |      d      cY d }~S d }~ww xY w)NrZ   rI   r   rH   FAll fields are required.r   r  rI   r  )r   r3   addedT)rI   r   )r]   r^   r4   r   )rc   rZ   rE   r
   rC   r(   r   r   r3   r   ro   rI   r   r   )r-   rI   r   rH   r3   r4   r^   r   s           r/   
save_gewogr(    s6   ~~<<##J/||'||''7<E>X YZZ	G!))--\-BI))8)<!
"+",,$),L JJL &+nnejjI!   E6GHII  	GEc!f EFF	Gs   5B+D/ /	E8EEEc                 <   | j                   dk(  rY| j                  j                  d      }	 t        j                  j                  |      }|j                          t        ddi      S t        dd	d      S # t        j                  $ r t        ddd      cY S w xY w)
NrZ   rI   r&  r]   TFzGewog not found.r   r   )rc   rZ   rE   r   r(   r   r
   r  )r-   rI   r4   s      r/   delete_gewogr*    s    ~~<<##J/	SMM%%x%8ELLND 122 E6GHII !! 	SE>P QRR	S   <A7 7!BBc                     | j                   j                  d      }|st        dg i      S t        j                  j                  |      j                  dd      }t        dt        |      id      S )NrH   r   )rH   rI   r   F)safe)rD   rE   r
   r   r(   r)   valueslist)r-   rH   r   s      r/   get_gewogs_by_dzongkhagr0    sa    ;;??>2LXrN++]]!!|!<CCJPVWF4<0u==r1   c                 R   | j                   dk(  r]| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }t        |||g      st	        ddd      S 	 t
        j                  j                  |	      }t        j                  j                  |
      }|r8t        j                  j                  |      }||_	        ||_
        ||_        d}n$t        j                  j                  |||      }d}|j                          t	        d||j                  |j                  dd      S t	        ddd      S # t        $ r!}	t	        dt!        |	      d      cY d }	~	S d }	~	ww xY w)NrZ   rJ   r   rH   rI   Fr%  r   r  r&  rJ   r  )r   r3   r4   r'  T)rJ   r   )r]   r^   r5   r   )rc   rZ   rE   rB   r
   rC   r(   r   r   r   r3   r4   r   ro   rJ   r   r   )
r-   rJ   r   rH   rI   r3   r4   r5   r^   r   s
             r/   save_villager3    s{   ~~\\%%l3
||'||''7<<##J/D,12E>X YZZ	G!))--\-BIMM%%x%8E!//---D#$-! %"!//00diW\0] LLN ")"4"4#LL!   E6GHII  	GEc!f EFF	Gs   CE< <	F&F!F&!F&c                 <   | j                   dk(  rY| j                  j                  d      }	 t        j                  j                  |      }|j                          t        ddi      S t        dd	d      S # t        j                  $ r t        ddd      cY S w xY w)
NrZ   rJ   r2  r]   TFzVillage not found.r   r   )rc   rZ   rE   r   r(   r   r
   r  )r-   rJ   r5   s      r/   delete_villager5    s    ~~\\%%l3
	Uoo))Z)@GNND 122 E6GHII ## 	UE>R STT	Ur+  c                     | j                   j                  d      }|rFt        j                  j	                  |      j                  dd      }t        dt        |      i      S t        dg i      S )NrI   r&  rJ   r   r   )rD   rE   r   r(   r)   r.  r
   r/  )r-   rI   r   s      r/   get_villages_by_gewogr7    s`    {{z*H??))8)<CCLRXYZh899R())r1   c                 &   | j                   j                  dk(  r[t        j                  j	                         j                  d      }t        j                  j	                         j                  d      }nrt        j                  j                  | j                         j                  d      }t        j                  j                  | j                         j                  d      }t               }||t        j                  |d}t        | d|      S )Nrx   hotel_room_typesr#   r   hotel__user)r>   r%   r@   r   z0janka_web_app/dashboard/hotels/room_details.html)r"   r   rA   r(   rB   prefetch_relatedr'   r,   r)   RoomTypeFormROOM_CHOICESr   )r-   r>   r%   r   r.   s        r/   add_edit_roomsr?    s     ||(""$556HI%%))+::7C
 %%7<<%8IIJ\]%%,,,FUUV]^
>D   --	G 'MwWWr1   c           	      t   | j                   dk7  rt        dddd      S t        t        |      }|j                  }|j
                  }|j                         }|j                          |xj                  |z  c_        |xj
                  |z  c_        |j                          t        d| d	| d
| dd      S )NrZ   Fr   r   r   rz   r   Tz (z room(s)) deleted. z room(s) returned to quota.)
rc   r
   r   r'   r#   r   get_room_type_displayr   r   ro   )r-   room_idroomr#   
room_count	room_names         r/   delete_room_typerF    s    ~~:KLUXYYX'2DJJE!!J**,I 	KKM 
Z'	#	JJL[:,.A*Mhi  r1   c                    | j                   dk7  rt        dddd      S | j                  }| j                  j	                  d      xs d }|r	 t        |      }| j                  j	                  d
      }| j                  j	                  d      }| j                  j	                  dd      }	 t        | j                  j	                  dd            }t        | j                  j	                  dd            }|r|r
|dk  s|dk  rt        dddd	      S t        t        |      }|j                  |k7  r|j                  dk7  rt        dddd      S |j                  j                  t        d            d   xs d}	|j                  |	z
  |_        |j#                  dg       t$        j&                  j)                  ||      j+                  |      j-                         r:t        d|j.                   dt1        t$        j2                        |    ddd	      S d}
|rt        t$        ||      }|j                  }
||
z
  }|dkD  r0||j                   kD  r!t        dd | d!|j                    d"dd	      S |ri|_        ||_        ||_        ||_        d#| j:                  v r| j:                  d#   |_        |j#                          d$|j?                          d%|
 d&| d'}nmt$        j&                  jA                  |||||(      }d#| j:                  v r$| j:                  d#   |_        |j#                          d)|j?                          d*| d'}|xj                   |z  c_        |j#                  dg       t        d+|d      S # t        t        f$ r t        dddd	      cY S w xY w# t        t        f$ r t        dddd	      cY S w xY w),NrZ   Fr  r   r   rz   rB  zInvalid room ID.r   r  r6   r   r   price_per_nightr   r   zInvalid price or room count.r   z1All fields are required and values must be valid.r   rx   z(Unauthorized: You do not own this hotel.i  totalrJ  r   rl   )r#   r6   z already has a r   )ri   r#   zYou cannot increase rooms by z because only z rooms are available.
room_imagezUpdated z from  to z rooms.)r#   r6   r   rH  r   zCreated z with T)!rc   r
   r"   rZ   rE   rF   rG   	TypeErrorfloatr   rA   r   r9  	aggregater   r   r   ro   r'   r(   r)   excluder   r   dictr>  r6   r   rH  r   rK  rA  r   )r-   r"   rB  r  r6   r   rH  new_total_roomsr#   actual_usedold_room_countrC  deltamsgs                 r/   save_room_typerW  1  s
   ~~:ST]`aa <<D lly)1TG	_'lG ||
+H  -I,,""="5K 0 01BA FGgll..}a@A 9!(;QR?RJ
  	 e1EzzTdnn7A
  	 ((22]9K2LWUZYZK!--;E	JJ/0J1 Ui@HHGHT[[]**_T(:O:O5PQZ5[4\\]^
  	 N gUC)) n,E qyUU222/wn(())>@
  	 *"&.7==(%mmL9DO		3356f^<LDQ`Paahi &&#+' ' 
 7==(%mmL9DOIIK3356f_<MWU 
U"	JJ/0J1  y I& 	_E>P QZ]^^	_ 	" 5
  	s%   N	 ,A
N. 	N+*N+.OOc           
         | j                   }t        j                  j                  ddd      }|j                  dk(  r|j                         }na|j                  dv r5|j                  dk(  r|j                  |      }n1|j                  |      }nt        j                  j                         }|j                  dk(  rD|j                  t        t        j                  j                  |t        d	      
                  }n9|j                  t        j                  dt        j                                     }|t        j                  d}t!        | d|      S )Nr"   r#   r   rx   )r   r"   r   r:  r   r  r"   booking)has_reviewedF)output_field)bookingsstatus_choicesz,janka_web_app/dashboard/booking/booking.html)r"   r   r(   r,   r   rB   r)   noneannotater   r+   r   modelsValueBooleanFieldr^  r   )r-   r"   base_qsr]  r.   s        r/   manage_bookingsre    s&   <<D oo,,VWoNG~~ ;;=	,	,>>W$~~$~7H~~4~0H??'') ~~$$%%$TN &  % 
 $$&,,uSYSfSfSh,2i$j !00G 'I7SSr1   c                    | j                   dk(  r}	 | j                  j                  d      }| j                  j                  d      }t        t        |      }t        t        j                        }||vrt        ddid      S |j                  }||_        |j                          |j                  }|j                  r|j                  j                         n|j                  }|j                  r|j                  j                         nd	}d
}	d
}
|dk(  r|dk7  rd}	d| d|j                   j"                   d| d|j$                  j'                  d       d|j(                  j'                  d       d|j*                   d|j,                   d|j.                   dj                         }
n|dk(  r|dk7  rd}	d| d|j                   j"                   d| d|j$                  j'                  d       d|j(                  j'                  d       d|j*                   d|j,                   d|j.                   dj                         }
|
r3|	r1|j0                  }d}	 t3        |	|
||gd       t5        d| d|	        t        d!d"||    d#      S t        dd'id      S # t6        $ r}t5        d |        Y d }~?d }~ww xY w# t6        $ r'}t5        d$|        t        dd%id&      cY d }~S d }~ww xY w)(NrZ   
booking_idr^   r   r`   zInvalid statusr   rz   zNot specifiedr   ry   u.   ✅ Your Booking at Janka Resort is Confirmed!z#
                            Hello u   ,

                            Great news! Your booking at Janka Resort has been confirmed 🎉

                            Booking Details:
                            - Hotel: z*
                            - Room Type: z)
                            - Check-In: z	%d %b, %Yz*
                            - Check-Out: z&
                            - Rooms: z'
                            - Guests: z+
                            - Booking ID: z

                            We can't wait to welcome you!

                            Warm regards,
                            Janka Resort Team
                                            r|   u3   ❌ Your Booking at Janka Resort has been Cancelledz,

                            We're sorry, but your booking at Janka Resort has been cancelled.

                            Booking Details:
                            - Hotel: z

                            If you have any questions, feel free to contact our support team.

                            Sincerely,
                            Janka Resort Team
                                            zno-reply@jankaresort.comFr   u   📧 Email sent to z | Subject: u   ❌ Failed to send email: TzBooking status updated to r   u%   🚨 Error in update_booking_status: zAn error occurredr   r   )rc   rZ   rE   r   r   rQ  r^  r
   r^   ro   r"   r   r   r[   r   rA  r#   r   check_inr  	check_outnumber_of_roomsnumber_of_guestsri   r   r   r   r   )r-   rg  r^   rZ  valid_statuses
old_statusr"   r   room_type_displayr   r_   recipient_emailr   email_errorr   s                  r/   update_booking_statusrq    s^    ~~c	L )),7J\\%%h/F'J?G "'"8"89N^+#W.>$?LL !J#GNLLN <<D-1^^4>>'')D
 (( %%;;=$  GG${)BJ##'& )&
 '.mm&8&8%9 :**;)< =))0)9)9)B)B;)O(P Q**1*;*;*D*D[*Q)R S&&-&=&=%> ?''.'?'?&@ A++2::, 7-0$ 16% ( ;&:+DO##'& )&
 '.mm&8&8%9 :**;)< =))0)9)9)B)B;)O(P Q**1*;*;*D*D[*Q)R S&&-&=&=%> ?''.'?'?&@ A++2::, 7-0$ 16% ( 7"&**7

F ' '#-(7'8&+ //@WIVW
  7v8N7OP!   "34SAA ! F6{mDEEF  	L9!=>*= >sKK	LsO   A2K GK "J :K 	J>&J94K 9J>>K 	K1
K,&K1,K1c                    	 |st        ddd      S t        t        |      }| j                  }t	        |dd      }|dk(  rn:|dk(  r'|j
                  j                  |k7  rt        dd	d      S t        dd
d      S |j                          t        ddd      S # t        $ r$}t        ddt        |      z   d      cY d }~S d }~ww xY w)NFzNo booking ID provided.r   r   r   r"   rx   r   z1You can only delete bookings for your own hotels.z.You do not have permission to delete bookings.TzBooking deleted successfully.r   r   )	r
   r   r   r"   getattrr#   r   r   r   )r-   rg  rZ  r"   r   r   s         r/   delete_bookingrt  /  s    YE<U VWW $G
; ||D+v6	'!}}!!T)#@s$tuuE<l mnn 	9XYZZ Y8MPSTUPV8VWXXYs/   B AB .B <B 	C#C<CCc                 *   t        t        |      }g }t        j                         j	                         }|j
                  j                         D ]m  }t        j                  j                  |d      j                  t        d            d   xs d}|j                  |z
  }|dkD  sY|j                  |||d       o t        j                  j                  |	      j                  d
d      j!                  d      d d }|||d}	t#        | d|	      S )Nr   ry   )r   r^   rj  rI  rJ  r   )r6   r   r   )r#   r"   rZ  r    r~   )r#   r%   reviewszjanka_web_app/room_details.html)r   rA   r   r   r   r9  rB   r   r(   r)   rO  r   r   appendr+   r,   r*   r   )
r-   r  r#   r%   todayr6   r   	availablerv  r.   s
             r/   hotel_detailrz  L  s%   e1EJ LLN!E++//1	$__33# 4 
 )#/0)
1'; @ ?@ 	
 )),>>	q=&&8#,  2 nn## $ n	h}cr	#G  G
 '<gFFr1   c           
         | j                   dk7  rt        ddid      S 	 | j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d	      }t	        | j                  j                  d
d            }t	        | j                  j                  dd            }t        ||||g      st        ddid      S t        t        |      }t        t        |      }t        |      }	t        |      }
|	r|
st        ddid      S |	|
k\  rt        ddid      S |	t        j                         k  rt        ddid      S t        j                  j                  |ddg|
|	      j                  t         j#                  d
            d   xs d}|j$                  |z
  }||kD  rt        dd| did      S t        j                  j'                  || j(                  ||	|
||d      }t*        j                  j'                  d| j(                  j,                   d|j/                          d|j0                   dd d!| j(                  j,                  |j(                  d"#       t        d$d%|j2                   d&|j4                   d'|j6                   dd(      S # t8        $ r"}t        dt;        |      id)      cY d }~S d }~ww xY w)*NrZ   r`   r  r   rz   r  room_type_idrh  ri  rj  r   rk  zMissing required fields.r   r   zInvalid date format.z!Check-out must be after check-in.z$Check-in date cannot be in the past.r{   ry   )r   
status__incheck_in__ltcheck_out__gtrI  rJ  r   zOnly z# room(s) available for this period.)r#   r"   r   rh  ri  rj  rk  r^   zNew Booking Requestz has requested a booking for z at r   r   r   z/manage-bookings/)r   r_   r   r   r   rj   rp   Tu&   Booking confirmed! We’ve saved your z room(s) from rL  r   r   )rc   r
   rZ   rE   rF   rB   r   rA   r'   r   r   rx  r   r(   r)   rO  ra  r   r   r   r"   rn   r[   rA  r   rj  rh  ri  r   r   )r-   r  r|  check_in_strcheck_out_strrj  rk  r#   r6   rh  ri  overlapping_bookingsr   rZ  r   s                  r/   create_bookingr  o  s$   ~~W&?@MME;<<##J/||''7||''
3((5gll../@!DEw||//0BAFG HlL-HI*D EcRR!%H5%h<@	l+}-	y*@ A#NNy *M NWZ[[djjl"*P QZ]^^  '55#!;/""	  6  

 )&**%67)
8 B  G
 FG 	 $//2FF_,5 11TU! 
 //((#+- ) 	
 	##'||,,--J9KjKjKlJmmqrwr|r|q}}~!#||,, ::* 	$ 	
 ?@W@W?XXfgngwgwfxx|  ~E  ~O  ~O  }P  PQ  R
  	
  ;Wc!f-c::;s?   CK 4A
K ?K %K 9A5K /CK 	K:K5/K:5K:c                    t         j                  j                  | j                        t         j                  j                  | j                        z  }|j	                  dd      j                  d      }t        j                  j                  | j                  j                        j                  d      }||d}t        | d	|      S )
N)r   r   r   r   r    r   r[   )user_messages	all_usersz,janka_web_app/dashboard/message/message.html)
r   r(   r)   r"   r,   r*   r   rP  ri   r   )r-   r  r  r.   s       r/   r   r     s     OO**|| +  	 	M
 "00:FOOP]^M $$$8AA*MI 'G 'I7SSr1   c           	      j   | j                   dk7  rt        dddd      S | j                  j                  d      }| j                  j                  dd	      j	                         }| j                  j                  d
d	      j	                         }| j                  j                  d      }|r|st        dddd      S 	 t
        j                  j                  |      }|| j                  k(  rt        dddd      S t        j                  j                  | j                  |||       |rR	 t        j                  j                  || j                        }|j                  sd|_        |j                  dg       |j                  }d|j                   d| j                  j                   d| d| d	j	                         }t        ||t         j"                  |gd       t        ddd      S # t
        j                  $ r t        dddd      cY S w xY w# t        j                  $ r Y w xY w)NrZ   Fr  r   r   rz   receiver_idr   r   r_   original_message_idz"Receiver and message are required.r   r   zReceiver not found.i  zYou cannot message yourself.)r   r   r   r_   ri   r   Tr   rl   z
        Hello z,,

        You just received a message from z about: z

        Message:
        z>

        Best regards,
        Janka Resort Team
            r   zMessage sent successfully!)rc   r
   rZ   rE   r   r   r(   r  r"   r   r   r   ro   r   r[   r   r   r   )	r-   r  r   r_   r  r   original_messager   
email_bodys	            r/   send_messager    sC   ~~:ST]`aa,,""=1Klly"-335Glly"-335G!,,**+@Ag;
  	
^<<##{#3 7<<:XYbeff OO||	   	&226IT[T`T`2a#(((, % %%VH%= NNE  ! "**1,,*?*?)@	 R	 
	 
   ..w /  ]  ^:OPY\]]^* ## 		s%   ? G3 .AH 3#HHH21H2c                     t         j                  j                  | j                        j	                  d      }d|i}t        | d|      S )N)rj   r    notificationsz.janka_web_app/dashboard/notification_list.html)rn   r(   r)   r"   r*   r   )r-   r  r.   s      r/   notifications_listr    sE     ((//w||/LUUVcdM}-G'KWUUr1   c                     t        t        || j                        }|j                  sd|_        |j	                  dg       t        d      S )zF
    Mark message as read and redirect to inbox or message detail
    r  Tr   rl   r   )r   r   r"   r   ro   r   )r-   
message_idr_   s      r/   message_redirectr    sH    
  G <<F8, Jr1   c                     t         j                  j                  | j                        j	                  ddd      j                  d      }d|i}t        | d|      S )Nr   r#   r6   rZ  r    rv  z#janka_web_app/dashboard/review.html)r+   r(   r)   r"   r,   r*   r   )r-   rv  r.   s      r/   review_pager  +  sf     nn##\\ $ n h}  	7G '@'JJr1   c           	      p   | j                   dk(  rJ| j                  j                  d      }| j                  j                  d      }| j                  j                  dd      j                         }	 t        j
                  j                  || j                        }t        j
                  j                  | j                  |      j                         r+t        dd	|j                  j                  d
       dd      S t        j
                  j                  |j                  |j                  | j                  |t!        |      |       t        ddd      S t        ddd      S # t        j"                  $ r t        ddd      cY S t$        $ r!}t        dt'        |      d      cY d }~S d }~ww xY w)NrZ   rg  ratingcommentr   ri   r"   rY  F'   You’ve already reviewed this stay on %d %b %Yr   r   )r#   r6   r"   rZ  r  r  TzReview submitted successfully!r   z"Booking not found or unauthorized.r  )rc   rZ   rE   r   r   r(   r"   r+   r)   r   r
   rh  r  r   r#   r   rF   r  r   r   )r-   rg  r  r  rZ  r   s         r/   submit_reviewr  ;  s    ~~\\%%l3
!!(+,,""9b1779	Eoo))Zgll)KG ~~$$',,$HOOQ#$FwGWGWG`G`akGlFmmno%   NN!!mm!//\\6{ "   D=] ^__ E4MNOO ## 	cE<` abb 	EECF CDD	Es,   2BE) AE) )!F5F5F0*F50F5c                    | j                   dk(  r| j                  j                  d      }	 t        j                  j                  || j
                        }t        j                  j                  | j
                  |      j                         }|r-|j                  j                  d      }t        dd| dd	      S t        d
di      S t        ddid      S # t        j                  $ r t        d
di      cY S w xY w)NrD   rg  r  rY  r  Tr  r   )r   r_   r   Fr`   r   r   rz   )rc   rD   rE   r   r(   r"   r+   r)   r   rh  r  r
   r  )r-   rg  rZ  r   review_dates        r/   check_review_existsr  _  s    ~~[[__\2
	3oo))Zgll)KG^^**g*NUUWF%..77
C#"!HUVW%  
 $Xu$566 "34SAA ## 	35 122	3s   BC ?C  C>=C>c                 z    t         j                  j                         j                  d      }t	        | dd|i      S )Nz-uploaded_atzjanka_web_app/gallery.htmlgallery_items)GalleryImager(   rB   r*   r   )r-   r  s     r/   galleryr  r  s=     ((,,.77GM'7:  r1   c           	         | j                   dk(  r"| j                  j                  d      }| j                  j                  dd      j                         }| j                  j                  dd      j                         }|st	        ddd      S |rB	 t
        j                  j                  |	      }||_        ||_        |j                          d
}n#t
        j                  j                  ||      }d}t	        d||j                  |j                  |j                  |j                  dd      S t	        ddd      S # t
        j                  $ r t	        ddd      cY S w xY w)NrZ   category_idr   r   r   FzName is requiredr   r   r  Category not found)r   r   r  T)ri   r   slugr   )r]   r^   r   r   )rc   rZ   rE   r   r
   r  r(   r   r   ro   r  r   ri   r  )r-   r  r   r   r   r^   s         r/   save_gallery_categoryr  x  sW    ~~ll&&}5||+113ll&&}b9??AE>P QRRY*2266+6F $'2$"
 '..55' 6 H Fkk  '33		
 	 		 E6GHII) #// Y#BV$WXXYs   A E !E%$E%c                 ~   | j                   dk(  rz| j                  j                  d      }|st        ddd      S 	 t        j
                  j                  |      }|j                  }|j                          t        dd| d	d      S t        ddd      S # t        j                  $ r t        dd
d      cY S w xY w)NrZ   r  FzNo category ID providedr   r   Tz
Category "z" deleted successfullyr  r   )	rc   rZ   rE   r
   r  r(   r   r   r  )r-   r  r   category_names       r/   delete_gallery_categoryr    s     ~~ll&&}5E>W XYY		U&..22k2BH$MMMOO'6LM!   E6GHII ++ 	UE>R STT	Us   AB !B<;B<c                     t         j                  j                         }t        j                  j                         }||d}t	        | d|      S )N)gallery_images
categoriesz2janka_web_app/dashboard/page_settings/gallery.html)r  r(   rB   r  r   )r-   r  r  r.   s       r/   gallery_page_settingsr    sJ    !))--/N ((,,.J( G 'OQXYYr1   )GalleryImageFormc                     | j                   dk(  rjt        | j                  | j                        }|j	                         r,|j                         }t        dd|j                   dd      S t        ddd      S y )	NrZ   Tu   ✅ Image "z" added successfully!r   F!Please check the form for errors.r   )rc   r  rZ   r   r   ro   r
   r   )r-   r   images      r/   add_gallery_imager    s{    ~~gmm<==?IIKE(5JK!  
   <!    r1   c                    | j                   dk(  r| j                  j                  d      }	 t        j                  j                  |      }t        | j                  | j                  |      }|j                         r|j                          t        ddd      S t        dd	d
      S y # t        j                  $ r t        ddd
      cY S w xY w)NrZ   image_idr   r   Tu   ✅ Image updated successfully!r   Fr  r   zImage not found.)rc   rZ   rE   r  r(   r  r   r   ro   r
   r  )r-   r  r  r   s       r/   update_gallery_imager    s    ~~<<##J/	 ((,,,9E#GLL'--%PD}}		##!@%  
 $$@%      (( 	 +!  	s   A/B+ B+ +!CCc                     | j                   dk(  r>	 t        j                  j                  |      }|j	                          t        ddi      S y # t        j                  $ r t        ddd      cY S w xY w)NrZ   r  r]   TFzImage not foundr   )rc   r  r(   rE   r   r
   r  )r-   r  r  s      r/   delete_gallery_imager    su    ~~	P ((,,,3ELLND 122	  
 (( 	PE<M NOO	Ps   <A !A32A3)adjango.shortcutsr   r   r   django.contrib.authr   r   r   r	   django.httpr
   django.views.decorators.csrfr   'django.contrib.auth.password_validationr   django.core.exceptionsr   r   django.urlsr   r   django.contribr   django.contrib.auth.decoratorsr   formsra  django.views.decorators.httpr   django.utilsr   	django.dbr   django.db.modelsr   r   r   django.utils.dateparser   datetimer   r   django.core.mailr   r0   rK   rO   rQ   rS   rV   rX   rd   rg   rs   r   r   r   r   r   r   r   r   r  r  r  r  r   r#  r(  r*  r0  r3  r5  r7  r?  atomicrF  rW  re  rq  rt  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r1   r/   <module>r     s   @ @ U U $ 4 E 2   . # 9   5 ! ! 2 2 - $ &?&@P=8<5:J$ 0 0$ +&OI 'OIb +&eX  'eXN H H,& +&b 'b& 5] 5]r +&Z 'Z*PRdFRP K K +&Q 'Q  : 
 
 J J: 	J 	J> "J "JH 	J 	J* +&X 'X*  , k kZ +&#T '#TJ gB  gBP Y  Y6!GF I; I;V +&T 'T$ B BHV
    $ K K  P   PD B B$ +&%J ' %JN +&J ' J$Z $    .Pr1   