calendar-social/app/__init__.py

128 lines
3.6 KiB
Python
Raw Normal View History

# Calendar.social
# Copyright (C) 2018 Gergely Polonkai
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
2018-06-25 07:01:13 +00:00
from datetime import datetime
import os
2018-06-29 12:00:45 +00:00
from flask import Flask, current_app, redirect, render_template, url_for
from flask_babel import Babel, get_locale as babel_get_locale
2018-06-30 04:44:45 +00:00
from flask_security import SQLAlchemyUserDatastore, current_user, login_required
def get_locale():
"""Locale selector
Selects the best locale based on values sent by the browser.
"""
from flask import request
supported_languages = ['en', 'hu']
if 'l' in request.args and request.args['l'].lower() in supported_languages:
return request.args['l'].lower()
return request.accept_languages.best_match(supported_languages)
def template_vars():
return {
'lang': babel_get_locale().language,
}
class CalendarSocialApp(Flask):
def __init__(self, name, config=None):
2018-06-29 06:03:49 +00:00
from app.models import db, User, Role
from app.security import security
2018-06-28 12:41:14 +00:00
Flask.__init__(self, name)
config_name = os.environ.get('ENV', config or 'dev')
self.config.from_pyfile(f'config_{config_name}.py', True)
2018-06-29 06:03:49 +00:00
# Make sure we look up users both by their usernames and email addresses
self.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = ('username', 'email')
2018-06-28 12:41:14 +00:00
db.init_app(self)
babel = Babel(app=self)
babel.localeselector(get_locale)
2018-06-29 06:03:49 +00:00
user_store = SQLAlchemyUserDatastore(db, User, Role)
security.init_app(self, datastore=user_store)
self.context_processor(template_vars)
app = CalendarSocialApp(__name__)
@app.route('/')
def hello():
2018-06-25 07:01:13 +00:00
from app.calendar_system.gregorian import GregorianCalendar
2018-06-29 06:03:49 +00:00
if not current_user.is_authenticated:
return render_template('welcome.html')
2018-06-25 07:01:13 +00:00
calendar = GregorianCalendar(datetime.utcnow().timestamp())
return render_template('index.html', calendar=calendar)
2018-06-29 12:00:45 +00:00
@app.route('/register', methods=['POST', 'GET'])
def register():
if not current_app.config['REGISTRATION_ENABLED']:
return render_template('registration-disabled.html')
from app.forms import RegistrationForm
from app.models import db, User
form = RegistrationForm()
if form.validate_on_submit():
# TODO: This might become False later, if we want registrations to be confirmed via E-mail
user = User(active=True)
form.populate_obj(user)
db.session.add(user)
db.session.commit()
return redirect(url_for('hello'))
return render_template('registration.html', form=form)
2018-06-30 04:44:45 +00:00
@app.route('/new-event', methods=['GET', 'POST'])
@login_required
def new_event():
from app.forms import EventForm
from app.models import db, Event
form = EventForm()
if form.validate_on_submit():
event = Event(user=current_user)
form.populate_obj(event)
db.session.add(event)
db.session.commit()
return redirect(url_for('hello'))
return render_template('event-edit.html', form=form)
if __name__ == '__main__':
app.run()