
    M7h                     <   d dl mZ d dl mZmZ d dlmZ d dlmZmZ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 d d	l mZ d dlmZ dd
lmZmZmZ d dlmZmZmZ d dlm Z  d dl!Z!d dl"Z"d dl#m$Z$ d dlm%Z% d dl&Z&d dl"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l0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z: d dl;m<Z<m=Z= d dl>Z>	 d Z?d7dZ@d7dZAd ZBd ZCd ZDd  ZEd! ZFd" ZGed#        ZHd$ ZIed%        ZJed&        ZKd' ZLd( ZM ed)*      d+        ZNed,        ZOed-        ZPed.        ZQed/        ZRed0        ZS ed)*      d1        ZT ed)*      d2        ZU ed)*      d3        ZV ed)*      d4        ZU ed)*      d5        ZV ed)*      d6        ZWy)8    render)r   redirect)authenticate)HttpResponseFileResponseJsonResponse   )formConnexion
formSignupFileUploadFormFileEditFormPasswordResetFormSetPasswordFormUserEditFormNoteForm)login_required)r   HttpResponseForbiddenHttp404)get_object_or_404)ProtectedFileUserFileUserNote)TimestampSignerBadSignatureSignatureExpired)reverseN)User)get_user_model)settings)	Paginator)messagesPath)	send_mail)render_to_string)
strip_tags)default_token_generator)urlsafe_base64_encodeurlsafe_base64_decode)force_bytes	force_strc                 .    t        d       t        d      S )N
Connectionindex)printr   )requestpages     '/var/www/html/djangosite/dsite/views.pylog_connectionr4   :   s    	,G    c           	         t         j                  j                  t         j                  j                  t         j                  j                  t                          }t         j                  j                  |d      }t         j                  j                  |      st        j                  |       ddl}ddl	}ddl
m} g }t        j                  |      D ]W  }t         j                  j                  t         j                  j                  ||            sA|dk7  sG|j                  |       Y i }| ru| j                  rh	 t!        t"        j$                  j'                  |       j)                  dd	            }	t!        t"        j$                  j'                  d      j)                  dd	            }
| j*                  rKt!        t"        j$                  j-                  |       j-                  d      j)                  dd	            }ng }t/        |	      t/        |
      z  t/        |      z  }|D cg c]	  }||vs| }}|rIt"        j$                  j1                  |D cg c]  }t#        |d
       c}       |
j3                  |       |	|
d}| j*                  r||d<   |S d|i}|S c c}w c c}w # t4        $ rC}ddl}t9        dt;        |              t9        |j=                                d|i}Y d}~|S d}~ww xY w)u   
    Retourne les fichiers disponibles, triés par propriétaire
    Cette fonction a été optimisée pour réduire le temps de chargement
    uploadsr   Nr#   
files.jsonuserfilenameTflat)r;   r:   )
user_filesno_owner_filesother_user_fileszErreur dans get_files: r?   	all_files)ospathdirnameabspath__file__joinexistsmakedirsunicodedatarepathlibr$   listdirisfileappendis_authenticatedlistr   objectsfiltervalues_listis_staffexcludesetbulk_createextend	Exception	tracebackr0   str
format_exc)r:   BASE_DIRuploads_dirrJ   rK   r$   rA   fresultr>   r?   r@   model_filesunknown_fileser[   s                   r3   	get_filesre   >   s   
 wwrwwrwwx/HIJH'',,x3K 77>>+&
K   IZZ$  77>>"'',,{A67A<MQ 
 F%%(	3 h..5545@LLZ^bLcdJ!("2"2"9"9t"9"D"P"PQ[bf"P"ghN }}#'(8(8(@(@d(@(K(S(SY](S(^(j(jku  }A(j  )B  $C #%  j/C,??#FVBWWK(1J1Qk5IQJMJ   ,,*. ad3.  %%m4 )"0F }}-=)* M y)M= K.   	3+CF845)&&()&	2F
 M	3s=   C4J; 8	J1J1!J; 'J6;.J; 1
J; ;	L8LLc           	         t         j                  j                  t         j                  j                  t         j                  j                  t                          }t         j                  j                  |d      }t         j                  j                  |      sat        j                  |       	 ddl}t        j                  ||j                  |j                  z  |j                  z  |j                  z         g }	 t        j"                  |      D cg c]H  }t         j                  j%                  t         j                  j                  ||            sA|dk7  sG|J }}|D ]  }t         j                  j                  ||      }t        j&                  |t         j(                        rH	 ddl}t        j                  ||j*                  |j,                  z  |j.                  z  |j0                  z  |j                  z         t        d|         	 | r| j2                  rg |g d	S d
|iS # t        $ r"}t        dt!        |              Y d}~[d}~ww xY wc c}w # t        $ r"}t        dt!        |              Y d}~#d}~ww xY w# t        $ r!}t        dt!        |              Y d}~d}~ww xY w)u   
    Version de secours de get_files qui ne dépend pas de la base de données
    À utiliser si la table UserFile n'existe pas encore
    r7   r   Nu:   Erreur lors de la définition des permissions du dossier: r8   #   Permissions du fichier corrigées: (Impossible de modifier les permissions: z.Erreur lors de la lecture du dossier uploads: )r>   r?   r@   rA   )rB   rC   rD   rE   rF   rG   rH   rI   statchmodS_IRWXUS_IRWXGS_IROTHS_IXOTHrZ   r0   r\   rM   rN   accessR_OKS_IRUSRS_IWUSRS_IRGRPS_IWGRPrP   )r:   r^   r_   ri   rd   rA   r`   	file_paths           r3   get_files_fallbackrv      s"   
 wwrwwrwwx/HIJH'',,x3K 77>>+&
