Estoy trabajando sobre un modulo que hecha una programación de turnos para citas medicas, se ofrecen los turnos en venta, sucede que dos cajeras pueden tomar el mismo turno simultáneamente, y las 2 llegan a terminar la venta pero el turno queda con el nombre del ultimo paciente que realizo la compra. De que manera se puede controlar que el turno ya vendido a una persona, no pueda ser vendido a otra persona cuando la transacción se realice en simultaneo. Si alguien me da algún alcance estaré agradecido. O algun modulo del core donde se utilice esa validación.
Saludos
Puedes hacer un bloqueo a nivel de tabla para asegurar que no hay 2 usuarios/sesiones intentando acceder al mismo turno.
By default Tryton uses repeatable read transaction isolation.
Also in recent version, there is the Database.lock_id which allows to lock only an id instead of the all table.
Creo que el problema es como esta modelado los horarios y los pacientes que lo compran.
A mi modo de ver las 2 cajeras no estan asignando un paciente a un horario sino editando un campo del horario.
si existiera un modelo intermedio simplemente aplica un constraint e impediría que se repita el horario y a la última cajera le saldría mensaje de error e impediría asignar ese horario.
sería algo así:
HorarioPaciente ():
__name__ = 'modulo.paciente.horario'
paciente = fields.Many2One('modulo.paciente', 'Paciente')
horario = fields.Many2One('modulo.horario', 'Horario')
@classmethod
def __setup__(cls):
super(HorarioPaciente, cls).__setup__()
table = cls.__table__()
cls._sql_constraints += [
('unique_horario', Unique(table, table.horario),
'El Horario debe ser unico')
]