o
    ~ ic$                    @   s  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	 d dl
mZ d dl
mZm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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mZ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 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l0m1Z1 d dl
mZ d dlmZ d	dlmZmZmZ d	dlm2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl m9Z9 d dl:Z:d dl;m<Z< d dl=m>Z> e e1d d! Z?e e1d"d# Z@d$d% ZAe1d&d' ZBd(d) ZC	 ed*d+ ZDed,d- ZE	 	 d.d/ ZFed0d1 ZGd dl:Z:d d2lmHZH d dl
mZ d dlmZ d dl m!Z! d dl-m.Z. d d3l mIZI ed4d5 ZJed6d7 ZK	 d dl:Z:d dl Z d d8lLmMZM d dlmZ d dl
mZ d	d9lmZ ed:d; ZNed<d= ZOd d>l0mPZP eePd?d@ ZQeePdAdB ZRd dClSmTZT d d8lLmMZM d dl m!Z! d dl-m.Z. g fdDdEZUdYdGdHZVdIdJ ZWdKdL ZXedMdN ZYedOdP ZZedQdR Z[edSdT Z\edUdV Z]edWdX Z^dS )Z    N)	exception)Path)renderredirect)login_required)r   user_passes_test)messagesr      )AziendaFormUserFormUserProfileFormRilieviFormInputAdminRilieviFormInputDeactivateUserFormReactivateUserFormReassignRilieviForm)AziendaRilieviUserProfile)User)serializers)HttpResponseRedirect)authenticateloginlogout)UserCreationFormPasswordChangeForm)update_session_auth_hash)gettext)reverse)RilieviFormOutput)r   r   r   )csrf_protect)r   )r   r   r   )	AccessLogtimezone)receiver)	post_save)HttpResponse)
iri_to_uri)transactionc           
      C   s   t jj|d}| jjstjj|| j|jd}n| jjr$tjj||jd}	 |jj}t	j
|}t|\}}|s:d}tdd}	||	d< d| d	|	d
< |	S z1print(path.split('/'))
    path = path.split('/')nome_azienda)pkuserazienda)r.   r0   zapplication/octet-streamzapplication/zipcontent_typez
X-Sendfilezattachment; filename=""Content-Disposition)r   objectsgetr/   is_superuserr   r.   
file_inputpathosbasename	mimetypes
guess_typer(   )
request
rilievo_idaziendaar0   rilievo	file_path	file_namectype_response rG   &/var/www/saasdg/saasdg/events/views.pydownload_file2   s   
rI   c                 C   s   t jj|d}| jjstjj|| j|jd}n| jjr$tjj||jd}	 |jj}t	j
|}t|\}}|s:d}tdd}	t|}
||	d< d| d	|	d
< |	S r+   )r   r5   r6   r/   r7   r   r.   file_outputr9   r:   r;   r<   r=   r(   r)   )r>   r?   r@   r0   rA   rB   rC   rD   rE   rF   quotedrG   rG   rH   download_fileoT   s    
rL   c                 C   s2   | j d}|r|dd }|S | j d}|S )NHTTP_X_FORWARDED_FOR,r   REMOTE_ADDR)METAr6   split)r>   x_forwarded_foriprG   rG   rH   get_client_ipw   s   rT   c                 C   s   | j jr| jdd}t|S | jdkrW| jd}| jd}t| ||d}|d urOt| | t	| }t
jj|t |d t|j |jrKtdS tdS t| d	d
diS t| d	S )NnexthomePOSTemailpassword)usernamerY   )r/   
login_time
ip_addressamministrazionezevents/login_modern.htmlerrorzCredenziali non valide)r/   is_authenticatedGETr6   r   methodrW   r   r   rT   r#   r5   creater%   nowprintr7   r   )r>   	next_pagerX   rY   r/   r\   rG   rG   rH   
login_view   s"   



rf   c                 C   s
   t | dS )Nzevents/mappa.htmlr	   r>   rG   rG   rH   map3   s   
rh   c                 C   s  | j jstd | j jrtdS | j jj}| jdkrt| j| j	}t
| j t
| j	 | rt
d |jdd}|jj|_| j |_ ||_|  |jr|jj}|d }||_|  |rzt|jpcd| |_|  W n ty } zt
d	|  W Y d }~nd }~ww t| d
 tjjdd}dd |D }|rd|j }	d|j d|j d|  d| j j d| j j d| j j d|j !d d}