K 	YHH[$,,"="Lt||"[\
 II "

; 7~1277>>"'',,WbdeJf;glmq}l}Q~	~  	OA[!4I99Y0OHHYt||(Cdll(RUYUaUa(adhdpdp(pq?	{KL	O %% ISUVVY''3  	YNsSTvhWXX	Y  ! ODSVHMNNO I>s1vhGHHIs|   3AH3 J AI!I!!I!%AJ 2A&I&J 3	I<II!J &	J/JJ JJ 	J>J99J>c                     | j                         }|dk(  rt        | d      S |dk(  r7| j                  j                  rt	        d      S t        d       t	        d      S t        | d      S )Nzbenigne.devz
index.htmlzperso.benigne.devfileszNot authenticated/login/)get_hostr   r:   rP   r   r0   )r1   hosts     r3   r/   r/      sg    D}g|,,	$	$<<((G$$%&I&&'<((r5   c                    | j                   j                  rt        d      S | j                  j	                  dd      }d}|rd|v rd}nd|v rd}n	d|v rd	}nd
}t               }| j                  dk(  r>t        | j                        }|j                         r|j                  j	                  d      }|dk(  r|j                  dd       n|j                  j	                  d      }t        | ||      }|t        j                  j                  j                  | |       d| j                  j	                  dd      v r;	 t!        t"        j$                  j'                  |      j)                  dd            }t        | j                  j	                  dd            S |j                  dd       |d||d}t+        | d|      S #  Y OxY w)uw   
    Fonction de connexion des utilisateurs
    Cette fonction a été optimisée pour améliorer les performances
    /next zfiles/u6   Veuillez vous connecter pour accéder à vos fichiers.zvideo/u2   Veuillez vous connecter pour accéder aux vidéos.znotes/u3   Veuillez vous connecter pour accéder à vos notes.u4   Veuillez vous connecter pour accéder à cette page.POSTusernameguestNz&Nom d'utilisateur ou mot de passe fauxpasswordr   r   r9   r;   Tr<   login)formcurrent_formredirect_messagenext_urlauthentication.html)r:   rP   r   GETgetr   methodr   is_validcleaned_data	add_errorr   djangocontribauthr   rQ   r   rR   rS   rT   r   )	r1   r   r   r   r   r   r:   r>   contexts	            r3   r   r      s    ||$$} {{vr*H xW!S!TU ?D ~~W\\*==?((,,Z8H 7"t%MN,,00< $GhR#NN''--gt<  7;;??62#>>! *.h.>.>.E.E4.E.P.\.\]gnr.\.s)tJ $GKKOOFC$@AA NN:/WX ,	G '0'::! s    :G G	c                 j    t         j                  j                  j                  |        t	        d      S )Nr/   )r   r   r   logoutr   )r1   s    r3   r   r     s%    
