Commit 24b7fc9a by Lucía Elizo Gómez

Plugin biaprint

parent 58123b41
# kadi-plugin-biaprint # kadi-plugin-biaprint
Plugin de **Kadi4Mat** que expone un endpoint HTTP para recibir archivos Plugin de **Kadi4Mat** que expone un endpoint HTTPS para recibir archivos
automáticamente desde una Raspberry Pi y crearlos como Records en la plataforma. automáticamente desde Raspberry Pi, analizarlos y subirlos a la plataforma.
## Arquitectura ## Arquitectura
``` ```
Raspberry Pi ──► POST /api/biaprint/folder ──► Plugin BiaPrint ──► Record en Kadi4Mat Raspberry Pi (Transfer.py) ──► POST /api/biaprint/folder ──► Plugin BiaPrint ──► Record en Kadi4Mat
(multipart/form-data) + archivos adjuntos (multipart/form-data) + archivos adjuntos
Authorization: Bearer <PAT> + extras/métricas Authorization: Bearer <PAT> + extras/métricas
+ folder_name + etiquetas automáticas + folder_name + etiquetas automáticas
+ files[] (mp4, json, ...) + Collection del año + files[] (mp4, json, ...) + Collection (año actual)
``` ```
## Configuracion en /kadi_plugin_biaprint/pyproject.toml (registro de endpoint)
## Instalación en el servidor Kadi4Mat ```python
[project]
name = "biaprint"
version = "0.1.0"
description = "Kadi4Mat plugin for 3D printing sessions"
requires-python = ">=3.10"
dependencies = [
"kadi"
]
```bash [project.entry-points."kadi_plugins"]
# Dentro del entorno virtual de Kadi4Mat (source /venv/bin/activate) biaprint = "kadi_plugin_biaprint.plugin"
pip install -e /ruta/al/kadi_plugin_biaprint/ ```
## Configuracion en /kadi_plugin_biaprint/setup.py
# Verificar que Kadi detecta el plugin ```python
pip show biaprint from setuptools import setup, find_packages
setup(
name="kadi_plugin_biaprint",
version="0.1.0",
packages=find_packages(),
entry_points={
"kadi_plugins": [
"biaprint = kadi_plugin_biaprint.plugin",
],
},
)
``` ```
## Configuración en /opt/kadi/config/kadi.py ## Configuración en /opt/kadi/config/kadi.py
...@@ -30,23 +52,42 @@ PLUGINS = ["...", "biaprint"] ...@@ -30,23 +52,42 @@ PLUGINS = ["...", "biaprint"]
PLUGIN_CONFIG = { PLUGIN_CONFIG = {
"biaprint": { "biaprint": {
"host": "https://tu-kadi.dominio.com", "host": "https://192.168.128.44",
"api_token": "TU_TOKEN",
"upload_dir": "/tmp/biaprint_uploads", "upload_dir": "/tmp/biaprint_uploads",
}, },
} }
``` ```
## Instalación en el servidor Kadi4Mat
```bash
# Dentro del entorno virtual de Kadi4Mat (source /venv/bin/activate)
pip install -e /ruta/al/kadi_plugin_biaprint/
# Verificar que Kadi detecta el plugin
pip show biaprint
```
Reiniciar tras cualquier cambio: Reiniciar servicios tras cualquier cambio:
```bash ```bash
sudo systemctl restart kadi-uwsgi sudo systemctl restart kadi-uwsgi apache2
``` ```
## Endpoints disponibles ## Endpoints disponibles
| Método | Ruta | Autenticación | Descripción | | Método | Ruta | Autenticación | Descripción |
|--------|------------------------|---------------------|------------------------------------------| |--------|------------------------|---------------------|------------------------------------------|
| GET | /biaprint/health | ninguna | Comprobación de que el plugin está activo| | GET | /biaprint/health | ninguna | Comprobacion de que el plugin esta activo|
| POST | /api/biaprint/folder | Bearer PAT (Token) | Recibe una sesión y crea el Record | | POST | /api/biaprint/folder | Bearer PAT (Token) | Recibe una sesion y crea el Record |
## Qué hace el endpoint /api/biaprint/folder
1. Lee el archivo `session_data.json` incluido en `files[]` y extrae métricas (diccionario)
2. Genera etiquetas según material, temperatura, duración y estado
3. Busca o crea la colección del año actual (ej: "2026")
4. Crea el Record con título, descripción, métricas como metadatos y etiquetas
5. Vincula el Record a la colección
6. Sube todos los archivos al Record, **excluyendo** las fotos de `cam1/` y `cam2/`
## Formato del JSON de metadatos ## Formato del JSON de metadatos
...@@ -64,15 +105,6 @@ sudo systemctl restart kadi-uwsgi ...@@ -64,15 +105,6 @@ sudo systemctl restart kadi-uwsgi
} }
``` ```
## Qué hace el endpoint /api/biaprint/folder
1. Lee el archivo `session_data.json` incluido en `files[]` y extrae métricas (diccionario)
2. Genera etiquetas según material, temperatura, duración y estado
3. Busca o crea la colección del año actual (ej: "2026")
4. Crea el Record con título, descripción, métricas como metadatos y etiquetas
5. Vincula el Record a la colección
6. Sube todos los archivos al Record, **excluyendo** las fotos de `cam1/` y `cam2/`
## Etiquetas automáticas generadas ## Etiquetas automáticas generadas
...@@ -92,12 +124,12 @@ sudo systemctl restart kadi-uwsgi ...@@ -92,12 +124,12 @@ sudo systemctl restart kadi-uwsgi
## Estructura esperada de la carpeta ## Estructura esperada de la carpeta
``` ```
sesion_2026-05-28/ sesion_2026-05-20/
├── session_data.json ← telemetría de la sesión (lista de samples) ├── session_data.json ← telemetría de la sesión (lista de samples)
├── video.mp4 ← vídeo de la impresión ├── video.mp4 ← vídeo de la impresión
├── cam1/ ← fotos de cámara 1 (se excluyen del upload) ├── cam1/ ← fotos de cámara 1 (se excluyen)
│ └── frame_000001.jpg │ └── frame_000001.jpg
└── cam2/ ← fotos de cámara 2 (se excluyen del upload) └── cam2/ ← fotos de cámara 2 (se excluyen)
└── frame_000001.jpg └── frame_000001.jpg
``` ```
......
...@@ -252,7 +252,7 @@ def _get_or_create_collection(host: str, pat: str, year_title: str): ...@@ -252,7 +252,7 @@ def _get_or_create_collection(host: str, pat: str, year_title: str):
session.headers["Authorization"] = f"Bearer {pat}" session.headers["Authorization"] = f"Bearer {pat}"
session.verify = False # ajustar segun entorno session.verify = False # ajustar segun entorno
# Busqueda # Busqueda con .get
r = session.get( r = session.get(
f"{host}/api/v1/collections", f"{host}/api/v1/collections",
params={"query": f'"{year_title}"', "per_page": 10}, params={"query": f'"{year_title}"', "per_page": 10},
...@@ -262,7 +262,7 @@ def _get_or_create_collection(host: str, pat: str, year_title: str): ...@@ -262,7 +262,7 @@ def _get_or_create_collection(host: str, pat: str, year_title: str):
if col.get("title") == year_title: if col.get("title") == year_title:
return col, False return col, False
# Creacion # Creacion con .post
identifier = _make_identifier(year_title) identifier = _make_identifier(year_title)
r = session.post( r = session.post(
f"{host}/api/v1/collections", f"{host}/api/v1/collections",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment