Usando señales en Django para controlar el stock

written by uve 12 July 2010

Ahora mismo estoy de lleno con la gestión del stock. El escenario es el siguiente:

# models.py
class Article(models.Model):
   ...
class Order(models.Model):
   ...
class OrderDetail(models.Model):
   order = models.ForeignKey('Order', ...)
   article = models.ForeignKey('Article', ...)
   amount = models.PositiveSmallIntegerField(...)
   ...

Tras analizarlo todo, lo más adecuado y sensato me parece utilizar el mecanismo de señales que ofrece Django para el control del stock.

from django.db.models import signals

# Almacenamiento temporal
temp_pre_save = {}

def watch_stock_handler(sender, instance, *args, **kwargs):
   # Cada vez que se inicie save, almacenamos la cantidad
   temp_pre_save[instance.id] = instance.amount

def update_stock_handler(sender, instance, created, *args, **kwargs):
   if created:
       # Directamente descontamos artículos
   else:
       if temp_pre_save[instance.id] > instance.amount:
           # Se añaden artículos al detalle
       elif temp_pre_save[instance.id] < instance.amount:
           # Se quitan artículos del detalle
   # Limpiamos el almacenamiento temporal
   temp_pre_save.pop(instance.id)

def delete_stock_handler(sender, instance, *args, **kwargs):
   # Restauramos la cantidad
   ...

# Añadimos los callbacks
signals.post_init.connect(watch_stock_handler, sender=OrderDetail)
signals.post_save.connect(update_stock_handler, sender=OrderDetail)
signals.pre_delete.connect(delete_stock_handler, sender=OrderDetail)

:)

Tags

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.