NNw'Gr5   c                 *   | j                   dk(  r't        | j                        }|j                         r|j                  j                  d      }t        j                  j                  |      j                         r"|j                  dd       t        | d|dd      S 	 |j                         }d}	 t        d	d
|j                  i      }t        |      }t         j"                  }|j$                  }t'        ||||g|d       t)        d|        t;        d      S t)        d|j<                          n
t               }t        | d|dd      S # t*        $ rx}	t)        dt-        |	              t)        dt/        |	      j0                          dd l}
t)        d|
j5                                 t7        j8                  | d       Y d }	~	d }	~	ww xY w# t*        $ r3}	t)        dt-        |	              |j                  d d       Y d }	~	d }	~	ww xY w)Nr   emailr   uH   Cette adresse email est déjà utilisée. Veuillez en choisir une autre.r   registerr   r   zBienvenue sur benigne.dev !zemails/welcome_email.htmlr   Fhtml_messagefail_silentlyu   Email de bienvenue envoyé à z#Erreur lors de l'envoi de l'email: zType d'erreur: r   zTraceback: u   Votre compte a été créé mais nous n'avons pas pu vous envoyer l'email de bienvenue. Vous pouvez quand même vous connecter.r   u(   Erreur lors de la création du compte : uN   Une erreur s'est produite lors de la création du compte. Veuillez réessayer.zErreurs de formulaire: )r   r   r   r   r   r   r   rR   rS   rH   r   r   saver&   r   r'   r    DEFAULT_FROM_EMAILr   r%   r0   rZ   r\   type__name__r[   r]   r"   warningr   errors)r1   r   r   r:   subjectr   plain_message
from_emailto_emailrd   r[   s              r3   r   r   
  s   ~~',,'==?%%))'2E||"""/668w(rsg'<t]g>hii$wyy{ 8q#34O"DMMR $L %/|$<M!)!<!<J#zzH%"!
%1&+ :8*EF  (( +DKK=9:| '04Q[2\]]+ ! q?AxHIODG,<,<+=>?$K	(<(<(>'?@A$$W  /p  q  qq  w@QIJt%uvvwsD   "G 5AE 
G 	GA.G	G GG 	H)HHc                    | j                   dk(  rt        | j                        }|j                         r|j                  d   }	 t
        j                  j                  |      }t        j                  |      }t        t        |j                              }d| d| d}d}t        d|j                  |d      }t        |      }	t         j"                  }
	 t%        ||	|
|g|d	
       t'        d|        t)        | d|ddd      S t               }t)        | d|dd      S # t*        $ r3}t'        dt-        |              |j/                  d d       Y d }~nd }~ww xY wP# t
        j0                  $ r |j/                  dd       Y wt*        $ r3}t'        dt-        |              |j/                  d d       Y d }~d }~ww xY w)Nr   r   r   z+https://benigne.dev/reset_password_confirm/r}   u7   Réinitialisation de votre mot de passe sur benigne.devz emails/password_reset_email.html)r   	reset_urlFr   u&   Email de réinitialisation envoyé à r   uU   Un email avec les instructions de réinitialisation a été envoyé à votre adresse.reset)r   success_messager   z$Erreur lors de l'envoi de l'email : uA   Erreur lors de l'envoi de l'email. Veuillez réessayer plus tard.u4   Aucun compte n'est associé à cette adresse e-mail.uA   Erreur inattendue lors de la réinitialisation du mot de passe : uD   Une erreur inattendue s'est produite. Veuillez réessayer plus tard.r   )r   r   r   r   r   r   rR   r   r(   
