
    Gi                     P   d Z ddlZddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZmZmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZ  e              ee dd          Z! ej"        d ej#        d                    e!j$        d<   ej%        &                    ej%        '                    e(                    Z)ej%        *                    e)dd          Z+ ej"        dde+           e!j$        d<   de!j$        d<   ej%        *                    e) ej"        dd                    e!j$        d<   de!j$        d<    ej,        ej%        *                    e)d          d            ej,        e!j$        d         d            ee!          Z- ee!          Z.de._/         G d de-j0                  Z1 G d  d!ee-j0                  Z2 G d" d#e-j0                  Z3 G d$ d%e-j0                  Z4 G d& d'e-j0                  Z5 G d( d)e-j0                  Z6 G d* d+e-j0                  Z7e.j8        d,             Z9d- Z:dd.Z;d/ Z<d0 Z=d1 Z>e!?                    d2          d3             Z@e!?                    d4          d5             ZAe!?                    d6          d7             ZBe!?                    d8          d9             ZCe!?                    d:          d;             ZDe!?                    d<          d=             ZEe!?                    d>          d?             ZFe!?                    d@          dA             ZGe!?                    dB          dC             ZHe!?                    dDdEgF          dG             ZIe!?                    dHdEgF          dI             ZJe!?                    dJdEgF          dK             ZKe!?                    dL          dM             ZLe!?                    dNdOgF          edP                         ZMe!?                    dQdOgF          edR                         ZNe!?                    dS          dT             ZOe!?                    dU          dV             ZPe!?                    dW          dX             ZQe!?                    dY          dZ             ZRe!?                    d[dEgF          d\             ZSe!?                    d]dOgF          d^             ZTe!?                    d_d`gF          da             ZUe!?                    dbd`gF          dc             ZVe!?                    dddEgF          de             ZWe!?                    df          edg                         ZXe!?                    dh          di             ZYe!?                    dj          dk             ZZe!?                    dl          dm             Z[e!?                    dn          ee=do                                     Z\e!?                    dp          ee=dq                                     Z]e!?                    dpdEgF          ee=dr                                     Z^e!?                    dsdOgF          ee=dt                                     Z_e!?                    dsd`gF          ee=du                                     Z`e!?                    dv          ee=dw                                     Zae!?                    dx          ee=dy                                     Zbe!?                    dzdOgF          ee=d{                                     Zce!?                    d|          ee=d}                                     Zde!?                    d~          ee=d                                     Zee!?                    d~dEgF          ee=d                                     Zfe!?                    dd`gF          ee=d                                     Zge!?                    d          ee=d                                     Zhe!?                    ddOgF          ee=d                                     Zid Zje dk    re!k                                5  e-l                                  ej             ddd           n# 1 swxY w Y    em ej"        dd                    Zn ej"        dd          o                                dk    Zp eqden            e!r                    denep           dS dS )zI
Les Vertes Prairies - Site E-commerce de Miel
Serveur Flask avec SQLite
    N)datetimewraps)Flaskrender_templaterequestjsonifyredirecturl_forsessionsend_from_directory)
SQLAlchemy)LoginManager	UserMixin
login_userlogout_userlogin_requiredcurrent_user)generate_password_hashcheck_password_hash)secure_filename)load_dotenvpublic )static_folderstatic_url_path
SECRET_KEY    datazmiel.dbDATABASE_URLz
sqlite:///SQLALCHEMY_DATABASE_URIFSQLALCHEMY_TRACK_MODIFICATIONSUPLOAD_FOLDERuploadsi   MAX_CONTENT_LENGTHT)exist_okcomptec                      e Zd Ze                    ej        d          Ze                    e                    d          dd          Ze                    ej	        d          Z
e                    ej        ej                  ZdS )	SettingTprimary_keyd   Funiquenullabler/   defaultN)__name__
__module____qualname__dbColumnIntegeridStringkeyTextvalueDateTimer   utcnow
updated_at     /var/www/html/lvp/server.pyr)   r)   1   sv        	2:4	0	0B
))BIIcNN4%)
@
@CIIbgI..E2;@@JJJrB   r)   c                      e Zd Ze                    ej        d          Ze                    e                    d          dd          Ze                    e                    d          d          Z	e                    e                    d          d          Z
e                    e                    d          d          Ze                    e                    d	                    Ze                    e                    d                    Ze                    e                    d                    Ze                    e                    d
                    Ze                    ej        d          Ze                    ej        ej                  Ze                    ddd          ZdS )UserTr*   x   Fr-      r0   r,      
   r1   OrderuserbackreflazyN)r3   r4   r5   r6   r7   r8   r9   r:   emailpassword
