
    ?&j                        d 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 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mZmZ ddlmZ ddlmZ ddZ G d de      Z  G d de      Z! G d de      Z"y)a  
alloggiati/views.py
===================
API views for the Alloggiati Web integration.

Endpoints:
  POST   /api/alloggiati/sync
  GET    /api/alloggiati/sync/logs/<structure_id>
  GET    /api/alloggiati/credentials/<structure_id>
  POST   /api/alloggiati/credentials/<structure_id>
  PATCH  /api/alloggiati/credentials/<structure_id>
  DELETE /api/alloggiati/credentials/<structure_id>
    )annotations)Q)get_object_or_404)OpenApiResponseextend_schemastatus)IsAuthenticated)Response)APIView)AlloggiatiCredentialAlloggiatiSyncLog)$AlloggiatiCredentialStatusSerializer#AlloggiatiCredentialWriteSerializerAlloggiatiSyncLogSerializerAlloggiatiSyncRequestSerializer AlloggiatiSyncResponseSerializer)AlloggiatiService)	Structurec                    t         j                  j                  t        |       t        |       z        j	                         }t        ||      S )N)user)structure_users__user)id)r   objectsfilterr   distinctr   )r   structure_idqss      /backend/alloggiati/views.py_get_accessible_structurer    %   sB    				!	!	tqt44
hj  RL11    c            
      `    e Zd ZdZegZ edgdee e	d       e	d      d      d	        Z
y
)AlloggiatiSyncAPIViewuC   POST /api/alloggiati/sync — trigger a manual Alloggiati Web sync.
Alloggiatiz!Trigger Alloggiati Web guest synczValidation errordescriptionzAlloggiati Web error)   i  i  tagssummaryrequest	responsesc                ~   t        |j                        }|j                  d       |j                  }t	        |j
                  |d          t        j                  |d   |d   j                         |d   j                               }|d   d	v rt        j                  nt        j                  }t        ||
      S )N)dataTraise_exceptionstructureIddateFromdateTo)r   	date_fromdate_tor	   )	CONNECTEDPARTIALr   )r   r.   is_validvalidated_datar    r   r   sync	isoformatr	   HTTP_200_OKHTTP_502_BAD_GATEWAYr   )selfr+   
serializerr.   resulthttp_statuss         r   postzAlloggiatiSyncAPIView.post5   s     5',,G
D1((!',,]0CD"''m,:&002N,,.
 h#;; ,, 	
 {33r!   N)__name__
__module____qualname____doc__r
   permission_classesr   r   r   r   rB    r!   r   r#   r#   0   sJ    M)*^3/1 -?@ -CD
		4	4r!   r#   c                  N    e Zd ZdZegZ edgdd ed      i      d
d       Zy	)AlloggiatiSyncLogListAPIViewuC   GET /api/alloggiati/sync/logs/<structure_id> — list sync history.r$   z)List Alloggiati sync logs for a structurer'   Tmanyr)   r*   r,   c                    t        |j                  |      }t        j                  j	                  |      d d }t        t        |d      j                        S )N	structure2   TrK   )r    r   r   r   r   r   r   r.   )r>   r+   r   rP   logss        r   getz AlloggiatiSyncLogListAPIView.get]   sM     .gllLI	 ((//)/DSbI3DtDIIJJr!   Nr   int)	rC   rD   rE   rF   r
   rG   r   r   rS   rH   r!   r   rJ   rJ   X   s=    M)*^;3>?
K
Kr!   rJ   c            	          e Zd ZdZegZddZ edgddei      dd       Z	 edgde
e ed	
      d      dd       Z edgde
dei      dd       Z edgddei      dd       Zy)AlloggiatiCredentialAPIViewz,CRUD for AlloggiatiCredential per structure.c                    t         j                  j                  |      j                         }|j                  |d u|r|j
                  nd |r|j                  nd |r|j                  dS d dS )NrO   )r   	connectedmode
created_at
updated_at)r   r   r   firstr   rZ   r[   r\   )r>   rP   creds      r   _status_payloadz+AlloggiatiCredentialAPIView._status_payloadq   sk    #++22Y2GMMO%LLT)!%DII4-1$//t-1$//
 	

 8<
 	
r!   r$   z Get Alloggiati credential statusr'   rM   c                b    t        |j                  |      }t        | j                  |            S )N)r    r   r   r_   )r>   r+   r   rP   s       r   rS   zAlloggiatiCredentialAPIView.get{   s*     .gllLI	,,Y788r!   zCreate Alloggiati credentialszCredential already existsr%   )   i  r(   c                   t        |j                  |      }t        j                  j	                  |      j                         rt        ddit        j                        S t        |j                  d|i      }|j                  d       |j                          t        | j                  |      t        j                        S )	NrO   detailz8Alloggiati credentials already exist for this structure.r   rP   )r.   contextTr/   )r    r   r   r   r   existsr   r	   HTTP_409_CONFLICTr   r.   r8   saver_   HTTP_201_CREATED)r>   r+   r   rP   r?   s        r   rB   z AlloggiatiCredentialAPIView.post   s     .gllLI	''...CJJLUV// 
 9 ),

 	D1,,Y7@W@WXXr!   zUpdate Alloggiati credentialsc                    t        |j                  |      }t        t        |      }t	        ||j
                  dd|i      }|j                  d       |j                          t        | j                  |            S )NrO   TrP   )r.   partialrd   r/   )
r    r   r   r   r   r.   r8   rg   r   r_   )r>   r+   r   rP   
credentialr?   s         r   patchz!AlloggiatiCredentialAPIView.patch   ss     .gllLI	&';yQ
8 ),	

 	D1,,Y788r!   zDelete Alloggiati credentialsc                    t        |j                  |      }t        t        |      }|j	                          t        | j                  |            S )NrO   )r    r   r   r   deleter   r_   )r>   r+   r   rP   rk   s        r   rn   z"AlloggiatiCredentialAPIView.delete   sC     .gllLI	&';yQ
,,Y788r!   N)rP   r   returndictrT   )rC   rD   rE   rF   r
   rG   r_   r   r   rS   r   r   rB   rl   rn   rH   r!   r   rW   rW   l   s    6)*
 ^2<=
9
9 ^/35 -HI
	YY" ^/3<=	99 ^/<=
9
9r!   rW   N)r   rU   ro   r   )#rF   
__future__r   django.db.modelsr   django.shortcutsr   drf_spectacular.utilsr   r   rest_frameworkr	   rest_framework.permissionsr
   rest_framework.responser   rest_framework.viewsr   alloggiati.modelsr   r   alloggiati.serializersr   r   r   r   r   alloggiati.servicer   structures.modelsr   r    r#   rJ   rW   rH   r!   r   <module>r}      sg    #  . @ ! 6 , ( E  1 '2!4G !4PK7 K(O9' O9r!   