Aplicación de escritorio multiplataforma para la gestión de concursos y operaciones de radioaficionados OA (Perú), con arquitectura desacoplada, interfaz moderna y soporte para importación de datos desde múltiples formatos y países.
- Características principales
- Requisitos previos
- Instalación
- Uso
- Estructura del proyecto
- Scripts de Build Multiplataforma
- Automatización de Releases
- Formato de Logs
- Testing
- Licencia y condiciones de uso
- Créditos / Autoría
- Gestión de concursos y operaciones de radioaficionados OA.
- Base de datos local SQLite, sin dependencias externas.
- Importación automática de operadores desde listados oficiales en PDF (Perú, Uruguay), Excel (Argentina, Chile) o CSV.
- Feedback visual en importación: diálogo de espera traducido y resumen detallado (total, nuevos, actualizados, deshabilitados, rehabilitados).
- Manejo robusto de importaciones: los errores controlados de PDF, Excel o CSV se muestran con su mensaje real y no como confirmaciones ambiguas.
- Interfaz gráfica moderna con PySide6 (Qt), temas claro/oscuro y cambio de idioma.
- Verificación manual de actualizaciones desde Ayuda > Buscar actualizaciones, consultando el último release publicado en GitHub.
- Diálogo Acerca de con enlace directo al repositorio oficial de GitHub.
- Arquitectura desacoplada basada en Clean Architecture.
- Scripts de build para Linux, Windows y macOS.
- Workflows de GitHub Actions para releases automáticos en Linux, Windows x64, Windows 7 x86 legacy, macOS Intel y macOS Apple Silicon.
- Internacionalización modular y extensible.
- Pruebas unitarias y de integración con pytest.
- Python >= 3.10
- pip
- Linux, Windows o macOS
- Recomendado: entorno virtual (
venv)
Si vas a mantener una variante legacy para Windows 7 x86, usa un entorno virtual separado para cada stack.
- Variante moderna: Python 3.10+ con PySide6.
- Variante legacy Win7 x86: Python 3.8 x86 con PySide2.
No conviene mezclar ambos stacks en el mismo venv, porque las dependencias Qt y el tooling de empaquetado son incompatibles entre sí.
La variante legacy requiere que el sistema operativo tenga instalados componentes de runtime que no vienen presentes en muchas instalaciones limpias de Windows 7.
- Windows 7 SP1 x86.
- Universal CRT para Windows 7: actualización KB2999226.
- Microsoft Visual C++ Redistributable x86 para Visual Studio 2015 (VC++ 14.0).
Si al abrir el ejecutable aparece el error api-ms-win-crt-runtime-l1-1-0.dll, el problema no está en Logger OA sino en el sistema operativo: falta el Universal CRT. Instala primero KB2999226 y luego el redistribuible VC++ x86.
PySide6>=6.9.2pdfplumberreportlabsqlite3(incluida en Python)
pyinstaller(para generar ejecutables)
- Clona el repositorio y accede a la carpeta del proyecto:
git clone <URL_DEL_REPOSITORIO>
cd "Logger-OA"
2. Crea y activa el entorno virtual correspondiente. Si solo trabajas con la variante moderna, usa `.venv` en cualquier plataforma. Si además mantendrás Win7 x86, crea un segundo entorno dedicado para legacy.
**Linux:**
```bash
python3 -m venv .venv
source .venv/bin/activate
macOS:
python3 -m venv .venv
source .venv/bin/activateWindows (cmd):
python -m venv .venv
.venv\Scripts\activateWindows (PowerShell):
python -m venv .venv
.venv\Scripts\Activate.ps1- Instala las dependencias de la variante que vayas a usar:
Para la variante legacy de Windows 7 x86:
# Variante moderna para desarrollo y builds pip install -r requirements-dev-modern.txtC:\Python38-32\python.exe -m venv .venv-win7-x86 .venv-win7-x86\Scripts\python.exe -m pip install -r requirements-dev-legacy.txt
- Ejecuta la aplicación:
python src/main.py
Variante moderna:
scripts\setup-windows-modern.batVariante legacy Win7 x86:
scripts\setup-windows-legacy.bat C:\Python38-32\python.exeEl segundo script requiere una instalación separada de Python 3.8 de 32 bits. El script valida ambos requisitos antes de crear .venv-win7-x86.
python src/main.pyfrom src.application.use_cases.update_operators_from_pdf import update_operators_from_pdf
resultado = update_operators_from_pdf('BaseDocs/396528-radioaficionados_autorizados_al_24sep2025.pdf')
print(resultado)El manual de usuario completo está disponible desde la propia aplicación, en el menú Ayuda > Manual de uso.
Desde Ayuda > Acerca de puedes abrir el enlace al repositorio oficial de Logger OA en GitHub.
Desde Ayuda > Buscar actualizaciones puedes consultar el último release publicado. Si hay una versión más nueva, la app ofrece abrir la página del release en el navegador para descargarla.
- Abre la aplicación.
- Ve al menú "Base de datos > Importar > Importar desde PDF" y selecciona el archivo oficial.
- Al finalizar, se muestra un resumen detallado (total, nuevos, actualizados, deshabilitados, rehabilitados).
Enteren el campo de indicativo: intenta registrar el contacto directamente.Ctrl+Enteren el campo de indicativo: envía el indicativo a la cola de espera.- En logs de concurso,
Espacioen el campo de indicativo mueve el foco aintercambio recibido. - En logs de concurso,
Enterenintercambio recibidointenta registrar el contacto si los datos son válidos.
El proyecto sigue los principios de Clean Architecture, separando responsabilidades en capas bien definidas:
src/
main.py # Punto de entrada de la aplicación
domain/ # Entidades y lógica de negocio pura
entities/ # Modelos de dominio (Operador, Concurso, Contacto, etc.)
repositories/ # Interfaces de repositorios
use_cases/ # Casos de uso del dominio
application/ # Casos de uso y lógica de aplicación
use_cases/ # Gestión, importación desde PDF, etc.
infrastructure/ # Implementaciones técnicas
db/ # Acceso y gestión de base de datos SQLite
pdf/ # Extracción y procesamiento de PDF
repositories/ # Repositorios concretos
interface_adapters/ # Adaptadores de interfaz
ui/ # Interfaz gráfica (PySide6)
views/ # Vistas principales (Welcome, LogOps, LogContest, DBTableWindow, etc.)
dialogs/ # Diálogos y ventanas auxiliares (incl. feedback visual)
themes/ # Temas visuales (claro/oscuro)
controllers/ # Controladores de UI
config/ # Configuración, rutas y settings
translation/ # Internacionalización y traducciones
utils/ # Utilidades puras
assets/ # Recursos gráficos (iconos, GIFs, etc.)
BaseDocs/ # Documentos oficiales OA (PDF)
scripts/ # Scripts de build multiplataforma
build-linux.sh # Build para Linux
build-mac.sh # Build para macOS
build-windows.bat # Build para Windows
build-windows-legacy.bat # Build para Windows 7 x86
tests/ # Pruebas unitarias y de integración
[ UI / Interface Adapters ] <--> [ Application ] <--> [ Domain ] <--> [ Infrastructure ]
El sistema de traducciones es modular y extensible. Los archivos de traducción se encuentran en src/translation/<idioma>/ y están organizados por subdiccionarios en un archivo all_keys.py (ALL_KEYS_TRANSLATIONS UI_TRANSLATIONS MENUS_TRANSLATIONS TABLE_HEADERS_TRANSLATIONS), etc.).
Para agregar un nuevo idioma:
- Crea una carpeta en
src/translation/con el código del idioma (ej:fr/para francés). - Copia y adapta el archivo de traducción existente.
- El loader central (
translations.py) combinará automáticamente los módulos.
En la carpeta scripts/ hay scripts para generar ejecutables en Linux, macOS y Windows usando PyInstaller:
build-linux.shbuild-mac.shbuild-windows.batbuild-windows-legacy.bat
Ejecuta el script correspondiente para generar el ejecutable standalone.
Para Linux y macOS, el flujo moderno usa el entorno .venv y requirements-dev-modern.txt.
Ejemplos:
./scripts/build-linux.sh
./scripts/build-mac.shEn Windows:
scripts\build-windows.bat
scripts\build-windows-legacy.batPara Windows hay dos rutas distintas:
build-windows.bat: build moderno con el entorno.venv.build-windows-legacy.bat: build legacy Win7 x86 con el entorno.venv-win7-x86.
En la variante legacy Win7 x86 el resultado se genera como ejecutable onefile en dist\LoggerOA-win7.exe, construido con LoggerOA.win7-x86.spec y el entorno .venv-win7-x86.
En la variante moderna, build-windows.bat usa LoggerOA.spec como fuente de verdad del empaquetado y genera dist\LoggerOA.exe.
En Linux y macOS, los scripts generan src/version.py desde el tag o commit actual y empaquetan también la carpeta assets, incluyendo las fuentes RobotoMono-Regular.ttf y RobotoMono-Bold.ttf.
El repositorio incluye workflows de GitHub Actions para generar builds de release automáticamente cuando se publica un tag con formato v* o cuando se lanzan manualmente vía workflow_dispatch.
Workflows disponibles:
- Linux x64:
.github/workflows/build-linux-release.yml - Windows moderno x64:
.github/workflows/build-windows-release.yml - Windows legacy Win7 x86:
.github/workflows/build-windows-legacy-release.yml - macOS Intel x64 y Apple Silicon ARM64:
.github/workflows/build-macos-release.yml
Assets generados por tag:
LoggerOA-linux-x64.tar.gzLoggerOA-windows-x64.zipLoggerOA-windows-win7-x86.zipLoggerOA-macos-intel-x64.zipLoggerOA-macos-arm64.zip
Contenido principal por plataforma:
LoggerOA-windows-x64.zipcontieneLoggerOA.exe.LoggerOA-windows-win7-x86.zipcontieneLoggerOA-win7.exe.LoggerOA-macos-intel-x64.zipyLoggerOA-macos-arm64.zipcontienenLoggerOA.app.LoggerOA-linux-x64.tar.gzcontiene el binarioLoggerOA.
Importante:
- Los nombres públicos de los artefactos son estables entre releases para que los enlaces
latest/download/...no cambien en cada versión. - Los workflows deben existir ya en el commit al que apunta el tag.
- Los builds de macOS no incluyen firma ni notarización de Apple.
- La variante legacy sigue requiriendo Python 3.8 x86 y dependencias separadas.
Compatibilidad de logs:
- Los logs SQLite creados por versiones antiguas siguen siendo abribles por las versiones actuales.
- Si un log legacy contiene timestamps guardados como texto en formato
YYYY-MM-DD_HH-MM-SS, la app los normaliza automáticamente al abrirlo y actualiza el archivo al formato versionado actual.
La especificación formal del formato actual de logs se encuentra en BaseDocs/log_file_format_v2.md.
Resumen:
- Cada log se guarda como un archivo SQLite independiente.
- El formato actual usa
PRAGMA user_version = 2. - La migración desde variantes legacy ocurre automáticamente al abrir el archivo.
Las pruebas unitarias y de integración se encuentran en la carpeta tests/ y utilizan pytest.
Para ejecutar todas las pruebas:
pytestEste software se distribuye bajo la licencia MIT. Puedes copiarlo, modificarlo y crear tus propias versiones, siempre y cuando menciones a los desarrolladores originales en los créditos:
- Miguel OA4BAU
- Raquel OA4EHN
No se aceptan sugerencias ni mejoras en este repositorio oficial. Eres libre de crear y distribuir tus propias versiones, respetando la mención a los autores.
Disclaimer: Este software se proporciona "tal cual", sin garantías de ningún tipo, expresas o implícitas. Los autores no se hacen responsables por daños, pérdidas o cualquier consecuencia derivada del uso del software. Úsalo bajo tu propio riesgo.
- Miguel OA4BAU
- Raquel OA4EHN
- Moises OA4EFJ