t"|	|
|d t }t#dS t
|j$ t%| d nt }|r|j&rt'jj| j d(d}n|rt'jj|d(dng }t)| d||d S )!Nr   r]   rW   zrequest.FILESFcommit   @r   %Errore nell'aggiornamento giga_elab: zRilievo caricato con successo!Tr7   c                 S   s   g | ]}|j r|j qS rG   rX   ).0adminrG   rG   rH   
<listcomp>   s    zhome.<locals>.<listcomp>zRilievo caricato da u.   È stato caricato un nuovo rilievo:

Azienda: z
Nome rilievo: z
Tipologia: z	
Utente:   (z)
Data caricamento: z%d/%m/%Y alle %H:%MzI

Puoi visualizzare i dettagli nella sezione amministrazione del portale.oggettotestodestinatari/home/#Errore nel caricamento del rilievo.r/   -created_at_inputr0   zevents/home_new.html)formrilievi_list)*r/   r_   r   r7   userprofiler0   ra   r   rW   FILESrd   is_validsaver8   name	nome_filesize
dimensionefloat	giga_elab	Exceptionr   successr   r5   filterr-   nome_rilievoget_survey_type_display
first_name	last_namerX   created_at_inputstrftimeinvia_emailr   errorsr^   privacy_moder   order_byr   )r>   r0   r}   rA   file_size_bytesfile_size_gbeadmin_usersadmin_emailsru   rv   r~   rG   rG   rH   rV      s|   








rV   c                 C   s   t |  ttdS )Nr   )r   r   r    rg   rG   rG   rH   djangologout   s   r   c                 C   s   | j S )Nrm   rz   rG   rG   rH   is_admin  s   r   c           ;      C   s  | j jstd | j jstdS tj }d }d }d }g }t }t }t	 }t
 }	t }
t }t }t }t
| j| j}	| jd}| jd}| jd}| jd}| jd}| jd}| jd	kr+| jd
}|rztjj|d}tjj|d}W n tjy   d }Y nw | jd}|rzt|}W n ty   d }Y nw t|d}t|d}t|d}t| j |	 r,td zWi }d| jv r`| jd }zD| d}t|}|sd|v r|d }|sd|v r|d }|sd|v r|d }|sd|v r|d }|sd|v r|d }W nJ tjy; } zt | dt!|  t"t#dW  Y d }~W S d }~w t$y_ } zt | dt!|  t"t#dW  Y d }~W S d }~ww t%jj||d}g }|sr|&d |sz|&d |s|&d |s|st | d t"t#dW S |rt | dd'| d t"t#dW S z"t(|j)pd}t(|j*pd}t(|j+pd}t(|j,pd}W n t$y   d } } }}Y nw |r-z>|dkrt(|j-pd| |_-|j.dkr!t(|j/pd| |_/t(|j0pd| |_0|dkr!t(|j1pd| |_1W n
 t$y,   Y nw |	j2d |_3d|_.t45 |_6||_)||_*|rJt(||_+nd|_+||_,|rYt||_7nd|_7|	j2d } | rn|j8 d | _9| |_:|;  t%jj|dd!}!|!< }"t|"|_=zt(|j-pdt(| |_-W n t$y   dt(| |_-Y nw zt(|j/pdt(| |_/W n t$y   dt(| |_/Y nw zt(|j0pdt(| |_0W n t$y   dt(| |_0Y nw |r
zt(|j1pdt(| |_1W n t$y	   dt(| |_1Y nw |;  t>| d" t"t#dW S  t%jy+   t | d# Y nw t | d$ d%| jv r`t| j}| rS|;  t>| d& t }t"d'S t|j?@  t | d( d)| jv r5| jd*}| jd+}|s| jd
}#|#r|#}nt | d, t"t#dS |st | d- t"t#dS zYtjj|d}tAjj|d.}$z
tjj|$|d/}%W n tjy   t | d0 t"t#d Y W S w t| j| j|d1}
|
 r|