first_name	last_namephoneaddresscitypostal_codeBooleanis_adminr>   r   r?   
created_atrelationshipordersrA   rB   rC   rE   rE   7   sV       	2:4	0	0BIIbiinnTEIBBEyy3%y88H299S>>E::J		"))C..5	99IIIbiimm$$Eii		#''G99RYYs^^$$D))BIIbMM**KyyUy33H2;@@J__Wf4_@@FFFrB   rE   c                       e Zd Ze                    ej        d          Ze                    e                    d          d          Ze                    ej	                  Z
e                    ddd          Zd	S )
CategoryTr*   r,   Fr0   ProductcategoryrL   N)r3   r4   r5   r6   r7   r8   r9   r:   namer<   descriptionrZ   productsrA   rB   rC   r]   r]   F   sn        	2:4	0	0B99RYYs^^e944D))BG$$Ky*4HHHHHrB   r]   c                      e Zd Ze                    ej        d          Ze                    e                    d          d          Ze                    ej	                  Z
e                    ej        d          Ze                    e                    d                    Ze                    ej        d          Ze                    e                    d	                    Ze                    ej        e                    d
                    Ze                    ej        d          Ze                    ej        d          Ze                    ej        ej                  ZdS )r^   Tr*      Fr0   2   r   r1   rG   zcategory.idN)r3   r4   r5   r6   r7   r8   r9   r:   r`   r<   ra   Floatpriceweightstockimage
ForeignKeycategory_idrW   	is_activeis_featuredr>   r   r?   rY   rA   rB   rC   r^   r^   M   s#       	2:4	0	0B99RYYs^^e944D))BG$$KIIbhI//EYYryy}}%%FIIbj!I,,EIIbiinn%%E))BJm(D(DEEK		"*d	33I))BJ)66K2;@@JJJrB   r^   c                      e Zd Ze                    ej        d          Ze                    e                    d          d          Ze                    ej        e	                    d                    Z
e                    ej        e	                    d          d          Ze                    ej        d	          Ze                    ej        ej        	          Ze                    d
          ZdS )CartItemTr*   r,   Fr0   user.id
product.id   r1   r^   N)r3   r4   r5   r6   r7   r8   r9   r:   
session_idrk   user_id
product_idquantityr>   r   r?   rY   rZ   productrA   rB   rC   rp   rp   Z   s        	2:4	0	0B299S>>E::Jii
BMM)$<$<==G2:r}}\'B'BUSSJyyQy//H2;@@Jooi((GGGrB   rp   c                      e Zd Ze                    ej        d          Ze                    ej        e                    d                    Ze                    e	                    d          dd          Z
e                    e	                    d          d	          Ze                    ej        d
          Ze                    e	                    d                    Ze                    e	                    d                    Ze                    e	                    d                    Ze                    e	                    d                    Ze                    e	                    d                    Ze                    e	                    d                    Ze                    e	                    d                    Ze                    e	                    d                    Ze                    ej                  Ze                    ej        ej        	          Ze                    ej        ej        ej                  Ze                    ddd          ZdS )rJ   Tr*   rq   re   Fr-   rH   pendingr1   r0   r,   rF   rG   rI   )r2   onupdate	OrderItemorderrL   N)r3   r4   r5   r6   r7   r8   r9   rk   ru   r:   order_numberstatusrf   totalshipping_first_nameshipping_last_nameshipping_emailshipping_phoneshipping_addressshipping_cityshipping_postal_codepayment_methodr<   notesr>   r   r?   rY   r@   rZ   itemsrA   rB   rC   rJ   rJ   d   s       	2:4	0	0Bii
BMM)$<$<==G99RYYr]]4%9HHLYYryy}}iY88FIIbhI//E))BIIcNN33299S>>22YYryy~~..NYYryy}}--Nyy300IIbiinn--M99RYYr]]33YYryy}}--NIIbgE2;@@J2;(/ZZJOOKtODDEEErB   rJ   c                      e Zd Ze                    ej        d          Ze                    ej        e                    d          d          Ze                    ej        e                    d          d          Z	e                    e
                    d          d          Ze                    ej        d          Ze                    ej        d          ZdS )	r|   Tr*   zorder.idFr0   rr   rd   N)r3   r4   r5   r6   r7   r8   r9   rk   order_idrv   r:   product_namerf   product_pricerw   rA   rB   rC   r|   r|   x   s        	2:4	0	0ByyR]]:%>%>yOOH2:r}}\'B'BUSSJ99RYYs^^e9<<LIIbhI77Myyey44HHHrB   r|   c                 Z    t           j                            t          |                     S N)rE   querygetintru   s    rC   	load_userr      s    :>>#g,,'''rB   c                      t           j        rdt           j         S dt          vr(t	          t          j                              t          d<   t          d         S )Nuser_cart_session)r   is_authenticatedr9   r   struuiduuid4rA   rB   rC   get_session_idr      sK    $ )(|(((W$$"%djll"3"3>""rB   c                 |    t           j                            |                                           }|r|j        n|S )Nr;   )r)   r   	filter_byfirstr=   )r;   r2   settings      rC   get_settingr      s7    m%%#%..4466G#07==0rB   c                 J   t           j                            |                                           }|r ||_        t          j                    |_        n0t          | |          }t          j	        
                    |           t          j	                                         d S )Nr   r;   r=   )r)   r   r   r   r=   r   r?   r@   r6   r   addcommit)r;   r=   r   s      rC   set_settingr      s    m%%#%..4466G  %_..c///

wJrB   c                 <     t                      fd            }|S )Nc                  j    t           j        rt           j        st          ddi          dfS  | i |S )Nerror   Accès refusé  )r   r   rX   r	   )argskwargsfs     rC   decorated_functionz*admin_required.<locals>.decorated_function   sF    , 	=L4I 	=G%5677<<q$!&!!!rB   r   )r   r   s   ` rC   admin_requiredr      s4    
1XX" " " " X" rB   c                 j    d| v o/|                      dd          d                                         dv S )N.rs   >   gifjpgpngjpegwebp)rsplitlowerfilenames    rC   allowed_filer      s6    (?jxsA66q9??AAEjjjrB   /c                  "    t          dd          S )Nr   z
index.htmlr   rA   rB   rC   indexr          x666rB   z	/boutiquec                  "    t          dd          S )Nr   zboutique.htmlr   rA   rB   rC   boutiquer          x999rB   z/panierc                  "    t          dd          S )Nr   zpanier.htmlr   rA   rB   rC   panierr          x777rB   z	/checkoutc                  "    t          dd          S )Nr   zcheckout.htmlr   rA   rB   rC   checkoutr      r   rB   z/comptec                  "    t          dd          S )Nr   zcompte.htmlr   rA   rB   rC   r'   r'      r   rB   z/adminc                  "    t          dd          S )Nr   z
admin.htmlr   rA   rB   rC   adminr      r   rB   z/sonotherapiec                  "    t          dd          S )Nr   zsonotherapie.htmlr   rA   rB   rC   sonotherapier      s    x)<===rB   z/gitec                  "    t          dd          S )Nr   z	gite.htmlr   rA   rB   rC   giter      s    x555rB   z/uploads/<path:filename>c                 B    t          t          j        d         |           S )Nr#   )r   appconfigr   s    rC   uploaded_filer      s    sz/:HEEErB   z/api/auth/registerPOST)methodsc            	      *   t           j        } t          |                     d          |                     d          |                     d          |                     d          g          st	          ddi          dfS t
          j                            | d                                                   rt	          dd	i          dfS t          | d         t          | d         d
          | d         | d         |                     d                    }t          j                            |           t          j                                         t          |           t	          d|j        |j        |j        |j        |j        dd          S )NrO   rP   	firstNamelastNamer   u2   Tous les champs obligatoires doivent être remplis  rO   u   Cet email est déjà utilisépbkdf2:sha256methodrS   )rO   rP   rQ   rR   rS   Tr9   rO   r   r   isAdminsuccessrK   )r   jsonallr   r	   rE   r   r   r   r   r6   r   r   r   r   r9   rO   rQ   rR   rX   r   rK   s     rC   registerr      s   <D!!488J#7#7+9N9NPTPXPXYcPdPdeff ]!UVWWY\\\z$w-006688 H!@ABBCGG7m'Z(8QQQ$z"hhw  D JNN4Jt'Z}
 
	 	 	 	 	rB   z/api/auth/loginc            	         t           j        } t          j                            |                     d                                                    }|r)t          |j        |                     dd                    st          ddi          dfS t          |           t          d|j        |j        |j        |j        |j        d	d
          S )NrO   r   rP   r   r   zEmail ou mot de passe incorrecti  Tr   r   )r   r   rE   r   r   r   r   r   rP   r	   r   r9   rO   rQ   rR   rX   r   s     rC   loginr      s    <D:dhhw&7&788>>@@D J*4=$((:r:R:RSS J!BCDDcIIt'Z}
 
	 	 	 	 	rB   z/api/auth/logoutc                  @    t                       t          ddi          S Nr   T)r   r	   rA   rB   rC   logoutr     s    MMMIt$%%%rB   z/api/auth/mec                  (   t           j        st          ddi          S t          dt           j        t           j        t           j        t           j        t           j        t           j        t           j	        t           j
        t           j        d	d          S )NloggedInFT)	r9   rO   r   r   rS   rT   rU   
