Backend
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.
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.
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:
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.
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.
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.