j;d2d3}|jBj9|_C|$|_ ||_D|jBr|j*s|jBjE}&|&d4 }'|'|_*|j3r|j)r|j*r|j,rd|_.t45 |_6n|j3r"d5|_.nd|_.|;  |j.dkre|j*re|rezt(|j-p=dt(|j* |_-|;  W n t$yd } ztd6|  W Y d }~nd }~ww |j.dkr|rt%jj|dd!}(|(< |_=|j*rt(|j-pdt(|j* |_-|j,rt(|j/pdt(|j, |_/|j)rt(|j0pdt(|j) |_0|j+rt(|j1pdt(|j+ |_1|;  t>| d7|j8 d8|$jF d9|$jG d: tjj|d}t }
t"t#dW S t | d;|
j?  W n> tjy   t | d< Y n. tAjy   t | d= Y n t$y4 } zt | d>t!|  W Y d }~nd }~ww d?| jv rzt| j|d}| rt|j2d@ })|)jrWt | dA n#d2|)_H|);  t>| dB|)I pi|)jJ dC t"t#dS t | dD dE| jv rt| j|d}| r|j2d@ }*|*jrt | dF n#dG|*_H|*;  t>| dB|*I p|*jJ dH t"t#dS t | dI dJ| jv rYt| j|d}| rS|j2dK }+|j2dL },z[tKL  t%jj|+|d/}-|-jM|,dM}.W d    n	1 sw   Y  |.dkrtN| dN|+I p|+jJ dO nt>| |. dP|+I p"|+jJ dQ|,I p+|,jJ dO t"t#dW S  t$yR } zt | dR|  W Y d }~nd }~ww t | dS dT| jv r*t| j}t	| j}t|  t|  | r$| r$|j2dU }/|j2dV }0tAjj|/dWO rt | dX ntAjj|0dYO rt | dZ nzXtAjjP|j2dV |j2dV |j2d[ |j2d\ |j2d] d^}1|1;  td_ td`|0 tjj|j2da jQd}2tAjj|0dW}3tjjR|3da|2idb\}%}4|4s|2|%_D|%;  tdc t"d'W S  t$y# } zt| t | dd|  W Y d }~nd }~ww t | de nt|d}t|d}t|d}| jd	krKd?| jvrKt|d}| jd	kr\dE| jvr\t|d}| jd	krmdJ| jvrmt|d}|rzt%jj|dSdfng }5|r|5r|5j|dg}5|rtjj|d}ng }g }6|D ]}7tTtjj|7dUdh}8|6&|7|8f qg }9|D ]}7tTt%jj|7djVdidGdj}:|9&|7jQ|:f qtW| dk|||||||5|||||6|9|	|
dlS )mNr   rV   rilievo_selezionatom2r   metri_sottoservizit_elabnumero_anomalierW   azienda_selezionatar,   r|   utente_selezionatoValidojson_data_fileutf-8
superficietempo_elaborazionez"Errore nel parsing del file JSON: r]   z$Errore nella lettura del file JSON: )r   r0   zDevi compilare almeno uno dei seguenti campi: "Metri lineari sottoservizi" (per rilievi GPR) o "Numero anomalie trovate" (per rilievi Magnetometro).zCampi mancanti: z, zS. Assicurati di caricare un file JSON valido o compilare manualmente tutti i campi.r              rJ   	shapefilez.geojsonr0   statoz Rilievo aggiornato con successo!z Rilievo selezionato non trovato.ry   create_aziendaz Azienda registrata con successo!z/amministrazione/z(Errore nella registrazione dell'azienda.create_rilievo_completoadmin_azienda_selezionataadmin_utente_selezionatoz?Seleziona un'azienda dal menu sopra prima di creare un rilievo.z/Seleziona un utente prima di creare un rilievo.id)r/   r0   z<L'utente selezionato non appartiene all'azienda selezionata.)r   Fri   rk   r
   rl   z	Rilievo "z#" creato con successo per l'utente rr   !z$Errore nella creazione del rilievo: zAzienda non trovata.zUtente non trovato.z)Errore durante la creazione del rilievo: deactivate_userutentez3Non puoi disattivare un amministratore dal portale.zUtente "z" disattivato con successo.z*Seleziona un utente valido da disattivare.reactivate_userz@Gli account amministratore non dovrebbero risultare disattivati.Tz" riattivato con successo.z)Seleziona un utente valido da riattivare.reassign_rilieviuser_sorgenteuser_destinazionerz   z(Nessun rilievo da spostare per l'utente .z rilievi riassegnati da z a z.Errore durante la riassegnazione dei rilievi: z0Compila correttamente il form di riassegnazione.create_userrZ   rX   )rZ   u*   Un utente con questo username esiste già.rn   u'   Un utente con questa email esiste già.r   r   rY   )rZ   rX   r   r   rY   z
