Leopoldadmin
dfa4a82e8d
feat(core): add address i18n keys (en)
2026-07-04 00:20:46 +00:00
Leopoldadmin
1e74efd2b4
feat(core): add address i18n keys (de)
2026-07-04 00:20:46 +00:00
Leopoldadmin
bc0aae0325
feat(core): add address fields to ContactForm
2026-07-04 00:20:30 +00:00
Leopoldadmin
f31baa444a
feat(core): add address fields to CompanyForm
2026-07-04 00:20:29 +00:00
Leopoldadmin
ec0353f469
feat(core): add address fields to contact service serialization and CRUD
2026-07-04 00:19:23 +00:00
Leopoldadmin
11527c4c95
feat(core): add address fields to company service serialization and CRUD
2026-07-04 00:18:45 +00:00
Leopoldadmin
59c787ba66
feat(core): add address fields to contact schemas
2026-07-04 00:15:25 +00:00
Leopoldadmin
01556534f2
feat(core): add address fields to company schemas
2026-07-04 00:15:25 +00:00
Leopoldadmin
c098180fa1
feat(core): add alembic migration for address fields
2026-07-04 00:15:24 +00:00
Leopoldadmin
36fcb33d7e
feat(core): add address fields to Contact model
2026-07-04 00:15:23 +00:00
Leopoldadmin
74284b3359
feat(core): add address fields to Company model
2026-07-04 00:15:22 +00:00
Leopoldadmin
997d60138a
Fix route: use model_fields_set to pass _UNSET when role_id not sent, None when explicitly null
2026-07-03 20:43:55 +00:00
Leopoldadmin
d7691b3d70
Fix role_id sentinel bug: use _UNSET sentinel so None explicitly clears FK, missing param leaves unchanged
2026-07-03 20:43:00 +00:00
Leopoldadmin
2deb7ed21c
Problem 3/5: Add i18n keys for systemPermissions, pluginPermissions, noPermissions, userDeleted, deleteUserConfirm (en)
2026-07-03 20:37:46 +00:00
Leopoldadmin
5991d79324
Problem 3/5: Add i18n keys for systemPermissions, pluginPermissions, noPermissions, userDeleted, deleteUserConfirm (de)
2026-07-03 20:26:26 +00:00
Leopoldadmin
0d3550ec86
Problem 1+5: Dynamic roles dropdown via useRoles(), delete button with ConfirmDialog, fixed create form
2026-07-03 20:11:04 +00:00
Leopoldadmin
493d99aff2
Problem 3/4: Replace hardcoded ALL_PERMISSIONS with usePermissions API call, group by category
2026-07-03 20:07:53 +00:00
Leopoldadmin
68b5153139
Problem 3/4: Add usePermissions hook + PermissionItem/PermissionsResponse interfaces
2026-07-03 20:02:32 +00:00
Leopoldadmin
792f0a464d
Problem 3/4: Add GET /api/v1/roles/permissions endpoint returning system + plugin permissions
2026-07-03 19:50:47 +00:00
Leopoldadmin
a799a3d0e6
Problem 2: Remove dead System nav item from Settings sidebar
2026-07-03 19:50:18 +00:00
Leopoldadmin
22e8756fa4
Problem 1: Alembic migration 0005 — add role_id FK column to users table
2026-07-03 19:50:08 +00:00
Leopoldadmin
762aac832f
Problem 1: Pass role_id through users route create/update, include in responses
2026-07-03 19:49:48 +00:00
Leopoldadmin
8a2468ee7d
Problem 1: Add role_id support to user_service create/update/_user_to_dict
2026-07-03 19:49:03 +00:00
Leopoldadmin
6986fcfaae
Problem 1: Add role_id to UserCreate/UserUpdate/UserResponse schemas
2026-07-03 19:48:48 +00:00
Leopoldadmin
530cfd485f
Problem 1: Add role_id FK column to User model (references roles.id, nullable, ondelete SET NULL)
2026-07-03 19:48:39 +00:00
Leopoldadmin
5138590277
fix(plugin): add version comparison and migration run on version mismatch
...
Bug 6: install() and activate() now compare the plugin's manifest
version with the stored DB version. If they differ, migrations are
re-run to bring the schema up to date and the DB version field is
updated. This ensures that updating a plugin with a new manifest
version triggers the migration runner automatically.
2026-07-03 16:56:30 +00:00
Leopoldadmin
f9508d17de
fix(plugin): add GET and PATCH /api/v1/plugins/{name}/config endpoints
...
Bug 4: Plugin config field existed but had no API endpoints. Added
GET /api/v1/plugins/{name}/config to retrieve config as JSON and
PATCH /api/v1/plugins/{name}/config to update it. Uses PluginConfigUpdate
Pydantic model for request validation.
2026-07-03 16:49:57 +00:00
Leopoldadmin
cbeed4b26d
fix(plugin): convert dependency errors to HTTPException 400, add config API
...
Bug 3: install_plugin() and activate_plugin() now catch dependency-related
ValueErrors and raise HTTPException 400 with the error detail.
Bug 4: Added get_plugin_config() and update_plugin_config() methods to
the service layer for the plugin config API endpoints.
2026-07-03 16:48:10 +00:00
Leopoldadmin
826cf69c9a
fix(plugin): add dependency resolution and permission soft-check
...
Bug 3: install() and activate() now verify that declared dependencies
are installed/active before proceeding. Raises ValueError which the
service layer converts to HTTPException 400.
Bug 5: activate() now performs a soft permission check — logs warnings
for declared permissions not found in any discovered plugin.
2026-07-03 16:45:49 +00:00
Leopoldadmin
94a5bf105c
fix(plugin): track routes by object identity to prevent cross-plugin removal
...
Bug 2: deactivate() removed routes by path-matching, which caused
routes from other plugins sharing the same prefix (e.g. /api/v1/dms)
to be removed when deactivating one plugin. Now tracks actual route
objects by identity in _mounted_routes and removes only those specific
objects during deactivation.
2026-07-03 16:25:31 +00:00
Leopoldadmin
18a0861a96
fix(plugin): discover MailPlugin in builtins __init__
...
Bug 1: MailPlugin was missing from imports and __all__, preventing
the plugin registry from discovering the mail plugin at startup.
2026-07-03 16:19:04 +00:00
Leopoldadmin
2968381a23
docs: update test_report.md with Settings Plugins & Roles API implementation evidence
2026-07-03 15:25:55 +00:00
Leopoldadmin
962ac66f72
feat: add plugin and role translation keys to en.json
2026-07-03 15:24:01 +00:00
Leopoldadmin
dda972187a
feat: add plugin and role translation keys to de.json
2026-07-03 15:24:00 +00:00
Leopoldadmin
502cddd68c
feat: add useRoles/useCreateRole/useUpdateRole/useDeleteRole and plugin mutation hooks
2026-07-03 15:23:59 +00:00
Leopoldadmin
eb0420d726
feat: add SettingsPluginsPage import and /settings/plugins route
2026-07-03 15:23:58 +00:00
Leopoldadmin
ce4d41c1b8
feat: add plugins nav item to Settings page
2026-07-03 15:23:58 +00:00
Leopoldadmin
1aa6d1ffa9
refactor: SettingsRoles.tsx - use API hooks instead of hardcoded data, add delete role
2026-07-03 15:23:57 +00:00
Leopoldadmin
d26efa5bb7
fix: SettingsPlugins.tsx with actual content - plugin management page
2026-07-03 15:23:55 +00:00
Leopoldadmin
e655311cac
feat: add SettingsPlugins.tsx - plugin management page with install/activate/deactivate/uninstall
2026-07-03 15:22:36 +00:00
Leopoldadmin
812ccdeaf0
fix: add missing display_name to PluginModel creation in lifespan
...
The PluginModel.display_name column is NOT NULL but was not set when
auto-installing builtin plugins during app startup, causing IntegrityError.
Fix mirrors the pattern used in registry.install().
2026-07-03 00:12:43 +00:00
leocrm-bot
36ac1d0df9
fix: register plugin routes in create_app BEFORE SPA catch-all
...
- Plugin routes now registered in create_app (sync context) before SPA catch-all
- Previously plugin routes were added in lifespan (async) AFTER SPA catch-all
- FastAPI matches routes in registration order — catch-all was shadowing plugin routes
- Fixes: Calendar/Mail/DMS/Tags/Permissions returning 404 despite being in OpenAPI
2026-07-02 14:37:30 +02:00
leocrm-bot
07bf6ce445
fix: auto-install discovered builtin plugins on startup — create DB records, run migrations, activate, register routes
...
- Lifespan creates PluginModel records for discovered plugins if missing
- Runs plugin migrations automatically
- Activates plugins and registers routes in FastAPI
- Fixes: Calendar/Mail/DMS/Tags/Permissions 404 after restart
2026-07-02 13:32:48 +02:00
leocrm-bot
5dc4d6d4c0
fix: activate plugins on startup + register routes + seed admin script
...
- lifespan: load active plugins from DB, call on_activate, register routes
- Fixes: Calendar/Mail/DMS/Tags/Permissions routes returning 404
- scripts/seed_admin.py: creates default tenant + admin user
2026-07-02 13:02:38 +02:00
leocrm-bot
f477efc366
fix: serve frontend in production — multi-stage Dockerfile with Node build + StaticFiles mount
...
- Dockerfile: add Node.js frontend build stage (vite build)
- Dockerfile: copy frontend/dist into runtime image
- app/main.py: mount /assets static files + SPA catch-all fallback
- app/main.py: serve index.html for all non-API routes
- Fixes: https://crm.media-on.de/ returning 404 (frontend not served)
2026-07-02 09:55:50 +02:00
leocrm-bot
5b7b1575de
chore: update state files for Phase 6 deployment completion
...
- LeoCRM deployed to https://crm.media-on.de (running:healthy)
- PostgreSQL 16 + Redis 7 provisioned
- Health endpoint 200, Swagger 200
- Production dependencies fixed in requirements.txt
2026-07-02 09:27:34 +02:00
leocrm-bot
1d3fccc1d3
fix: remove duplicate dependency entries from rebase conflict
2026-07-02 09:26:18 +02:00
leocrm-bot
50f4fa7152
fix: add missing production dependencies (httpx, email-validator, cryptography, python-jose, aioimaplib, aiosmtplib, pgpy, nh3)
...
These dependencies were missing from requirements.txt but are required
for production deployment. Discovered during Coolify deployment.
2026-07-02 09:25:10 +02:00
Leopoldadmin
f61cfc82b1
fix: add missing production dependencies (email-validator, cryptography, python-jose, aioimaplib, aiosmtplib, pgpy, nh3)
2026-07-02 06:59:30 +00:00
Leopoldadmin
811735f1f0
fix: add httpx to requirements.txt (missing dependency for llm_client.py)
2026-07-02 06:54:38 +00:00