make_tokenr)   r+   pkr&   r   r'   r    r   r%   r0   r   rZ   r\   r   DoesNotExist)r1   r   r   r:   tokenuidr   r   r   r   r   rd   s               r3   reset_passwordr   D  s   ~~ .==?%%g.E*m||''e'4 0::4@+K,@A J#aPUwVWX	 T/0R $!*U   !+< 8%88
n%"%1&+ B5'JK!'+@ $ ,C(/C   !"'04QX2YZZ ! n@QIJNN4)lmmnm$$ `w(^_ mYZ]^_Z`Yabct%kllmsC   BE# 0D# #	E,)EE# EE# #%G
G)G  Gc                 `   	 t        t        |            }t        j                  j	                  |      }t        j                  ||      st        | dddi      S | j                  dk(  rtt        | j                        }|j                         rY|j                  |j                  d          |j                          t        j                   | d       t#        d      S t               }t        | d|d	d
      S # t$        t&        t(        t        j*                  f$ r t        | dddi      cY S w xY w)N)r   z(registration/password_reset_confirm.html	validlinkFr   new_password1uX   Votre mot de passe a été modifié avec succès. Vous pouvez maintenant vous connecter.r   T)r   r   )r,   r*   r   rR   r   r(   check_tokenr   r   r   r   r   set_passwordr   r   r"   successr   	TypeError
ValueErrorOverflowErrorr   )r1   uidb64r   r   r:   r   s         r3   reset_password_confirmr   z  s+    -f56||3' '224?'#MUP   >>V#"7<<0D}}!!$"3"3O"DE		     +E  F(("$DgIL
  	
 z=$2C2CD gIL
  	s   AC8 BC8 C8 82D-,D-c           	         | j                   j                  dk(  }d|i}t               }	 t        | j                         }| j                  dk(  r|st        | j                  | j                        }|j                         r| j                  j                  d      D ]c  }| j                  j                  dd	      }t!        |       }	t"        j$                  j'                  t"        j$                  j'                  t"        j$                  j)                  t*                          }
t"        j$                  j-                  |
d
      }ddl}ddl}ddlm} |j6                  }t"        j$                  j9                  |      \  }}|j;                  d|      }dj-                  |D cg c]  }|j=                  |      r| c}      } |j>                  dd|      }||z   }|} ||      }||z  }	 tA        t"        j$                  j-                  ||      d      5 }|jC                         D ]  }|jE                  |        	 ddd       t#        jF                  t"        j$                  j-                  ||      d       t"        j$                  jI                  t"        j$                  j-                  ||            }|d	k(  r| j                   nd}tJ        jL                  jO                  ||||	|      }t        d| d| d       f t        | j                         }tQ        d      S |jS                  ||d       tU        | d|      S # t        $ rT}ddl}t        dt        |              t        |j                                t        | j                         }Y d}~_d}~ww xY wc c}w # 1 sw Y   mxY w# t        $ r?}ddl}t        dt        |              t        |j                                Y d}~]d}~ww xY w)u   
    Vue pour afficher et uploader des fichiers
    Cette fonction a été optimisée pour améliorer les performances de chargement
    r   is_guestr   N/   Erreur lors de la récupération des fichiers: r   filefile_visibilityprivater7   r#   NFKDr   z[^a-zA-Z0-9_\-\.]_wbi  )r;   display_namer:   
ip_address	file_sizeu   Fichier uploadé avec succès: u    (stocké comme )zErreur lors de l'upload: rx   )r   
files_dataz
files.html)+r:   r   r   re   rZ   r[   r0   r\   r]   rv   r   r   FILESr   getlistr   get_client_iprB   rC   rD   rE   rF   rG   rJ   rK   rL   r$   namesplitext	normalize	combiningsubopenchunkswriterj   getsizer   rR   creater   updater   )r1   r   r   r   r   rd   r[   uploaded_filer   r   r^   r_   rJ   rK   r$   original_filename	file_namefile_ext
normalizedc
ascii_name	safe_namesafe_filenamedisplay_filenameuploads_pathru   destinationchunkr   r:   file_objs                                  r3   rx   rx     sc    ||$$/H 8$G D6w||,
 ~~gllGMM:==?!(!6!6v!> 82"),,"2"23Di"P*73
77??277??277??8;T+UV ggll8Y? #( %2$6$6!&(gg&6&67H&I#	8 )2269E
WW%\A;CXCXYZC[a%\]
"BFF#7jI	 !*H 4#4   $K0(=8	2bggll;FM 5Q\%2%9%9%; 5E'--e455 HHRWW\\+}EuM "[-0X YI+:i+G7<<TD  (//66!.%5!#-"+  7  H ;<L;MM]^k]llmnog82t #7<<0JG$$ NN  
 '<11]  6?AxHIi""$%'5
	6< &]5 5& ! 2$5c!fX>?)..0112sU   M "N%
9N%
-*N7'N*?CN7	N"A	NN"*N4	/N77	O? 4O::O?c                     | j                   j                  d      }|r$|j                  d      d   j                         }|S | j                   j                  d      }|S )zA
    Fonction utilitaire pour obtenir l'adresse IP du client
    HTTP_X_FORWARDED_FOR,r   REMOTE_ADDR)METAr   splitstrip)r1   x_forwarded_forips      r3   r   r     s\     ll&&'=>O""3'*002 I \\m,Ir5   c           
         | j                   j                  st        d      S | j                  j	                  dd      }| j                  j	                  dd      }g d}||vrd}t
        j                  j                         j                  |      }|D ]b  }|j                  	 |j                         }|j                         r2|j                         j                  |_	        |j                  dg	       d | j                  j	                  dd      }|r|j'                  |      }t)        |d      }		 |	j+                  |      }
|
|||
|	j,                  dkD  rdnd|	d}t/        | d|      S # t        $ r/}t!        d
|j"                   dt%        |              Y d}~d}~ww xY w#  |	j+                  d      }
Y wxY w)zV
    Vue d'administration des fichiers, accessible uniquement aux administrateurs
    I   Vous n'avez pas les permissions nécessaires pour accéder à cette page.r2   r
   sort-upload_date)
r;   z	-filenameupload_dater   r   z
-file_sizeuser__usernamez-user__usernamer   z-ip_addressNr   )update_fieldsu7   Erreur lors de la mise à jour de la taille du fichier : searchr   )filename__icontainsd   TF)rx   current_sortsearch_querypage_objis_paginated	paginatorzfiles/file_admin.html)r:   rU   r   r   r   r   rR   allorder_byr   get_file_pathrH   ri   st_sizer   rZ   r0   r;   r\   rS   r!   r2   	num_pagesr   )r1   r2   sort_byvalid_sort_fieldsrA   r   ru   rd   r   r   
files_pager   s               r3   
file_adminr	  
  s    <<  $%pqq ;;??61%Dkkoofn5Gh ''    $$&//8I  k>>!k ..0	##%%.^^%5%=%=DNII[MI:k ;;??8R0L$$$F	 )S)I'^^D)
 $ ) 3 3a 7UG '2G<<5  kOPTP]P]^`adefag`hijjk'^^A&
s%   $AE-5F( -	F%6$F  F%(F=c           
      d   | j                   j                  st        d      S ddl}|j	                  d|      }	 t
        j                  j                  |      }|j                         s%t        j                  | d| d       t        d      S |j                         j                         }|j                         r	 |j                          |j%                         }|j'                          |d
kD  rt        j(                  | d| d| d       nt        j(                  | d| d       t        d      S # t        $ r,}t        j                   | d	t#        |              Y d}~d}~ww xY w# t        $ r9}t        j                  | d| dt#        |              Y d}~t        d      S d}~ww xY w)zU
    Vue pour supprimer un fichier
    Accessible uniquement aux administrateurs
    I   Vous n'avez pas les permissions nécessaires pour effectuer cette action.r   NNFCr;   Le fichier u'    n'existe pas dans la base de données.r	  z-Impossible de supprimer le fichier physique: r
   u!    a été supprimé avec succès (u"    entrées dupliquées nettoyées).u     a été supprimé avec succès.z)Erreur lors de la suppression du fichier r   )r:   rU   r   rJ   r   r   rR   rS   rH   r"   errorr   firstr  unlinkrZ   r   r\   countdeleter   )r1   r;   rJ   r   	file_objsru   rd   
file_counts           r3   delete_filer  E  s    <<  $%pqq ))%:Mg$$++]+C	!NN7k-@g$hiL)) OO%335	d  "
 __&
 	 >WM?Bcdnco  pR  'S  TWM?Bb&cd L!!)  d  ,YZ]^_Z`Ya*bccd  gw"KM?Z\]`ab]c\d eff L!!gsI   AE- .E- =D5 AE- 5	E*>"E% E- %E**E- -	F/6%F**F/c                 l   t         j                  j                  d      }|j                  d       |j	                          | j
                  j                  sSt        | dd      }t        j                  j                  j                  | |       | j                  j                  d       t        d      S )Nr   )r   votre_mot_de_passe_complexer   r   r}   )r   rR   r   r   r   r:   rP   r   r   r   r   r   session
