Thadillo's picture
First commit.
1c4a712 verified
raw
history blame
3.46 kB
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'))