diff --git a/base/tests/test_login.py b/base/tests/test_login.py new file mode 100644 index 000000000..78cacf4a4 --- /dev/null +++ b/base/tests/test_login.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +import pytest +from django.contrib.auth.models import User +from django.test.html import parse_html as html + + +pytestmark = pytest.mark.django_db + +@pytest.fixture +def user(): + return User.objects.create_user('jfirmino', password='123') + +def test_login_aparece_na_barra_para_usuario_nao_logado(client): + response = client.get('/') + assert 'Login' in response.content + +def test_username_do_usuario_logado_aparece_na_barra(client, user): + assert client.login(username='jfirmino', password='123') + response = client.get('/') + assert html('Login') not in html(response.content) + assert 'jfirmino' in response.content + assert html('Sair') in html(response.content) + +def test_nome_completo_do_usuario_logado_aparece_na_barra(client, user): + # nome completo para o usuario + user.first_name = 'Joao' + user.last_name = 'Firmino' + user.save() + assert client.login(username='jfirmino', password='123') + response = client.get('/') + assert html('Login') not in html(response.content) + assert 'Joao Firmino' in response.content + assert html('Sair') in html(response.content) + +@pytest.mark.parametrize("link_login,destino", [ + # login a partir de uma pagina retorna para ela mesma + ('/login/?next=/zzzz', 'http://testserver/zzzz'), + ('/login/?next=/', 'http://testserver/'), + # login a partir da propria pagina de login redireciona para home + ('/login/?next=/login/', 'http://testserver/'), + # link sem destino de retorno (next) redireciona para home + ('/login/', 'http://testserver/'), +]) +def test_login(app, user, link_login, destino): + pagina_login = app.get(link_login) + form = pagina_login.forms['login-form'] + form['username'] = 'jfirmino' + form['password'] = '123' + res = form.submit() + + assert user.pk == app.session['_auth_user_id'] + assert res.url == destino + +@pytest.mark.urls('home.teststub_urls') +@pytest.mark.parametrize("link_logout,destino", [ + # logout a partir de uma pagina retorna para ela mesma + ('/logout/?next=/zzzz', 'http://testserver/zzzz'), + ('/logout/?next=/', 'http://testserver/'), + # logout a partir da propria pagina de logout redireciona para home + ('/logout/?next=/logout/', 'http://testserver/'), + # link sem destino de retorno (next) redireciona para home + ('/logout/', 'http://testserver/'), +]) +def test_logout(client, user, link_logout, destino): + # com um usuário logado ... + assert client.login(username='jfirmino', password='123') + assert user.pk == client.session['_auth_user_id'] + + # ... acionamos o link de logout + res = client.get(link_logout, follow=True) + destino_real = res.redirect_chain[-1][0] + + assert '_auth_user_id' not in client.session + assert destino_real == destino diff --git a/base/tests/teststub_urls.py b/base/tests/teststub_urls.py new file mode 100644 index 000000000..b244287fc --- /dev/null +++ b/base/tests/teststub_urls.py @@ -0,0 +1,8 @@ +from django.conf.urls import patterns, url + +from sapl.urls import urlpatterns as original_patterns + + +urlpatterns = original_patterns + patterns('', + url(r'^zzzz$', 'home.views.index', name='zzzz'), +) diff --git a/base/urls.py b/base/urls.py index 4ddb4532a..cb3154934 100644 --- a/base/urls.py +++ b/base/urls.py @@ -3,7 +3,7 @@ from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.views.generic.base import TemplateView from .apps import AppConfig -from .views import CasaLegislativaTableAuxView, HelpView +from .views import CasaLegislativaTableAuxView, HelpView, login, logout app_name = AppConfig.name @@ -14,6 +14,9 @@ urlpatterns = [ name='help_base'), url(r'^casa-legislativa$', CasaLegislativaTableAuxView.as_view(), name='casa_legislativa'), + + url(r'^login/$', login, name='login'), + url(r'^logout/$', logout, name='logout'), ] # Fix a static asset finding error on Django 1.9 + gunicorn: diff --git a/base/views.py b/base/views.py index 1950ce99a..f69fc5b5d 100644 --- a/base/views.py +++ b/base/views.py @@ -1,11 +1,17 @@ import os from functools import lru_cache +import django.contrib.auth.views +from crispy_forms.helper import FormHelper +from crispy_forms.layout import Hidden, Submit from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse +from django.http import HttpResponseRedirect +from django.shortcuts import render from django.views.generic import FormView from django.views.generic.base import TemplateView +from .areas import areas_em_pares from .forms import CasaLegislativaTabelaAuxForm from .models import CasaLegislativa @@ -42,7 +48,7 @@ class CasaLegislativaTableAuxView(FormView): casa = CasaLegislativa.objects.first() if casa: if ("remover" in request.POST or - (form.cleaned_data['logotipo'] and casa.logotipo)): + (form.cleaned_data['logotipo'] and casa.logotipo)): try: os.unlink(casa.logotipo.path) except OSError: @@ -65,3 +71,37 @@ class CasaLegislativaTableAuxView(FormView): def get_success_url(self): return reverse('base:casa_legislativa') + + +def index(request): + """Página Inicial""" + + return render(request, 'home.html', {'areas': areas_em_pares}) + + +def login(request): + """Página de Login""" + + helper = FormHelper() + helper.form_id = 'login-form' + helper.form_class = 'form-horizontal' + helper.label_class = 'col-lg-1' + helper.field_class = 'col-lg-3' + helper.form_method = 'post' + + login_path = reverse('base:login') + helper.form_action = login_path + + next_path = request.REQUEST.get('next', '/') + if next_path == login_path: + next_path = '/' + helper.add_input(Hidden('next', next_path)) + helper.add_input(Submit('submit', 'Submit')) + + return django.contrib.auth.views.login(request, + extra_context={'helper': helper}) + + +def logout(request): + django.contrib.auth.views.logout(request) + return HttpResponseRedirect(request.GET.get('next', '/')) diff --git a/templates/base.html b/templates/base.html index 4822ebc2d..862086233 100644 --- a/templates/base.html +++ b/templates/base.html @@ -103,6 +103,19 @@ + +