set_expiryr   )r1   ur:   s      r3   r   r   w  s    '*ANN01FFH<<((Gg@]^!!'40""1%C=r5   c                     t        | dd      S )Nz404.htmli  )statusr   )r1   	exceptions     r3   
custom_404r    s    ':c22r5   ry   )	login_urlc                    	 t         j                  j                  |      j                         }|s.t         j                  j                  |      j                         }|st	        d      |j
                  }|j                  r:|j                  | j                  k7  r!| j                  j                  st        d      S t        j                  j                  t        j                  j                  t        j                  j                  t                          }t        j                  j                  |d|      }t        j                  j                  |      rt        j                  j!                  |      st	        d      t        j"                  |t        j$                        sg	 ddl}t        j(                  ||j*                  |j,                  z  |j.                  z  |j0                  z  |j2                  z         t5        d	|        t;        j<                  |      \  }}	|d}|j>                  xs |}
	 tA        tC        |d      |      }d|
 d|d<   |S # t6        $ r,}t5        d
t9        |              t        d      cY d}~S d}~ww xY w# t6        $ rU}ddl"}t5        dt9        |              t5        |jG                                t        dt9        |             cY d}~S d}~ww xY w# t6        $ rU}ddl"}t5        dt9        |              t5        |jG                                t        dt9        |             cY d}~S d}~ww xY w)ut   
    Vue sécurisée pour servir les fichiers uploadés
    Vérifie les permissions avant de servir le fichier
    )r   r  u:   Le fichier demandé n'existe pas dans la base de données.u7   Vous n'avez pas la permission d'accéder à ce fichier.r7   u/   Le fichier demandé n'existe pas sur le disque.r   Nrg   rh   zQLe fichier existe mais n'est pas accessible. Veuillez contacter l'administrateur.zapplication/octet-streamrb)content_typezinline; filename=""Content-Dispositionu$   Erreur lors de l'accès au fichier: z Erreur globale dans serve_file: )$r   rR   rS   r  r   r;   r:   is_superuserr   rB   rC   rD   rE   rF   rG   rH   rN   ro   rp   ri   rj   rq   rr   rs   rt   rm   r0   rZ   r\   	mimetypes
