
    ?&j                    |    d Z ddlmZ ddlZddlmZ  G d dej                        Z G d dej                        Zy)	u   
alloggiati/models.py
====================
Persistence layer for Alloggiati Web sync operations.

No guest PII (names, document numbers) is ever stored — only
aggregated counts and status metadata.
    )annotationsN)modelsc                  z   e Zd ZdZdZdZedfedfgZ ej                  dej                  d      Z
 ej                  d	eed
      Z ej                  dd      Z ej                  dd      Z ej                  dd      Z ej                  dd      Z ej$                  d      Z ej$                  d      Z G d d      ZddZedd       Zej2                  dd       Zedd       Zej2                  dd       Zedd       Zej2                  dd       Zedd       Zej2                  dd       Zy)AlloggiatiCredentiala  
    Stores encrypted Alloggiati Web credentials for a structure.

    Supports two authentication modes:
      - DIGITAL_CERTIFICATE: mTLS client certificate + private key
      - CODES: username / password (web service key)

    Sensitive fields are stored encrypted via istat.security helpers
    (Fernet symmetric encryption keyed from settings.SECRET_KEY or
    ISTAT_CREDENTIAL_ENCRYPTION_KEY).
    DIGITAL_CERTIFICATECODESzDigital Certificate (mTLS)zCodes (Web Service Key)structures.Structurealloggiati_credential	on_deleterelated_name    z'Authentication mode for Alloggiati Web.)
max_lengthchoicesdefault	help_textT blankr   )auto_now_add)auto_nowc                      e Zd ZdZy)AlloggiatiCredential.Metaalloggiati_credentialsN)__name__
__module____qualname__db_table     /backend/alloggiati/models.pyMetar   =   s    +r    r"   c                :    d| j                    d| j                   S )NzAlloggiatiCredential [z] for )mode	structureselfs    r!   __str__zAlloggiatiCredential.__str__@   s    '		{&8HIIr    c                2    ddl m}  || j                        S Nr   )decrypt_istat_secret)istat.securityr+   username_encryptedr'   r+   s     r!   usernamezAlloggiatiCredential.usernameG       7#D$;$;<<r    c                *    ddl m}  ||      | _        y Nr   )encrypt_istat_secret)r,   r3   r-   r'   valuer3   s      r!   r/   zAlloggiatiCredential.usernameL       7"6u"=r    c                2    ddl m}  || j                        S r*   )r,   r+   password_encryptedr.   s     r!   passwordzAlloggiatiCredential.passwordQ   r0   r    c                *    ddl m}  ||      | _        y r2   )r,   r3   r8   r4   s      r!   r9   zAlloggiatiCredential.passwordV   r6   r    c                2    ddl m}  || j                        S r*   )r,   r+   certificate_encryptedr.   s     r!   certificatez AlloggiatiCredential.certificate[       7#D$>$>??r    c                *    ddl m}  ||      | _        y r2   )r,   r3   r<   r4   s      r!   r=   z AlloggiatiCredential.certificate`       7%9%%@"r    c                2    ddl m}  || j                        S r*   )r,   r+   private_key_encryptedr.   s     r!   private_keyz AlloggiatiCredential.private_keye   r>   r    c                *    ddl m}  ||      | _        y r2   )r,   r3   rB   r4   s      r!   rC   z AlloggiatiCredential.private_keyj   r@   r    Nreturnstr)r5   rG   rF   None)r   r   r   __doc__MODE_DIGITAL_CERTIFICATE
MODE_CODESMODE_CHOICESr   OneToOneFieldCASCADEr%   	CharFieldr$   	TextFieldr-   r8   r<   rB   DateTimeField
created_at
updated_atr"   r(   propertyr/   setterr9   r=   rC   r   r    r!   r   r      s   
  5J 
"#?@	./L
 %$$..,I
 6;	D *))bA)))bA -F,,4D,F,,4D%%%48J%%%t4J, ,J = = __> > = = __> > @ @ A A @ @ A Ar    r   c                  N   e Zd ZdZ G d dej
                        Z ej                  dej                  d      Z
 ej                  dej                  d	      Z ej                         Z ej                         Z ej"                  d
ej$                  ej&                        Z ej*                  dd      Z ej.                  d      Z ej.                  d      Z ej4                  ed      Z ej:                         Z ej:                  dd      Z G d d      Z ddZ!y)AlloggiatiSyncLogu   
    Immutable audit record for a single Alloggiati Web sync attempt.

    One record is created per sync call regardless of outcome.
    No guest PII is stored — only aggregated counts and status.
    c                      e Zd ZdZdZdZy)AlloggiatiSyncLog.Status)	CONNECTEDzConnected (all guests sent))PARTIALzPartial (some guests rejected))ERRORzError (sync failed)N)r   r   r   rZ   r[   r\   r   r    r!   StatusrY   x   s    >	=.r    r]   TF)primary_keyr   editabler	   alloggiati_sync_logsr      )r   r   r   r   r   r   )r   )r   r   )nullr   c                      e Zd ZdZdgZy)AlloggiatiSyncLog.Metar`   z-started_atN)r   r   r   r   orderingr   r    r!   r"   rd      s    )!?r    r"   c                n    d| j                    d| j                   d| j                   d| j                   S )NzAlloggiatiSyncLog [z]  u   →)statusr%   	date_fromdate_tor&   s    r!   r(   zAlloggiatiSyncLog.__str__   s9    !$++b~~a~~c$,,1	
r    NrE   )"r   r   r   rI   r   TextChoicesr]   	UUIDFielduuiduuid4id
ForeignKeyrN   r%   	DateFieldri   rj   rO   r   r\   rh   rP   messagePositiveIntegerFieldguests_sentguests_rejected	JSONFieldlistvalidation_errorsrQ   
started_atcompleted_atr"   r(   r   r    r!   rW   rW   p   s#   /## /
 
		dDJJ	OB!!!..+I !  "If G VF
 fT26G .&--a8K1f11!<O )((TB &%%'J'6''T>L# #
r    rW   )	rI   
__future__r   rm   	django.dbr   Modelr   rW   r   r    r!   <module>r~      s:    #  \A6<< \A~9
 9
r    