Browse Source

Fix #316 316 login simples (#328)

* Inicia implementação do login simples

* Cria o Login

* Melhora a mensagem de erro no Login

* Ajusta migração para novas mudanças das models

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Concerta problema de duplicidade

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Arruma conflito com master e traduz textos de info

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Remove global e corrige alguns textos

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Arruma exclusão de stubs desnecessários

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Arruma problema de merge no makemigrations

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Cria função para pegar fields_dict

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Retira código desnecessário

* Arruma exclusão de stubs desnecessários

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Arruma problema de merge no makemigrations

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Cria função para pegar fields_dict

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Adiciona datas invalidas à model ProblemaMigracao

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Arruma imports

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Adiciona a ativação/desativação do virtualenv

* Ajusta sugestões de correção do PR

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Exclui arquivo de migrate pra resolver conflito

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* Concerta alguns problemas de model e admin

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>

* FIX: substitui null por '' ao limpar autor

* Init crud legislação citada

* Tests

* Init crud legislacao

* Init crud legislação citada

* Valida legislação repetida

* Valida legislação igual

* Ajeita testes

* Init Crud Tramitação

* Valida ultima tramitação

* Ordena tramitações

* Teste delete

* Termina validações para deletar uma tramitação

* Fix testes

* Fix #381

* Adiciona placeholder

* Estruturar View e template de pendências.

* Refat dos tipos de pendências e rend. dos vides

* Alteração na reenderização da mensagem dos Vides.

* Ajuste na integração com Compilação

* Criar Filtro em Nível de Notificação de Pendências

* Fix #398

* Faz o merge de migrations de materia

* Fix #397 - Apresentar Filiação Partidária Atual

* HOT FIX: filiação vem em ordem decrescente: first() ao invés de last()

* Fix #407

* Adiciona o campo Natureza de Processo

* Resolve alguns erros apontados pelo check_qa

* Adiciona mais um 'guarda' pra preservar ordem decrescente de filiação

* Init crud legislação citada

* Comeca a implementacao do travis

* Modifica o travis

* Insere a verificacao com o Travis apos testes em um fork do sapl

* Faz a integracao continua com o travis funcionar corretamente

* Fix #355 crud relatoria

* Init crud legislação citada

* Init Crud Tramitação

* Init crud relatoria

* Disabilita localização atual

* Valida localização atual

* Fix qa e testes

* Init crud documento acessório

* Monta layout para autor

* Adicona busca de autor na criação de documento acessório

* Esconde campo não usado de autor

* Define layout documento acessório

* Ajusta botão de salvar e cancelar

* Fix qa

* Adiciona edição de documento acessório

* Fix qa e testes

* Init crud legislação citada

* Init Crud Tramitação

* Init crud relatoria

* Fix qa e testes

* Fix url

* Adiciona campo de arquivo em Documento Acessório

* Fix #391 refatora pesquisa doc adm django filter (#417)

* Refatora a Pesquisa de Documento Adm

* Finaliza a refatoracao da pesquisa por documento administrativo

* Cria o botao de pesquisa por Documento Administrativo

* Faz ir para o menu principal quando clica na logoda aplicacao

* Arruma PEP8

* Arruma alguns detalhes

* Faz modificacoes propostas pela issue 418
fix #418

* Fix #429 - ordem descrescente de mandato parlamentar (#437)

* Ordena Mandato por data_inicio de Legislatura em ordem decrescente

* Fix #402 - checagem de filiação partidária (#423)

* Fix #402 - checagem de filiação partidária

* WIP

* WIP

* WIP

* WIP

* Init crud legislação citada

* Disabilita localização atual

* Valida localização atual

* Fix qa e testes

* Init crud documento acessório

* Monta layout para autor

* Adicona busca de autor na criação de documento acessório

* Esconde campo não usado de autor

* Define layout documento acessório

* Fix qa

* Remove duplicidade do helper

* Modifica row dos botões

* Init crud relatoria

* Disabilita localização atual

* Valida localização atual

* Init crud legislação citada