guess_typer   r   r   r[   r]   )r1   r;   	user_filer   r^   ru   ri   perm_errr#  encodingcontent_filenameresponserd   r[   
global_errs                  r3   
serve_filer/    s   ;_$$+++BHHJ	  ((///BHHJIVWW "** >>inn<W\\E^E^()bcc 77??277??277??83L#MNGGLL9mD	ww~~i(y0IKLL yyBGG,CDLL4<<$?$,,$NQUQ]Q]$]`d`l`l$lm;I;GH "+!5!5i!@h5L %11B]	Z#DD$9UH0BCSBTTU.VH*+O!  C@XPQ,  0A  C  CC"  	Z8QAB)&&()(+OPSTUPVx)XYY		Z  _0Z0ABCi""$%$'KCPZOK\%]^^	_s   B<K9 ?C+K9 +A&I  ,K9 >!J  	J)!J
JK9 JK9 	K6!A
K1+K6,K9 1K66K9 9	MA
MMMc                 R   | j                   j                  st        d      S t        t        |      }| j
                  dk(  rt        | j                        }|j                         r|j                  j                  d      }|j                  j                  d      }|dk(  r
|r||_         n|dk(  rd|_         |j                          t        j                  | d	| d
       t        d      S |j                   rdnd}t        |j                   |d      }||dd}t        | d|      S )uJ   
    Vue pour éditer le propriétaire et la visibilité d'un fichier
    r   r  r   r:   
visibilityr   publicNr  u    a été modifié avec succès.r	  )r:   r1  )initialzModifier le fichier)r   r   titlezfiles/edit_file.html)r:   rU   r   r   r   r   r   r   r   r   r   r   r"   r   r   r   )r1   r;   r   r   new_userr1  initial_visibilityr   s           r3   	edit_filer7    s    <<  $%pqq X9D~~GLL)==?((,,V4H**..|<J Y&8$	x' 	 IIK WH:=\&]^ L)) +/))Y II,%
  &G '17;;r5   c                 b   | j                   j                  st        d      S | j                  j	                  dd      }| j                  j	                  dd      }g d}||vrd}t
        j                  j                         j                  |      }| j                  j	                  dd      }|r%|j                  |	      |j                  |
      z  }t        |d      }	 |j                  |      }|||||j                  dkD  rdnd|d}t        | d|      S #  |j                  d      }Y <xY w)z
    Vue d'administration des utilisateurs, accessible uniquement aux administrateurs
    Maintenant accessible via /files/users/
    r   r2   r
   r   r   )r   z	-usernamer   z-emaildate_joinedz-date_joined
