Commit Graph

1553 Commits

Author SHA1 Message Date
github-actions[bot] 0854e901ac chore(release): update build metadata files [skip ci] 2026-03-08 09:04:40 +00:00
semantic-release 31b4d9387b 0.89.0
Automatically generated by python-semantic-release
2026-03-08 09:04:37 +00:00
Christian Krakau-Louis 5e6f44e6bf Merge pull request #507 from christianlouis/copilot/add-backup-and-restore-functionality 2026-03-08 10:04:18 +01:00
semantic-release 0955765525 0.88.2
Automatically generated by python-semantic-release
2026-03-08 09:04:16 +00:00
Christian Krakau-Louis b710a90796 Merge pull request #508 from christianlouis/copilot/fix-local-user-login-issue 2026-03-08 10:03:58 +01:00
github-actions[bot] 0942609d03 chore(release): update build metadata files [skip ci] 2026-03-08 08:08:54 +00:00
semantic-release 7f20dc7782 0.88.1
Automatically generated by python-semantic-release
2026-03-08 08:08:52 +00:00
Christian Krakau-Louis 39c0464fe8 Merge pull request #505 from christianlouis/copilot/update-signup-page-functionality 2026-03-08 09:08:36 +01:00
copilot-swe-agent[bot] 1877fc0000 fix(backup): address code review feedback - accessibility, CSRF, docs, imports
- Move `import os` to top-level in app/views/backup.py
- Fix docstring in BackupRecord model to remove non-existent 'location' field
- Replace browser confirm() dialogs with accessible modal dialog (role=dialog, aria-modal, aria-labelledby)
- Add csrfToken() helper that validates token presence instead of silently falling back to empty string
- Fix aria-live region to remain in DOM (screen-reader friendly) rather than using x-show
- Add Backup & Restore section to docs/ConfigurationGuide.md with retention table
- Add backup env vars to .env.demo with comments

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 22:08:47 +00:00
copilot-swe-agent[bot] 2dd1ca0197 feat(backup): add database backup/restore with scheduled retention and admin dashboard
- Add BackupRecord model for tracking backup archives
- Add migration 021_add_backup_records
- Add backup configuration settings (backup_enabled, backup_dir, backup_remote_destination, backup_remote_folder, backup_retain_hourly/daily/weekly)
- Add backup_tasks.py with create_backup, cleanup_old_backups, and helpers
- Register hourly/daily/weekly Celery beat schedules
- Add /api/admin/backup/* REST endpoints (list, create, download, restore, delete, cleanup)
- Add /admin/backup dashboard view and template
- Add backup link to admin dropdown navigation in base.html
- Add backup settings to SETTING_METADATA in settings_service.py
- Add comprehensive test suite (39 tests passing)

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 22:03:27 +00:00
copilot-swe-agent[bot] b95f552ed2 fix(auth): prevent None==None admin credential bypass creating phantom admin user
When ADMIN_USERNAME/ADMIN_PASSWORD env vars are not configured, settings
values are None. Python's `None == None` evaluates to True, so any login
request omitting those form fields was authenticated as admin — creating a
phantom 'None@local.docuelevate' profile with admin rights and business plan.

Guard the admin credential check to require both values to be truthy
(non-None, non-empty) before attempting the comparison.

Adds three regression tests covering: both None, both empty-string, and
only password None scenarios.

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 21:36:31 +00:00
copilot-swe-agent[bot] c73c9484b8 Initial plan 2026-03-07 21:23:51 +00:00
copilot-swe-agent[bot] f4a607df05 Initial plan 2026-03-07 21:21:14 +00:00
copilot-swe-agent[bot] db5f3d51d9 fix(ui): make pricing page CTAs link to /signup when local signup is enabled
All four CTA anchor elements on pricing.html were hardcoded to /login.
They now use /signup when allow_signup is True (MULTI_USER_ENABLED and
ALLOW_LOCAL_SIGNUP both true), falling back to /login when signup is
disabled. Bottom CTA button text also updates accordingly.

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 21:18:17 +00:00
copilot-swe-agent[bot] 40f0beb1bf Initial plan 2026-03-07 21:15:21 +00:00
github-actions[bot] de8a1e18e8 chore(release): update build metadata files [skip ci] 2026-03-07 21:03:20 +00:00
semantic-release 5f0c9b8205 0.88.0
Automatically generated by python-semantic-release
2026-03-07 21:03:18 +00:00
Christian Krakau-Louis e929930bae Merge pull request #499 from christianlouis/copilot/add-subscription-management-features
Merge main → subscription-management-features; fix migration chain collision
2026-03-07 22:03:02 +01:00
Christian Krakau-Louis a18245cd1d Merge pull request #501 from christianlouis/copilot/add-push-notifications-for-signup
feat(notifications): admin push notifications and webhooks for user signup, plan changes, and payment issues
2026-03-07 22:02:41 +01:00
github-actions[bot] d256e66574 chore(release): update build metadata files [skip ci] 2026-03-07 20:58:38 +00:00
semantic-release a264ba474a 0.87.0
Automatically generated by python-semantic-release
2026-03-07 20:58:35 +00:00
Christian Krakau-Louis f53574dc33 Merge pull request #503 from christianlouis/copilot/add-help-forum-and-blog
feat(help): embed MkDocs documentation site at /help/ with How-To guides
2026-03-07 21:58:16 +01:00
copilot-swe-agent[bot] 699a93e193 chore: merge main into branch, resolve conflict in models.py
Both sets of UserProfile columns are retained:
- is_complimentary (from main, migration 019_add_is_complimentary)
- subscription_change_pending_tier / subscription_change_pending_date
  (our branch, renamed to migration 020_add_subscription_change_pending
   with down_revision updated to chain after 019_add_is_complimentary)
2026-03-07 20:53:42 +00:00
copilot-swe-agent[bot] f9b9fb081a chore: merge main into notifications branch
Resolve conflicts in app/auth.py and app/api/admin_users.py:

- auth.py: combine admin-aware profile creation (from main, adding
  is_complimentary/highest-tier defaults for admins) with signup
  notification/webhook (from our branch). Admin users skip the
  signup notification since they are the ones being notified.

- admin_users.py: combine is_complimentary assignment (from main)
  with tier_changed/new_tier tracking variables (from our branch)
  to fire plan-change notifications when an admin updates a user.
2026-03-07 20:52:44 +00:00
copilot-swe-agent[bot] 63905842fd fix(ui): move Help nav link outside auth conditional so it shows for all visitors
Previously, duplicate Help links existed inside both branches of the
{% if multi_user_enabled and not is_logged_in %}...{% else %}...{% endif %}
conditional. This refactoring places a single Help link AFTER {% endif %}
in both the desktop and mobile menus, guaranteeing it renders for:
- Unauthenticated visitors (multi-user mode)
- Logged-in users (multi-user mode)
- All users in single-user / auth-disabled mode

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 20:52:02 +00:00
github-actions[bot] 3a1ecaf63a chore(release): update build metadata files [skip ci] 2026-03-07 20:45:44 +00:00
semantic-release e8c2854325 0.86.0
Automatically generated by python-semantic-release
2026-03-07 20:45:41 +00:00
Christian Krakau-Louis 93b4dcf641 Merge pull request #500 from christianlouis/copilot/auto-user-creation-for-admins
feat(auth): auto-provision admin user profiles with highest tier and complimentary flag
2026-03-07 21:45:21 +01:00
github-actions[bot] 5a9d2e7ad6 chore(release): update build metadata files [skip ci] 2026-03-07 20:45:01 +00:00
semantic-release cfb1e2d62d 0.85.0
Automatically generated by python-semantic-release
2026-03-07 20:44:58 +00:00
Christian Krakau-Louis a27a0d6f01 Merge pull request #502 from christianlouis/copilot/update-plan-descriptions
fix(ui): rename "Business" → "Power" and rewrite plan copy for per-user pricing
2026-03-07 21:44:40 +01:00
Christian Krakau-Louis 1883606a5e Merge pull request #497 from christianlouis/copilot/fix-user-sign-up-functionality
feat(auth): enable local user self-registration without SMTP + admin account creation
2026-03-07 21:44:24 +01:00
github-actions[bot] 79e76522e3 chore(release): update build metadata files [skip ci] 2026-03-07 20:38:51 +00:00
semantic-release 3f67b80a42 0.84.0
Automatically generated by python-semantic-release
2026-03-07 20:38:48 +00:00
Christian Krakau-Louis dc1a12772a Merge pull request #498 from christianlouis/copilot/update-landing-page-description
feat(ui): Replace unauthenticated dashboard with marketing landing page in multi-user mode
2026-03-07 21:38:31 +01:00
copilot-swe-agent[bot] fe8e1c41cc fix(docs): improve security and accessibility in help section
- Add aria-label to all Help nav links for better screen reader support
- Fix Samba config examples: use authenticated user instead of guest ok=yes
- Fix chmod 777 to chmod 770 with group-based access control
- Add security notes about dedicated groups and passwords in how-to guides
- Fix Python script to use os.environ.get() with explicit error messages
- Add app-specific password comment to EmailIngestion.md config example

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 20:38:12 +00:00
copilot-swe-agent[bot] 46b2f17acc feat(docs): add built-in help section with How-To guides embedded in app
- Add MkDocs Material docs build stage to Dockerfile and Dockerfile.local
- Mount pre-built docs as static files at /help/ in FastAPI (app/main.py)
- Add app/views/help.py with /help → /help/ permanent redirect route
- Register help router in app/views/__init__.py
- Add Help nav link to base.html (public + app nav, desktop + mobile)
- Create how-to guides: HP printer, ScanSnap, watched folder, email ingestion, mobile scanning
- Update mkdocs.yml with How-To Guides section and Material theme palette
- Add optional docs service (squidfunk/mkdocs-material) to docker-compose.yaml with docs profile
- Add mkdocs-material to requirements-dev.txt
- Add /docs_build to .gitignore
- Add tests for help view (8 tests, 100% coverage on help.py)

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 20:33:10 +00:00
copilot-swe-agent[bot] 72f96e3c02 fix(subscriptions): address code review feedback
- Fix platform-specific %%-d format → use .day and .year directly in templates and messages
- Fix Tailwind JIT dynamic class interpolation → use static class variables in showFlash()
- Fix Jinja pending_date rendering → use .strftime('%B') + .day + .year
- Add aria-atomic=true to flash container for full screen-reader announcements
- Move SessionLocal() creation inside try block in Celery task for proper session management

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 20:18:10 +00:00
copilot-swe-agent[bot] 064ba72d36 fix(ui): address code review feedback on complimentary badge and aria attributes
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 20:17:07 +00:00
copilot-swe-agent[bot] fdc48c7fe9 feat(notifications): admin push notifications and webhooks for user signup, plan changes, and payment issues
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 20:15:39 +00:00
copilot-swe-agent[bot] 97f85ce74e feat(auth): auto-create admin user profiles with highest tier and complimentary flag
- Add `is_complimentary` column to UserProfile model (migration 019)
- Update `_ensure_user_profile` to accept `is_admin` param; admins get
  highest subscription tier, is_complimentary=True, onboarding skipped
- Call `_ensure_user_profile` from all login paths (OAuth, local user, admin creds)
- Add `is_complimentary` to UserProfileUpsert schema, response helpers,
  list_users, get_user, upsert_user_profile in admin API
- Add complimentary toggle to admin users UI with gift badge in table
- Write 18 new tests covering complimentary plan and admin auto-creation
- Update SubscriptionTiers.md documentation

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 20:14:34 +00:00
copilot-swe-agent[bot] 231f983429 feat(subscriptions): add subscription change management with upgrade/downgrade scheduling
- Add subscription_change_pending_tier and subscription_change_pending_date fields to UserProfile
- Create migration 019_add_subscription_change_pending
- Add apply_pending_subscription_changes(), request_subscription_change(), cancel_pending_subscription_change() utilities
- Add POST /api/subscriptions/change and DELETE /api/subscriptions/change endpoints
- Update GET /api/subscriptions/my to apply pending changes and return pending change info
- Update subscription view to apply pending changes and pass period_start + pending info
- Update subscription.html: per-tier action buttons (upgrade/downgrade/cancel), pending-change banner, period start date
- Add Celery daily task apply_pending_subscription_changes_all at 00:05 UTC
- Add 19 new tests covering all new utility functions and API endpoints

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 20:14:12 +00:00
copilot-swe-agent[bot] 9d11d741f4 fix(ui): update plan descriptions to reflect per-user pricing
- Rewrite taglines and feature lists for all four tiers with
  concrete, use-case-driven copy (freelancers, knowledge workers,
  power users — no team or enterprise framing)
- Rename 'Business' display name to 'Power' (plan_id stays
  'business' for backwards DB compatibility)
- Replace 'enterprise' language in pricing page hero with
  'per person, per month' copy
- Swap fa-building icon for fa-bolt on the Power tier
- Fix support level for Power tier to 'Priority' (was 'Dedicated')
- Update docs/SubscriptionTiers.md with new names, table, and
  intended-use-case section
- Add test_business_tier_display_name_is_power assertion

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 20:12:28 +00:00
copilot-swe-agent[bot] 19c1ccb11c fix(auth): restore get_user function body lost in refactor; fix button period placement
- Restore the get_user handler that was accidentally dropped when inserting
  the local user management routes before the /{user_id:path} catch-all
- Move period inside the 'Create one' button text in admin_users.html

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 20:03:03 +00:00
copilot-swe-agent[bot] 6ebf66275c Initial plan 2026-03-07 20:00:52 +00:00
copilot-swe-agent[bot] aa6e2fe001 feat(auth): enable local user signup without SMTP, add admin user creation
- Remove SMTP hard-requirement from /api/auth/signup: when SMTP is not
  configured accounts are activated immediately (no email verification).
  When SMTP is configured the existing email-verification flow is kept.
- Inject allow_signup into global template context via app/views/base.py
- Add data-allow-signup attribute to base.html body tag
- Update common.js _renderLoggedOutAuth to show Sign Up (→ /signup) when
  signup is enabled, otherwise Get Started (→ /pricing)
- Add admin API endpoints before the /{user_id:path} catch-all:
    GET  /api/admin/users/local       – list all local accounts
    POST /api/admin/users/local       – admin-create local account (active immediately)
    DELETE /api/admin/users/local/{id} – delete local account + profile
- Add LocalUserCreate / LocalUserResponse Pydantic schemas
- Update admin_users.html with Local User Accounts section and modals
- Update .env.demo to document ALLOW_LOCAL_SIGNUP
- Update docs/BillingSetup.md: SMTP is optional, document both flows
- Update tests: test_signup_smtp_not_configured now asserts 201 + immediate
  activation; add 7 new integration tests for admin local user endpoints

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-07 19:59:10 +00:00
copilot-swe-agent[bot] 8a55860e86 Initial plan 2026-03-07 19:58:48 +00:00
copilot-swe-agent[bot] 4791e2fa15 Initial plan 2026-03-07 19:57:04 +00:00
copilot-swe-agent[bot] a7d428d009 Initial plan 2026-03-07 19:55:53 +00:00
copilot-swe-agent[bot] 0599cf86b3 Initial plan 2026-03-07 19:54:15 +00:00