postalCoder   )r   rK   )r   r   r	   r9   rO   rQ   rR   rS   rT   rU   rV   rX   rA   rB   rC   get_current_userr     s~    ( ,
E*+++/!'%0$.!'#+ %&2#,

 

    rB   z/api/auth/profilePUTc                  p   t           j        } |                     dt          j                  t          _        |                     dt          j                  t          _        |                     dt          j                  t          _        |                     dt          j                  t          _        |                     dt          j                  t          _        |                     dt          j	                  t          _	        t          j                                         t          ddi          S )	Nr   r   rS   rT   rU   r   r   T)r   r   r   r   rQ   rR   rS   rT   rU   rV   r6   r   r   r	   r   s    rC   update_profiler   $  s     <D"hh{L4KLLL!XXj,2HIIL'<+=>>L88I|/CDDL):;;L#xxl6NOOLJIt$%%%rB   z/api/auth/passwordc                  <   t           j        } t          t          j        |                     dd                    st          ddi          dfS t          | d         d          t          _        t          j	        
                                 t          d	d
i          S )NcurrentPasswordr   r   zMot de passe actuel incorrectr   newPasswordr   r   r   T)r   r   r   r   rP   r   r	   r   r6   r   r   r   s    rC   change_passwordr   3  s     <D|4dhh?PRT6U6UVV H!@ABBCGG243F___LJIt$%%%rB   z/api/productsc                     t           j                            d          } t          j                            d          }|r|                     |          } t          j                            d          }|dk    r|                     d          } |                     t           j                                        t           j	                                                  
                                }t          d |D                       S )	NT)rm   r_   )rl   featuredtrue)rn   c                     g | ]O}|j         |j        |j        |j        |j        |j        |j        |j        |j        r|j        j        nd |j	        d