last_loginz-last_loginrU   z	-is_staff	is_activez
-is_activer   r   )username__icontains)email__icontains   TF)usersr   r   r   r   r   zusers/user_admin.html)r:   rU   r   r   r   r   rR   r  r  rS   r!   r2   r  r   )	r1   r2   r  r  	all_usersr   r   
users_pager   s	            r3   
user_adminrB    s4    <<  $%pqq ;;??61%Dkkoofj1Gj ''   "++G4I ;;??8R0L$$$F##\#BC	 )R(I'^^D)
 $ ) 3 3a 7UG '2G<<'^^A&
s   !D D.c                 n   | j                   j                  st        d      S t        t        |      }|| j                   k(  r!t        j                  | d       t        d      S | j                  dk(  rt        | j                        }|j                         r|j                  j                  dd      |_        |j                  j                  dd	      |_        |j                          t        j                   | d
|j"                   d       t        d      S t        |      }||dd}t%        | d|      S )zr
    Vue pour modifier les droits d'un utilisateur
    Maintenant accessible via /files/users/edit/<user_id>/
    r   idzDVous ne pouvez pas modifier votre propre compte via cette interface.rB  r   rU   Fr;  TzLes droits de l'utilisateur u"    ont été modifiés avec succès.r9   z$Modifier les droits de l'utilisateur)r   user_to_editr4  zusers/edit_user.html)r:   rU   r   r   r   r"   r  r   r   r   r   r   r   r   r;  r   r   r   r   )r1   user_idrF  r   r   s        r3   	edit_userrH  .  s    <<  $%pqq %Tg6L w||#w fg%%~~GLL)==?$($5$5$9$9*e$LL!%)%6%6%:%:;%ML" W(D\EZEZD[[}&~ L)) . $7G '17;;r5   c                 "   | j                   j                  st        d      S t        t        |      }|| j                   k(  r!t        j                  | d       t        d      S |j                  }	 | j                  j                  dd      j                         dk(  rt        j                  j                  |      }|D ]4  }|j                         }|j!                         s$	 |j#                          6 |j-                          t        j.                  | d| d       nZt        j                  j                  |      j1                  d       |j-                          t        j.                  | d| d       t        d      S # t$        $ r:}t        j&                  | d	|j(                   d
t+        |              Y d}~d}~ww xY w# t$        $ r9}t        j                  | d| d
t+        |              Y d}~t        d      S d}~ww xY w)zh
    Vue pour supprimer un utilisateur
    Maintenant accessible via /files/users/delete/<user_id>/
    r  rD  z1Vous ne pouvez pas supprimer votre propre compte.rB  delete_filesfalsetruer9   z#Impossible de supprimer le fichier r   NzL'utilisateur u8    et tous ses fichiers ont été supprimés avec succès.uF    a été supprimé avec succès. Ses fichiers sont maintenant publics.z/Erreur lors de la suppression de l'utilisateur )r:   rU   r   r   r   r"   r  r   r   r   r   lowerr   rR   rS   r  rH   r  rZ   r   r;   r\   r  r   r   )r1   rG  user_to_deleter   r>   r   ru   rd   s           r3   delete_userrO  Y  s    <<  $%pqq 't8N %w ST%% &&Hh;;??>7399;vE!))00n0EJ # s ..0	##%s!((*	s !!#Wxj@x&yz ###8??T?J !!#Wxj  AG  'H  I
 L!!# % s ((4WX\XeXeWffhilmniohp2qrrs  hw"QRZQ[[]^abc^d]e fggL!!hsD   0A2G $F4BG 	G	/G>G G		G 	H%H		Hc                    i }	 t        | j                        }g }g }|j                         D ]b  \  }}|D ]X  }	|	j                         }
|
j                  d      r|j                  |	       6|
j                  d      sH|j                  |	       Z d | j                  j                  dd      }| j                  j                  dd      }|j                  ||||d	       t        | d
|      S # t        $ rT}ddl}t	        dt        |              t	        |j                                t        | j                        }Y d}~,d}~ww xY w)u^   
    Vue pour la page vidéo permettant de lire des fichiers MP4 avec des sous-titres SRT
    r   Nr   z.mp4.vttvideor   subtitle)	mp4_files	srt_filesselected_videoselected_subtitlez