user savedz#########################r0   )r/   defaultszuser profile salvatoz)Errore durante la creazione dell'utente: z'Errore nella registrazione dell'utente.r{   )user_idr/   r   )flatzevents/admin_new.html)azienda_form	user_formuser_profile_formdeactivate_user_formreactivate_user_formreassign_rilievi_formr~   aziender   r   user_profiles!all_user_profiles_by_azienda_list!all_rilievi_names_by_azienda_listr}   admin_rilievo_form)Xr/   r_   r   r7   r   r5   allr   r   r   r!   r   r   r   r   rW   r   r6   ra   r   r   DoesNotExistint
ValueErrorrd   r   readdecodejsonloadsJSONDecodeErrorr   r^   strr   r    r   r   appendjoinr   r   r   r   r   r   r   tempo_tot_elabm2_elabmetri_lineari_rilcleaned_datarJ   r%   rc   created_at_outputr   r   r   r   r   countn_file_elabr   r   as_datar   r8   r   r0   r   r   r   	is_activeget_full_namerZ   r*   atomicupdatewarningexistsr   r-   get_or_creater   listselect_relatedvalues_listr   );r>   r   r   nome_rilievo_selezionator   r   r   r   r   r}   r   r   r   r   rilievo_nome	superficer   r   r   r   azienda_nome	utente_id	json_data	json_filejson_contentr   rA   missing_fieldsold_m2old_dim	old_metriold_tr   rilievinumero_rilieviazienda_nome_from_selectionr   user_profiler   r   rilievi_elaboratiuser_to_deactivateuser_to_reactivater   r   
rilievi_qsmoved_countrZ   rX   new_userazienda_user	user_usercreatedr~   r   r0   user_profiles_listr   rilievi_namesrG   rG   rH   amministrazione_view  s  
















 
&"





















r  )get_object_or_404)JsonResponsec                 C   s  | j jstt|| j d}n
| j jrtt|d}| jdkr|jr9|jj}	 tj|r/t	| |j
r9t	|j
j |jd ur|j}zJ|jrTt|jpJdt|jpPd |_|jdkrt|jp^dt|jpdd |_t|jpmdt|jpsd |_t|jp|dt|jpd |_|  W n	 ty   Y nw |j}|  |d urztjj|dd }t||_|  W n	 ty   Y nw tddiS tdd	id
dS )Nr   r/   r   rW   r   r   r   r   TF  status)r/   r7   r  r   ra   r8   r9   r:   r   remover   r0   r   r   r   r   r   r   r   r   r   r   r   r   deleter5   r   r   r   r   r  )r>   r?   rA   rB   r0   azienda_refn_elabrG   rG   rH   elimina_rilievo  sJ   




r  c                 C   sb   t t|| jd}| jdkr)|jr|jj}tj|rt| |	  t
ddiS t
ddiddS )Nr  rW   r   TFr	  r
  )r  r   r/   ra   filer9   r:   r   r  r  r  )r>   r?   rA   rB   rG   rG   rH   elimina_rilievo_elaboratoN  s   

r  )settings)r   c                 C   s  d }| j d}| jjr/tj d}|r,z	tjj|d}W n% tjy+   d }Y nw d }nz	| jj	}|j
}W n tjyD   d }Y nw | jjrV|rStjj|ddng }n|rf|jrftjj| j|dd}n|rptjj|ddng }g }|D ]}t|dd }|std|j d	|j  qvzt|j}	W n# ttfy }
 ztd
|j d	|j d|
  W Y d }
~
qvd }
~
ww |	 std|j d	|j d|	  qvz|	jddd}t|}W d    n1 sw   Y  W n% ttjfy }
 ztd|j d	|j d|
  W Y d }