PS )N)
r9   r`   ra   rg   rh   ri   rj   rl   category_namern   )
r9   r`   ra   rg   rh   ri   rj   rl   r_   rn   .0ps     rC   
<listcomp>z get_products.<locals>.<listcomp>R  sp         d}(},-J@D}    rB   )r^   r   r   r   r   r   order_byrn   descrY   r   r	   )r   r_   r   rb   s       rC   get_productsr  D  s    M##d#33E|
++H 6H55|
++H6D11~~g16688':L:Q:Q:S:STTXXZZH        rB   z/api/products/categoriesc                  p    t           j                                        } t          d | D                       S )Nc                 8    g | ]}|j         |j        |j        d S r9   r`   ra   r	  r   cs     rC   r  z"get_categories.<locals>.<listcomp>b  )    cccST14NNcccrB   r]   r   r   r	   
categoriess    rC   get_categoriesr  _  s3    ##%%JccXbcccdddrB   z/api/products/<int:product_id>c                     t           j                            |           }t          |j        |j        |j        |j        |j        |j	        |j
        |j        |j        r|j        j        nd |j        |j        d          S N)r9   r`   ra   rg   rh   ri   rj   rl   r   rm   rn   )r^   r   
get_or_404r	   r9   r`   ra   rg   rh   ri   rj   rl   r_   rm   rn   rv   rx   s     rC   get_productr  d  s    m&&z22Gj*.*292BL)..&*    rB   z	/api/cartc                     t                      } t          j                            |                                           }g }d}d}|D ]}|j        r|                    |j        |j        |j        j        |j        j	        |j        j
        |j        j        |j        j        |j        j        d           ||j        j
        |j        z  z  }||j        z  }t          |||d          S )Nrt   r   )r9   rw   rv   r`   rg   rj   ri   rh   )r   r   count)r   rp   r   r   r   rx   appendr9   rw   r`   rg   rj   ri   rh   r	   )rt   r   
cart_itemsr   r  items         rC   get_cartr  y  s    !!JN$$
$;;??AAEJEE # #< 	#g M"lo)+++,-	 	 	 	 	 T\'$-77ET]"EZ%%HHIIIrB   z/api/cart/addc                  d   t           j        } |                     d          }|                     dd          }t          dd          dk    rt	          ddi          d	fS t
          j                            |d
                                          }|st	          ddi          dfS |j	        |k     rt	          ddi          d	fS t                      }t          j                            ||                                          }|r0|j        |z   }||j	        k    rt	          ddi          d	fS ||_        nJt          |t          j        rt          j        nd ||          }t           j                            |           t           j                                         t	          d
dd          S )N	productIdrw   rs   	shop_openr   falser   $   La boutique est actuellement ferméer   T)r9   rm   u   Produit non trouvé  Stock insuffisant)rt   rv   )rt   ru   rv   rw   u   Produit ajouté au panier)r   message)r   r   r   r   r	   r^   r   r   r   ri   r   rp   rw   r   r   r9   r6   r   r   r   )r   rv   rw   rx   rt   existingnew_qty	cart_items           rC   add_to_cartr(    s   <D+&&Jxx
A&&H ;''722!GHII3NNm%%t%DDJJLLG >!6788#==}x!4566;;!!J~'':*'UU[[]]H "#h.W]""G%89::C??#!'3'DNLOO$!	
 
 
	 	
y!!!Jt0KLLMMMrB   z/api/cart/update/<int:item_id>c                    t           j        }|                    dd          }t                      }t          j                            | |                                          }|st          ddi          dfS |dk    r t          j
                            |           n*||j        j        k    rt          ddi          d	fS ||_        t          j
                                         t          d
di          S )Nrw   rs   r9   rt   r      Article non trouvér"  r   r#  r   r   T)r   r   r   r   rp   r   r   r   r	   r6   r   deleterx   ri   rw   r   )item_idr   rw   rt   r  s        rC   update_cart_itemr.    s    <Dxx
A&&H!!J>##w:#FFLLNND >!6788#==1}}

