settings.py.example: fix typo
.gitignore: add virtualenv dir that Makefile creates
admin.py: remove unused imports
Fix login rendering
Add shortcut -F option for running func tests
tflink |
settings.py.example: fix typo
.gitignore: add virtualenv dir that Makefile creates
admin.py: remove unused imports
Fix login rendering
Add shortcut -F option for running func tests
None
No Linters Available |
No Unit Test Coverage |
Path | |||
---|---|---|---|
M | .gitignore (2 lines) | ||
M | conf/settings.py.example (2 lines) | ||
M | fake_fedorainfra/controllers/admin.py (2 lines) | ||
M | fake_fedorainfra/controllers/login_page.py (15 lines) | ||
M | fake_fedorainfra/templates/login.html (2 lines) | ||
M | fake_fedorainfra/templates/navigation.html (2 lines) | ||
M | testing/conftest.py (2 lines) |
Commit | Tree | Parents | Author | Summary | Date |
---|---|---|---|---|---|
f9be4d31da1b | b3aa597e585f | b7c27514b30c | Martin Krizek | Add shortcut -F option for running func tests | Apr 11 2014, 10:53 AM |
b7c27514b30c | 43e1713b533f | fd4b470a6bb6 | Martin Krizek | Fix login rendering | Apr 11 2014, 9:14 AM |
fd4b470a6bb6 | 55fb3af17ea5 | 6aba2d7442af | Martin Krizek | admin.py: remove unused imports | Apr 11 2014, 9:14 AM |
6aba2d7442af | e3bc3694965d | 09d5b20d1b48 | Martin Krizek | .gitignore: add virtualenv dir that Makefile creates | Apr 11 2014, 9:12 AM |
09d5b20d1b48 | 3163d305025b | 3d47b0122ac3 | Martin Krizek | settings.py.example: fix typo | Apr 11 2014, 9:10 AM |
1 | *.pyc | 1 | *.pyc | ||
---|---|---|---|---|---|
2 | *.pyo | 2 | *.pyo | ||
3 | *.swp | 3 | *.swp | ||
4 | *__pycache__* | 4 | *__pycache__* | ||
5 | .ropeproject/ | 5 | .ropeproject/ | ||
6 | conf/settings.py | 6 | conf/settings.py | ||
7 | *.sqlite | 7 | *.sqlite | ||
8 | *.sass-cache | 8 | *.sass-cache | ||
9 | *build/ | 9 | *build/ | ||
10 | *dist/ | 10 | *dist/ | ||
11 | *.egg* | 11 | *.egg* | ||
12 | /env | 12 | /test_env |
1 | # while you can use this as a template, we recommend that you use the blockerbugs | 1 | # while you can use this as a template, we recommend that you use the blockerbugs | ||
---|---|---|---|---|---|
2 | # cli to generate a config file | 2 | # cli to generate a config file | ||
3 | SECRET_KEY = 'replace-me-with-something-random' | 3 | SECRET_KEY = 'replace-me-with-something-random' | ||
4 | SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2://dbuser:dbpassword@dbhost:dbport/dbname' | 4 | SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2://dbuser:dbpassword@dbhost:dbport/dbname' | ||
5 | FILE_LOGGING = False | 5 | FILE_LOGGING = False | ||
6 | LOGFILR = '/var/log/fake_fedorainfra/fake_fedorainfra.log' | 6 | LOGFILE = '/var/log/fake_fedorainfra/fake_fedorainfra.log' | ||
7 | SYSLOG_LOGGING = False | 7 | SYSLOG_LOGGING = False | ||
8 | STREAM_LOGGING = True | 8 | STREAM_LOGGING = True |
Show All 11 Lines | |||||
12 | # | 12 | # | ||
13 | # You should have received a copy of the GNU General Public License along | 13 | # You should have received a copy of the GNU General Public License along | ||
14 | # with this program; if not, write to the Free Software Foundation, Inc., | 14 | # with this program; if not, write to the Free Software Foundation, Inc., | ||
15 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 15 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | # | 16 | # | ||
17 | # Authors: | 17 | # Authors: | ||
18 | # Josef Skladanka <jskladan@redhat.com> | 18 | # Josef Skladanka <jskladan@redhat.com> | ||
19 | 19 | | |||
20 | from flask import Blueprint, render_template, flash, url_for | 20 | from flask import Blueprint, render_template | ||
21 | from flask.ext.login import login_required | 21 | from flask.ext.login import login_required | ||
22 | 22 | | |||
23 | 23 | | |||
24 | admin = Blueprint('admin', __name__) | 24 | admin = Blueprint('admin', __name__) | ||
25 | 25 | | |||
26 | @admin.route('/admin') | 26 | @admin.route('/admin') | ||
27 | @admin.route('/admin/') | 27 | @admin.route('/admin/') | ||
28 | @login_required | 28 | @login_required | ||
29 | def admin_index(): | 29 | def admin_index(): | ||
30 | return render_template('admin/index.html') | 30 | return render_template('admin/index.html') | ||
31 | 31 | |
Show All 23 Lines | |||||
24 | 24 | | |||
25 | from fake_fedorainfra import app, login_manager | 25 | from fake_fedorainfra import app, login_manager | ||
26 | from fake_fedorainfra.models.user import User | 26 | from fake_fedorainfra.models.user import User | ||
27 | 27 | | |||
28 | login_page = Blueprint('login_page', __name__) | 28 | login_page = Blueprint('login_page', __name__) | ||
29 | 29 | | |||
30 | 30 | | |||
31 | class LoginForm(Form): | 31 | class LoginForm(Form): | ||
32 | username = TextField(u'Username', validators = [Required()]) | 32 | username = TextField(u'Username', validators=[Required()]) | ||
33 | password = PasswordField(u'Password', validators = [Required()], description="ahoj pepo jak se vede") | 33 | password = PasswordField(u'Password', validators=[Required()]) | ||
34 | next_page = HiddenField() | 34 | next_page = HiddenField() | ||
35 | 35 | | |||
36 | 36 | | |||
37 | # handle login stuff | 37 | # handle login stuff | ||
38 | @login_manager.user_loader | 38 | @login_manager.user_loader | ||
39 | def load_user(userid): | 39 | def load_user(userid): | ||
40 | app.logger.debug("getting info for user %s" % str(userid)) | 40 | app.logger.debug("getting info for user %s" % str(userid)) | ||
41 | user = User.query.get(userid) | 41 | user = User.query.get(userid) | ||
42 | if user: | 42 | if user: | ||
43 | return user | 43 | return user | ||
44 | else: | 44 | else: | ||
45 | return AnonymousUserMixin | 45 | return AnonymousUserMixin | ||
46 | 46 | | |||
47 | 47 | | |||
48 | @login_page.route('/login', methods=['GET', 'POST']) | 48 | @login_page.route('/login', methods=['GET', 'POST']) | ||
49 | def login(): | 49 | def login(): | ||
50 | login_form = LoginForm() | 50 | login_form = LoginForm() | ||
51 | 51 | | |||
52 | if login_form.validate_on_submit(): | 52 | if login_form.validate_on_submit(): | ||
53 | user = User.query.filter_by(username = login_form.username.data).first() | 53 | user = User.query.filter_by(username=login_form.username.data).first() | ||
54 | if user and user.check_password(login_form.password.data): | 54 | if user and user.check_password(login_form.password.data): | ||
55 | login_user(user) | 55 | login_user(user) | ||
56 | 56 | | |||
57 | app.logger.info('Successful login for user %s' % login_form.username.data) | 57 | app.logger.info('Successful login for user %s' % login_form.username.data) | ||
58 | flash('Logged In Successfully!') | 58 | flash('Logged In Successfully!') | ||
59 | 59 | | |||
60 | return redirect(login_form.next_page.data) | 60 | return redirect(login_form.next_page.data) | ||
61 | else: | 61 | else: | ||
62 | app.logger.info('FAILED login for user %s' % login_form.username.data) | 62 | app.logger.info('FAILED login for user %s' % login_form.username.data) | ||
63 | flash('Login Failed! Please Try again!') | 63 | flash('Login Failed! Please Try again!') | ||
64 | 64 | | |||
65 | login_form.next_page.data = request.args.get('next') or url_for('main.index') | 65 | login_form.next_page.data = request.args.get('next') or url_for('boji_main') | ||
66 | return render_template('login.html', form = login_form) | 66 | return render_template('login.html', form=login_form) | ||
67 | 67 | | |||
68 | 68 | | |||
69 | @login_page.route('/logout') | 69 | @login_page.route('/logout') | ||
70 | @login_required | 70 | @login_required | ||
71 | def logout(): | 71 | def logout(): | ||
72 | app.logger.info('logout for user %s' % current_user.username) | 72 | app.logger.info('logout for user %s' % current_user.username) | ||
73 | logout_user() | 73 | logout_user() | ||
74 | flash('Logged Out Successfully!') | 74 | flash('Logged Out Successfully!') | ||
75 | return redirect(url_for('main.index')) | 75 | return redirect(url_for('boji_main')) | ||
76 | | ||||
77 | | ||||
78 | |
1 | {% extends "layout.html" %} | 1 | {% extends "layout.html" %} | ||
---|---|---|---|---|---|
2 | 2 | | |||
3 | {% from "_formhelpers.html" import form_field %} | 3 | {% from "_formhelpers.html" import form_field %} | ||
4 | 4 | | |||
5 | {% block body %} | 5 | {% block body %} | ||
6 | 6 | | |||
7 | <div class="row"> | 7 | <div class="row"> | ||
8 | <div class="large-4 columns"> | 8 | <div class="large-4 columns"> | ||
9 | <form method="post" action="login"> | 9 | <form method="post" action="login"> | ||
10 | <fieldset> | 10 | <fieldset> | ||
11 | <legend>Login</legend> | 11 | <legend>Login</legend> | ||
12 | {{ form.csrf_token }} | 12 | {{ form.csrf_token }} | ||
13 | {{ form.next_page }} | 13 | {{ form.next_page }} | ||
14 | {{ form_field(form.username) }} | 14 | {{ form_field(form.username) }} | ||
15 | {{ form_field(form.password) }} | 15 | {{ form_field(form.password) }} | ||
16 | {{ form_field(form.rbtn) }} | | |||
17 | {{ form_field(form.chbox) }} | | |||
18 | <input type="submit" value="Login"/> | 16 | <input type="submit" value="Login"/> | ||
19 | </form> | 17 | </form> | ||
20 | </div> | 18 | </div> | ||
21 | </div> | 19 | </div> | ||
22 | 20 | | |||
23 | {% endblock %} | 21 | {% endblock %} |
1 | <nav class="top-bar"> | 1 | <nav class="top-bar"> | ||
---|---|---|---|---|---|
2 | <ul class="title-area"> | 2 | <ul class="title-area"> | ||
3 | <!-- Title Area --> | 3 | <!-- Title Area --> | ||
4 | <li class="name"> | 4 | <li class="name"> | ||
5 | <h1> | 5 | <h1> | ||
6 | <a href="#"> | 6 | <a href="#"> | ||
7 | Skeleton | 7 | Skeleton | ||
8 | </a> | 8 | </a> | ||
9 | </h1> | 9 | </h1> | ||
10 | </li> | 10 | </li> | ||
11 | <li class="toggle-topbar menu-icon"><a href="#"><span>Menu</span></a></li> | 11 | <li class="toggle-topbar menu-icon"><a href="#"><span>Menu</span></a></li> | ||
12 | </ul> | 12 | </ul> | ||
13 | 13 | | |||
14 | <section class="top-bar-section"> | 14 | <section class="top-bar-section"> | ||
15 | <!-- Navigation links --> | 15 | <!-- Navigation links --> | ||
16 | <ul class="left"> | 16 | <ul class="left"> | ||
17 | <li><a href="{{ url_for('main.index') }}">Main page</a></li> | 17 | <li><a href="{{ url_for('boji_main') }}">Main page</a></li> | ||
18 | <li><a href="{{ url_for('admin.admin_index') }}">Admin</a></li> | 18 | <li><a href="{{ url_for('admin.admin_index') }}">Admin</a></li> | ||
19 | </ul> | 19 | </ul> | ||
20 | 20 | | |||
21 | <ul class="right"> | 21 | <ul class="right"> | ||
22 | <li class="search"> | 22 | <li class="search"> | ||
23 | <form> | 23 | <form> | ||
24 | <input type="search"> | 24 | <input type="search"> | ||
25 | </form> | 25 | </form> | ||
Show All 9 Lines |
Show All 22 Lines | |||||
23 | import re | 23 | import re | ||
24 | 24 | | |||
25 | def pytest_addoption(parser): | 25 | def pytest_addoption(parser): | ||
26 | """ | 26 | """ | ||
27 | Add an option to the py.test parser to detect when the functional tests | 27 | Add an option to the py.test parser to detect when the functional tests | ||
28 | should be detected and run | 28 | should be detected and run | ||
29 | """ | 29 | """ | ||
30 | 30 | | |||
31 | parser.addoption('--functional', action='store_true', default=False, | 31 | parser.addoption('-F', '--functional', action='store_true', default=False, | ||
32 | help='Add functional tests') | 32 | help='Add functional tests') | ||
33 | 33 | | |||
34 | def pytest_ignore_collect(path, config): | 34 | def pytest_ignore_collect(path, config): | ||
35 | """Prevents collection of any files named testfunc* to speed up non | 35 | """Prevents collection of any files named testfunc* to speed up non | ||
36 | integration tests""" | 36 | integration tests""" | ||
37 | if path.fnmatch('*testfunc*'): | 37 | if path.fnmatch('*testfunc*'): | ||
38 | try: | 38 | try: | ||
39 | is_functional = config.getvalue('functional') | 39 | is_functional = config.getvalue('functional') | ||
Show All 10 Lines |