import pytz from flask import Blueprint, abort, render_template from flask.globals import request from flask_login import current_user, login_required from flask_migrate import current from flask_wtf import FlaskForm from wtforms import IntegerField, SelectField, SubmitField from wtforms.validators import DataRequired, NumberRange from wtforms.widgets import NumberInput from .db import APIKey, db blueprint = Blueprint('settings', __name__) class SettingsForm(FlaskForm): timezone = SelectField( 'Timezone', choices=list(map(lambda x: (x, x.replace("_", " ")), pytz.all_timezones)), validators=[ DataRequired() ]) start_of_day = IntegerField( 'Start of day hour', widget=NumberInput(min=0, max=23), validators=[ NumberRange(min=0, max=23) ] ) submit = SubmitField('Save') @blueprint.route('/settings', methods=['GET', 'POST']) @login_required def settings(): form = SettingsForm(obj=current_user) if form.validate_on_submit(): current_user.timezone = form.timezone.data current_user.start_of_day = form.start_of_day.data db.session.commit() return render_template('settings.html', form=form, success=True) return render_template('settings.html', form=form) @blueprint.route('/settings/keys', methods=['GET', 'POST']) @login_required def api_keys(): apps = [a[0] for a in db.session.query(APIKey.app_name).filter( APIKey.user == current_user).group_by(APIKey.app_name).all()] keys = {app_name: APIKey.query.filter( APIKey.user_id == current_user.id, APIKey.app_name == app_name).all() for app_name in apps} return render_template('api_keys.html', apps=sorted(apps), keys=keys) @blueprint.route('/settings/keys//delete', methods=['GET', 'POST']) @login_required def api_key_delete(key_id): k = APIKey.query.get_or_404(key_id) if k.user_id != current_user.id: abort(403) if request.method == 'GET': return render_template('')