$dl(((G%89::C?? JIt$%%%rB   z/api/cart/remove/<int:item_id>DELETEc                 J   t                      }t          j                            | |                                          }|st          ddi          dfS t          j                            |           t          j        	                                 t          ddi          S )Nr*  r   r+  r"  r   T)
r   rp   r   r   r   r	   r6   r   r,  r   )r-  rt   r  s      rC   remove_from_cartr1    s    !!J>##w:#FFLLNND >!6788#==JdJIt$%%%rB   z/api/cart/clearc                      t                      } t          j                            |                                            t
          j                                         t          ddi          S )Nr  r   T)	r   rp   r   r   r,  r6   r   r   r	   r  s    rC   
clear_cartr3    sY    !!JN
33::<<<JIt$%%%rB   z/api/orders/createc                  >   t          dd          dk    rt          ddi          dfS t          j        t	                      } g d}t          fd|D                       st          dd	i          dfS t          j                            | 
                                          }|st          ddi          dfS d}|D ]P}|j	        |j
        j        k    r"t          dd|j
        j         i          dfc S ||j
        j        |j	        z  z  }Qdt          j                                        d           dt#          j                    j        d d                                          }t+          t,          j        rt,          j        nd ||d         d         d                             d          d         d         d                             dd                              d                    }t4          j                            |           t4          j                                         |D ]w}t=          |j        |j
        j        |j
        j        |j
        j        |j	                  }t4          j                            |           |j
        xj        |j	        z  c_        xt          j                            | 
                                           t4          j                                          t          d||j        |dd           S )!Nr  r   r   r   r!  r   )r   r   rO   rT   rU   r   c              3   B   K   | ]}                     |          V  d S r   )r   )r   r   r   s     rC   	<genexpr>zcreate_order.<locals>.<genexpr>  s-      --qtxx{{------rB   u&   Informations de livraison incomplètesr  zLe panier est vider   zStock insuffisant pour zVP-z%y%m%d-   r   r   rO   rS   rT   rU   r   paymentMethodcardr   )ru   r~   r   r   r   r   r   r   r   r   r   r   )r   rv   r   r   rw   Tu   Commande créée avec succès)r   orderNumberorderIdr   r$  )!r   r	   r   r   r   r   rp   r   r   rw   rx   ri   r`   rg   r   nowstrftimer   r   hexupperrJ   r   r   r9   r   r6   r   r   flushr|   r,  r   )	rt   requiredr  r   r  r~   r}   
order_itemr   s	           @rC   create_orderrD    s"    ;''722!GHII3NN<D!!J SRRH----H----- Q!IJKKSPP ))Z)@@DDFFJ =!5677<< E 4 4=4<---G%Rt|?P%R%RSTTVYYYYY#dm33 \00::[[TZ\\=Mbqb=Q=W=W=Y=Y[[L #/#@Jd! -
+G}xx((i6l!,/xx88hhw  E JNN5J  	, 	,X|*,,]
 
 

 	
z"""dm+ N
33::<<<J#82    rB   z/api/orders/my-ordersc                  
   t           j                            t          j                                      t           j                                                                                  } t          d | D                       S )Nr   c                 t    g | ]5}|j         |j        |j        |j        |j                                        d 6S ))r9   r~   r   r   rY   )r9   r~   r   r   rY   	isoformatr   os     rC   r  z!get_my_orders.<locals>.<listcomp>0  sV         d(l,,..    rB   )
rJ   r   r   r   r9   r  rY   r  r   r	   r[   s    rC   get_my_ordersrK  ,  sw     [""<?";;DDUEUEZEZE\E\]]aaccF        rB   z/api/orders/<order_number>c                    t           j                            |                                           }t          j        r4t          j        s(|j        t          j        k    rt          ddi          dfS t          |j        |j
        |j        |j        |j        |j        |j        |j                                        d |j        D             d	          S )N)r~   r   r   r   c                 8    g | ]}|j         |j        |j        d S r   r   rw   rO  r   is     rC   r  zget_order.<locals>.<listcomp>J  @            N_

 
      rB   )	r9   r~   r   r   r   r   r   rY   r   )rJ   r   r   first_or_404r   r   rX   ru   r9   r	   r~   r   r   r   r   r   rY   rG  r   )r~   r}   s     rC   	get_orderrT  8  s    K!!|!<<IIKKE $ =$ 	=,/)I)IG%5677<<h*,$8#6.&0022    ;	         rB   z/api/settingsc                  p    t           j                                        } t          d | D                       S )Nc                 (    i | ]}|j         |j        S rA   r   r   ss     rC   
<dictcomp>z$get_all_settings.<locals>.<dictcomp>X  s    555qAE17555rB   r)   r   r   r	   settingss    rC   get_all_settingsr]  U  s2    }  ""H55H555666rB   z/api/settings/<key>c                 l    t          |           }|t          ddi          dfS t          d|i          S )Nr   u   Paramètre non trouvér"  r=   )r   r	   r   s     rC   get_setting_valuer_  Z  s@    E}!9:;;S@@GU#$$$rB   z/api/admin/statsc            
         t           j                                        } t          j                            t          j                            t           j                                                t           j	        dk              
                                pd}t          j                            d                                          }t          j                                        }t           j                            d                                          }t          j                            t          j        dk     t          j        dk                                              }t           j                            t           j                                                                      d	                                          }t+          | |||||d
 |D             d          S )N	cancelledr   FrX   rz   )r   rI   T   c           	          g | ];}|j         |j        |j        |j                                        |j        |j        d <S ))r~   r   r   rY   r   r   )r~   r   r   rY   rG  r   r   rH  s     rC   r  zadmin_stats.<locals>.<listcomp>y  s]     " " "  NWh,0022#$#8"#"6
 
 " " "rB   )totalOrderstotalRevenuetotalCustomerstotalProductspendingOrderslowStockrecentOrders)rJ   r   r  r6   r   funcsumr   filterr   scalarrE   r   r^   ri   rm   r  rY   r  limitr   r	   )total_orderstotal_revenuetotal_customerstotal_productspending_orders	low_stockrecent_orderss          rC   admin_statsrx  e  s{    ;$$&&LJ$$RW[[%=%=>>EEelVaFabbiikkpopMj**E*::@@BBO]((**N[**)*<<BBDDN$$W]R%79Jd9RSSYY[[IK(()9)>)>)@)@AAGGJJNNPPM#%)''" " !" " "    rB   z/api/admin/productsc                      t           j                            t           j                                                                                  } t          d | D                       S )Nc                     g | ]U}|j         |j        |j        |j        |j        |j        |j        |j        |j        r|j        j        nd |j	        |j
        dVS r  )r9   r`   ra   rg   rh   ri   rj   rl   r_   rm   rn   r   s     rC   r  z"admin_products.<locals>.<listcomp>  su         d}(},-J@D[}    rB   )r^   r   r  rY   r  r   r	   )rb   s    rC   admin_productsr{    sd     }%%g&8&=&=&?&?@@DDFFH        rB   c                  t   t           j                            d          } t           j                            d          }t          t           j                            dd                    }t           j                            d          }t	          t           j                            dd                    }t           j                            d          pd }t           j                            d          d	k    }t           j                            d
          d	k    }d }dt           j        v rt           j        d         }	|	rt          |	j                  rwt          t          j
                    j         d|	j                   }