~
qvd }
~
ww ||j|j|j|j|j |j!|d qvtd t"|}| j dd }z|r<t#|nd }W n tyK   d }Y nw t$| d||||r[|j%dS ddS )Nr0   r-   r,   r   r   )r/   r0   r   r   z)Nessun file GeoJSON associato al rilievo z - z+Percorso GeoJSON non valido per il rilievo : z(File GeoJSON non trovato per il rilievo rr   )encodingz.Impossibile leggere il GeoJSON per il rilievo )r   nome
latitudinelongitudinesuperfice_rilievo"metri_lineari_sottoservizi_trovatigeojson_textrilievi_elaborati1r?   zevents/map_new.html )rilievi_elaborati_jsonselected_rilievo_idr   r   )&r`   r6   r/   r7   r   r5   r   r   r   r   r0   r   r   r   r   getattrrd   r   r   r   r9   r   FileNotFoundErroris_fileopenr   loadOSErrorr   r   r  r  r   r   dumpsr   r   r-   )r>   r   selected_company_namer0   r   r   rilievi_datar  shapefile_fieldshapefile_pathexcfdatarilievi_jsonr?   r   rG   rG   rH   mapr  s   





r0  c                 C   sh  | j j}|j}|st| d tdS ddlm} tj	j
|dd
|dd|d	dB |d
dB }tj	j
|ddd}tj	j
|d
|dd|d	dB |d
dB  }tj	j
|dd }| }| }	tdd |D }
tdd |D }tdd |D }tdd |D }|dkr|| nd}tj	j
|d
|dd|d	dB |d
dB }tdd |D }tdd |D }tdd |D }tdd |D }tdd |D }|dkr|| nd}tdd |D }tj	j
|dd}tdd |D }t| di d|d|d |
d!|d"|d#|d$|d%|d&|	d'|d(|d)|d*|d+|d,|d-|d.|S )/Nz)Nessuna azienda associata al tuo profilo.rV   r   )Qr   r   GPR)survey_typer  T)survey_type__isnullMAG)r0   r3  r   r|   )r0   r3  c                 s       | ]
}t |jp	d V  qdS r   Nr   r   ro   r  rG   rG   rH   	<genexpr>      zstats.<locals>.<genexpr>c                 s   r6  r7  r   r   r9  rG   rG   rH   r:    r;  c                 s   r6  r7  r   r   r9  rG   rG   rH   r:    r;  c                 s   r6  r7  r   r   r9  rG   rG   rH   r:    r;  r   c                 s   r6  r7  r8  r9  rG   rG   rH   r:    r;  c                 s   r6  r7  r8  r9  rG   rG   rH   r:    r;  c                 s   r6  r7  r<  r9  rG   rG   rH   r:    r;  c                 s   r6  r7  r=  r9  rG   rG   rH   r:    r;  c                 s   r6  r7  r>  r9  rG   rG   rH   r:    r;  c                 s   r6  r7  )r   r   r9  rG   rG   rH   r:     r;  c                 s   r6  r7  r8  r9  rG   rG   rH   r:    r;  zevents/stats2_new.htmln_file_elab_gprn_file_tot_gprgiga_elab_gprgiga_caricati_gprm2_elab_gprtempo_tot_elab_gprtempo_elab_medio_gprmetri_lineari_ril_gprn_file_elab_magn_file_tot_maggiga_elab_maggiga_caricati_magm2_elab_magtempo_tot_elab_magtempo_elab_medio_magmetri_lineari_ril_magnumero_anomalie_mag)r/   r   r0   r   r^   r   django.db.modelsr1  r   r5   r   r   sumr   )r>   r   r0   r1  rilievi_gpr_elabrilievi_mag_elabr@  rH  r?  rG  rA  rC  rD  rF  rE  rilievi_gpr_totrB  rI  rK  rL  rN  rM  rO  rilievi_mag_totrJ  rG   rG   rH   stats  s    	rV  )csrf_exemptc           
   
   C   s  | j dkrt| j}|d}|d}ztjj|d}|j}t|}|j	r|j	}|dkr|dkrzF|j
rEt|jp=dt|j
 |_|jrUt|jpMdt|j |_|jret|jp]dt|j |_|jrut|jpmdt|j |_|  W n ty } ztd|  W Y d }~nmd }~ww |dkr|dkrzF|j
rt|jpdt|j
 |_|jrt|jpdt|j |_|jrt|jpdt|j |_|jrt|jpdt|j |_|  W n ty } ztd|  W Y d }~nd }~ww ||_|dkr|jst |_|d	kr,td