* Init Crud Tramitação

* Init crud relatoria

* Fix qa e testes

* Init crud documento acessório

* Monta layout para autor

* Adicona busca de autor na criação de documento acessório

* Define layout documento acessório

* Fix url

* Adiciona campo de arquivo em Documento Acessório

* Init crud proposicao

* Muda url de proposição e valida tipo de proposicao para adição de matéria

* Muda data inválida para elaboração

* Ordena listagem pela data de envio

* Valida se uma proposição está sendo enviada ou criada

* Valida remoção ou retorno de proposição

* Remove código desnecessário

* Fix qa

* Fix testes

* Inicia implementação do login simples

* Cria o Login

* Melhora a mensagem de erro no Login

* Faz algumas das mudancas apontadas na revisao

* Tenta arrumar a quebra nos testes

* Faz com que todos os testes passem

* Muda detalhes na url do template
pull/445/head
eduardocalil 9 years ago
committed by Edward
parent
commit
d6616bccde
  1. 12
      base/forms.py
  2. 69
      base/tests/test_login.py
  3. 10
      base/tests/teststub_urls.py
  4. 8
      base/urls.py
  5. 2
      protocoloadm/views.py
  6. 2
      sapl/settings.py
  7. 20
      templates/base.html
  8. 68
      templates/base/login.html

12
base/forms.py

@ -1,6 +1,7 @@
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Fieldset, Layout from crispy_forms.layout import HTML, Fieldset, Layout
from django import forms from django import forms
from django.contrib.auth.forms import AuthenticationForm
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.forms import ModelForm from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -109,3 +110,14 @@ class CasaLegislativaTabelaAuxForm(ModelForm):
) )
) )
super(CasaLegislativaTabelaAuxForm, self).__init__(*args, **kwargs) super(CasaLegislativaTabelaAuxForm, self).__init__(*args, **kwargs)
class LoginForm(AuthenticationForm):
username = forms.CharField(label="Username", max_length=30,
widget=forms.TextInput(
attrs={
'class': 'form-control', 'name': 'username'}))
password = forms.CharField(label="Password", max_length=30,
widget=forms.PasswordInput(
attrs={
'class': 'form-control', 'name': 'password'}))

69
base/tests/test_login.py

