fase 2.5: formularios digitales y consentimientos (modulo skeen_formularios: plantillas con 12 tipos de campo, versionado, respuestas con firma PNG y fotos antes/despues, portal publico con token HMAC y limite de subida, historial por paciente, permisos y notificacion de envio)
This commit is contained in:
68
odoo-addons/skeen_formularios/models/formulario_respuesta.py
Normal file
68
odoo-addons/skeen_formularios/models/formulario_respuesta.py
Normal file
@@ -0,0 +1,68 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Respuesta (instancia llenada) de una plantilla de formulario.
|
||||
|
||||
Guarda el snapshot de versión de la plantilla (`plantilla_version`), las
|
||||
respuestas como JSON en `respuestas`, la firma como PNG en `firma_imagen`
|
||||
(Binary) y las fotos/archivos en `skeen.formulario.adjunto`.
|
||||
|
||||
El `token` es un HMAC que viaja en el enlace público; una vez llenada la
|
||||
respuesta el token deja de ser válido para reenvíos.
|
||||
"""
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class SkeenFormularioRespuesta(models.Model):
|
||||
_name = 'skeen.formulario.respuesta'
|
||||
_description = 'Respuesta de formulario'
|
||||
_order = 'create_date desc, id desc'
|
||||
|
||||
name = fields.Char(string='Folio', readonly=True, copy=False)
|
||||
plantilla_id = fields.Many2one('skeen.formulario.plantilla', string='Plantilla',
|
||||
required=True, ondelete='restrict', index=True)
|
||||
plantilla_version = fields.Integer(string='Versión de la plantilla', default=1)
|
||||
partner_id = fields.Many2one('res.partner', string='Paciente', required=True,
|
||||
ondelete='cascade', index=True,
|
||||
domain=[('is_patient', '=', True)])
|
||||
cita_id = fields.Many2one('skeen.cita', string='Cita', ondelete='set null', index=True)
|
||||
respuestas = fields.Text(string='Respuestas (JSON)', default='{}')
|
||||
firma_imagen = fields.Binary(string='Firma (PNG)', attachment=True)
|
||||
firma_nombre = fields.Char(string='Firmado por')
|
||||
foto_ids = fields.One2many('skeen.formulario.adjunto', 'respuesta_id', string='Fotos y archivos')
|
||||
|
||||
estado = fields.Selection([
|
||||
('borrador', 'Borrador'),
|
||||
('enviado', 'Enviado'),
|
||||
('llenado', 'Llenado'),
|
||||
('cancelado', 'Cancelado'),
|
||||
], string='Estado', default='borrador', required=True, index=True)
|
||||
|
||||
enviado_at = fields.Datetime(string='Enviado el')
|
||||
llenado_at = fields.Datetime(string='Llenado el')
|
||||
token = fields.Char(string='Token', index=True, copy=False)
|
||||
canal_envio = fields.Selection([
|
||||
('whatsapp', 'WhatsApp'),
|
||||
('email', 'Correo'),
|
||||
('enlace', 'Enlace'),
|
||||
('manual', 'Manual'),
|
||||
], string='Canal de envío', default='enlace')
|
||||
ip_llenado = fields.Char(string='IP de llenado')
|
||||
creado_por_empleado = fields.Boolean(string='Llenado por el personal', default=False)
|
||||
notas = fields.Text(string='Notas')
|
||||
|
||||
_sql_constraints = [
|
||||
('token_uniq', 'unique(token)',
|
||||
'El token del formulario debe ser único.'),
|
||||
]
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
for vals in vals_list:
|
||||
if not vals.get('name'):
|
||||
vals['name'] = (self.env['ir.sequence'].next_by_code('skeen.formulario.respuesta')
|
||||
or 'FORM-00001')
|
||||
return super().create(vals_list)
|
||||
|
||||
def tiene_firma(self):
|
||||
self.ensure_one()
|
||||
return bool(self.firma_imagen)
|
||||
Reference in New Issue
Block a user