Nachtrag: Migration 0030 (App-Store-Batch-1-Merkmale) war im letzten
Commit versehentlich nicht mit dabei - jetzt nachgeholt (git status hat
es aufgedeckt).
Neue Tabelle workspace_webapps (Migration 0032): kundeneigene
{name, url}-Eintraege pro Workspace, kein fester Katalog wie bei
Merkmalen - jede Organisation/jeder Workspace hat ihre/seine eigene
Liste (Nutzer-Anforderung 09.09.2026: 'der Kunde hat diverse URLs').
app.py-Aenderungen:
- fetch_favicon(): bestes-Effort-Ermittlung des Website-Favicons
(erst <link rel=icon> per Regex aus dem HTML, sonst /favicon.ico an
der Domain-Wurzel) - bewusst ohne neue pip-Abhaengigkeit (nur
urllib, passt zum bisher sehr schlanken requirements.txt).
- CRUD-Endpunkte /api/v1/workspaces/{id}/webapps[/{webapp_id}]
(GET/POST/PUT/DELETE), Icon-Serving unter /webapp-icons/{filename}
(unauthentifiziert wie /golden-images/, gleicher
Path-Traversal-Schutz).
- Checkin-Response um 'webapps' erweitert (fetch_workspace_webapps(),
gleiches assignments->bereitstellungsvorlagen-Join-Muster wie
fetch_assigned_blueprints()).
- WICHTIG: Server komponiert nie eine eigene oeffentliche URL (ANODE_URL
ist nur client-seitig bekannt, siehe agent.py/backend.sh) - Checkin
liefert nur den relativen icon_path, der Agent haengt ANODE_URL davor.
Gehört zusammen mit admin/ansible-content (neue Rolle
webapp-shortcuts, echt end-to-end getestet) und admin/kundenplattform
(Admin-UI unter /admin/technik/workspaces/{id}, Icon-Proxy analog zum
bestehenden ISO-Download-Proxy-Muster).
Live auf anode angewendet: Migration 0032 (workspace_webapps-Tabelle).
app.py-Deployment (git pull + Neustart) folgt separat.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
104 lines
4.8 KiB
PL/PgSQL
104 lines
4.8 KiB
PL/PgSQL
BEGIN;
|
|
|
|
-- Erste Batch Phase 2 (App-Store-Merkmale, siehe
|
|
-- project_phase2_app_store_merkmale-Memory): 28 Apps mit regulärem
|
|
-- Debian/Ubuntu-Paket, per apt-cache auf einer echten Debian-trixie-Quelle
|
|
-- verifiziert (09.09.2026), kein Flatpak nötig - apt/deb hat laut
|
|
-- Nutzer-Entscheidung ohnehin Vorrang. Nur die drei apt-basierten Backends
|
|
-- (mint-image/debian-image/ubuntu-image), Fedora bewusst ausgeklammert.
|
|
|
|
INSERT INTO merkmale (id, key, name, description, kategorie_id, im_auftragskatalog) VALUES
|
|
(gen_random_uuid(), 'gimp', 'GIMP', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
|
|
(gen_random_uuid(), 'inkscape', 'Inkscape', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
|
|
(gen_random_uuid(), 'scribus', 'Scribus', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
|
|
(gen_random_uuid(), 'librecad', 'LibreCAD', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'kreativ-grafik'), TRUE),
|
|
(gen_random_uuid(), 'audacity', 'Audacity', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
|
|
(gen_random_uuid(), 'musescore', 'MuseScore', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
|
|
(gen_random_uuid(), 'metronome', 'Metronom', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
|
|
(gen_random_uuid(), 'minuet', 'Minuet', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'musik-audio'), TRUE),
|
|
(gen_random_uuid(), 'stellarium', 'Stellarium', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
|
(gen_random_uuid(), 'octave', 'GNU Octave', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
|
(gen_random_uuid(), 'kalgebra', 'KAlgebra', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
|
(gen_random_uuid(), 'kalzium', 'KAlzium', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
|
(gen_random_uuid(), 'kbruch', 'KBruch', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
|
(gen_random_uuid(), 'step', 'Step (Physik-Simulator)', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
|
(gen_random_uuid(), 'tuxmath', 'Tux Math', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
|
(gen_random_uuid(), 'filius', 'Filius', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
|
(gen_random_uuid(), 'gcompris', 'GCompris', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-mathe-naturwissenschaft'), TRUE),
|
|
(gen_random_uuid(), 'ktouch', 'KTouch', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
|
|
(gen_random_uuid(), 'kwordquiz', 'KWordQuiz', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
|
|
(gen_random_uuid(), 'kanagram', 'Kanagram', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
|
|
(gen_random_uuid(), 'tuxtype', 'Tux Typing', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
|
|
(gen_random_uuid(), 'foliate', 'Foliate', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'bildung-sprache-schreiben'), TRUE),
|
|
(gen_random_uuid(), 'evolution', 'Evolution', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'buero-produktivitaet'), TRUE),
|
|
(gen_random_uuid(), 'kturtle', 'KTurtle', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'programmieren-making'), TRUE),
|
|
(gen_random_uuid(), 'fritzing', 'Fritzing', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'programmieren-making'), TRUE),
|
|
(gen_random_uuid(), 'remmina', 'Remmina', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'internet-kommunikation'), TRUE),
|
|
(gen_random_uuid(), 'geogebra', 'GeoGebra', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'unterrichtswerkzeuge'), TRUE),
|
|
(gen_random_uuid(), 'marble', 'Marble', NULL,
|
|
(SELECT id FROM kategorien WHERE key = 'unterrichtswerkzeuge'), TRUE);
|
|
|
|
INSERT INTO blueprints (id, merkmal_id, backend_id, ansible_role)
|
|
SELECT gen_random_uuid(), m.id, b.id, m.key
|
|
FROM merkmale m
|
|
JOIN backends b ON b.key IN ('mint-image', 'debian-image', 'ubuntu-image')
|
|
WHERE m.key IN (
|
|
'gimp',
|
|
'inkscape',
|
|
'scribus',
|
|
'librecad',
|
|
'audacity',
|
|
'musescore',
|
|
'metronome',
|
|
'minuet',
|
|
'stellarium',
|
|
'octave',
|
|
'kalgebra',
|
|
'kalzium',
|
|
'kbruch',
|
|
'step',
|
|
'tuxmath',
|
|
'filius',
|
|
'gcompris',
|
|
'ktouch',
|
|
'kwordquiz',
|
|
'kanagram',
|
|
'tuxtype',
|
|
'foliate',
|
|
'evolution',
|
|
'kturtle',
|
|
'fritzing',
|
|
'remmina',
|
|
'geogebra',
|
|
'marble'
|
|
);
|
|
|
|
COMMIT;
|