
    =
j3                     v   d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlmZ d	d
lmZmZmZmZmZmZmZmZmZmZ d	dlmZm Z  d	dl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' de(fdZ) G d de      Z* G d de      Z+ G d de      Z, G d de      Z- G d de      Z. G d de      Z/ G d de      Z0y)    )date)HttpResponse)timezone)OpenApiParameterOpenApiResponseextend_schemastatus)AllowAnyIsAuthenticated)Response)APIView   )
IstatCalendarRequestSerializerIstatCalendarResponseSerializerIstatFixIssuesRequestSerializer IstatFixIssuesResponseSerializerIstatExportRequestSerializer!IstatIssuesSummaryQuerySerializer$IstatIssuesSummaryResponseSerializer IstatMunicipalityQuerySerializer#IstatMunicipalityResponseSerializerIstatPreviewRequestSerializer)search_municipalitiesserialize_municipality)apply_bulk_issue_fixesbuild_daily_calendar_for_periodbuild_issues_summarygenerate_export_for_date_rangegenerate_export_for_periodgenerate_preview_for_period
field_namec                     | y t        |       j                         }|sy 	 t        j                  |      S # t        $ r}t	        | d      |d }~ww xY w)Nz must be in YYYY-MM-DD format.)strstripr   fromisoformat
ValueError)valuer"   rawexcs       /backend/istat/views.py_parse_iso_dater,   "   s`    }
e*


CQ!!#&& QJ<'EFGSPQs   6 	AAAc                       e Zd ZegZ edgd edeej                  dd       ede	ej                  dd       ed	e	ej                  dd
      g e
d       e
d      d      d        Zy)IstatExportAPIViewISTATzExport ISTAT TXT filestructure_idTzStructure IDnametypelocationrequireddescription
start_datezStart date (YYYY-MM-DD)end_datezEnd date (YYYY-MM-DD)ISTAT TXT file downloadr6   Validation error   i  tagssummary
parameters	responsesc                 R   |j                   j                  d      }|j                   j                  d      }|j                   j                  d      }|st        ddit        j                        S 	 t        |      }	 t        |d      }t        |d      }|r|st        ddit        j                        S ||kD  rt        dd	it        j                        S 	 t        |||
      }	|	d   dk  r!t        d|	d   dt        j                        S t        |	d   d      }
d|	d    d|
d<   t        |	d         |
d<   t        t        |	d               |
d<   t        j                         j                         |
d<   |
S # t        t        f$ r  t        ddit        j                        cY S w xY w# t        $ r0}t        dt        |      it        j                        cY d }~S d }~ww xY w# t        $ r0}t        dt        |      it        j                        cY d }~S d }~ww xY w)Nr0   r7   r8   detailzstructure_id is required.r	   z structure_id must be an integer.z%start_date and end_date are required.z)start_date cannot be later than end_date.)r0   r7   r8   valid_countr   ,No valid ISTAT records available for export.invalid_recordsrD   rG   contenttext/plain; charset=asciicontent_typeattachment; filename="filename"Content-DispositionX-ISTAT-Valid-RecordsX-ISTAT-Invalid-RecordsX-ISTAT-Generated-At)query_paramsgetr   r
   HTTP_400_BAD_REQUESTint	TypeErrorr'   r,   r$   r   r   lenr   now	isoformat)selfrequeststructure_id_rawstart_date_rawend_date_rawr0   r7   r8   r*   export_payloadresponses              r+   rU   zIstatExportAPIView.get1   s^   @ #//33NC --11,?++//
;6722 
	/0L	(FJ&|Z@H BC22 
  FG22 

	;)%!N -(A-L'56G'H 22   9%4

 %^J%?$@B 	&' -0}0M,N().1012/
*+ ,4<<>+C+C+E'(y :& 	=>22 	  	3s8$22 	0  	3s8$22 	sN   2E? >F1 G- ?,F.-F.1	G*:%G%G*%G*-	H&6%H!H&!H&N)__name__
__module____qualname__r   permission_classesr   r   rW   QUERYr$   r   rU        r+   r.   r.   .   s    )*Y'#)//* !)//5 )//3
0 !-FG -?@
5>I?>Iri   r.   c                       e Zd ZegZ edgd edeej                  dd       edeej                  dd       ed	e	ej                  dd
      gde
i      d        Zy)IstatMunicipalityListAPIViewr/   z,Search official ISTAT Italian municipalitiesprovinceFz1Optional Italian province sigla (for example BO).r1   searchz,Optional municipality name/code search text.limitz"Maximum results to return (1-100).r=   r>   c           	      4   t        |j                        }|j                  d       |j                  }t	        |j                  d      |j                  d      |j                  dd            }t        d	|D cg c]  }t        |       c}i      S c c}w )
NdataTraise_exceptionrl   rm   rn      )rl   rm   rn   results)r   rT   is_validvalidated_datar   rU   r   r   )r\   r]   
serializerparamsmunicipalitiesmunicipalitys         r+   rU   z IstatMunicipalityListAPIView.get   s    : 67;O;OP
D1**.ZZ
+::h'**Wb)

 (6(6 +<8(6
 	
s   ;B
N)rc   rd   re   r   rf   r   r   r$   rg   rW   r   rU   rh   ri   r+   rk   rk      s    "Y>)//O )//J )//@
. ;<58
98
ri   rk   c            	       Z    e Zd ZegZ edgde ed       ed      d      d        Zy	)
IstatPreviewAPIViewr/   zPreview ISTAT export datazISTAT preview datar:   r;   r<   r?   r@   r]   rB   c                 0   t        |j                        }|j                  d       	 t        ||j                  d         }t        |d   |d	   |d
   d      S # t
        $ r0}t        dt        |      it        j                        cY d }~S d }~ww xY w)Nrp   Trr   periodr0   r   rD   r	   r@   record_payloadsrG   )r@   recordsrG   )
r   rq   rv   r!   rw   r'   r   r$   r
   rV   )r\   r]   r0   rx   previewr*   s         r+   postzIstatPreviewAPIView.post   s     3E
D1		1)!00:G "9-"#45#*+<#=
 	
  	3s8$22 	s   A 	B%%B
BBN)	rc   rd   re   r   rf   r   r   r   r   rh   ri   r+   r}   r}      sD    )*Y+- -AB -?@
	

ri   r}   c            	       L    e Zd ZegZ edgdee ed      d      d        Z	y)	IstatCalendarAPIViewr/   z0Get daily ISTAT calendar metrics for a structurer;   r:   r<   r~   c                    t        |j                        }|j                  d       	 t        ||j                  d         }t        |      S # t
        $ r0}t        dt        |      it        j                        cY d }~S d }~ww xY w)Nrp   Trr   r   r   rD   r	   )
r   rq   rv   r   rw   r'   r   r$   r
   rV   r\   r]   r0   rx   payloadr*   s         r+   r   zIstatCalendarAPIView.post   s     4F
D1		5)!00:G     	3s8$22 	s   A 	B%B=BBN)
rc   rd   re   r   rf   r   r   r   r   r   rh   ri   r+   r   r      s>    )*YB.0 -?@
	!!ri   r   c                       e Zd ZegZ edgd edeej                  dd       edeej                  dd       ed	eej                  dd
      ge	 e
d      d      d        Zy)IstatIssuesSummaryAPIViewr/   z#Get grouped ISTAT validation issuesyearTzPeriod yearr1   
from_monthzStart month (1-12)to_monthzEnd month (1-12)r;   r:   r<   r>   c                    t        |j                        }|j                  d       	 t        ||j                        }t        |      S # t
        $ r0}t        dt        |      it        j                        cY d }~S d }~ww xY w)Nrp   Trr   r   rD   r	   )
r   rT   rv   r   rw   r'   r   r$   r
   rV   r   s         r+   rU   zIstatIssuesSummaryAPIView.get  s    @ 7G<P<PQ
D1		*)!00G     	3s8$22 	s   A 	B%B :B BN)rc   rd   re   r   rf   r   r   rW   rg   r   r   rU   rh   ri   r+   r   r     s    )*Y5)//) !)//0 )//.
0 6 -?@
5>!?>!ri   r   c            	       L    e Zd ZegZ edgdee ed      d      d        Z	y)	IstatFixIssuesAPIViewr/   z Apply bulk fixes to ISTAT issuesr;   r:   r<   r~   c                 2   t        |j                        }|j                  d       	 t        ||j                  d   |j                  d         }t        |      S # t
        $ r0}t        dt        |      it        j                        cY d }~S d }~ww xY w)	Nrp   Trr   r   fixes)r0   r   r   rD   r	   )
r   rq   rv   r   rw   r'   r   r$   r
   rV   )r\   r]   r0   rx   resultr*   s         r+   r   zIstatFixIssuesAPIView.postG  s     5',,G
D1
	+)!00: //8F   	3s8$22 	s   (A 	B&%BBBN)
rc   rd   re   r   rf   r   r   r   r   r   rh   ri   r+   r   r   D  s>    )*Y2/1 -?@
	  ri   r   c            	       Z    e Zd ZegZ edgde ed       ed      d      d        Zy	)
IstatExportStructureAPIViewr/   z!Export ISTAT TXT file (structure)r9   r:   r;   r<   r~   c                 .   t        |j                        }|j                  d       	 t        ||j                  d         }|d   d	k  r!t        d
|d   dt        j                        S t        |d   d      }d|d    d|d<   t        |d         |d<   t        t        |d               |d<   t        j                         j                         |d<   |S # t
        $ r0}t        dt        |      it        j                        cY d }~S d }~ww xY w)Nrp   Trr   r   r   rD   r	   rE   r   rF   rG   rH   rI   rJ   rK   rM   rN   rO   rP   rQ   rR   rS   )r   rq   rv   r    rw   r'   r   r$   r
   rV   r   rY   r   rZ   r[   )r\   r]   r0   rx   ra   r*   rb   s          r+   r   z IstatExportStructureAPIView.postf  s;    2w||D
D1		7)!00:N -(A-L'56G'H 22   9%4

 %^J%?$@B 	&' -0}0M,N().1012/
*+ ,4<<>+C+C+E'(7  	3s8$22 	s   C 	D$%D	DDN)	rc   rd   re   r   rf   r   r   r   r   rh   ri   r+   r   r   c  sD    )*Y3, -FG -?@
	$$ri   r   N)1datetimer   django.httpr   django.utilsr   drf_spectacular.utilsr   r   r   rest_frameworkr
   rest_framework.permissionsr   r   rest_framework.responser   rest_framework.viewsr   serializersr   r   r   r   r   r   r   r   r   r   rz   r   r   servicesr   r   r   r   r    r!   r$   r,   r.   rk   r}   r   r   r   r   rh   ri   r+   <module>r      s     $ ! R R ! @ , (   J 	Qs 	Qk k\/
7 /
d!
' !
H!7 !<1! 1!h G  >0' 0ri   