# encoding: utf-8
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
'''
@date: 14/4/2017
@author: Luis Zarate Montero
@contact: luis.zarate@solvosoft.com
@license: GPLv3
'''
import logging
from django.conf import settings
from rest_framework import mixins
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import GenericViewSet
from person.models import SignPersonRequest
from person.signer.serializer import Sign_Person_Request_Serializer, \
Sign_Person_Response_Serializer
logger = logging.getLogger(settings.DEFAULT_LOGGER_NAME)
[documentos]class SignPersonView(mixins.RetrieveModelMixin, mixins.CreateModelMixin, mixins.DestroyModelMixin, GenericViewSet):
"""
**Solucitud de Firma de documentos de una persona**
::
POST /sign/person/
Solicita una firma de un documento xml, odf o msoffice para un usuario
Los valores a suministrar en el parámetro data son:
* **person:** identificación de la persona solicitante de firma,
* **notification_url:** URL para la notificación (debe estar inscrita) o N/D si marca falso en not_webapp,
* **document:** Archivo en base64,
* **format:** tipo de archivo (xml_cofirma,xml_contrafirma, odf, msoffice),
* **algorithm_hash:** algoritmo usado para calcular hash,
* **document_hash:** hash del documento,
* **resumen:** Información de ayuda acerca del documento,
* **identification:** Identificación de la persona a firmar,
* **request_datetime:** Hora de petición en formato '%Y-%m-%d %H:%M:%S', osea '2006-10-25 14:30:59'
Data es un diccionario, osea un objeto de tipo clave -> valor
Los valores devueltos son:
* **expiration_datetime:** hora final de validez
* **request_datetime:** Hora de recepción de la solicitud
* **id_transaction:** Id de trasnacción en el FVA del BCCR
* **signed_document:** Normalmente None, es un campo para almacenar el documento, pero no se garantiza que venga el documento firmado
* **status:** Código de error de la transacción
* **identification:** Identificador del suscriptor
* **code:** Código para mostrar al usuario
* **received_notification** True si la autenticación ha sido procesada, False si está esperando al usuario
* **duration** Tiempo en segundos que dura la transacción
**Solucitud de información de una transacción de firmado**
::
GET /person/sign/{transaction_id}/
Verifica la firma dado un código y su respectiva identificación
Los valores a suministrar en el parámetro data son:
* **person:** identificación de la persona solicitante de firma,
* **identification:** Identificación de la persona a autenticar,
* **request_datetime:** Hora de petición en formato '%Y-%m-%d %H:%M:%S', osea '2006-10-25 14:30:59'
Data es un diccionario, osea un objeto de tipo clave -> valor
Los valores devueltos son:
* **expiration_datetime:** hora final de validez
* **request_datetime:** Hora de recepción de la solicitud
* **id_transaction:** Id de trasnacción en el FVA del BCCR
* **status:** Código de error de la transacción
* **identification:** Identificador del suscriptor
* **code:** Código para mostrar al usuario
* **received_notification** True si la autenticación ha sido procesada, False si está esperando al usuario
* **signed_document** Documento firmado en base64 o None si aún no se ha firmado la autenticación
* **duration** Tiempo en segundos que dura la transacción
**Elimina la información de la transacción de firma**
::
DELETE /person/authenticate/{transaction_id}/
Los valores devueltos son:
No tiene valores devueltos
"""
serializer_class = Sign_Person_Request_Serializer
queryset = SignPersonRequest.objects.all()
response_class = Sign_Person_Response_Serializer
permission_classes = [IsAuthenticated]
authentication_classes = [TokenAuthentication]
# def get_queryset(self):
# queryset = super().get_queryset()
# id_transaction = self.request.query_params.get('id_transaction', None)
# if id_transaction is not None:
# queryset = queryset.filter(id_transaction=id_transaction)
# else:
# queryset = queryset.none()
# return queryset
def retrieve(self, request, *args, **kwargs):
self.serializer_class = self.response_class
return super().retrieve(request, *args, **kwargs)