|j d|j d tjj|j	dj|jgd n=|dkrKtd|j d|j d tjj|j	dj|jgd n|dkritd|j d|j d tjj|j	dj|jgd |  |j	rztjj|j	dd }	|	|j	_ |j	  W n ty } ztd|  W Y d }~nd }~ww t!ddiW S  tj"oty } zt| t#| |d t!dddW  Y d }~S d }~ww t!dddd d!S )"NrW   r?   r   r.   r   r   z)Errore nella sottrazione valori azienda: z%Errore nell'aggiunta valori azienda: 1u#   Elaborazione iniziata • Rilievo: zIl rilievo u    è in fase di elaborazione.
r,   rt   2u!   Elaborazione finita • rilievo: z'Abbiamo finito di elaborare il rilievo u>   .
Ora è disponibile il risultato sul portale www.deepgeo.com.3u+   Errore durante l'elaborazione • Rilievo: zL'elaborazione del rilievo u    non è andato a buon fine.
 Si prega di contattare l'assistenza all'indirizzo technicalsupport@xploragroup.ai per risolvere il problema.r   z'Errore nell'aggiornamento n_file_elab: r   T404FRilievo non trovator   r^   Metodo non supportator	  r
  )$ra   r   r   bodyr6   r   r5   r   r   r0   r   r   r   r   r   r   r   r   r   r   r   rd   r   r%   rc   r   r   r   mail_referenter/   r   r   r   r  r   invia_notifica_errore)
r>   r.  r?   nuovo_statorA   vecchio_statonuovo_stato_intr0   r   r   rG   rG   rH   aggiorna_stato_rilievo  s   








