mirror of
https://github.com/zvx-echo6/recon.git
synced 2026-05-20 14:44:54 +02:00
Add contacts/phone book system with per-user scoping
New files: - lib/auth.py: Authentik forward-auth helpers (get_user_id, @require_auth) - lib/contacts.py: ContactsDB with CRUD, soft delete, restore, purge, find_nearby - lib/contacts_api.py: Flask Blueprint with 9 API endpoints at /api/contacts - templates/knowledge/deleted_contacts.html: Dashboard recovery page Modified: - lib/api.py: Register contacts_bp, add KNOWLEDGE_SUBNAV entry, /deleted-contacts route - config/profiles: has_contacts feature flag (true for home, false for pi profiles) Separate SQLite DB at data/contacts.db. Per-user isolation via X-Authentik-Username. Home/Work labels enforced unique per user. Haversine proximity queries (75m default). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
095bf8c2af
commit
a4288c0cd8
8 changed files with 423 additions and 0 deletions
17
lib/api.py
17
lib/api.py
|
|
@ -63,6 +63,10 @@ app.request_class = _LargeZimRequest
|
|||
from .address_book_api import address_book_bp
|
||||
app.register_blueprint(address_book_bp)
|
||||
|
||||
# ── Contacts Blueprint ──
|
||||
from .contacts_api import contacts_bp
|
||||
app.register_blueprint(contacts_bp)
|
||||
|
||||
# ── Netsyms + Geocode Blueprints ──
|
||||
from .netsyms_api import netsyms_bp, geocode_bp
|
||||
app.register_blueprint(netsyms_bp)
|
||||
|
|
@ -78,6 +82,7 @@ KNOWLEDGE_SUBNAV = [
|
|||
{'href': '/upload', 'label': 'Upload'},
|
||||
{'href': '/web-ingest', 'label': 'Web Ingest'},
|
||||
{'href': '/failures', 'label': 'Failures'},
|
||||
{'href': '/deleted-contacts', 'label': 'Deleted Contacts'},
|
||||
]
|
||||
|
||||
PEERTUBE_SUBNAV = [
|
||||
|
|
@ -323,6 +328,18 @@ def failures_page():
|
|||
failures=failures)
|
||||
|
||||
|
||||
@app.route("/deleted-contacts")
|
||||
def deleted_contacts_page():
|
||||
from .auth import get_user_id
|
||||
from .contacts import ContactsDB
|
||||
user_id = get_user_id() or "anonymous"
|
||||
db = ContactsDB()
|
||||
contacts = db.list_deleted(user_id)
|
||||
return render_template("knowledge/deleted_contacts.html",
|
||||
domain="knowledge", subnav=KNOWLEDGE_SUBNAV, active_page="/deleted-contacts",
|
||||
contacts=contacts)
|
||||
|
||||
|
||||
@app.route('/peertube')
|
||||
def peertube_dashboard():
|
||||
return render_template('peertube/dashboard.html',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue