from flask import Blueprint, render_template, request, redirect, url_for, session, flash from app.models.models import Token, Settings from app import db import random import string from datetime import datetime bp = Blueprint('auth', __name__) CONTRIBUTOR_TYPES = [ {'value': 'government', 'label': 'Government Officer', 'description': 'Public sector representatives'}, {'value': 'community', 'label': 'Community Member', 'description': 'Local residents and community leaders'}, {'value': 'industry', 'label': 'Industry Representative', 'description': 'Business and industry stakeholders'}, {'value': 'ngo', 'label': 'NGO/Non-Profit', 'description': 'Civil society organizations'}, {'value': 'academic', 'label': 'Academic/Researcher', 'description': 'Universities and research institutions'}, {'value': 'other', 'label': 'Other Stakeholder', 'description': 'Other interested parties'} ] def generate_token(contributor_type): prefix = contributor_type[:3].upper() random_part = ''.join(random.choices(string.ascii_uppercase + string.digits, k=6)) timestamp_part = str(int(datetime.now().timestamp()))[-4:] return f"{prefix}-{random_part}{timestamp_part}" @bp.route('/') def index(): return redirect(url_for('auth.login')) @bp.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': token_str = request.form.get('token') token = Token.query.filter_by(token=token_str).first() if token: session['token'] = token.token session['type'] = token.type if token.type == 'admin': return redirect(url_for('admin.overview')) else: return redirect(url_for('submissions.submit')) else: flash('Invalid token', 'error') return render_template('login.html') @bp.route('/generate', methods=['GET', 'POST']) def generate(): token_generation_enabled = Settings.get_setting('token_generation_enabled', 'true') == 'true' if request.method == 'POST': if not token_generation_enabled: flash('Token generation is currently disabled', 'error') return redirect(url_for('auth.generate')) contributor_type = request.form.get('type') user_name = request.form.get('name', '').strip() if not contributor_type or contributor_type not in [t['value'] for t in CONTRIBUTOR_TYPES]: flash('Please select a valid role', 'error') return redirect(url_for('auth.generate')) # Generate token from datetime import datetime token_str = generate_token(contributor_type) name = user_name if user_name else f"{contributor_type.capitalize()} User" new_token = Token( token=token_str, type=contributor_type, name=name ) db.session.add(new_token) db.session.commit() return render_template('generate.html', contributor_types=CONTRIBUTOR_TYPES, token_generation_enabled=token_generation_enabled, generated_token=token_str) return render_template('generate.html', contributor_types=CONTRIBUTOR_TYPES, token_generation_enabled=token_generation_enabled) @bp.route('/logout') def logout(): session.clear() return redirect(url_for('auth.login'))