rf  c                 C   s   | j dkrDt| j}|d}|d}ztjj|d}t||_|	  t
ddiW S  tjyC   t| dd t
d	d
d Y S w t
d	ddddS )NrW   r?   prioritarX  r   Tz$Rilievo non trovato per eliminazioner\  Fr]  r^  r_  r	  r
  )ra   r   r   r`  r6   r   r5   r   rg  r   r  r   rb  )r>   r.  r?   nuova_prioritarA   rG   rG   rH   aggiorna_priorita_rilievoy  s   



ri  )	send_mailc                 C   s   | }|}d}|}d S )Nzdeepgeo@xploragroup.airG   )ru   rv   rw   subjectmessage
from_emailrecipient_listrG   rG   rH   r     s   r   500c                 C   s2  ddl m } ddl}d}| jjr7| jj d| jj d| jj d}t| jdr7| jjj	r7|d	| jjj	j
 7 }|  }| j}| jd
d}	| jdd}
| }|d}t|}d}d}d}zI|re|}n| }|d}|D ]6}d|v rd|v r|d}t|dkr|d d}t|dkr|d dd }|d dd } nqpW n ty } ztd|  W Y d}~nd}~ww d| d| }d| d| d| d|
 d|	 d| d| d | d!| d"| d#}t| ztd$|  td% W dS  ty } ztd&|  W Y d}~dS d}~ww )'zLInvia notifica email per errori del server a technicalsupport@xploragroup.air   )datetimeNzUtente non autenticatorr   rs   )r   z - Azienda: HTTP_USER_AGENTzNon disponibilerO   %d/%m/%Y %H:%M
zFile "zline r
   z", line /rN   z9Errore nell'estrazione delle informazioni del traceback: z[Error z] z$ERRORE DEL SERVER RILEVATO

UTENTE:
z

DETTAGLI ERRORE:
URL: z	
Metodo: z
IP: z
User Agent: z
Data/Ora: z

LOCALIZZAZIONE ERRORE:
File: z
Riga: z


ERRORE:
z

TRACEBACK COMPLETO:
uF   

---
Questo è un messaggio automatico generato dal sistema DeepGeo.
u   🔔 INVIO NOTIFICA ERRORE: u   ✅ Email inviata con successo!u,   ❌ Errore nell'invio della notifica email: )rp  	tracebackr/   r_   r   r   rX   hasattrr   r0   r-   build_absolute_urira   rP   r6   rc   r   r   
format_excrQ   lenr   rd   )r>   errorecodice_erroretraceback_inforp  tbutente_info
url_erroremetodo_richiesta
user_agentr\   rc   data_oraerrore_dettaglifile_erroreriga_erroretraceback_completotb_lineslineparts	file_partr   ru   rv   rG   rG   rH   rb    s   "


	
rb  c              
   C   sb   | j jstdS ztd ty0 } zddl}| }t| |d| W Y d}~tdS d}~ww )zAVista di test per la notifica errori - DA RIMUOVERE IN PRODUZIONErx   z*Test error notification - Division by zeror   NTESTz]Email di test inviata con informazioni dettagliate! Controlla technicalsupport@xploragroup.ai)	r/   r7   r   r   r   rw  rz  rb  r(   )r>   errore_testrw  r~  rG   rG   rH   test_error_notification  s   r  c               
   C   s  zddl } ddl}| jdd}|  }|  }td t| |  }t|jd d}t|j	d d}|j
}ddl}	|	jdkrE| d	}
n| d
}
t|
jd d}t|
j	d d}t|
jd d}t|
j	|
j d d}|  }t|jd d}t|jd d}t|  }|  }| j | }t|d d}i d|d|d|r|jndd|d|d|d|d|d|d|d|d|d|d|d| d| W S  ty% } zDtdt|  i dddddddddddddddddddddddddddddddddd W  Y d}~S d}~w ty@ } zddt| iW  Y d}~S d}~ww )!z Raccoglie le metriche di sistemar   Nr
   )interval	cpu_countrk   r   ntzC:\ru  d   i   i  cpu_percentcpu_freqmemory_total_gbmemory_used_gbmemory_percentdisk_total_gbdisk_used_gbdisk_free_gbdisk_percentnetwork_sent_mbnetwork_recv_mb	processesuptime_hoursplatformplatform_versionzErrore nel monitoraggio: Unknownr^   zpsutil non installato)psutilr  r  r  r  rd   virtual_memoryroundtotalusedpercentr:   r   
disk_usagefreenet_io_counters
bytes_sent
bytes_recvr{  pids	boot_timetimecurrentsystemversionr   r   )r  r  r  r  r  memoryr  r  r  r:   diskr  r  r  r  networkr  r  r  r  uptime_secondsr  r   rG   rG   rH   get_system_metrics
  s   

	
	
r  c              
   C   s  | j jstdS | j jstdS t }ddlm}m} ddlm	} ddl
m} tj }tjjdd }tj }tjjd	d
 }	| |dd }
tjj|
d }tjj|
d }ttjdj|dd}|spg }ddddd}|||||	||||d	}t| d|S )zYPannello di controllo per monitorare l'utilizzo delle risorse di sistema - Solo per adminr   rV   r   )SumCountr$   )	timedeltaFrm   r   )r      )days)created_at_input__gte)login_time__gter   )r   zIn CodazIn Elaborazione	ElaboratoErrore)r   r
   r      )	system_metricstotal_aziendetotal_userstotal_rilievitotal_rilievi_elaboratirilievi_ultimi_30_giorniaccessi_ultimi_30_giornirilievi_per_statostati_labelszevents/admin_dashboard.html)r/   r_   r   r7   r  rP  r  r  django.utilsr%   rp  r  r   r5   r   r   r   r   rc   r#   r   valuesannotater   )r>   r  r  r  r%   r  r  r  r  r  thirty_days_agor  r  r  r  contextrG   rG   rH   admin_dashboardc  sD   

	r  c                 C   s  | j jst| d tdS | jdkrt| d tdS ztj }|	 }d}d}d}d}i }|D ]}zt|j
r|j
jrzE|j
j}	|	d }
t|jpLd}|
|_|  |jrv|jj}||vrh|jdd||< |
| }|| d	  |7  < |dkr~|d
7 }|d
7 }W n% ty } ztd|j d|  |d
7 }W Y d}~n	d}~ww |d
7 }W q4 ty } ztd|j d|  |d
7 }W Y d}~q4d}~ww d}| D ]I\}}z(|d }|d	 }|dkrt|jpd| |_|jdk rd|_|  |d
7 }W q ty } ztd| d|  W Y d}~qd}~ww t| d| d| d| d| d| d|  W tdS  tyY } zt| dt|  W Y d}~tdS d}~ww )z
    Funzione per calcolare e salvare le dimensioni dei file per tutti i rilievi nel database.
    Aggiorna anche il campo giga_elab delle aziende.
    zKAccesso negato. Solo gli amministratori possono eseguire questa operazione.r  rW   zMetodo non consentito.r   rk   r   )r0   
differenzar  r
   z*Errore nel calcolo dimensione per rilievo r  NzErrore generale per rilievo r0   z"Errore nell'aggiornamento azienda z3Calcolo dimensioni completato! Rilievi aggiornati: ru  z, Rilievi senza file: z', Rilievi senza dimensione precedente: z
, Errori: z, Aziende aggiornate: z,Errore durante il calcolo delle dimensioni: )r/   r7   r   r^   r   ra   r   r5   r   r   r8   r   r   r   r   r   r0   r   r   rd   itemsr   r   r   )r>   r   totale_rilievirilievi_aggiornatirilievi_senza_filerilievi_senza_dimensioneerroriaziende_dimensionirA   r   r   r   
azienda_idr  r   aziende_aggiornater.  r0   rG   rG   rH   calcola_dimensioni_rilievi  s   



  r  c              	   C   sr   | j jstdS t }dt|ddv|dd|dd|dd|d	d
|ddd}t| d||dS )z)Pagina di test per verificare le metricherV   r  r^   r  r  r   r  r  r  r  N)psutil_availabler  r  r  r  r^   zevents/test_metrics.html)metricstest_results)r/   r7   r   r  r   r6   r   )r>   r  r  rG   rG   rH   test_metrics  s   




	r  c                 C   s  | j jstdS tdd}d|d< t|}|g d tj	d
 d}|D ]Z}z|j}|jr7|jjnd	}|jr@|jjnd
}W n tjyQ   d	}d
}Y nw ||j|j|j|j|j|jd|jrl|jdnd|jrrdnd|jrxdnd|jr~dnd||g q*|S )zHScarica CSV con tutti gli utenti e le loro informazioni - Solo per adminrV   text/csvr1   z)attachment; filename="utenti_deepgeo.csv"r4   )IDUsernameEmailNomeCognomezData RegistrazionezUltimo AccessoAttivoStaff	SuperuserzAzienda Associataz
ID Aziendauserprofile__aziendar   NessunazN/Ars  Maiu   SìNo)r/   r7   r   r(   csvwriterwriterowr   r5   r   r   r   r   r0   r-   r   r   r   rZ   rX   r   r   date_joinedr   
last_loginr   is_staff)r>   rF   r  usersr/   r   r   r  rG   rG   rH   download_users_csv  s>   


r  c                 C   s   | j jstdS tdd}d|d< t|}|g d tj	 
d}|D ]}||j|j|j|j|j|j|j|j|j|j|j|jg q'|S )zHScarica CSV con tutte le aziende e le loro informazioni - Solo per adminrV   r  r1   z*attachment; filename="aziende_deepgeo.csv"r4   )r  zNome AziendazPartita IVAzEmail ReferentezTelefono ReferentePECzIndirizzo LegalezGiga ElaborazionezM2 ElaborazionezTempo Medio ElaborazionezTempo Totale ElaborazionezMetri Lineari Rilievir   )r/   r7   r   r(   r  r  r  r   r5   r   r   r   r-   partita_ivara  telefono_referentepecindirizzo_legaler   r   tempo_medio_elabr   r   )r>   rF   r  	companiescompanyrG   rG   rH   download_companies_csvM  s.   

r  c                 C   sv   | j dkr.t| j| j}| r%| }t| | t| t	d t
dS t| t	d nt| j}t| dd|iS )z+Pagina per cambiare la password dell'utenterW   zPassword cambiata con successo!rV   u6   Si è verificato un errore. Controlla i dati inseriti.zevents/change_password.htmlr}   )ra   r   r/   rW   r   r   r   r   r   rE   r   r^   r   )r>   r}   r/   rG   rG   rH   change_passwordv  s   


r   )ro  N)_r   r  r<   loggingr   pathlibr   django.shortcutsr   r   django.contrib.auth.decoratorsr   r   django.contribr   formsr   r   r   r   r   r   r   r   modelsr   r   r   django.contrib.auth.modelsr   django.corer   django.httpr   django.contrib.authr   r   r   django.contrib.auth.formsr   r   r   django.utils.translationr   rE   django.urlsr    r!   django.views.decorators.csrfr"   r#   r  r%   django.dispatchr&   django.db.models.signalsr'   r(   r:   django.utils.encodingr)   	django.dbr*   rI   rL   rT   rf   rh   rV   r   r   r  r  r  r  r  django.confr  r0  rV  rW  rf  ri  django.core.mailrj  r   rb  r  r  r  r  r  r  r  r   rG   rG   rG   rH   <module>   s    (
 !

M

    
1

R
VY
	[Y
;
c

1
(