1 from flask import Flask, send_from_directory, abort, g, render_template, request, redirect, url_for, flash, \
3 from sqlalchemy.engine import create_engine
5 import wradmin.template_helper
6 from wradmin.controllers.rodelbahn import RodelbahnController
7 from wradmin.controllers.gasthaus import GasthausController
8 from wradmin.controllers.bericht import BerichtController
9 from wradmin.controllers.coordtool import CoordtoolController
10 from wradmin.auth import password_is_correct
11 from wradmin.auth.forms import LoginForm
12 from flask_login import LoginManager, current_user, login_required, login_user, logout_user
13 from flask_principal import Principal, Permission, RoleNeed, identity_changed, identity_loaded, Identity, \
14 AnonymousIdentity, UserNeed
18 app.config.from_envvar('WRADMIN_SETTINGS')
19 wradmin.model.init_model(create_engine(app.config['DATABASE_URI']))
20 app.jinja_env.globals.update(h=wradmin.template_helper.PylonsHelper())
21 login_manager = LoginManager(app)
22 login_manager.login_view = "login"
23 principals = Principal(app)
24 admin_permission = Permission(RoleNeed('admin'))
28 def _before_request():
32 @app.teardown_appcontext
33 def remove_db_session(error):
34 """Removes the database session at the end of the request."""
35 wradmin.model.meta.Session.remove()
40 return render_template('index.html')
43 @app.route("/rodelbahn/list")
46 return RodelbahnController().list()
49 @app.route("/rodelbahn/view/<int:id>")
51 @admin_permission.require(403)
52 def rodelbahn_view(id):
53 return RodelbahnController().view(id)
56 @app.route("/rodelbahn/update")
58 def rodelbahn_update():
59 return RodelbahnController().update()
62 @app.route("/rodelbahn/update_regioncache")
64 def rodelbahn_update_regioncache():
65 return RodelbahnController().update_regioncache()
68 @app.route("/rodelbahn/update_mapcache")
70 def rodelbahn_update_mapcache():
71 return RodelbahnController().update_mapcache()
74 @app.route("/bericht/list")
76 @admin_permission.require(403)
78 return BerichtController().list()
81 @app.route("/bericht/view/<int:id>")
83 @admin_permission.require(403)
85 return BerichtController().view(id)
88 @app.route("/bericht/change_date_invalid/<int:id>", methods=['POST'])
90 @admin_permission.require(403)
91 def bericht_change_date_invalid(id):
92 return BerichtController().change_date_invalid(id)
95 @app.route("/bericht/update_reportcache")
97 def bericht_update_reportcache():
98 return BerichtController().update_reportcache()
101 @app.route("/gasthaus/list")
104 return GasthausController().list()
107 @app.route("/gasthaus/view/<int:id>")
109 def gasthaus_view(id):
110 return GasthausController().view(id)
113 @app.route("/gasthaus/update")
115 def gasthaus_update():
116 return GasthausController().update()
119 @app.route("/coordtool/index")
121 def coordtool_index():
122 return CoordtoolController().index()
125 @app.route("/coordtool/convert", methods=['POST'])
127 def coordtool_convert():
128 return CoordtoolController().convert()
131 @app.route("/login", methods=['GET', 'POST'])
134 if form.validate_on_submit():
135 user = wradmin.model.meta.Session.query(wradmin.model.MwUser).filter_by(user_name=form.user_name.data).first()
136 if user is not None and password_is_correct(form.password.data, user.user_password.decode()):
137 login_user(user, form.remember_me.data)
138 identity_changed.send(current_app._get_current_object(), identity=Identity(user.get_id()))
139 next = request.args.get('next')
140 if next is None or not next.startswith('/'):
141 next = url_for('index')
142 flash('Sie sind nun angemeldet.')
143 return redirect(next)
144 flash('Ungülter Benutzername oder ungültiges Passwort.')
145 return render_template('auth/login.html', form=form)
148 @app.route("/logout")
151 for key in ('identity.name', 'identity.auth_type'):
152 session.pop(key, None)
153 identity_changed.send(current_app._get_current_object(), identity=AnonymousIdentity())
154 flash('Sie wurden ausgeloggt.')
155 return redirect(url_for('index'))
158 @login_manager.user_loader
159 def user_loader(user_id):
160 return wradmin.model.meta.Session.query(wradmin.model.MwUser).get(user_id)
163 @identity_loaded.connect_via(app)
164 def on_identity_loaded(sender, identity):
165 identity.user = current_user
166 user_id = current_user.get_id()
167 if user_id is not None:
168 identity.provides.add(UserNeed(user_id))
169 if wradmin.model.meta.Session.query(wradmin.model.MwUserGroups).get((user_id, 'sysop')) is not None:
170 identity.provides.add(RoleNeed('admin'))