Add NextSnap PWA with photo gallery viewer and continuous capture
Offline-first photo capture app for Nextcloud with: - Camera capture with continuous mode (auto-reopens after each photo) - File browser with fullscreen image gallery, swipe navigation, and rename - Upload queue with background sync engine - Admin panel for Nextcloud user management - Service worker for offline-first caching (v13) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
84
app/routes/views.py
Normal file
84
app/routes/views.py
Normal file
@@ -0,0 +1,84 @@
|
||||
from flask import Blueprint, render_template, redirect, url_for, session, jsonify
|
||||
|
||||
bp = Blueprint('views', __name__)
|
||||
|
||||
@bp.route('/')
|
||||
def index():
|
||||
"""Root route - redirect to capture if logged in, otherwise show login."""
|
||||
if 'username' in session:
|
||||
return redirect(url_for('views.capture'))
|
||||
return render_template('login.html')
|
||||
|
||||
@bp.route('/login')
|
||||
def login_page():
|
||||
"""Render login page."""
|
||||
if 'username' in session:
|
||||
return redirect(url_for('views.capture'))
|
||||
return render_template('login.html')
|
||||
|
||||
@bp.route('/capture')
|
||||
def capture():
|
||||
"""Render capture page (requires authentication)."""
|
||||
if 'username' not in session:
|
||||
return redirect(url_for('views.login_page'))
|
||||
return render_template(
|
||||
'capture.html',
|
||||
username=session['username'],
|
||||
show_nav=True,
|
||||
is_admin=session.get('is_admin', False)
|
||||
)
|
||||
|
||||
@bp.route('/queue')
|
||||
def queue():
|
||||
"""Render queue page (requires authentication)."""
|
||||
if 'username' not in session:
|
||||
return redirect(url_for('views.login_page'))
|
||||
return render_template(
|
||||
'queue.html',
|
||||
username=session['username'],
|
||||
show_nav=True,
|
||||
is_admin=session.get('is_admin', False)
|
||||
)
|
||||
|
||||
@bp.route('/browser')
|
||||
def browser():
|
||||
"""Render file browser page (requires authentication)."""
|
||||
if 'username' not in session:
|
||||
return redirect(url_for('views.login_page'))
|
||||
return render_template(
|
||||
'browser.html',
|
||||
username=session['username'],
|
||||
show_nav=True,
|
||||
is_admin=session.get('is_admin', False)
|
||||
)
|
||||
|
||||
@bp.route('/reviewer')
|
||||
def reviewer():
|
||||
"""Render photo reviewer page (requires authentication)."""
|
||||
if 'username' not in session:
|
||||
return redirect(url_for('views.login_page'))
|
||||
return render_template(
|
||||
'reviewer.html',
|
||||
username=session['username'],
|
||||
show_nav=False,
|
||||
is_admin=session.get('is_admin', False)
|
||||
)
|
||||
|
||||
@bp.route('/admin')
|
||||
def admin():
|
||||
"""Render admin page (requires admin privileges)."""
|
||||
if 'username' not in session:
|
||||
return redirect(url_for('views.login_page'))
|
||||
if not session.get('is_admin', False):
|
||||
return "Access denied: Admin privileges required", 403
|
||||
return render_template(
|
||||
'admin.html',
|
||||
username=session['username'],
|
||||
show_nav=True,
|
||||
is_admin=True
|
||||
)
|
||||
|
||||
@bp.route('/test')
|
||||
def test():
|
||||
"""Test page for camera functionality."""
|
||||
return render_template('test.html')
|
||||
Reference in New Issue
Block a user