|	                    t          j                            t           j        d         |
                     d|
 }t%          | ||||||||	  	        }t&          j                            |           t&          j                                         t/          d|j        d          S )Nr`   ra   rg   r   rh   ri   
categoryIdisActiver   
isFeaturedrj   _r#   	/uploads/)	r`   ra   rg   rh   ri   rl   rm   rn   rj   Tr   r9   )r   formr   floatr   filesr   r   r   r   r   r?  saveospathjoinr   r   r^   r6   r   r   r   r	   r9   )r`   ra   rg   rh   ri   rl   rm   rn   rj   filer   rx   s               rC   create_productr    s    <F##D,""=11K',""7A..//E\h''F  !,,--E,""<008DK  ,,6I,""<00F:KE'-}W% 	+L// 	+&$*,,*:'L'LT]'L'LMMHIIbgll3:o#>IIJJJ***E
 
 
G JNN7Jt7:66777rB   z$/api/admin/products/<int:product_id>c                    t           j                            |           }t          j                            d|j                  |_        t          j                            d|j                  |_        t          t          j                            d|j	                            |_	        t          j                            d|j
                  |_
        t          t          j                            d|j                            |_        t          j                            d          p|j        |_        t          j                            d          dk    |_        t          j                            d	          dk    |_        d
t          j        v rt          j        d
         }|rt#          |j                  r|t'          t)          j                    j         d|j                   }|                    t0          j                            t6          j        d         |                     d| |_        t<          j                                          tC          ddi          S )Nr`   ra   rg   rh   ri   r}  r~  r   r  rj   r  r#   r  r   T)"r^   r   r  r   r  r   r`   ra   r  rg   rh   r   ri   rl   rm   rn   r  r   r   r   r   r   r?  r  r  r  r  r   r   rj   r6   r   r   r	   )rv   rx   r  r   s       rC   update_productr    s    m&&z22G<##FGL99GL!,**=':MNNG',**7GMBBCCGM\%%h??GN(('-@@AAGM!,**<88OG<OG((44>G!,**<88FBG'-}W% 	3L// 	3&$*,,*:'L'LT]'L'LMMHIIbgll3:o#>IIJJJ222GMJIt$%%%rB   c                     t           j                            |           }t          j                            |           t          j                                         t          ddi          S r   )r^   r   r  r6   r   r,  r   r	   r  s     rC   delete_productr    sV     m&&z22GJgJIt$%%%rB   z/api/admin/ordersc                      t           j                            t           j                                                                                  } t          d | D                       S )Nc                     g | ][}|j         |j        |j        r|j        j        nd |j        |j        |j        |j        |j        |j	        
                                d	\S )N)	r9   r~   
user_emailr   r   r   r   r   rY   )r9   r~   rK   rO   r   r   r   r   r   rY   rG  rH  s     rC   r  z admin_orders.<locals>.<listcomp>  sz     
 
 
  d&'f6afll$( 42*l,,..
 
 
 
 
