diff --git a/README.rst b/README.rst index 67d1e84db..c245a89aa 100644 --- a/README.rst +++ b/README.rst @@ -173,7 +173,7 @@ Instalação e configuração das dependências do projeto ./manage.py bower install -* Atualizar e/ou criar a base de dados para refletir o modelo da versão clonada:: +* Atualizar e/ou criar as tabelas da base de dados para refletir o modelo da versão clonada:: ./manage.py migrate @@ -189,6 +189,35 @@ Instalação e configuração das dependências do projeto http://localhost:8000/ +Instruções para criação dos grupos de perfis de usuários e os usuários de testes +=========================================================================== + +* Criar super usuário do django-contrib-admin (Será solicitado alguns dados para criação):: + + ./manage.py createsuperuser + +Os perfis semânticos do SAPL devem ser criados manualmente através da execução de um script que gera esses perfis e adiciona um usuário padrão em cada perfil. Para testar o comportamento de cada perfil é necessário executar este script: + +* Execute:: + + ./manage.py shell_plus + +* Será aberto um prompt do python customizado com diversas funcionalidades do django e do sapl. Execute dentro do prompt:: + + %run scripts/inicializa_grupos_autorizacoes.py + +* Os usuários criados, todos com senha "interlegis", serão:: + + operador_administrativo + operador_protocoloadm + operador_comissoes + operador_materia + operador_norma + operador_sessao + operador_painel + operador_geral + operador_autor + Instruções para Tradução ======================== diff --git a/sapl/parlamentares/migrations/0028_auto_20160922_1443.py b/sapl/parlamentares/migrations/0028_auto_20160922_1443.py new file mode 100644 index 000000000..23efc2489 --- /dev/null +++ b/sapl/parlamentares/migrations/0028_auto_20160922_1443.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-22 17:43 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0027_merge'), + ] + + operations = [ + migrations.RemoveField( + model_name='tipoafastamento', + name='afastamento', + ), + migrations.RemoveField( + model_name='tipoafastamento', + name='fim_mandato', + ), + migrations.AddField( + model_name='tipoafastamento', + name='indicador', + field=models.CharField(choices=[('A', 'Afastamento'), ('F', 'Fim de Mandato')], default='F', max_length=1, verbose_name='Indicador'), + ), + ] diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index 67039a107..0a4acb994 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -4,7 +4,8 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from model_utils import Choices -from sapl.utils import (UF, YES_NO_CHOICES, intervalos_tem_intersecao, +from sapl.utils import (INDICADOR_AFASTAMENTO, UF, YES_NO_CHOICES, + intervalos_tem_intersecao, restringe_tipos_de_arquivo_img) @@ -328,9 +329,9 @@ class Filiacao(models.Model): class TipoAfastamento(models.Model): descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) - afastamento = models.BooleanField( - choices=YES_NO_CHOICES, verbose_name=_('Indicador')) - fim_mandato = models.BooleanField(verbose_name=_('Indicador')) + indicador = models.CharField( + max_length=1, verbose_name=_('Indicador'), default='F', + choices=INDICADOR_AFASTAMENTO) dispositivo = models.CharField( max_length=50, blank=True, verbose_name=_('Dispositivo')) diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 8b5845de2..0a9b7b613 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -11,9 +11,11 @@ from django.utils.translation import ugettext_lazy as _ from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.forms import MateriaLegislativaFilterSet from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa +from sapl.parlamentares.models import Parlamentar from sapl.utils import RANGE_DIAS_MES, RANGE_MESES, autor_label, autor_modal -from .models import Bancada, ExpedienteMateria, OrdemDia, SessaoPlenaria +from .models import (Bancada, ExpedienteMateria, Orador, OradorExpediente, + OrdemDia, SessaoPlenaria) def pega_anos(): @@ -265,3 +267,27 @@ class AdicionarVariasMateriasFilterSet(MateriaLegislativaFilterSet): row4, row5, row6, row7, row8, form_actions(save_label='Pesquisar')) ) + + +class OradorForm(ModelForm): + + def __init__(self, *args, **kwargs): + super(OradorForm, self).__init__(*args, **kwargs) + self.fields['parlamentar'].queryset = Parlamentar.objects.filter( + ativo=True).order_by('nome_completo') + + class Meta: + model = Orador + exclude = ['sessao_plenaria'] + + +class OradorExpedienteForm(ModelForm): + + def __init__(self, *args, **kwargs): + super(OradorExpedienteForm, self).__init__(*args, **kwargs) + self.fields['parlamentar'].queryset = Parlamentar.objects.filter( + ativo=True).order_by('nome_completo') + + class Meta: + model = OradorExpediente + exclude = ['sessao_plenaria'] diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 6112307f1..a15c3a8e0 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -29,9 +29,9 @@ from sapl.utils import permissao_tb_aux, permissoes_painel, permissoes_sessao from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, ExpedienteForm, ExpedienteMateriaForm, ListMateriaForm, - MesaForm, OrdemDiaForm, PresencaForm, - SessaoPlenariaFilterSet, VotacaoEditForm, VotacaoForm, - VotacaoNominalForm) + MesaForm, OradorExpedienteForm, OradorForm, OrdemDiaForm, + PresencaForm, SessaoPlenariaFilterSet, VotacaoEditForm, + VotacaoForm, VotacaoNominalForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, ExpedienteSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, @@ -180,6 +180,10 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): class CreateView(MasterDetailCrud.CreateView): form_class = OrdemDiaForm + def get_success_url(self): + return reverse('sapl.sessao:ordemdia_list', + kwargs={'pk': self.kwargs['pk']}) + class UpdateView(MasterDetailCrud.UpdateView): form_class = OrdemDiaForm @@ -349,6 +353,10 @@ class ExpedienteMateriaCrud(MasterDetailCrud): form_class = ExpedienteMateriaForm permission_required = permissoes_sessao() + def get_success_url(self): + return reverse('sapl.sessao:expedientemateria_list', + kwargs={'pk': self.kwargs['pk']}) + class UpdateView(PermissionRequiredMixin, MasterDetailCrud.UpdateView): form_class = ExpedienteMateriaForm permission_required = permissoes_sessao() @@ -392,9 +400,15 @@ class OradorExpedienteCrud(OradorCrud): class CreateView(PermissionRequiredMixin, MasterDetailCrud.CreateView): permission_required = permissoes_sessao() + form_class = OradorExpedienteForm + + def get_success_url(self): + return reverse('sapl.sessao:oradorexpediente_list', + kwargs={'pk': self.kwargs['pk']}) class UpdateView(PermissionRequiredMixin, MasterDetailCrud.UpdateView): permission_required = permissoes_sessao() + form_class = OradorExpedienteForm class DeleteView(PermissionRequiredMixin, MasterDetailCrud.DeleteView): permission_required = permissoes_sessao() @@ -405,9 +419,15 @@ class OradorCrud(OradorCrud): class CreateView(PermissionRequiredMixin, MasterDetailCrud.CreateView): permission_required = permissoes_sessao() + form_class = OradorForm + + def get_success_url(self): + return reverse('sapl.sessao:orador_list', + kwargs={'pk': self.kwargs['pk']}) class UpdateView(PermissionRequiredMixin, MasterDetailCrud.UpdateView): permission_required = permissoes_sessao() + form_class = OradorForm class DeleteView(PermissionRequiredMixin, MasterDetailCrud.DeleteView): permission_required = permissoes_sessao() diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 0d55182dc..83f6414a3 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -160,9 +160,9 @@ <span class="vcenter"> {# XXX Make better use of translation tags in html blocks ie. actually use the proper blocktrans tag efficiently #} {% if nome %} - {{ nome }} {% trans 'de' %} {{ municipio }} - {{ uf }} + {{ nome }} {% else %} - {% trans 'Câmara Municipal'%} + {% trans 'Câmara/Assembléia não configurada'%} {% endif %} <br/><small>{% trans 'Sistema de Apoio ao Processo Legislativo' %}</small> </span> diff --git a/sapl/templates/parlamentares/layouts.yaml b/sapl/templates/parlamentares/layouts.yaml index f455a593e..d208ee2ba 100644 --- a/sapl/templates/parlamentares/layouts.yaml +++ b/sapl/templates/parlamentares/layouts.yaml @@ -82,7 +82,7 @@ NivelInstrucao: TipoAfastamento: {% trans 'Tipo de Afastamento' %}: - - descricao:5 dispositivo:5 afastamento + - descricao dispositivo indicador SituacaoMilitar: {% trans 'Tipo Situação Militar' %}: diff --git a/sapl/templates/sessao/sessaoplenaria_filter.html b/sapl/templates/sessao/sessaoplenaria_filter.html index 560f5751d..a1fe89169 100644 --- a/sapl/templates/sessao/sessaoplenaria_filter.html +++ b/sapl/templates/sessao/sessaoplenaria_filter.html @@ -18,41 +18,36 @@ {% block detail_content %} <h1><b>Pesquisar Sessão Plenária</b></h1> <br></br> - {% crispy filter.form %} - <p></p> - <table class="table table-striped table-hover"> - <thead class="thead-default"> - <tr><td><h3>Resultados</h3></td></tr> - </thead> - {% if page_obj|length %} - {% if numero_res > 1 %} - <h3>Foram encontradas {{numero_res}} sessões.</h3></br> - {% elif numero_res == 1 %} - <h3>Foi encontrada {{numero_res}} sessão.</h3></br> - {% endif %} - - {% for s in page_obj %} - <tr> - <td> - <strong><a href="{% url 'sapl.sessao:sessaoplenaria_detail' s.id %}">{{s}}</strong></a></br> - <strong>Abertura:</strong> {{s.data_inicio}}</br> - <strong>Legislatura:</strong> {{s.legislatura}}</br> - <strong>Sessão Legislativa:</strong> {{s.sessao_legislativa}}</br> - <strong>Tipo:</strong> {{s.tipo}}</br> - </> - </tr> - {% endfor %} - {% else %} - <tr> - <td> - <h3>Nenhuma Sessão Plenária encontrada com essas especificações</h3> - </tr> + {% if filter_url %} + <p></p> + <table class="table table-striped table-hover"> + <thead class="thead-default"> + <tr><td><h3>Resultados</h3></td></tr> + </thead> + {% if page_obj|length %} + {% if numero_res > 1 %} + <h3>Foram encontradas {{numero_res}} sessões.</h3></br> + {% elif numero_res == 1 %} + <h3>Foi encontrada {{numero_res}} sessão.</h3></br> {% endif %} - - </table> -{% include "paginacao.html" %} - -{% endblock detail_content %} \ No newline at end of file + {% for s in page_obj %} + <tr> + <td> + <strong><a href="{% url 'sapl.sessao:sessaoplenaria_detail' s.id %}">{{s}}</strong></a></br> + <strong>Abertura:</strong> {{s.data_inicio}}</br> + <strong>Legislatura:</strong> {{s.legislatura}}</br> + <strong>Sessão Legislativa:</strong> {{s.sessao_legislativa}}</br> + <strong>Tipo:</strong> {{s.tipo}}</br> + </td> + </tr> + {% endfor %} + {% else %} + <tr><td><h3>Nenhuma Sessão Plenária encontrada com essas especificações</h3></tr> + {% endif %} + </table> + {% include "paginacao.html" %} + {% endif %} +{% endblock detail_content %} diff --git a/sapl/utils.py b/sapl/utils.py index 3f63c30df..b59b4f5b3 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -111,6 +111,11 @@ TURNO_TRAMITACAO_CHOICES = [ ('C', _('2ª e 3ª Votação')), ] +INDICADOR_AFASTAMENTO = [ + ('A', _('Afastamento')), + ('F', _('Fim de Mandato')), +] + def listify(function): @wraps(function)