video.html)re   r:   rZ   r[   r0   r\   r]   rv   itemsrM  endswithrO   r   r   r   r   )r1   r   r   rd   r[   rT  rU  	file_type
files_listr   lower_filenamerV  rW  s                r3   rR  rR    s8    G6w||,
 II!+!1!1!3 '	: 	'D!ZZ\N&&v.  &((0  &	'' [[__Wb1N
B7NN(.	  '<11=  6?AxHIi""$%'5
	6s   C- -	E
6A	EE
c                     |j                         j                  d      st        d      S t        | |      }t	        |t
              rd|d<   d| d|d<   |S )z9
    Vue pour servir les fichiers de sous-titres SRT
    rQ  uF   Ce point d'accès est uniquement pour les fichiers de sous-titres SRT.ztext/plain; charset=utf-8zContent-Typezattachment; filename="r$  r%  )rM  rY  r   r/  
isinstancer   )r1   r;   r-  s      r3   serve_subtitler_    sb    
 >>$$V,$%mnn '8,H (L)#> ,B8*A*N&'Or5   c                     t         j                  j                  | j                  ddd      \  }}d|i}t	        | d|      S u?   
    Vue pour afficher et éditer la note de l'utilisateur
    r   Ma notecontentr4  r:   defaultsnoteznotes/note.htmlr   rR   get_or_creater:   r   r1   rg  createdr   s       r3   	view_noterl    R     $$22\\)4 3 MD' 	G ',g66r5   c                 <   | j                   dk(  r| j                         rq| j                  j                  dd      }t        j
                  j                  | j                  |dd      \  }}||_        |j                          t        ddi      S t        dd	i      S )
/
    Vue pour sauvegarder la note via AJAX
    r   rd  r   rb  rc  re  r   TF)r   is_ajaxr   r   r   rR   ri  r:   rd  r   r	   r1   rd  rg  rk  s       r3   	save_noterr    s    
 ~~GOO$5,,""9b1 !((66!(9= 7 
g 		Y-..E*++r5   c                     t         j                  j                  | j                  ddd      \  }}d|i}t	        | d|      S ra  rh  rj  s       r3   rl  rl    rm  r5   c                 X   | j                   dk(  r| j                  j                  d      dk(  rq| j                  j                  dd      }t        j
                  j                  | j                  |dd      \  }}||_        |j                          t        d	d
i      S t        d	di      S )ro  r   zX-Requested-WithXMLHttpRequestrd  r   rb  rc  re  r   TF)r   headersr   r   r   rR   ri  r:   rd  r   r	   rq  s       r3   rr  rr    s    
 ~~GOO$7$78J$KO_$_,,""9b1 !((66!(9= 7 
g 		Y-..E*++r5   c                     t        | |      S )uC   
    Vue pour servir les fichiers spécifiques à la page pawn
    )r/  )r1   r;   s     r3   serve_pawn_filerx    s     gx((r5   )N)Xdjango.shortcutsr   r   django.contrib.authr   django.httpr   r   r	   formsr   r   r   r   r   r   r   r   django.contrib.auth.decoratorsr   r   r   r   modelsr   r   r   django.core.signingr   r   r   django.urlsr   r   rB   django.contrib.auth.modelsr   r   jsondjango.confr    r'  django.core.paginatorr!   django.contribr"   rL   r$   django.core.mailr%   django.template.loaderr&   django.utils.htmlr'   django.contrib.auth.tokensr(   django.utils.httpr)   r*   django.utils.encodingr+   r,   rK   r4   re   rv   r/   r   r   r   r   r   rx   r   r	  r  r   r  r/  r7  rB  rH  rO  rR  r_  rl  rr  rx   r5   r3   <module>r     s#   # - , @ @ G  G  G 9 D D . 9 5 5 O O   	 + .  	    + #  & 3 ( > J 8 	4HT((T
)C;L
7^t3[l!F _2 _2B	 8= 8=t /" /"b	3 )$A_ %A_F 0< 0<d /= /=b (< (<T 1" 1"f (2 (2T )$ %" )$7 %7  )$, %,* )$7 %7  )$, %,* )$) %)r5   