rB   )rJ   r   r  rY   r  r   r	   rJ  s    rC   admin_ordersr    sd     [!!%"2"7"7"9"9::>>@@F 
 
 
 
 
 
 
 
rB   z /api/admin/orders/<int:order_id>c                 @   t           j                            |           }t          |j        |j        |j        |j        |j        |j	        |j
        |j        |j        |j        |j        |j        |j                                        d |j        D             d          S )Nc                 8    g | ]}|j         |j        |j        d S rN  rO  rP  s     rC   r  z&admin_order_detail.<locals>.<listcomp>  rR  rB   )r9   r~   r   r   r   r   r   r   r   r   r   r   rY   r   )rJ   r   r  r	   r9   r~   r   r   r   r   r   r   r   r   r   r   rY   rG  r   )r   r}   s     rC   admin_order_detailr    s     K""8,,Eh*,$8#6..!2, % :&0022    ;	         rB   z'/api/admin/orders/<int:order_id>/statusc                 ,   t           j                            |           }t          j        }g d}|                    d          |vrt          ddi          dfS |d         |_        t          j	        
                                 t          ddi          S )N)rz   	confirmed
processingshipped	deliveredra  r   r   zStatut invalider   r   T)rJ   r   r  r   r   r   r	   r   r6   r   r   )r   r}   r   valid_statusess       rC   update_order_statusr    s     K""8,,E<D```Nxx//!2344c99>ELJIt$%%%rB   z/api/admin/customersc                     t           j                            d                              t           j                                                                                  } g }| D ]}t          j                            |j                  	                                }t          j                            t          j                            t          j                                                |j                                                  pd}|                    |j        |j        |j        |j        |j        |j        |j                                        ||d	           t/          |          S )NFrb  r   r   )	r9   rO   rQ   rR   rS   rU   rY   order_counttotal_spent)rE   r   r   r  rY   r  r   rJ   r9   r  r6   r   rl  rm  r   ro  r  rO   rQ   rR   rS   rU   rG  r	   )	customersresultr  r  r  s        rC   admin_customersr    s2    
$$e$44==do>R>R>T>TUUYY[[IF  k++AD+99??AAj&&rw{{5;'?'?@@JJSTSWJXX__aafef$W,WF,0022&&

 

 
	 
	 
	 
	 6??rB   z/api/admin/categoriesc                  p    t           j                                        } t          d | D                       S )Nc                 8    g | ]}|j         |j        |j        d S r  r	  r
  s     rC   r  z$admin_categories.<locals>.<listcomp>4  r  rB   r  r  s    rC   admin_categoriesr  /  s5     ##%%JccXbcccdddrB   c                  0   t           j        } t          |                     d          |                     d                    }t          j                            |           t          j                                         t          d|j	        d          S )Nr`   ra   r`   ra   Tr  )
r   r   r]   r   r6   r   r   r   r	   r9   )r   r_   s     rC   create_categoryr  6  su     <DTXXf--488M;R;RSSSHJNN8Jt8;77888rB   z'/api/admin/categories/<int:category_id>c                     t           j                            |           }t          j                            |           t          j                                         t          ddi          S r   )r]   r   r  r6   r   r,  r   r	   )rl   r_   s     rC   delete_categoryr  @  sV     ~((55HJhJIt$%%%rB   z/api/admin/settingsc                  p    t           j                                        } t          d | D                       S )Nc                 ,    g | ]}|j         |j        d S )r   r   rW  s     rC   r  z"admin_settings.<locals>.<listcomp>N  s$    GGGAEAG44GGGrB   rZ  r[  s    rC   admin_settingsr  I  s4     }  ""HGGhGGGHHHrB   z/api/admin/settings/<key>c                     t           j        }t          | |                    dd                     t	          ddi          S )Nr=   r   r   T)r   r   r   r   r	   )r;   r   s     rC   update_settingr  P  s<     <DTXXgr**+++It$%%%rB   c                     ddddd} |                                  D ]e\  }}t          j                            |                                          s.t
          j                            t          ||                     ft          j                            d	                                          sQt          d
t          dd          ddd          }t
          j                            |           t          d           t          j                                        dk    r*t          dd          t          dd          t          dd          g}t
          j                            |           t
          j                                         t          dddddddd !          t          d"d#d$dd%ddd&!          t          d'd(d)dd*ddd+!          t          d,d-d.dd/dd0d1!          t          d2d3d4d5d6d7dd8!          t          d9d:d;d<d=d>d0d?!          t          d@dAdBdCdDd>d0dE!          g}t
          j                            |           t
          j                                         t          dF           dGS )Hu=   Initialise la base de données avec les données par défaut.r   uY   Notre miellerie est actuellement fermée pour la saison. Revenez nous voir au printemps !zLes Vertes PrairieszMiel artisanal de nos ruches)r  shop_closed_message	shop_nameshop_tagliner   r   Trb  zadmin@vertesprairies.fradmin123r   r   Admin	Miellerie)rO   rP   rQ   rR   rX   u<   👤 Compte admin créé: admin@vertesprairies.fr / admin123r   Mielsu#   Nos différentes variétés de mielr  Coffretsz Coffrets cadeaux et assortimentszProduits de la rucheu)   Pollen, propolis, cire et autres trésorszMiel de Fleurs Sauvagesu   Un miel doux et parfumé, récolté dans les prairies fleuries de notre région. Notes florales délicates avec une texture crémeuse.g      )@500gre   rs   z/images/miel-fleurs.jpg)r`   ra   rg   rh   ri   rl   rn   rj   zMiel d'Acaciaut   Miel très clair et liquide, au goût délicat et subtil. Idéal pour sucrer vos boissons sans en altérer le goût.g      ,@#   z/images/miel-acacia.jpgzMiel de Tilleulu   Miel ambré aux notes mentholées caractéristiques. Reconnu pour ses propriétés apaisantes, parfait pour les tisanes du soir.g      +@(   z/images/miel-tilleul.jpgu   Miel de Châtaignierui   Miel corsé et puissant, légèrement amer. Un caractère affirmé pour les amateurs de saveurs intenses.g      .@   Fz/images/miel-chataignier.jpgu   Coffret Découverteu_   Assortiment de 4 petits pots (125g chacun) pour découvrir nos différentes variétés de miel.g      <@4x125grH      z/images/coffret-decouverte.jpgzPollen Fraisu~   Pollen récolté avec soin, séché naturellement. Riche en protéines et vitamines, à saupoudrer sur vos salades ou yaourts.g      2@250g      z/images/pollen.jpgzPropolis Pureue   Propolis brute récoltée dans nos ruches. Connue pour ses propriétés antibactériennes naturelles.g      6@30g   z/images/propolis.jpgu&   🗄️  Base de données initialiséeN)r   r)   r   r   r   r6   r   r   rE   r   printr]   r  add_allrA  r^   r   )defaultsr;   r=   r   r  rb   s         rC   init_dbr  \  s   
 z*6	 H nn&& : :
