Volver a la API del backend

Backend

Registro de actividad

Quién hizo qué, cuándo. Un registro por cada acción relevante, de solo lectura — nadie puede editar ni borrar estos registros desde la aplicación.

Acceso: solo admin / sistemas

Qué se registra

Siete tipos de acción: crear, editar, eliminar, activar, desactivar, login, logout. Sobre estos modelos: Producto, Variante, Categoría, Proveedor, Almacén, Movimiento de inventario, Usuario, Cliente, Pedido, Envío, Orden de compra, Embarque, Muestra, Comprobante, Pago, Nota de crédito y Foto de producto.

Cómo se captura (y por qué no es tan simple como parece)

Lo intuitivo sería usar señales de Django (post_save/post_delete). Este sistema no las usa para las operaciones de negocio, por dos razones deliberadas:

Los movimientos de inventario, líneas de pedido y costos de importación se crean con bulk_create() — y Django no dispara post_save en un bulk_create. Un enfoque por señales dejaría fuera, en silencio, justo las operaciones más sensibles de auditar.
Las vistas ya tienen request.user a mano. Resolver quién hizo la acción vía señales exigiría un middleware con estado en un hilo (thread-local), una capa extra de complejidad evitable.

En su lugar, un RegistraActividadMixin se añade a cada ViewSet y sobreescribe perform_create/perform_update/perform_destroy. Cuando un ViewSet tiene lógica propia más compleja (crear un usuario, emitir un comprobante, confirmar un pago o una orden), se llama a apps.actividad.services.registrar() a mano, en el punto exacto donde ocurre la acción de negocio.

La única excepción: login y logout

Iniciar y cerrar sesión sí se capturan por señales de Django (user_logged_in / user_logged_out) — no hay una "vista" de negocio donde enganchar el mixin, así que aquí sí tiene sentido.

Quién puede verlo

Solo admin y sistemas — ni siquiera la lectura es abierta a cualquier autenticado (SoloAdminOSistemas, la única regla de permisos de todo el sistema que restringe también el GET). Cualquier otro rol que abra la sección Actividad en la intranet verá un mensaje de "sin permiso"; el control real ocurre en el servidor (403), la pantalla solo refleja eso.

El endpoint (filtros, paginación) está en La API del motor; cómo se ve desde la intranet, en Administración.