@ -0,0 +1,69 @@
# -*- coding: utf-8 -*-
import pytest
from django.contrib.auth.models import User
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 '<a href="/login/?next=">Login</a>' in str(response.content)
def test_username_do_usuario_logado_aparece_na_barra(client, user):
assert client.login(username='jfirmino', password='123')
response = client.get('/')
assert '<a href="/login/?next=">Login</a>' not in str(response.content)
assert 'jfirmino' in str(response.content)
assert '<a href="/logout/?next=">Sair</a>' in str(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 '<a href="/login/?next=">Login</a>' not in str(response.content)
assert 'Joao Firmino' in str(response.content)
assert '<a href="/logout/?next=">Sair</a>' in str(response.content)
@pytest.mark.urls('base.tests.teststub_urls')
@pytest.mark.parametrize("link_login,destino", [
# login redireciona para home
('/login/', '/'),
])
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() # login
assert str(user.pk) == app.session['_auth_user_id']
assert res.url == destino
@pytest.mark.parametrize("link_logout,destino", [
# logout redireciona para a pagina de login
('/logout/', '/login/'),
])
def test_logout(client, user, link_logout, destino):
# com um usuário logado ...
assert client.login(username='jfirmino', password='123')
assert str(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

10
base/tests/teststub_urls.py

@ -0,0 +1,10 @@
from django.conf.urls import patterns, url
from django.views.generic.base import TemplateView
from sapl.urls import urlpatterns as original_patterns
urlpatterns = original_patterns + patterns('', url(r'^zzzz$',
TemplateView.as_view(
template_name='index.html'),
name='zzzz')
)

8
base/urls.py

@ -1,12 +1,15 @@
from django.conf.urls import url from django.conf.urls import url
from django.contrib.auth import views
from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from .apps import AppConfig from .apps import AppConfig
from .forms import LoginForm
from .views import CasaLegislativaTableAuxView, HelpView from .views import CasaLegislativaTableAuxView, HelpView
app_name = AppConfig.name app_name = AppConfig.name
urlpatterns = [ urlpatterns = [
url(r'^sistema/', TemplateView.as_view(template_name='sistema.html')), url(r'^sistema/', TemplateView.as_view(template_name='sistema.html')),
url(r'^ajuda/(?P<topic>\w+)$', HelpView.as_view(), name='help_topic'), url(r'^ajuda/(?P<topic>\w+)$', HelpView.as_view(), name='help_topic'),
@ -14,6 +17,11 @@ urlpatterns = [
name='help_base'), name='help_base'),
url(r'^casa-legislativa$', url(r'^casa-legislativa$',
CasaLegislativaTableAuxView.as_view(), name='casa_legislativa'), CasaLegislativaTableAuxView.as_view(), name='casa_legislativa'),
url(r'^login/$', views.login, {
'template_name': 'base/login.html', 'authentication_form': LoginForm},
name='login'),
url(r'^logout/$', views.logout, {'next_page': '/login'}, name='logout')
] ]
# Fix a static asset finding error on Django 1.9 + gunicorn: # Fix a static asset finding error on Django 1.9 + gunicorn:

2
protocoloadm/views.py

@ -4,7 +4,7 @@ from datetime import date, datetime
from braces.views import FormValidMessageMixin from braces.views import FormValidMessageMixin
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Q, Max from django.db.models import Max, Q
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _

2
sapl/settings.py

@ -30,6 +30,8 @@ DEBUG = config('DEBUG', default=False, cast=bool)
ALLOWED_HOSTS = ['*'] ALLOWED_HOSTS = ['*']
LOGIN_REDIRECT_URL = '/'
LOGIN_URL = '/login/?next='
# SAPL business apps in dependency order # SAPL business apps in dependency order
SAPL_APPS = ( SAPL_APPS = (

20
templates/base.html

@ -103,6 +103,26 @@
</li> </li>
</ul> </ul>
<ul class="nav navbar-nav navbar-right" id="autenticacao">
{% if not user.is_authenticated %}
<li><a href="{% url 'base:login' %}">Login</a></li>
{% else %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
{% if user.first_name or user.last_name %}
{{ user.get_full_name }}
{% else %}
{{ user.username }}
{% endif %}
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="{% url 'base:logout' %}">Sair</a></li>
{% endif %}
</ul>
</li>
</ul>
</div><!--/.nav-collapse --> </div><!--/.nav-collapse -->
</div> </div>
</nav> </nav>

68
templates/base/login.html

@ -0,0 +1,68 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% block base_content %}
<!-- O bloco comentado é para ser implementado após as autorizacoes -->
<!-- {% if next %}
{% if user.is_authenticated %}
<p>Você não tem acesso a esta página. Se quiser continuar, faça o Login.</p>
{% else %}
<p>Por favor, faça o Login para acessar esta página.</p>
{% endif %}
{% endif %} -->
<div class="container">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="login-panel panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Entrar</h3>
</div>
<div class="panel-body">
<form id="login-form" method="post" action="{% url 'base:login' %}">
{% csrf_token %}
<p class="bs-component">
<table>
{% if form.errors %}
<div class="alert alert-danger">Usuário e/ou Senha inválidos.
</div>
{% endif %}
<tr>
<td><b>Usuário</b></td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td><b>Senha</b></td>
<td>{{ form.password }}</td>
</tr>
</table>
</p>
<p class="bs-component">
<center>
<input class="btn btn-success btn-sm" type="submit" value="login" />
</center>
</p>
<input type="hidden" name="next" value="{{ next }}" />
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock base_content %}
{% block javascript %}
<script>
{% if not user.is_authenticated %}
$("#autenticacao") .css("display","none");
{% endif %}
</script>
{% endblock %}
Loading…
Cancel
Save