U}&&3&//5577 	:JNN7s%888999 :..4466 	N++JOOO!
 
 
 	
uLMMM ~""'/TUUU*2TUUU0>ijjj


 	
:&&&

 . eF"!QU]v  
 $ SF"!QU]v  
 & _F"!QU]w  
 + HF"!QV^|  
 *}HBASW_  
 # ]F"!QV^r  
 $ DEPU]s  ?$
J 	
8$$$J	
233333rB   __main__PORTi#  DEBUGr   r   u@   🍯 Serveur Les Vertes Prairies démarré sur http://localhost:z0.0.0.0)hostportdebugr   )s__doc__r  r   secretsr   	functoolsr   flaskr   r   r   r	   r
   r   r   r   flask_sqlalchemyr   flask_loginr   r   r   r   r   r   werkzeug.securityr   r   werkzeug.utilsr   dotenvr   r3   r   getenv	token_hexr   r  abspathdirname__file__basedirr  db_pathmakedirsr6   login_manager
login_viewModelr)   rE   r]   r^   rp   rJ   r|   user_loaderr   r   r   r   r   r   router   r   r   r   r'   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r(  r.  r1  r3  rD  rK  rT  r]  r_  rx  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  app_context
create_allr   r  r   r  r  runrA   rB   rC   <module>r     s   
 
			               k k k k k k k k k k k k k k k k k k k k ' ' ' ' ' ' f f f f f f f f f f f f f f f f I I I I I I I I * * * * * *        eHHbAAA$29\3D73DR3H3HII
<  '//"'//(33
4
4
',,w	
2
2(1	.BXwBXBX(Y(Y
$ %/4
+ , gll7IBIoy4Y4YZZ
? #3
   BGLL&))D 9 9 9 9 CJ'$ 7 7 7 7 Z__S!!# A A A A Abh A A AA A A A A9bh A A AI I I I Irx I I IA A A A Abh A A A) ) ) ) )rx ) ) )E E E E EBH E E E(5 5 5 5 5 5 5 5 ( ( (# # #1 1 1 1    k k k 37 7 7 ;: : : 98 8 8 ;: : : 98 8 8 87 7 7 ?> > > 76 6 6 %&&F F '&F &22  32@ vh//  0/* x00& & 10& >  & 00& &  10& %11	& 	&  21	& ?  4 %&&e e '&e +,,  -,( ;J J J2 ?VH--#N #N .-#NJ +eW==& & >=&& +hZ@@	& 	& A@	& xj11& & 21& &22E E 32EN "##   $# '((  )(8 ?7 7 7  !!% % "!%     6  !!    "!   6(33 8  8   43 8D 1E7CC& &   DC&, 1H:FF& &   GF&       -..    /.. 4ugFF
& 
&   GF
& !""    #"* "##e e   $#e "VH559 9   659 4xjII& &   JI&  !!I I   "!I &88& &   98&N4 N4 N4h z			  
			               3yry&&''DBIgw''--//69E	E
ST
S
STTTGGUG33333 s   b22b69b6