Browse Source

Semi-merge master

Precisa avaliar proposição
pull/529/head
Eduardo Edson Batista Cordeiro Alves 8 years ago
parent
commit
65fd92b6c6
  1. 3
      sapl/base/tests/test_login.py
  2. 5
      sapl/base/urls.py
  3. 21
      sapl/comissoes/migrations/0005_comissao_ativa.py
  4. 3
      sapl/comissoes/models.py
  5. 2
      sapl/comissoes/views.py
  6. 74
      sapl/legacy/migration.py
  7. 2
      sapl/legacy_migration_settings.py
  8. 40
      sapl/materia/forms.py
  9. 3
      sapl/materia/legacy.yaml
  10. 42
      sapl/materia/migrations/0039_auto_20160808_1753.py
  11. 35
      sapl/materia/migrations/0040_auto_20160810_1524.py
  12. 19
      sapl/materia/migrations/0041_remove_proposicao_data_incorporação.py
  13. 20
      sapl/materia/migrations/0042_proposicao_data_devolução.py
  14. 20
      sapl/materia/migrations/0043_auto_20160810_1738.py
  15. 28
      sapl/materia/models.py
  16. 11
      sapl/materia/tests/test_materia.py
  17. 31
      sapl/materia/urls.py
  18. 227
      sapl/materia/views.py
  19. 10
      sapl/painel/views.py
  20. 8
      sapl/parlamentares/views.py
  21. 29
      sapl/protocoloadm/forms.py
  22. 36
      sapl/protocoloadm/urls.py
  23. 15
      sapl/protocoloadm/views.py
  24. 126
      sapl/sessao/forms.py
  25. 28
      sapl/sessao/migrations/0021_adicionamultiplasmaterias.py
  26. 22
      sapl/sessao/migrations/0022_auto_20160805_0943.py
  27. 43
      sapl/sessao/urls.py
  28. 348
      sapl/sessao/views.py
  29. BIN
      sapl/static/img/file.png
  30. BIN
      sapl/static/img/icon_comissoes.png
  31. BIN
      sapl/static/img/icon_materia_legislativa.png
  32. BIN
      sapl/static/img/icon_mesa_diretora.png
  33. BIN
      sapl/static/img/icon_normas_juridicas.png
  34. BIN
      sapl/static/img/icon_parlamentares.png
  35. BIN
      sapl/static/img/icon_pautas.png
  36. BIN
      sapl/static/img/icon_plenarias.png
  37. BIN
      sapl/static/img/icon_relatorios.png
  38. 229
      sapl/static/styles/app.scss
  39. 149
      sapl/templates/ajuda.html
  40. 17
      sapl/templates/base.html
  41. 2
      sapl/templates/comissoes/layouts.yaml
  42. 2
      sapl/templates/crud/confirm_delete.html
  43. 2
      sapl/templates/crud/detail.html
  44. 2
      sapl/templates/crud/form.html
  45. 162
      sapl/templates/index.html
  46. 32
      sapl/templates/materia/confirmar_proposicao.html
  47. 11
      sapl/templates/materia/formulario_cadastro.html
  48. 43
      sapl/templates/materia/prop_devolvidas_list.html
  49. 35
      sapl/templates/materia/prop_pendentes_list.html
  50. 43
      sapl/templates/materia/prop_recebidas_list.html
  51. 10
      sapl/templates/materia/proposicao_confirm_delete.html
  52. 6
      sapl/templates/materia/proposicao_detail.html
  53. 8
      sapl/templates/materia/proposicao_form.html
  54. 9
      sapl/templates/materia/receber_proposicao.html
  55. 70
      sapl/templates/materia/recibo_proposicao.html
  56. 6
      sapl/templates/materia/subnav_prop.html
  57. 113
      sapl/templates/painel/index.html
  58. 12
      sapl/templates/sessao/OrdemDia.html
  59. 96
      sapl/templates/sessao/adicionar_varias_materias_expediente.html
  60. 18
      sapl/templates/sessao/adicionar_varias_materias_ordem.html
  61. 85
      sapl/templates/sessao/expediente_ordemdia_list.html
  62. 3
      sapl/templates/sessao/expedientemateria_list.html
  63. 27
      sapl/templates/sessao/layouts.yaml
  64. 76
      sapl/templates/sessao/materia_ordemdia.html
  65. 74
      sapl/templates/sessao/materia_ordemdia_edit.html
  66. 89
      sapl/templates/sessao/materia_ordemdia_list.html
  67. 4
      sapl/templates/sessao/painel.html
  68. 16
      sapl/templates/sessao/pauta_sessao_detail.html
  69. 36
      sapl/templates/sessao/pauta_sessao_list.html
  70. 2
      sapl/templates/sessao/subnav.yaml
  71. 11
      sapl/templates/sessao/votacao/nominal.html
  72. 13
      sapl/templates/sessao/votacao/nominal_edit.html
  73. 13
      sapl/utils.py

3
sapl/base/tests/test_login.py

@ -12,7 +12,8 @@ def user():
def test_login_aparece_na_barra_para_usuario_nao_logado(client):
response = client.get('/')
assert '<a href="/login/">Login</a>' in str(response.content)
assert '<a href="/login/"><img src="/static/img/user.png"></a>' in str(
response.content)
def test_username_do_usuario_logado_aparece_na_barra(client, user):

5
sapl/base/urls.py

@ -10,7 +10,12 @@ app_name = AppConfig.name
urlpatterns = [
<<<<<<< HEAD
url(r'^sistema/', SistemaView.as_view()),
=======
url(r'^sistema/', TemplateView.as_view(template_name='sistema.html')),
url(r'^ajuda/', TemplateView.as_view(template_name='ajuda.html')),
>>>>>>> master
url(r'^ajuda/(?P<topic>\w+)$', HelpView.as_view(), name='help_topic'),
url(r'^ajuda/', TemplateView.as_view(template_name='ajuda/index.html'),
name='help_base'),

21
sapl/comissoes/migrations/0005_comissao_ativa.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-08-05 18:36
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('comissoes', '0004_auto_20160307_0905'),
]
operations = [
migrations.AddField(
model_name='comissao',
name='ativa',
field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=True, verbose_name='Comissão Ativa?'),
preserve_default=False,
),
]

3
sapl/comissoes/models.py

@ -73,6 +73,9 @@ class Comissao(models.Model):
unidade_deliberativa = models.BooleanField(
choices=YES_NO_CHOICES,
verbose_name=_('Unidade Deliberativa'))
ativa = models.BooleanField(
choices=YES_NO_CHOICES,
verbose_name=_('Comissão Ativa?'))
class Meta:
verbose_name = _('Comissão')

2
sapl/comissoes/views.py

@ -138,7 +138,7 @@ class ComissaoCrud(Crud):
permission_required = permissoes_comissoes()
class BaseMixin(CrudBaseMixin):
list_field_names = ['nome', 'sigla', 'tipo', 'data_criacao']
list_field_names = ['nome', 'sigla', 'tipo', 'data_criacao', 'ativa']
class MateriasTramitacaoListView(ListView):

74
sapl/legacy/migration.py

@ -13,7 +13,7 @@ from model_mommy.mommy import foreign_key_required, make
from sapl.base.models import ProblemaMigracao
from sapl.comissoes.models import Composicao, Participacao
from sapl.materia.models import StatusTramitacao, Tramitacao
from sapl.materia.models import StatusTramitacao, TipoProposicao, Tramitacao
from sapl.norma.models import AssuntoNormaRelationship, NormaJuridica
from sapl.parlamentares.models import Parlamentar
from sapl.protocoloadm.models import StatusTramitacaoAdministrativo
@ -377,7 +377,24 @@ def migrate(obj=appconfs):
# MIGRATION_ADJUSTMENTS #####################################################
def adjust_participacao(new_participacao, old):
def adjust_ordemdia(new, old):
# Prestar atenção
if not old.tip_votacao:
new.tipo_votacao = 1
def adjust_parlamentar(new, old):
if old.ind_unid_deliberativa:
value = new.unidade_deliberativa
# Field is defined as not null in legacy db,
# but data includes null values
# => transform None to False
if value is None:
warn('nulo convertido para falso')
new.unidade_deliberativa = False
def adjust_participacao(new, old):
composicao = Composicao()
composicao.comissao, composicao.periodo = [
get_fk_related(Composicao._meta.get_field(name), value)
@ -391,33 +408,21 @@ def adjust_participacao(new_participacao, old):
[composicao] = already_created
else:
composicao.save()
new_participacao.composicao = composicao
new.composicao = composicao
def adjust_parlamentar(new_parlamentar, old):
if old.ind_unid_deliberativa:
value = new_parlamentar.unidade_deliberativa
# Field is defined as not null in legacy db,
# but data includes null values
# => transform None to False
if value is None:
warn('nulo convertido para falso')
new_parlamentar.unidade_deliberativa = False
def adjust_normajuridica(new, old):
# O 'S' vem de 'Selecionar'. Na versão antiga do SAPL, quando uma opção do
# combobox era selecionada, o sistema pegava a primeira letra da seleção,
# sendo F para Federal, E para Estadual, M para Municipal e o S para
# Selecionar, que era a primeira opção quando nada era selecionado.
if old.tip_esfera_federacao == 'S':
new.esfera_federacao = ''
def adjust_sessaoplenaria(new, old):
assert not old.tip_expediente
def adjust_ordemdia(new, old):
# Prestar atenção
if not old.tip_votacao:
new.tipo_votacao = 1
def adjust_tipoproposicao(new, old):
if new.materia_ou_documento == 'M':
field = TipoProposicao.tipo_materia.field
value = get_fk_related(field=field, value=old.tip_mat_ou_doc)
elif new.materia_ou_documento == 'D':
field = TipoProposicao.tipo_documento.field
value = get_fk_related(field=field, value=old.tip_mat_ou_doc)
setattr(new, field.name, value)
def adjust_statustramitacao(new, old):
@ -438,11 +443,18 @@ def adjust_tramitacao(new, old):
new.turno = 'U'
def adjust_sessaoplenaria(new, old):
assert not old.tip_expediente
def adjust_normajuridica_antes_salvar(new, old):
# Ajusta choice de esfera_federacao
# O 'S' vem de 'Selecionar'. Na versão antiga do SAPL, quando uma opção do
# combobox era selecionada, o sistema pegava a primeira letra da seleção,
# sendo F para Federal, E para Estadual, M para Municipal e o S para
# Selecionar, que era a primeira opção quando nada era selecionado.
if old.tip_esfera_federacao == 'S':
new.esfera_federacao = ''
def adjust_normajuridica(new, old):
def adjust_normajuridica_depois_salvar(new, old):
# Ajusta relação M2M
lista_ids_assunto = old.cod_assunto.split(',')
for id_assunto in lista_ids_assunto:
relacao = AssuntoNormaRelationship()
@ -452,17 +464,19 @@ def adjust_normajuridica(new, old):
AJUSTE_ANTES_SALVAR = {
NormaJuridica: adjust_normajuridica_antes_salvar,
OrdemDia: adjust_ordemdia,
Participacao: adjust_participacao,
Parlamentar: adjust_parlamentar,
Participacao: adjust_participacao,
SessaoPlenaria: adjust_sessaoplenaria,
TipoProposicao: adjust_tipoproposicao,
StatusTramitacao: adjust_statustramitacao,
StatusTramitacaoAdministrativo: adjust_statustramitacaoadm,
Tramitacao: adjust_tramitacao,
}
AJUSTE_DEPOIS_SALVAR = {
NormaJuridica: adjust_normajuridica,
NormaJuridica: adjust_normajuridica_depois_salvar,
}
# CHECKS ####################################################################

2
sapl/legacy_migration_settings.py

@ -3,7 +3,7 @@
from .settings import * # flake8: noqa
INSTALLED_APPS += (
'legacy', # legacy reversed model definitions
'sapl.legacy', # legacy reversed model definitions
)
DATABASES['legacy'] = {

40
sapl/materia/forms.py

@ -33,6 +33,31 @@ def em_tramitacao():
(False, 'Não')]
class ConfirmarProposicaoForm(ModelForm):
class Meta:
model = Proposicao
exclude = ['texto_original', 'descricao', 'tipo']
class ReceberProposicaoForm(ModelForm):
cod_hash = forms.CharField(label='Código do Documento', required=True)
class Meta:
model = Proposicao
exclude = ['texto_original', 'descricao', 'tipo']
def __init__(self, *args, **kwargs):
row1 = to_row([('cod_hash', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(
_('Incorporar Proposição'), row1,
form_actions(save_label='Buscar Proposição')
)
)
super(ReceberProposicaoForm, self).__init__(*args, **kwargs)
class UnidadeTramitacaoForm(ModelForm):
class Meta:
@ -84,6 +109,11 @@ class ProposicaoForm(ModelForm):
cleaned_data = self.cleaned_data
if 'tipo' in cleaned_data:
if cleaned_data['tipo'].descricao == 'Parecer':
if self.instance.materia:
cleaned_data['materia'] = self.instance.materia
cleaned_data['autor'] = (
self.instance.materia.autoria_set.first().autor)
else:
try:
materia = MateriaLegislativa.objects.get(
tipo_id=cleaned_data['tipo_materia'],
@ -94,10 +124,18 @@ class ProposicaoForm(ModelForm):
raise ValidationError(msg)
else:
cleaned_data['materia'] = materia
cleaned_data['autor'] = materia.autoria_set.first().autor
cleaned_data['autor'] = materia.autoria_set.first(
).autor
return cleaned_data
def save(self, commit=False):
proposicao = super(ProposicaoForm, self).save(commit)
if 'materia' in self.cleaned_data:
proposicao.materia = self.cleaned_data['materia']
proposicao.save()
return proposicao
class Meta:
model = Proposicao
fields = ['tipo', 'data_envio', 'descricao', 'texto_original', 'autor']

3
sapl/materia/legacy.yaml

@ -126,7 +126,8 @@ TipoProposicao:
descricao: des_tipo_proposicao
materia_ou_documento: ind_mat_ou_doc
modelo: nom_modelo
tipo_materia: tip_mat_ou_doc
tipo_documento:
tipo_materia:
Proposicao:
autor: cod_autor

42
sapl/materia/migrations/0039_auto_20160808_1753.py

@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-08-08 20:53
from __future__ import unicode_literals
from django.db import migrations, models
import sapl.materia.models
import sapl.utils
class Migration(migrations.Migration):
dependencies = [
('materia', '0038_auto_20160612_1506'),
]
operations = [
migrations.RemoveField(
model_name='proposicao',
name='data_devolucao',
),
migrations.AddField(
model_name='proposicao',
name='data_incorporação',
field=models.DateTimeField(blank=True, null=True, verbose_name='Data de Incorporação'),
),
migrations.AlterField(
model_name='proposicao',
name='data_recebimento',
field=models.DateTimeField(blank=True, null=True, verbose_name='Data de Recebimento'),
),
migrations.AlterField(
model_name='proposicao',
name='status',
field=models.CharField(blank=True, choices=[('E', 'Enviada'), ('R', 'Recebida'), ('I', 'Incorporada')], max_length=1, verbose_name='Status Proposição'),
),
migrations.AlterField(
model_name='proposicao',
name='texto_original',
field=models.FileField(default='', upload_to=sapl.materia.models.texto_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Original'),
preserve_default=False,
),
]

35
sapl/materia/migrations/0040_auto_20160810_1524.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-08-10 18:24
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('materia', '0039_auto_20160808_1753'),
]
operations = [
migrations.RemoveField(
model_name='proposicao',
name='documento',
),
migrations.AddField(
model_name='proposicao',
name='documento_gerado',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='materia.DocumentoAcessorio'),
),
migrations.AddField(
model_name='proposicao',
name='materia_gerada',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='materia_gerada', to='materia.MateriaLegislativa'),
),
migrations.AlterField(
model_name='proposicao',
name='materia',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='materia_vinculada', to='materia.MateriaLegislativa', verbose_name='Matéria'),
),
]

19
sapl/materia/migrations/0041_remove_proposicao_data_incorporação.py

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-08-10 20:02
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('materia', '0040_auto_20160810_1524'),
]
operations = [
migrations.RemoveField(
model_name='proposicao',
name='data_incorporação',
),
]

20
sapl/materia/migrations/0042_proposicao_data_devolução.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-08-10 20:37
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('materia', '0041_remove_proposicao_data_incorporação'),
]
operations = [
migrations.AddField(
model_name='proposicao',
name='data_devolução',
field=models.DateTimeField(blank=True, null=True, verbose_name='Data de Devolução'),
),
]

20
sapl/materia/migrations/0043_auto_20160810_1738.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-08-10 20:38
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('materia', '0042_proposicao_data_devolução'),
]
operations = [
migrations.RenameField(
model_name='proposicao',
old_name='data_devolução',
new_name='data_devolucao',
),
]

28
sapl/materia/models.py

@ -459,14 +459,16 @@ class TipoProposicao(models.Model):
class Proposicao(models.Model):
autor = models.ForeignKey(Autor, null=True, blank=True)
tipo = models.ForeignKey(TipoProposicao, verbose_name=_('Tipo'))
# XXX data_envio was not null, but actual data said otherwise!!!
data_envio = models.DateTimeField(
null=True, blank=True, verbose_name=_('Data de Envio'))
blank=True, null=True, verbose_name=_('Data de Envio'))
data_recebimento = models.DateTimeField(
blank=True, null=True, verbose_name=_('Data de Incorporação'))
descricao = models.TextField(max_length=100, verbose_name=_('Descrição'))
blank=True, null=True, verbose_name=_('Data de Recebimento'))
data_devolucao = models.DateTimeField(
blank=True, null=True, verbose_name=_('Data de devolução'))
blank=True, null=True, verbose_name=_('Data de Devolução'))
descricao = models.TextField(max_length=100, verbose_name=_('Descrição'))
justificativa_devolucao = models.CharField(
max_length=200,
blank=True,
@ -477,17 +479,23 @@ class Proposicao(models.Model):
status = models.CharField(blank=True,
max_length=1,
choices=(('E', 'Enviada'),
('D', 'Devolvida'),
('R', 'Recebida'),
('I', 'Incorporada')),
verbose_name=_('Status Proposição'))
# mutually exclusive (depend on tipo.materia_ou_documento)
materia = models.ForeignKey(
MateriaLegislativa, blank=True, null=True, verbose_name=_('Matéria'))
documento = models.ForeignKey(
DocumentoAcessorio, blank=True, null=True, verbose_name=_('Documento'))
MateriaLegislativa, blank=True, null=True, verbose_name=_('Matéria'),
related_name=_('materia_vinculada'))
# Ao ser recebida, irá gerar uma nova matéria ou um documento acessorio
# de uma já existente
materia_gerada = models.ForeignKey(
MateriaLegislativa, blank=True, null=True,
related_name=_('materia_gerada'))
documento_gerado = models.ForeignKey(
DocumentoAcessorio, blank=True, null=True)
texto_original = models.FileField(
blank=True,
null=True,
upload_to=texto_upload_path,
verbose_name=_('Texto Original'),
validators=[restringe_tipos_de_arquivo_txt])

11
sapl/materia/tests/test_materia.py

@ -7,10 +7,10 @@ from model_mommy import mommy
from sapl.comissoes.models import Comissao, TipoComissao
from sapl.materia.models import (Anexada, Autor, Autoria, DespachoInicial,
DocumentoAcessorio, MateriaLegislativa,
Numeracao, Proposicao, RegimeTramitacao,
StatusTramitacao, TipoAutor, TipoDocumento,
TipoMateriaLegislativa, TipoProposicao,
Tramitacao, UnidadeTramitacao)
Numeracao, RegimeTramitacao, StatusTramitacao,
TipoAutor, TipoDocumento,
TipoMateriaLegislativa, Tramitacao,
UnidadeTramitacao)
from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
TipoNormaJuridica)
@ -429,6 +429,7 @@ def test_form_errors_relatoria(admin_client):
['Este campo é obrigatório.'])
assert (response.context_data['form'].errors['parlamentar'] ==
['Este campo é obrigatório.'])
<<<<<<< HEAD
@pytest.mark.django_db(transaction=False)
@ -478,3 +479,5 @@ def test_form_errors_proposicao(admin_client):
['Este campo é obrigatório.'])
assert (response.context_data['form'].errors['descricao'] ==
['Este campo é obrigatório.'])
=======
>>>>>>> master

31
sapl/materia/urls.py

@ -3,17 +3,24 @@ from django.conf.urls import include, url
from sapl.materia.views import (AcompanhamentoConfirmarView,
AcompanhamentoExcluirView,
AcompanhamentoMateriaView, AnexadaCrud,
<<<<<<< HEAD
AutorCrud, AutoriaCrud, ConfirmarEmailView,
=======
AutorCrud, AutoriaCrud, ConfirmarProposicao,
>>>>>>> master
DespachoInicialCrud, DocumentoAcessorioCrud,
LegislacaoCitadaCrud, MateriaLegislativaCrud,
MateriaLegislativaPesquisaView, MateriaTaView,
NumeracaoCrud, OrgaoCrud, OrigemCrud,
ProposicaoCrud, ProposicaoTaView,
RegimeTramitacaoCrud, RelatoriaCrud,
StatusTramitacaoCrud, TipoAutorCrud,
TipoDocumentoCrud, TipoFimRelatoriaCrud,
TipoMateriaCrud, TipoProposicaoCrud,
TramitacaoCrud, UnidadeTramitacaoCrud)
ProposicaoCrud, ProposicaoDevolvida,
ProposicaoPendente, ProposicaoRecebida,
ProposicaoTaView, ReceberProposicao,
ReciboProposicaoView, RegimeTramitacaoCrud,
RelatoriaCrud, StatusTramitacaoCrud,
TipoAutorCrud, TipoDocumentoCrud,
TipoFimRelatoriaCrud, TipoMateriaCrud,
TipoProposicaoCrud, TramitacaoCrud,
UnidadeTramitacaoCrud)
from .apps import AppConfig
@ -34,6 +41,18 @@ urlpatterns = [
ConfirmarEmailView.as_view(), name='confirmar_email'),
url(r'^proposicao/', include(ProposicaoCrud.get_urls())),
url(r'^proposicao/recibo/(?P<pk>\d+)', ReciboProposicaoView.as_view(),
name='recibo-proposicao'),
url(r'^proposicao/receber/', ReceberProposicao.as_view(),
name='receber-proposicao'),
url(r'^proposicao/pendente/', ProposicaoPendente.as_view(),
name='proposicao-pendente'),
url(r'^proposicao/recebida/', ProposicaoRecebida.as_view(),
name='proposicao-recebida'),
url(r'^proposicao/devolvida/', ProposicaoDevolvida.as_view(),
name='proposicao-devolvida'),
url(r'^proposicao/confirmar/(?P<pk>\d+)', ConfirmarProposicao.as_view(),
name='proposicao-confirmar'),
# Integração com Compilação
url(r'^materia/(?P<pk>[0-9]+)/ta$',

227
sapl/materia/views.py

@ -18,7 +18,7 @@ from django.template import Context, loader
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, TemplateView, UpdateView
from django.views.generic import CreateView, ListView, TemplateView, UpdateView
from django_filters.views import FilterView
from sapl.base.models import CasaLegislativa
@ -29,6 +29,7 @@ from sapl.crud.base import (Crud, CrudBaseMixin, CrudCreateView,
CrudUpdateView, make_pagination)
from sapl.crud.masterdetail import MasterDetailCrud
from sapl.norma.models import LegislacaoCitada
<<<<<<< HEAD
from sapl.utils import (autor_label, autor_modal, get_base_url,
permissao_tb_aux, permissoes_autor, permissoes_materia)
@ -38,6 +39,17 @@ from .forms import (AcompanhamentoMateriaForm, AnexadaForm, AutorForm,
NumeracaoForm, ProposicaoForm, RelatoriaForm,
TramitacaoForm, UnidadeTramitacaoForm,
filtra_tramitacao_destino,
=======
from sapl.utils import (autor_label, autor_modal, gerar_hash_arquivo,
get_base_url)
from .forms import (AcompanhamentoMateriaForm, AnexadaForm, AutoriaForm,
ConfirmarProposicaoForm, DespachoInicialForm,
DocumentoAcessorioForm, LegislacaoCitadaForm,
MateriaLegislativaFilterSet, NumeracaoForm, ProposicaoForm,
ReceberProposicaoForm, RelatoriaForm, TramitacaoForm,
UnidadeTramitacaoForm, filtra_tramitacao_destino,
>>>>>>> master
filtra_tramitacao_destino_and_status,
filtra_tramitacao_status)
from .models import (AcompanhamentoMateria, Anexada, Autor, Autoria,
@ -188,6 +200,43 @@ class StatusTramitacaoCrud(Crud):
return permissao_tb_aux(self)
def criar_materia_proposicao(proposicao):
tipo_materia = TipoMateriaLegislativa.objects.get(
descricao=proposicao.tipo.descricao)
numero = MateriaLegislativa.objects.filter(
ano=datetime.now().year).order_by('numero').last().numero + 1
regime = RegimeTramitacao.objects.get(descricao='Normal')
return MateriaLegislativa.objects.create(
tipo=tipo_materia,
ano=datetime.now().year,
numero=numero,
data_apresentacao=datetime.now(),
regime_tramitacao=regime,
em_tramitacao=True,
ementa=proposicao.descricao,
texto_original=proposicao.texto_original
)
def criar_doc_proposicao(proposicao):
tipo_doc = TipoDocumento.objects.get(
descricao=proposicao.tipo.descricao)
if proposicao.autor is None:
autor = 'Desconhecido'
else:
autor = proposicao.autor
return DocumentoAcessorio.objects.create(
materia=proposicao.materia,
tipo=tipo_doc,
arquivo=proposicao.texto_original,
nome=proposicao.descricao,
data=proposicao.data_envio,
autor=autor
)
class UnidadeTramitacaoCrud(Crud):
model = UnidadeTramitacao
help_path = 'unidade_tramitacao'
@ -204,12 +253,149 @@ class UnidadeTramitacaoCrud(Crud):
permission_required = permissoes_materia()
class ProposicaoDevolvida(ListView):
template_name = 'materia/prop_devolvidas_list.html'
model = Proposicao
ordering = ['data_envio']
paginate_by = 10
def get_queryset(self):
return Proposicao.objects.filter(
data_envio__isnull=False,
data_recebimento__isnull=True,
data_devolucao__isnull=False)
def get_context_data(self, **kwargs):
context = super(ProposicaoDevolvida, self).get_context_data(**kwargs)
paginator = context['paginator']
page_obj = context['page_obj']
context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages)
context['NO_ENTRIES_MSG'] = 'Nenhuma proposição devolvida.'
return context
class ProposicaoPendente(ListView):
template_name = 'materia/prop_pendentes_list.html'
model = Proposicao
ordering = ['data_envio', 'autor', 'tipo', 'descricao']
paginate_by = 10
def get_queryset(self):
return Proposicao.objects.filter(
data_envio__isnull=False,
data_recebimento__isnull=True,
data_devolucao__isnull=True)
def get_context_data(self, **kwargs):
context = super(ProposicaoPendente, self).get_context_data(**kwargs)
paginator = context['paginator']
page_obj = context['page_obj']
context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages)
context['NO_ENTRIES_MSG'] = 'Nenhuma proposição pendente.'
return context
class ProposicaoRecebida(ListView):
template_name = 'materia/prop_recebidas_list.html'
model = Proposicao
ordering = ['data_envio']
paginate_by = 10
def get_queryset(self):
return Proposicao.objects.filter(
data_envio__isnull=False,
data_recebimento__isnull=False,
data_devolucao__isnull=True)
def get_context_data(self, **kwargs):
context = super(ProposicaoRecebida, self).get_context_data(**kwargs)
paginator = context['paginator']
page_obj = context['page_obj']
context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages)
context['NO_ENTRIES_MSG'] = 'Nenhuma proposição recebida.'
return context
class ReceberProposicao(CreateView):
template_name = "materia/receber_proposicao.html"
form_class = ReceberProposicaoForm
def get_context_data(self, **kwargs):
context = super(ReceberProposicao, self).get_context_data(**kwargs)
context.update({'form': self.get_form()})
return context
def post(self, request, *args, **kwargs):
form = ReceberProposicaoForm(request.POST)
if form.is_valid():
proposicoes = Proposicao.objects.filter(data_envio__isnull=False)
for proposicao in proposicoes:
hasher = gerar_hash_arquivo(proposicao.texto_original.path,
str(proposicao.pk))
if hasher == form.cleaned_data['cod_hash']:
return HttpResponseRedirect(
reverse('sapl.materia:proposicao-confirmar',
kwargs={'pk': proposicao.pk}))
msg = 'Proposição não encontrada!'
return self.render_to_response({'form': form, 'msg': msg})
else:
return self.render_to_response({'form': form})
def get_success_url(self):
return reverse('sapl.materia:receber-proposicao')
class ConfirmarProposicao(CreateView):
template_name = "materia/confirmar_proposicao.html"
form_class = ConfirmarProposicaoForm
def get_context_data(self, **kwargs):
context = super(ConfirmarProposicao, self).get_context_data(**kwargs)
proposicao = Proposicao.objects.get(pk=self.kwargs['pk'])
context.update({'form': self.get_form(), 'proposicao': proposicao})
return context
def post(self, request, *args, **kwargs):
form = ConfirmarProposicaoForm(request.POST)
proposicao = Proposicao.objects.get(pk=self.kwargs['pk'])
if form.is_valid():
if 'incorporar' in request.POST:
proposicao.data_recebimento = datetime.now()
if proposicao.tipo.descricao == 'Parecer':
documento = criar_doc_proposicao(proposicao)
proposicao.documento_gerado = documento
proposicao.save()
return HttpResponseRedirect(
reverse('sapl.materia:documentoacessorio_update',
kwargs={'pk': documento.pk}))
else:
materia = criar_materia_proposicao(proposicao)
proposicao.materia_gerada = materia
proposicao.save()
return HttpResponseRedirect(
reverse('sapl.materia:materialegislativa_update',
kwargs={'pk': materia.pk}))
else:
proposicao.data_devolucao = datetime.now()
proposicao.save()
return HttpResponseRedirect(
reverse('sapl.materia:proposicao-devolvida'))
class ProposicaoCrud(Crud):
model = Proposicao
help_path = ''
class BaseMixin(CrudBaseMixin):
list_field_names = ['data_envio', 'descricao', 'tipo']
list_field_names = ['data_envio', 'descricao',
'tipo', 'data_recebimento']
class CreateView(PermissionRequiredMixin, CrudCreateView):
form_class = ProposicaoForm
@ -260,10 +446,22 @@ class ProposicaoCrud(Crud):
class DetailView(PermissionRequiredMixin, CrudDetailView):
permission_required = permissoes_autor()
def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs)
if self.object.materia:
context['form'].fields['tipo_materia'].initial = (
self.object.materia.tipo.id)
context['form'].fields['numero_materia'].initial = (
self.object.materia.numero)
context['form'].fields['ano_materia'].initial = (
self.object.materia.ano)
return context
@property
def layout_key(self):
return 'ProposicaoCreate'
<<<<<<< HEAD
def has_permission(self):
perms = self.get_permission_required()
if self.request.user.has_perms(perms):
@ -279,12 +477,23 @@ class ProposicaoCrud(Crud):
class ListView(PermissionRequiredMixin, CrudListView):
ordering = ['-data_envio', 'descricao']
permission_required = permissoes_autor()
=======
class ListView(CrudListView):
ordering = ['-data_envio', '-descricao']
>>>>>>> master
def get_rows(self, object_list):
for obj in object_list:
if obj.data_envio is None:
obj.data_envio = 'Em elaboração...'
else:
obj.data_envio = obj.data_envio.strftime("%d/%m/%Y %H:%M")
if obj.data_recebimento is None:
obj.data_recebimento = 'Não recebida'
else:
obj.data_recebimento = obj.data_recebimento.strftime(
"%d/%m/%Y %H:%M")
return [self._as_row(obj) for obj in object_list]
@ -311,6 +520,20 @@ class ProposicaoCrud(Crud):
kwargs={'pk': proposicao.pk}))
class ReciboProposicaoView(TemplateView):
template_name = "materia/recibo_proposicao.html"
def get_context_data(self, **kwargs):
context = super(ReciboProposicaoView, self).get_context_data(
**kwargs)
proposicao = Proposicao.objects.get(pk=self.kwargs['pk'])
context.update({'proposicao': proposicao,
'hash': gerar_hash_arquivo(
proposicao.texto_original.path,
self.kwargs['pk'])})
return context
class RelatoriaCrud(MasterDetailCrud):
model = Relatoria
parent_field = 'materia'

10
sapl/painel/views.py

@ -153,7 +153,9 @@ def get_presentes(pk, response, materia):
'numero_votos_nao': 0,
'numero_abstencoes': 0,
'total_votos': 0,
'tipo_resultado': tipo_votacao})
'tipo_resultado': tipo_votacao,
'observacao_materia': materia.observacao,
'materia_legislativa_texto': str(materia.materia)})
return response
@ -232,7 +234,9 @@ def get_presentes_expediente(pk, response, materia):
'numero_votos_nao': 0,
'numero_abstencoes': 0,
'total_votos': 0,
'tipo_resultado': tipo_votacao})
'tipo_resultado': tipo_votacao,
'observacao_materia': materia.observacao,
'materia_legislativa_texto': str(materia.materia)})
return response
@ -267,7 +271,7 @@ def get_votos(response, materia):
'numero_abstencoes': registro.numero_abstencoes,
'total_votos': total,
'tipo_votacao': tipo_votacao,
'tipo_resultado': registro.tipo_resultado_votacao.nome
'tipo_resultado': registro.tipo_resultado_votacao.nome,
})
return response

8
sapl/parlamentares/views.py

@ -2,7 +2,7 @@ from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ImproperlyConfigured
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
from django.core.urlresolvers import reverse_lazy
from django.shortcuts import redirect
from django.utils.datastructures import MultiValueDictKeyError
@ -248,17 +248,21 @@ class ParlamentarCrud(Crud):
legislaturas = Legislatura.objects.all().order_by(
'-data_inicio', '-data_fim')
if legislaturas:
try:
legislatura_id = int(self.request.GET['periodo'])
except MultiValueDictKeyError:
legislatura_id = legislaturas.first().id
return legislatura_id
else:
return 0
def get_queryset(self):
if self.take_legislatura_id() != 0:
mandatos = Mandato.objects.filter(
legislatura_id=self.take_legislatura_id())
return mandatos
return []
def get_rows(self, object_list):
parlamentares = []

29
sapl/protocoloadm/forms.py

@ -441,35 +441,6 @@ class ProtocoloMateriaForm(ModelForm):
*args, **kwargs)
class ProposicaoSimpleForm(forms.Form):
tipo = forms.CharField(label='Tipo',
widget=forms.TextInput(
attrs={'readonly': 'readonly'}))
materia = forms.CharField(label='Matéria',
widget=forms.TextInput(
attrs={'readonly': 'readonly'}))
data_envio = forms.DateField(label=_('Data Envio'),
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'readonly': 'readonly'}))
data_recebimento = forms.DateField(label=_('Data Recebimento'),
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'readonly': 'readonly'}))
descricao = forms.CharField(label='Descrição',
widget=forms.TextInput(
attrs={'readonly': 'readonly'}))
numero_proposicao = forms.CharField(label='Número',
widget=forms.TextInput(
attrs={'readonly': 'readonly'}))
# ano = forms.CharField(label='Ano',
# widget = forms.TextInput(
# attrs={'readonly':'readonly'}))
class DocumentoAcessorioAdministrativoForm(ModelForm):
class Meta:

36
sapl/protocoloadm/urls.py

@ -9,11 +9,6 @@ from sapl.protocoloadm.views import (AnularProtocoloAdmView,
DocumentoAcessorioAdministrativoView,
DocumentoAdministrativoCrud,
PesquisarDocumentoAdministrativoView,
ProposicaoDetailView,
ProposicaoReceberView, ProposicaoView,
ProposicoesIncorporadasView,
ProposicoesNaoIncorporadasView,
ProposicoesNaoRecebidasView,
ProtocoloDocumentoCrud,
ProtocoloDocumentoView, ProtocoloListView,
ProtocoloMateriaCrud,
@ -22,8 +17,17 @@ from sapl.protocoloadm.views import (AnularProtocoloAdmView,
ProtocoloPesquisaView,
StatusTramitacaoAdministrativoCrud,
TipoDocumentoAdministrativoCrud,
<<<<<<< HEAD
TipoInstituicaoCrud, TramitacaoAdmCrud,
get_nome_autor, pesquisa_autores)
=======
TipoInstituicaoCrud,
TramitacaoAdmDeleteView,
TramitacaoAdmEditView,
TramitacaoAdmIncluirView,
TramitacaoAdministrativoCrud,
TramitacaoAdmView)
>>>>>>> master
from .apps import AppConfig
@ -72,26 +76,4 @@ urlpatterns = [
ComprovanteProtocoloView.as_view(), name='comprovante_protocolo'),
url(r'^protocoloadm/(?P<pk>\d+)/(?P<ano>\d+)/criar_documento$',
CriarDocumentoProtocolo.as_view(), name='criar_documento'),
# TODO: move to Proposicoes app
url(r'^proposicao$',
ProposicaoView.as_view(), name='proposicao'),
url(r'^proposicao/proposicao-receber',
ProposicaoReceberView.as_view(), name='proposicao_receber'),
url(r'^proposicao/proposicao-naorecebidas',
ProposicoesNaoRecebidasView.as_view(),
name='proposicao_naorecebidas'),
url(r'^proposicao/proposicao-naoincorporadas',
ProposicoesNaoIncorporadasView.as_view(),
name='proposicao_naoincorporadas'),
url(r'^proposicao/proposicao-incorporadas',
ProposicoesIncorporadasView.as_view(),
name='proposicao_incorporadas'),
url(r'^proposicao/(?P<pk>\d+)/proposicao',
ProposicaoDetailView.as_view(), name='proposicao_view'),
url(r'^proposicao/pesquisar_autor',
pesquisa_autores, name='pesquisar_autor'),
url(r'^proposicao/get_nome_autor',
get_nome_autor, name='get_nome_autor')
]

15
sapl/protocoloadm/views.py

@ -13,6 +13,7 @@ from django.views.generic import CreateView, DetailView, FormView, ListView
from django.views.generic.base import TemplateView
from django_filters.views import FilterView
<<<<<<< HEAD
import sapl.crud.base
from sapl.crud.base import (Crud, CrudBaseMixin, CrudCreateView,
CrudDeleteView, CrudListView, CrudUpdateView,
@ -27,6 +28,16 @@ from .forms import (AnularProcoloAdmForm, DocumentoAcessorioAdministrativoForm,
DocumentoAdministrativoForm, ProposicaoSimpleForm,
ProtocoloDocumentForm, ProtocoloFilterSet,
ProtocoloMateriaForm, TramitacaoAdmEditForm,
=======
from sapl.crud.base import Crud, CrudBaseMixin, CrudListView, make_pagination
from sapl.materia.models import TipoMateriaLegislativa
from sapl.utils import create_barcode, get_client_ip
from .forms import (AnularProcoloAdmForm, DocumentoAcessorioAdministrativoForm,
DocumentoAdministrativoFilterSet,
DocumentoAdministrativoForm, ProtocoloDocumentForm,
ProtocoloFilterSet, ProtocoloMateriaForm,
>>>>>>> master
TramitacaoAdmForm)
from .models import (Autor, DocumentoAcessorioAdministrativo,
DocumentoAdministrativo, Protocolo,
@ -349,6 +360,7 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView):
return redirect(self.get_success_url())
<<<<<<< HEAD
# TODO: move to Proposicao app
class ProposicaoReceberView(TemplateView):
template_name = "protocoloadm/proposicao_receber.html"
@ -413,6 +425,9 @@ class ProposicaoDetailView(DetailView):
class PesquisarDocumentoAdministrativoView(PermissionRequiredMixin,
FilterView):
=======
class PesquisarDocumentoAdministrativoView(FilterView):
>>>>>>> master
model = DocumentoAdministrativo
filterset_class = DocumentoAdministrativoFilterSet
paginate_by = 10

126
sapl/sessao/forms.py

@ -2,17 +2,18 @@ from datetime import datetime
import django_filters
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Fieldset, Layout
from crispy_forms.layout import HTML, Button, Fieldset, Layout
from django import forms
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.forms import ModelForm
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.utils import RANGE_DIAS_MES, RANGE_MESES
from sapl.utils import RANGE_DIAS_MES, RANGE_MESES, autor_label, autor_modal
from .models import Bancada, ExpedienteMateria, SessaoPlenaria
from .models import Bancada, ExpedienteMateria, SessaoPlenaria, OrdemDia
def pega_anos():
@ -94,6 +95,39 @@ class ExpedienteMateriaForm(ModelForm):
return expediente
class OrdemDiaForm(ExpedienteMateriaForm):
class Meta:
model = OrdemDia
fields = ['data_ordem', 'numero_ordem', 'tipo_materia', 'observacao',
'numero_materia', 'ano_materia', 'tipo_votacao']
def clean_data_ordem(self):
return datetime.now()
def clean(self):
cleaned_data = self.cleaned_data
try:
materia = MateriaLegislativa.objects.get(
numero=self.cleaned_data['numero_materia'],
ano=self.cleaned_data['ano_materia'],
tipo=self.cleaned_data['tipo_materia'])
except ObjectDoesNotExist:
msg = _('A matéria a ser inclusa não existe no cadastro'
' de matérias legislativas.')
raise ValidationError(msg)
else:
cleaned_data['materia'] = materia
return cleaned_data
def save(self, commit=False):
ordem = super(OrdemDiaForm, self).save(commit)
ordem.materia = self.cleaned_data['materia']
ordem.save()
return ordem
class PresencaForm(forms.Form):
presenca = forms.CharField(required=False, initial=False)
parlamentar = forms.CharField(required=False, max_length=20)
@ -107,19 +141,6 @@ class ListMateriaForm(forms.Form):
error_message = forms.CharField(required=False, label='votacao_aberta')
class MateriaOrdemDiaForm(forms.Form):
data_sessao = forms.CharField(required=True, label=_('Data da Sessão'))
numero_ordem = forms.IntegerField(required=True, label=_('Número Ordem'))
tipo_votacao = forms.IntegerField(required=True, label=_('Tipo Votação'))
tipo_sessao = forms.IntegerField(required=True, label=_('Tipo da Sessão'))
ano_materia = forms.IntegerField(required=True, label=_('Ano Matéria'))
numero_materia = forms.IntegerField(required=True,
label=_('Número Matéria'))
tipo_materia = forms.IntegerField(required=True, label=_('Tipo Matéria'))
observacao = forms.CharField(required=False, label=_('Ementa'))
error_message = forms.CharField(required=False, label=_('Matéria'))
class MesaForm(forms.Form):
parlamentar = forms.IntegerField(required=True)
cargo = forms.IntegerField(required=True)
@ -171,3 +192,76 @@ class SessaoPlenariaFilterSet(django_filters.FilterSet):
row1,
form_actions(save_label='Pesquisar'))
)
class AdicionarVariasMateriasFilterSet(MateriaLegislativaFilterSet):
class Meta:
model = MateriaLegislativa
fields = ['numero',
'numero_protocolo',
'ano',
'tipo',
'data_apresentacao',
'data_publicacao',
'autoria__autor__tipo',
'autoria__partido',
'relatoria__parlamentar_id',
'local_origem_externa',
'em_tramitacao',
]
order_by = (
('', 'Selecione'),
('dataC', 'Data, Tipo, Ano, Numero - Ordem Crescente'),
('dataD', 'Data, Tipo, Ano, Numero - Ordem Decrescente'),
('tipoC', 'Tipo, Ano, Numero, Data - Ordem Crescente'),
('tipoD', 'Tipo, Ano, Numero, Data - Ordem Decrescente')
)
def __init__(self, *args, **kwargs):
super(MateriaLegislativaFilterSet, self).__init__(*args, **kwargs)
self.filters['tipo'].label = 'Tipo de Matéria'
self.filters['autoria__autor__tipo'].label = 'Tipo de Autor'
self.filters['autoria__partido'].label = 'Partido do Autor'
self.filters['relatoria__parlamentar_id'].label = 'Relatoria'
row1 = to_row(
[('tipo', 12)])
row2 = to_row(
[('numero', 4),
('ano', 4),
('numero_protocolo', 4)])
row3 = to_row(
[('data_apresentacao', 6),
('data_publicacao', 6)])
row4 = to_row(
[('autoria__autor', 0),
(Button('pesquisar',
'Pesquisar Autor',
css_class='btn btn-primary btn-sm'), 2),
(Button('limpar',
'limpar Autor',
css_class='btn btn-primary btn-sm'), 10)])
row5 = to_row(
[('autoria__autor__tipo', 6),
('autoria__partido', 6)])
row6 = to_row(
[('relatoria__parlamentar_id', 6),
('local_origem_externa', 6)])
row7 = to_row(
[('em_tramitacao', 6),
('o', 6)])
row8 = to_row(
[('ementa', 12)])
self.form.helper = FormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Pesquisa de Matéria'),
row1, row2, row3,
HTML(autor_label),
HTML(autor_modal),
row4, row5, row6, row7, row8,
form_actions(save_label='Pesquisar'))
)

28
sapl/sessao/migrations/0021_adicionamultiplasmaterias.py

@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-03 14:27
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('materia', '0038_auto_20160612_1506'),
('sessao', '0020_auto_20160517_1450'),
]
operations = [
migrations.CreateModel(
name='AdicionaMultiplasMaterias',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('materia', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa')),
],
options={
'verbose_name_plural': 'Tabela de Adicionar Várias Matérias',
'verbose_name': 'Tabela de Adicionar Várias Matérias',
},
),
]

22
sapl/sessao/migrations/0022_auto_20160805_0943.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-05 12:43
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('sessao', '0021_adicionamultiplasmaterias'),
]
operations = [
migrations.RemoveField(
model_name='adicionamultiplasmaterias',
name='materia',
),
migrations.DeleteModel(
name='AdicionaMultiplasMaterias',
),
]

43
sapl/sessao/urls.py

@ -1,9 +1,10 @@
from django.conf.urls import include, url
from sapl.sessao.views import (BancadaCrud, CargoBancadaCrud,
EditMateriaOrdemDiaView, ExpedienteMateriaCrud,
ExpedienteView, ListMateriaOrdemDiaView,
MateriaOrdemDiaView, MesaView, OradorCrud,
from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
AdicionarVariasMateriasOrdemDia,
BancadaCrud, CargoBancadaCrud,
ExpedienteMateriaCrud, ExpedienteView,
MateriaOrdemDiaCrud, MesaView, OradorCrud,
OradorExpedienteCrud, PainelView,
PautaExpedienteDetail, PautaOrdemDetail,
PautaSessaoDetailView, PautaSessaoListView,
@ -17,8 +18,10 @@ from sapl.sessao.views import (BancadaCrud, CargoBancadaCrud,
VotacaoNominalExpedienteEditView,
VotacaoNominalExpedienteView,
VotacaoNominalView, VotacaoView,
abrir_votacao_view,
reordernar_materias_expediente)
abrir_votacao_expediente_view,
abrir_votacao_ordem_view,
reordernar_materias_expediente,
reordernar_materias_ordem)
from .apps import AppConfig
@ -31,13 +34,19 @@ sessao_rest = [
urlpatterns = [
url(r'^sessao/', include(SessaoCrud.get_urls() + OradorCrud.get_urls() +
OradorExpedienteCrud.get_urls() +
ExpedienteMateriaCrud.get_urls())),
ExpedienteMateriaCrud.get_urls() +
MateriaOrdemDiaCrud.get_urls())),
url(r'^(?P<pk>\d+)/(?P<spk>\d+)/abrir-votacao$', abrir_votacao_view,
url(r'^(?P<pk>\d+)/(?P<spk>\d+)/abrir-votacao-expediente$',
abrir_votacao_expediente_view,
name="abrir_votacao_exp"),
url(r'^(?P<pk>\d+)/(?P<spk>\d+)/abrir-votacao-ordem$',
abrir_votacao_ordem_view,
name="abrir_votacao"),
url(r'^(?P<pk>\d+)/reordenar-expediente$', reordernar_materias_expediente,
name="reordenar_expediente"),
url(r'^(?P<pk>\d+)/reordenar-ordem$', reordernar_materias_ordem,
name="reordenar_ordem"),
url(r'^rest/', include(sessao_rest)),
url(r'^sistema/sessao-plenaria/tipo/',
include(TipoSessaoCrud.get_urls())),
@ -49,6 +58,12 @@ urlpatterns = [
include(BancadaCrud.get_urls())),
url(r'^sistema/cargo-bancada/',
include(CargoBancadaCrud.get_urls())),
url(r'^sessao/(?P<pk>\d+)/adicionar-varias-materias-expediente/',
AdicionarVariasMateriasExpediente.as_view(),
name='adicionar_varias_materias_expediente'),
url(r'^sessao/(?P<pk>\d+)/adicionar-varias-materias-ordem-dia/',
AdicionarVariasMateriasOrdemDia.as_view(),
name='adicionar_varias_materias_ordem_dia'),
# PAUTA SESSÃO
url(r'^pauta-sessao$',
@ -71,14 +86,6 @@ urlpatterns = [
PresencaOrdemDiaView.as_view(),
name='presencaordemdia'),
url(r'^(?P<pk>\d+)/mesa$', MesaView.as_view(), name='mesa'),
url(r'^(?P<pk>\d+)/materiaordemdia/list$',
ListMateriaOrdemDiaView.as_view(), name='materiaordemdia_list'),
url(r'^(?P<pk>\d+)/materiaordemdia/list$',
ListMateriaOrdemDiaView.as_view(), name='materiaordemdia_reorder'),
url(r'^(?P<pk>\d+)/materiaordemdia/edit/(?P<oid>\d+)$',
EditMateriaOrdemDiaView.as_view(), name='materiaordemdia_edit'),
url(r'^(?P<pk>\d+)/materiaordemdia/create$',
MateriaOrdemDiaView.as_view(), name='materiaordemdia_create'),
url(r'^(?P<pk>\d+)/resumo$',
ResumoView.as_view(), name='resumo'),
url(r'^sessao/pesquisar-sessao$',
@ -100,7 +107,7 @@ urlpatterns = [
url(r'^(?P<pk>\d+)/matexp/votnom/edit/(?P<oid>\d+)/(?P<mid>\d+)$',
VotacaoNominalExpedienteEditView.as_view(),
name='votacaonominalexpedit'),
url(r'^(?P<pk>\d+)/matexp/votsec/(?P<oid>\d+)/(?P<mid>\d+)$',
url(r'^(?P<pk>\d+)/matexp/votsimb/(?P<oid>\d+)/(?P<mid>\d+)$',
VotacaoExpedienteView.as_view(), name='votacaosimbolicaexp'),
url(r'^(?P<pk>\d+)/matexp/votsec/view/(?P<oid>\d+)/(?P<mid>\d+)$',
VotacaoExpedienteEditView.as_view(), name='votacaosimbolicaexpedit'),

348
sapl/sessao/views.py

@ -7,9 +7,10 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.urlresolvers import reverse
from django.forms.utils import ErrorList
from django.http.response import HttpResponseRedirect
from django.utils.datastructures import MultiValueDictKeyError
from django.utils.html import strip_tags
from django.utils.translation import ugettext_lazy as _
from django.views.generic import ListView, TemplateView
from django.views.generic import FormView, ListView, TemplateView
from django.views.generic.edit import FormMixin
from django_filters.views import FilterView
from rest_framework import generics
@ -18,17 +19,21 @@ from sapl.crud.base import (Crud, CrudBaseMixin, CrudCreateView,
CrudDeleteView, CrudDetailView, CrudListView,
CrudUpdateView, make_pagination)
from sapl.crud.masterdetail import MasterDetailCrud
from sapl.materia.forms import pega_ultima_tramitacao
from sapl.materia.models import (Autoria, DocumentoAcessorio,
TipoMateriaLegislativa, Tramitacao)
from sapl.materia.views import MateriaLegislativaPesquisaView
from sapl.norma.models import NormaJuridica
from sapl.parlamentares.models import Parlamentar
from sapl.sessao.serializers import SessaoPlenariaSerializer
from sapl.utils import permissao_tb_aux, permissoes_painel, permissoes_sessao
from .forms import (BancadaForm, ExpedienteForm, ExpedienteMateriaForm,
ListMateriaForm, MateriaOrdemDiaForm, MesaForm,
PresencaForm, SessaoPlenariaFilterSet, VotacaoEditForm,
VotacaoForm, VotacaoNominalForm)
from .forms import (AdicionarVariasMateriasFilterSet,
BancadaForm, ExpedienteForm, ExpedienteMateriaForm,
ListMateriaForm, MesaForm,
OrdemDiaForm, PresencaForm,
SessaoPlenariaFilterSet, VotacaoEditForm, VotacaoForm,
VotacaoNominalForm)
from .models import (Bancada, CargoBancada, CargoMesa, ExpedienteMateria,
ExpedienteSessao, IntegranteMesa, MateriaLegislativa,
Orador, OradorExpediente, OrdemDia, PresencaOrdemDia,
@ -53,6 +58,19 @@ def reordernar_materias_expediente(request, pk):
reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': pk}))
def reordernar_materias_ordem(request, pk):
ordens = OrdemDia.objects.filter(
sessao_plenaria_id=pk)
ordem_num = 1
for o in ordens:
o.numero_ordem = ordem_num
o.save()
ordem_num += 1
return HttpResponseRedirect(
reverse('sapl.sessao:ordemdia_list', kwargs={'pk': pk}))
class BancadaCrud(Crud):
model = Bancada
help_path = ''
@ -73,6 +91,7 @@ class BancadaCrud(Crud):
form_class = BancadaForm
<<<<<<< HEAD
class TipoSessaoCrud(Crud):
model = TipoSessaoPlenaria
help_path = 'tipo_sessao_plenaria'
@ -109,7 +128,7 @@ class CargoBancadaCrud(Crud):
return permissao_tb_aux(self)
def abrir_votacao_view(request, pk, spk):
def abrir_votacao_expediente_view(request, pk, spk):
existe_votacao_aberta = ExpedienteMateria.objects.filter(
sessao_plenaria_id=spk, votacao_aberta=True
).exists()
@ -125,6 +144,114 @@ def abrir_votacao_view(request, pk, spk):
reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': spk}))
def abrir_votacao_ordem_view(request, pk, spk):
existe_votacao_aberta = OrdemDia.objects.filter(
sessao_plenaria_id=spk, votacao_aberta=True
).exists()
if existe_votacao_aberta:
msg = _('Já existe uma matéria com votação aberta. Para abrir '
'outra, termine ou feche a votação existente.')
raise ValidationError(msg)
else:
ordem = OrdemDia.objects.get(id=pk)
ordem.votacao_aberta = True
ordem.save()
return HttpResponseRedirect(
reverse('sapl.sessao:ordemdia_list', kwargs={'pk': spk}))
class MateriaOrdemDiaCrud(MasterDetailCrud):
model = OrdemDia
parent_field = 'sessao_plenaria'
help_path = ''
class BaseMixin(MasterDetailCrud.BaseMixin):
list_field_names = ['numero_ordem', 'materia', 'observacao',
'resultado']
class CreateView(MasterDetailCrud.CreateView):
form_class = OrdemDiaForm
class UpdateView(MasterDetailCrud.UpdateView):
form_class = OrdemDiaForm
def get_initial(self):
self.initial['tipo_materia'] = self.object.materia.tipo.id
self.initial['numero_materia'] = self.object.materia.numero
self.initial['ano_materia'] = self.object.materia.ano
return self.initial
class DetailView(MasterDetailCrud.DetailView):
@property
def layout_key(self):
return 'OrdemDiaDetail'
class ListView(MasterDetailCrud.ListView):
ordering = ['numero_ordem', 'materia', 'resultado']
def get_rows(self, object_list):
for obj in object_list:
if not obj.resultado:
if obj.votacao_aberta:
url = ''
if obj.tipo_votacao == 1:
url = reverse('sapl.sessao:votacaosimbolica',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
elif obj.tipo_votacao == 2:
url = reverse('sapl.sessao:votacaonominal',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
elif obj.tipo_votacao == 3:
url = reverse('sapl.sessao:votacaosecreta',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
btn_registrar = '''
<a href="%s"
class="btn btn-primary"
role="button">Registrar Votação</a>''' % (url)
obj.resultado = btn_registrar
else:
url = reverse('sapl.sessao:abrir_votacao', kwargs={
'pk': obj.pk, 'spk': obj.sessao_plenaria_id})
btn_abrir = '''
Matéria não votada<br />
<a href="%s"
class="btn btn-primary"
role="button">Abrir Votação</a>''' % (url)
obj.resultado = btn_abrir
else:
url = ''
if obj.tipo_votacao == 1:
url = reverse('sapl.sessao:votacaosimbolicaedit',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
elif obj.tipo_votacao == 2:
url = reverse('sapl.sessao:votacaonominaledit',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
elif obj.tipo_votacao == 3:
url = reverse('sapl.sessao:votacaosecretaedit',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
obj.resultado = '<a href="%s">%s</a>' % (url,
obj.resultado)
return [self._as_row(obj) for obj in object_list]
class ExpedienteMateriaCrud(MasterDetailCrud):
model = ExpedienteMateria
parent_field = 'sessao_plenaria'
@ -167,7 +294,7 @@ class ExpedienteMateriaCrud(MasterDetailCrud):
role="button">Registrar Votação</a>''' % (url)
obj.resultado = btn_registrar
else:
url = reverse('sapl.sessao:abrir_votacao', kwargs={
url = reverse('sapl.sessao:abrir_votacao_exp', kwargs={
'pk': obj.pk, 'spk': obj.sessao_plenaria_id})
btn_abrir = '''
Matéria não votada<br />
@ -408,6 +535,7 @@ class PresencaOrdemDiaView(PermissionRequiredMixin,
return reverse('sapl.sessao:presencaordemdia', kwargs={'pk': pk})
<<<<<<< HEAD
class ListMateriaOrdemDiaView(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/materia_ordemdia_list.html'
form_class = ListMateriaForm
@ -1050,22 +1178,21 @@ class VotacaoEditView(PermissionRequiredMixin,
ordem_id = kwargs['mid']
if(int(request.POST['anular_votacao']) == 1):
RegistroVotacao.objects.get(
RegistroVotacao.objects.filter(
materia_id=materia_id,
ordem_id=ordem_id).delete()
ordem_id=ordem_id).last().delete()
ordem = OrdemDia.objects.get(
sessao_plenaria_id=self.object.id,
materia_id=materia_id)
ordem.votacao_aberta = False
ordem.resultado = None
ordem.resultado = ''
ordem.save()
return self.form_valid(form)
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
context = {}
url = request.get_full_path()
@ -1084,15 +1211,16 @@ class VotacaoEditView(PermissionRequiredMixin,
materia = {'materia': ordem.materia, 'ementa': ordem.observacao}
context.update({'materia': materia})
votacao = RegistroVotacao.objects.get(
votacao = RegistroVotacao.objects.filter(
materia_id=materia_id,
ordem_id=ordem_id)
ordem_id=ordem_id).last()
votacao_existente = {'observacao': sub(
'&nbsp;', ' ', strip_tags(votacao.observacao)),
'tipo_resultado':
votacao.tipo_resultado_votacao_id}
context.update({'votacao_titulo': titulo,
'votacao': votacao_existente})
'votacao': votacao_existente,
'tipos': self.get_tipos_votacao()})
return self.render_to_response(context)
@ -1102,7 +1230,7 @@ class VotacaoEditView(PermissionRequiredMixin,
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sapl.sessao:materiaordemdia_list',
return reverse('sapl.sessao:ordemdia_list',
kwargs={'pk': pk})
@ -1224,7 +1352,7 @@ class VotacaoView(PermissionRequiredMixin,
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sapl.sessao:materiaordemdia_list',
return reverse('sapl.sessao:ordemdia_list',
kwargs={'pk': pk})
@ -1235,17 +1363,15 @@ class VotacaoNominalView(PermissionRequiredMixin,
permission_required = permissoes_sessao()
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
ordem_id = kwargs['mid']
ordem = OrdemDia.objects.get(id=ordem_id)
materia = {'materia': ordem.materia,
'ementa': sub(
'&nbsp;', ' ', strip_tags(ordem.observacao))}
context.update({'materia': materia})
context = {'materia': materia, 'object': self.get_object(),
'parlamentares': self.get_parlamentares(),
'tipos': self.get_tipos_votacao()}
return self.render_to_response(context)
@ -1354,7 +1480,7 @@ class VotacaoNominalView(PermissionRequiredMixin,
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sapl.sessao:materiaordemdia_list',
return reverse('sapl.sessao:ordemdia_list',
kwargs={'pk': pk})
@ -1365,8 +1491,7 @@ class VotacaoNominalEditView(PermissionRequiredMixin,
permission_required = permissoes_sessao()
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
context = {}
materia_id = kwargs['oid']
ordem_id = kwargs['mid']
@ -1393,7 +1518,8 @@ class VotacaoNominalEditView(PermissionRequiredMixin,
'&nbsp;', ' ', strip_tags(votacao.observacao)),
'tipo_resultado':
votacao.tipo_resultado_votacao_id}
context.update({'votacao': votacao_existente})
context.update({'votacao': votacao_existente,
'tipos': self.get_tipos_votacao()})
return self.render_to_response(context)
@ -1412,7 +1538,7 @@ class VotacaoNominalEditView(PermissionRequiredMixin,
ordem = OrdemDia.objects.get(
sessao_plenaria_id=self.object.id,
materia_id=materia_id)
ordem.resultado = None
ordem.resultado = ''
ordem.votacao_aberta = False
ordem.save()
@ -1434,7 +1560,7 @@ class VotacaoNominalEditView(PermissionRequiredMixin,
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sapl.sessao:materiaordemdia_list',
return reverse('sapl.sessao:ordemdia_list',
kwargs={'pk': pk})
@ -1445,17 +1571,15 @@ class VotacaoNominalExpedienteView(PermissionRequiredMixin,
permission_required = permissoes_sessao()
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
expediente_id = kwargs['mid']
expediente = ExpedienteMateria.objects.get(id=expediente_id)
materia = {'materia': expediente.materia,
'ementa': sub(
'&nbsp;', ' ', strip_tags(expediente.observacao))}
context.update({'materia': materia})
context = {'materia': materia, 'object': self.get_object(),
'parlamentares': self.get_parlamentares(),
'tipos': self.get_tipos_votacao()}
return self.render_to_response(context)
@ -1573,9 +1697,7 @@ class VotacaoNominalExpedienteEditView(PermissionRequiredMixin,
permission_required = permissoes_sessao()
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
context = {}
materia_id = kwargs['oid']
expediente_id = kwargs['mid']
@ -1601,7 +1723,8 @@ class VotacaoNominalExpedienteEditView(PermissionRequiredMixin,
'&nbsp;', ' ', strip_tags(votacao.observacao)),
'tipo_resultado':
votacao.tipo_resultado_votacao_id}
context.update({'votacao': votacao_existente})
context.update({'votacao': votacao_existente,
'tipos': self.get_tipos_votacao()})
return self.render_to_response(context)
@ -2076,3 +2199,154 @@ class PesquisarSessaoPlenariaView(FilterView):
)
return self.render_to_response(context)
def filtra_tramitacao_ordem_dia():
lista = pega_ultima_tramitacao()
return Tramitacao.objects.filter(
id__in=lista,
status__descricao='Ordem do Dia').distinct().values_list(
'materia_id', flat=True)
def retira_materias_ja_adicionadas(id_sessao, model):
lista = model.objects.filter(
sessao_plenaria_id=id_sessao)
lista_id_materias = [l.materia_id for l in lista]
return lista_id_materias
class AdicionarVariasMateriasExpediente(MateriaLegislativaPesquisaView):
filterset_class = AdicionarVariasMateriasFilterSet
template_name = 'sessao/adicionar_varias_materias_expediente.html'
def get_filterset_kwargs(self, filterset_class):
super(AdicionarVariasMateriasExpediente,
self).get_filterset_kwargs(filterset_class)
kwargs = {'data': self.request.GET or None}
qs = self.get_queryset()
lista_ordem_dia = filtra_tramitacao_ordem_dia()
lista_materias_adicionadas = retira_materias_ja_adicionadas(
self.kwargs['pk'], ExpedienteMateria)
qs = qs.filter(id__in=lista_ordem_dia).exclude(
id__in=lista_materias_adicionadas).distinct()
kwargs.update({
'queryset': qs,
})
return kwargs
def get_context_data(self, **kwargs):
# import ipdb; ipdb.set_trace()
context = super(MateriaLegislativaPesquisaView,
self).get_context_data(**kwargs)
context['title'] = _('Pesquisar Matéria Legislativa')
self.filterset.form.fields['o'].label = _('Ordenação')
qr = self.request.GET.copy()
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
context['pk_sessao'] = self.kwargs['pk']
return context
def post(self, request, *args, **kwargs):
marcadas = request.POST.getlist('materia_id')
for m in marcadas:
try:
tipo_votacao = request.POST['tipo_votacao_%s' % m]
except MultiValueDictKeyError:
msg = _('Formulário Inválido. Você esqueceu de selecionar ' +
'o tipo de votação de %s' %
MateriaLegislativa.objects.get(id=m))
messages.add_message(request, messages.ERROR, msg)
return self.get(request, self.kwargs)
if tipo_votacao:
lista_materias_expediente = ExpedienteMateria.objects.filter(
sessao_plenaria_id=self.kwargs[
'pk'])
materia = MateriaLegislativa.objects.get(id=m)
expediente = ExpedienteMateria()
expediente.sessao_plenaria_id = self.kwargs['pk']
expediente.materia_id = materia.id
if lista_materias_expediente:
posicao = lista_materias_expediente.last().numero_ordem + 1
expediente.numero_ordem = posicao
else:
expediente.numero_ordem = 1
expediente.data_ordem = datetime.now()
expediente.tipo_votacao = request.POST['tipo_votacao_%s' % m]
expediente.save()
return self.get(request, self.kwargs)
class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente):
filterset_class = AdicionarVariasMateriasFilterSet
template_name = 'sessao/adicionar_varias_materias_ordem.html'
def get_filterset_kwargs(self, filterset_class):
super(AdicionarVariasMateriasExpediente,
self).get_filterset_kwargs(filterset_class)
kwargs = {'data': self.request.GET or None}
qs = self.get_queryset()
lista_ordem_dia = filtra_tramitacao_ordem_dia()
lista_materias_adicionadas = retira_materias_ja_adicionadas(
self.kwargs['pk'], OrdemDia)
qs = qs.filter(id__in=lista_ordem_dia).exclude(
id__in=lista_materias_adicionadas).distinct()
kwargs.update({
'queryset': qs,
})
return kwargs
def post(self, request, *args, **kwargs):
marcadas = request.POST.getlist('materia_id')
for m in marcadas:
try:
tipo_votacao = request.POST['tipo_votacao_%s' % m]
except MultiValueDictKeyError:
msg = _('Formulário Inválido. Você esqueceu de selecionar ' +
'o tipo de votação de %s' %
MateriaLegislativa.objects.get(id=m))
messages.add_message(request, messages.ERROR, msg)
return self.get(request, self.kwargs)
if tipo_votacao:
lista_materias_ordem_dia = OrdemDia.objects.filter(
sessao_plenaria_id=self.kwargs[
'pk'])
materia = MateriaLegislativa.objects.get(id=m)
ordem_dia = OrdemDia()
ordem_dia.sessao_plenaria_id = self.kwargs['pk']
ordem_dia.materia_id = materia.id
if lista_materias_ordem_dia:
posicao = lista_materias_ordem_dia.last().numero_ordem + 1
ordem_dia.numero_ordem = posicao
else:
ordem_dia.numero_ordem = 1
ordem_dia.data_ordem = datetime.now()
ordem_dia.tipo_votacao = tipo_votacao
ordem_dia.save()
return self.get(request, self.kwargs)

BIN
sapl/static/img/file.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1021 B

BIN
sapl/static/img/icon_comissoes.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
sapl/static/img/icon_materia_legislativa.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
sapl/static/img/icon_mesa_diretora.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
sapl/static/img/icon_normas_juridicas.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
sapl/static/img/icon_parlamentares.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
sapl/static/img/icon_pautas.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
sapl/static/img/icon_plenarias.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
sapl/static/img/icon_relatorios.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

229
sapl/static/styles/app.scss

@ -139,3 +139,232 @@ fieldset {
}
}
}
.btn-primary, .btn-danger{
font-size: 16px;
height: 40px !important;
display: inline-block;
}
/* INDEX */
#conteudo {
position: relative;
padding: 2em 1.5em 1.5em 1.5em;
overflow: hidden;
font-size: 100%;
text-align: left;
min-height: 350px;
max-width: 1000px;
margin: 0 auto;
}
#conteudo a:hover {
color: #444;
-webkit-transition: 0.3s ease-in;
-moz-transition: 0.3s ease-in;
-o-transition: 0.3s ease-in
}
#homeIndex {
text-align: center;
}
.homeBanner span {
color: white;
font-size: 32px;
font-weight: 600;
display: inline-block;
vertical-align: middle;
padding: 2px 45px 4px;
border: 2px solid;
}
.homeBanner::after {
display: inline-block;
vertical-align: middle;
height: 100%;
}
.homeBlock {
display: inline-block;
position: relative;
background-color: #F3F3F3;
width: 190px;
height: 260px;
margin: 3px;
text-align: center;
font-size: 0;
overflow: hidden;
}
.homeBlock > a {
display: block;
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
}
.homeBlock::after {
content: '';
display: inline-block;
vertical-align: middle;
height: 100%;
overflow: visible;
clear: none;
visibility: initial;
}
.homeContent {
position: relative;
padding: 10px;
text-align: justify;
font-size: 14px;
color: #FFF;
opacity: 0;
transition: opacity 0.5s ease;
display: inline-block;
vertical-align: middle;
}
.homeContent p {
display: block;
line-height: 13px;
font-size: 80%;
color: white;
}
.homeIcon {
position: relative;
display: inline-block;
width: 105px;
height: 105px;
border-radius: 50%;
background: #364347;
z-index: 1;
}
.homeIcon::before {
content: '';
position: absolute;
width: 100%;
height: 100%;
border-radius: 50%;
background: #364347;
top: 0;
left: 0;
transform: scale(0.95);
transition: transform 0.6s ease;
}
.homeIcon img {
position: absolute;
margin: auto;
top: 0;
bottom: 0;
right: 0;
left: 0;
transition: opacity 0.4s 0.4s ease;
}
.homeFront {
position: absolute;
top: 46%;
width: 100%;
font-size: 0;
transform: translateY(-60%);
}
.homeFront h2 {
position: absolute;
margin-top: 18px;
font-size: 22px;
font-weight: 700;
color: #595959 !important;
width: 100%;
padding: 0 6%;
z-index: 0;
}
.homeTitle {
display: block;
height: 32px;
text-align: center;
width: 100%;
opacity: 0;
transition: opacity 0.4s ease;
}
.homeTitle::before {
content: '';
display: inline-block;
vertical-align: middle;
height: 100%;
}
.homeTitle h2 {
display: inline-block;
vertical-align: middle;
max-width: 110px;
font-size: 14px;
color: white !important;
line-height: 1em;
}
.homeTitle img {
display: inline-block;
vertical-align: middle;
height: 30px;
margin-right: 5px;
}
.homeBlock:hover .homeIcon::before {
transform: scale(3.6) translateY(7px);
}
.homeBlock:hover .homeContent{
opacity: 1;
transition-delay: 0.2s;
}
.homeBlock:hover .homeIcon img {
opacity: 0;
transition-duration: 0.2s;
transition-delay: 0s;
}
.homeBlock:hover .homeTitle {
opacity: 1;
}
h1, h2, h3, h4, h5, h6, form, dl, dt, dd, p, div, img, a {
margin: 0;
padding: 0;
}
p {
margin: 0.5em 0;
}
/* FIM INDEX */
/* TEMPLATE AJUDA */
.manual li {
display: list-item;
line-height: 1.5em;
padding-right: 0;
}
.manual li a {
background-color: transparent;
border: none;
border-radius: none;
padding: 0;
}
.manual, .manual ul {
padding-left: 1.5em;
list-style-type: none;
margin-top: 0;
font-size: 100%;
}
/* FIM TEMPLATE AJUDA */

149
sapl/templates/ajuda.html

@ -0,0 +1,149 @@
{% extends "base.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
<div class="conteudo">
<h2>Tópicos do Manual de Ajuda</h2>
<br />
<ul class="manual">
<li>
<a href="">Acessando o Sistema</a>
<ul>
<li><a href="">Consulta à Mesa Diretora</a></li>
<li><a href="">Consulta às Comissões</a></li>
<li><a href="">Consulta à Ordem do Dia</a></li>
<li><a href="">Consulta Sessão Plenária</a></li>
<li><a href="">Consulta Parlamentares</a></li>
<li><a href="">Consulta às Matérias Legislativas</a></li>
<li><a href="">Consulta às Normas Jurídicas</a></li>
</ul>
</li>
<li><a href="">Tramitando Processos em Lote</a></li>
<li><a href="">Impressos</a></li>
<li>
<a href="">Emitindo Relatórios Administrativos</a>
<ul>
<li><a href="">Emite Proposituras por Tipo, Autor e Ano</a></li>
<li><a href="">Emite Proposituras por Autor</a></li>
<li><a href="">Emite Matérias Legislativas por status da tramitação e prazo limite</a></li>
</ul>
</li>
<li><a href="">Acessando o modulo de alimentação das informações</a></li>
<li><a href="">Casa Legislativa</a></li>
<li>
<a href="">Parlamentares</a>
<ul>
<li><a href="">Legislatura</a></li>
<li><a href="">Tipo de Afastamento</a></li>
<li><a href="">Tipo de Dependente</a></li>
<li><a href="">Tipo de Situação Militar</a></li>
<li><a href="">Nível de Instrução</a></li>
<li><a href="">Partidos</a></li>
<li><a href="">Coligação</a>
<ul><li><a href="">Composição</a></li></ul>
</li>
<li><a href="">Cadastro de Parlamentares</a>
<ul>
<li><a href="">Mandatos do Parlamentar</a></li>
<li><a href="">Filiações Partidárias</a></li>
<li><a href="">Dependentes</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="">Mesa Diretora</a>
<ul>
<li><a href="">Sessão Legislativa</a></li>
<li><a href="">Cargo Mesa</a></li>
<li><a href="">Cadastro da Mesa Diretora</a></li>
</ul>
</li>
<li><a href="">Comissões</a>
<ul>
<li><a href="">Cargo Comissão</a></li>
<li><a href="">Tipo de Comissão</a></li>
<li><a href="">Período da Composição da Comissão</a></li>
<li><a href="">Cadastro de Comissões</a>
<ul><li><a href="">Composição</a></li></ul>
</li>
</ul>
</li>
<li>
<a href="">Matérias Legislativas</a>
<ul><li><a href="">Acompanhamento de Matéria Legislativa, via e-mail</a></ul>
<ul>
<li><a href="">Tipo de Matéria Legislativa</a></li>
<li><a href="">Regime de Tramitação</a></li>
<li><a href="">Origem</a></li>
<li><a href="">Autor</a></li>
<li><a href="">Tipo de Autor</a></li>
<li><a href="">Unidade de Tramitação</a></li>
<li><a href="">Órgão</a></li>
<li><a href="">Tipo de Fim de Relatoria</a></li>
<li><a href="">Status de Tramitação</a></li>
<li><a href="">Tipo de Documento</a></li>
<li><a href="">Cadastro das Matérias Legislativas</a>
<ul>
<li><a href="">Para inclusão do Despacho Inicial, acione a função "Despacho Inicial"</a></li>
<li><a href="">Para inclusão de Autoria, acione a função "Autoria"</a></li>
<li><a href="">Para inclusão de Legislação Citada, acione a função "Legislação Citada"</a></li>
<li><a href="">Para inclusão de Matéria Anexada, acione a função "Matéria Anexada"</a></li>
<li><a href="">Para inclusão de Tramitação, acione a função "Tramitação"</a></li>
<li><a href="">Para inclusão da Relatoria, acione a função "Relatoria"</a></li>
<li><a href="">Para inclusão de Numeração, acione a função "Numeração"</a></li>
<li><a href="">Para inclusão de Documentos Acessórios, acione a função "Documentos Acessórios"</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="">Norma Jur&iacute;dica</a>
<ul>
<li><a href="">Tipo de Norma Jurídica</a></li>
<li><a href="">Cadastro de Normas Jurídicas</a></li>
</ul>
</li>
<li><a href="">Ordem do Dia</a></li>
<li><a href="">Troca de Senha</a></li>
<li><a href="">Gerenciar Usuários</a></li>
<li><a href="">Pesquisar no LexML</a></li>
<li><a href="">Proposições Legislativas</a>
<ul>
<li><a href="">Tipos de Proposições</a></li>
<li><a href="">Proposições - elaboração</a></li>
<li><a href="">Proposições - atualização</a></li>
<li><a href="">Recebimento de Proposições</a></li>
<li><a href="">Envio de Proposições</a></li>
<li><a href="">Autor</a></li>
</ul>
</li>
<li><a href="">Sessão Plenária</a>
<ul>
<li><a href="">Mesa</a></li>
<li><a href="">Oradores</a></li>
<li><a href="">Lista de Presença Sesão</a></li>
<li><a href="">Lista de Presença - Ordem do Dia</a></li>
<li><a href="">Votação</a></li>
<li><a href="">Agenda</a></li>
<li><a href="">Matérias</a></li>
<li><a href="">Expedientes</a></li>
</ul>
</li>
<li><a href="">Glossário</a></li>
<li><a href="">Anexos</a></li>
<ul>
<li><a href="">A - Acesso a Banco de Dados</a></li>
<li><a href="">B - Procedimentos de Backup das Tabelas MySQL</a></li>
</ul>
</li>
</ul>
</div>
{% endblock base_content %}

17
sapl/templates/base.html

@ -28,7 +28,6 @@
<body>
<div class="page fadein">
{% block navigation %}
<nav class="navbar navbar-inverse navbar-static-top">
@ -60,6 +59,7 @@
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Protocolo <span class="caret"></span></a>
<ul class="dropdown-menu">
<li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'sapl.protocoloadm:protocolo' %}">Pesquisar Protocolo</a></li>
<li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'sapl.materia:receber-proposicao' %}">Receber Proposições</a></li>
<!-- <li class="nav__sub-item"><a class="nav__sub-link" href="/materia">Protocolo Legislativo</a></li> -->
{# <li class="nav__sub-item"><a class="nav__sub-link" href="">Protocolo Geral</a></li> #}
{# <li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'sapl.protocoloadm:proposicao' %}">Proposições</a></li> #}
@ -117,8 +117,19 @@
</ul>
<ul class="nav navbar-nav navbar-right" id="autenticacao">
<li class="dropdown pesquisa">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><img src="{% static 'img/search.png' %}"><span class="caret"></span></a>
<ul class="dropdown-menu">
<li class="nav__sub-item">
<form class="navbar-form search-form" method="get" action="http://sapl3.interlegis.leg.br/generico/lexml_pesquisar">
<input type="text" class="form-control" placeholder="Pesquisar no LexML" />
</form>
</li>
</ul>
</li>
<li><a href="/ajuda"><img src="{% static 'img/manual.png' %}"></a></li>
{% if not user.is_authenticated %}
<li><a href="{% url 'sapl.base:login' %}">Login</a></li>
<li><a href="{% url 'sapl.base:login' %}"><img src="{% static 'img/user.png' %}"></a></li>
{% else %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
@ -131,9 +142,9 @@
</a>
<ul class="dropdown-menu">
<li><a href="{% url 'sapl.base:logout' %}">Sair</a></li>
{% endif %}
</ul>
</li>
{% endif %}
</ul>
</div><!--/.nav-collapse -->

2
sapl/templates/comissoes/layouts.yaml

@ -14,7 +14,7 @@ TipoComissao:
Comissao:
{% trans 'Dados Básicos' %}:
- nome:8 sigla
- nome:7 sigla ativa
- tipo data_criacao unidade_deliberativa data_extincao
{% trans 'Dados Complementares' %}:
- local_reuniao agenda_reuniao telefone_reuniao

2
sapl/templates/crud/confirm_delete.html

@ -5,9 +5,11 @@
<form action="" method="post">{% csrf_token %}
<div class="panel panel-danger">
<div class="panel-heading text-center">
{% block msg %}
{% blocktrans %}
Confirma exclusão de "{{ object }}"?
{% endblocktrans %}
{% endblock msg %}
</div>
<div class="panel-body text-center">
<a href="{{ view.cancel_url }}" class="btn btn-inverse">{% trans 'Cancelar' %}</a>

2
sapl/templates/crud/detail.html

@ -17,7 +17,7 @@
</div>
{% endblock actions %}
</div>
{% block extra_msg %}{% endblock extra_msg %}
{% block detail_content %}
{% for fieldset in view.layout_display %}
<h2 class="legend">{{ fieldset.legend }}</h2>

2
sapl/templates/crud/form.html

@ -1,6 +1,6 @@
{% extends "base.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
{% block extra_msg %}{% endblock %}
{% crispy form %}
{% endblock %}

162
sapl/templates/index.html

@ -1,6 +1,164 @@
{% extends "base.html" %}
{% load i18n %}
{% load i18n staticfiles %}
{% block title%}
<h1>Bem-vindo ao SAPL!</h1>
<head>
</head>
<br />
<div id="conteudo" style="min-height: 60px">
<div id="homeIndex">
<div class="homeBlock">
<div class="homeFront">
<div class="homeIcon">
<img src="{% static 'img/icon_mesa_diretora.png' %}" alt="Mesa Diretora">
</div>
<h2>Mesa Diretora</h2>
</div>
<div class="homeContent">
<div class="homeTitle">
<img src="{% static 'img/icon_mesa_diretora.png' %}">
<h2>Mesa Diretora</h2>
</div>
<p>
Órgão colegiado, composto de no mínimo três membros efetivos - Presidente e 1° e 2° Secretários - a quem cabe a direção dos trabalhos legislativos. Os parlamentares integrantes da Mesa Diretora são eleitos por seus pares na primeira reunião de instalação do período legislativo, para um mandato de um a dois anos.
</p>
</div>
<a href="{% url 'sapl.parlamentares:mesa_diretora' %}"></a>
</div>
<div class="homeBlock">
<div class="homeFront">
<div class="homeIcon">
<img src="{% static 'img/icon_comissoes.png' %}" alt="Comissões">
</div>
<h2>Comissões</h2>
</div>
<div class="homeContent">
<div class="homeTitle">
<img src="{% static 'img/icon_comissoes.png' %}">
<h2>Comissões</h2>
</div>
<p>
Órgãos da Casa Legislativa, de natureza técnica especializada e que têm por objetivo prestar melhores esclarecimentos aos parlamentares para a tomada de decisões. Assim, as comissões elaboram estudos, pareceres a respeito de determinados projetos de lei e investigação de irregularidades sobre fato determinado.
</p>
</div>
<a href="{% url 'sapl.comissoes:comissao_list' %}"></a>
</div>
<div class="homeBlock">
<div class="homeFront">
<div class="homeIcon">
<img src="{% static 'img/icon_parlamentares.png' %}" alt="Parlamentares">
</div>
<h2>Parlamentares</h2>
</div>
<div class="homeContent">
<div class="homeTitle">
<img src="{% static 'img/icon_parlamentares.png' %}">
<h2>Parlamentares</h2>
</div>
<p>
O Poder Legislativo, exercido pelo sistema de representação, tem nos parlamentares a sua expressão máxima. Devem transformar os anseios de seus representados em ações diretas, na forma de leis ou buscando junto do Executivo obras e atos que beneficiem a sua comunidade. Possuem funções legisladora, administrativa, julgadora e de fiscalização sobre a conduta do Executivo.
</p>
</div>
<a href="{% url 'sapl.parlamentares:parlamentar_list' %}"></a>
</div>
<div class="homeBlock">
<div class="homeFront">
<div class="homeIcon">
<img src="{% static 'img/icon_pautas.png' %}" alt="Pautas das Sessões">
</div>
<h2>Pautas das Sessões</h2>
</div>
<div class="homeContent">
<div class="homeTitle">
<img src="{% static 'img/icon_pautas.png' %}">
<h2>Pautas das<br>Sessões</h2>
</div>
<p>
Utilizadas para se determinar quais matérias serão discutidas e votadas. A responsabilidade pela elaboração das Pautas, que incluem Expediente e Ordem do Dia, é definida no Regimento Interno que, em geral, dá poderes ao Presidente da Casa Legislativa para a sua elaboração. Também, pode ficar a cargo de um colégio de líderes dos partidos políticos.
</p>
</div>
<a href="{% url 'sapl.sessao:list_pauta_sessao' %}"></a>
</div>
<div class="homeBlock">
<div class="homeFront">
<div class="homeIcon">
<img src="{% static 'img/icon_plenarias.png' %}" alt="Sessão Plenária">
</div>
<h2>Sessão Plenária</h2>
</div>
<div class="homeContent">
<div class="homeTitle">
<img src="{% static 'img/icon_plenarias.png' %}">
<h2>Sessão Plenária</h2>
</div>
<p>
Foro apropriado para a tomada de decisões sobre os projetos de lei e outras matérias legislativas ou administrativas, aprovadas ou rejeitadas em votação pelos parlamentares. É dirigida pela Mesa Diretora de acordo com o Regimento Interno da Casa. As decisões votadas em Plenário são soberanas e prevalecem sobre interesses ou vontades individuais.
</p>
</div>
<a href="{% url 'sapl.sessao:sessaoplenaria_list' %}"></a>
</div>
<div class="homeBlock">
<div class="homeFront">
<div class="homeIcon">
<img src="{% static 'img/icon_materia_legislativa.png' %}" alt="Matérias Legislativas">
</div>
<h2>Matérias Legislativas</h2>
</div>
<div class="homeContent">
<div class="homeTitle">
<img src="{% static 'img/icon_materia_legislativa.png' %}">
<h2>Matérias<br>Legislativas</h2>
</div>
<p>
Têm início com o processo de criação de leis e a apresentação de projetos no Poder Legislativo. Na apreciação de matérias, podem haver eventuais conflitos de interpretação ou de entendimento entre o que estabelece o Regimento Interno da Casa e a Lei Orgânica do Município. Nestes casos, prevalece a Lei Orgânica.
</p>
</div>
<a href="{% url 'sapl.materia:materialegislativa_list' %}"></a>
</div>
<div class="homeBlock">
<div class="homeFront">
<div class="homeIcon">
<img src="{% static 'img/icon_normas_juridicas.png' %}" alt="Normas Jurídicas">
</div>
<h2>Normas Jurídicas</h2>
</div>
<div class="homeContent">
<div class="homeTitle">
<img src="{% static 'img/icon_normas_juridicas.png' %}">
<h2>Normas Jurídicas</h2>
</div>
<p>
Nos Municípios, referem-se às emendas à Lei Orgânica, às leis complementares, às leis ordinárias, aos decretos legislativos e às resoluções.
</p>
</div>
<a href="{% url 'sapl.norma:norma_pesquisa'%}"></a>
</div>
<div class="homeBlock">
<div class="homeFront">
<div class="homeIcon">
<img src="{% static 'img/icon_relatorios.png' %}" alt="Relatórios">
</div>
<h2>Relatórios</h2>
</div>
<div class="homeContent">
<div class="homeTitle">
<img src="{% static 'img/icon_relatorios.png' %}">
<h2>Relatórios</h2>
</div>
<p>
Contém informações estatísticas sobre a produção legislativa dos parlamentares e da Casa, dispostas e agrupadas de diferentes formas de acordo com parâmetros fornecidos.
</p>
</div>
<a href=""></a>
</div>
</div>
</div>
</div>
{% endblock %}

32
sapl/templates/materia/confirmar_proposicao.html

@ -0,0 +1,32 @@
{% extends "base.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
<style>
table {
border-collapse: collapse;
}
table, th, td {
border: 2px solid black;
}
</style>
<fieldset>
<legend>Confirmar recebimento de Proposição</legend>
<table class="table table-striped">
<tr><td><b>Tipo: </b>{{proposicao.tipo}}</td></tr>
<tr><td><b>Autor: </b>{{proposicao.autor}}</td></tr>
<tr><td><b>Descrição: </b>{{proposicao.descricao}}</td></tr>
<tr><td><b>Data de Envio: </b>{{proposicao.data_envio|date:'d/m/Y H:i:s'}}</td></tr>
</table>
<form method="POST">
{% csrf_token %}
<div align="center">
<input type="submit" value="Devolver ao autor" name="devolver" class="btn btn-danger">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type="submit" value="Incorporar" name="incorporar" class="btn btn-primary">
</div>
</form>
</fieldset>
{% endblock %}

11
sapl/templates/materia/formulario_cadastro.html

@ -1,11 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<form method="POST">
{% csrf_token %}
{% crispy form %}
</form>
{% endblock %}

43
sapl/templates/materia/prop_devolvidas_list.html

@ -0,0 +1,43 @@
{% extends "base.html" %}
{% load i18n %}
{% block sections_nav %} {% include 'materia/subnav_prop.html'%} {% endblock sections_nav %}
{% block base_content %}
<fieldset>
<legend>Proposições Não Incorporadas</legend>
{% if not object_list %}
<p>{{ NO_ENTRIES_MSG }}</p>
{% else %}
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Data do Devolução</th>
<th>Tipo</th>
<th>Descrição</th>
<th>Autor</th>
<th>Vínculo</th>
</tr>
</thead>
<tbody>
{% for prop in object_list %}
<tr>
<td><a href="{% url 'sapl.materia:proposicao_detail' prop.pk %}">{{ prop.data_devolucao|date:"d/m/Y H:i:s" }}</a></td>
<td>{{ prop.tipo.descricao }}</td>
<td>{{ prop.descricao }}</td>
<td>{{ prop.autor }}</td>
<td>
{% if prop.materia_gerada %}
<a href="{% url 'sapl.materia:materialegislativa_detail' prop.materia_gerada.pk %}">{{ prop.materia_gerada.tipo.sigla }} {{ prop.materia_gerada.numero }}/{{ prop.materia_gerada.ano }}</a>
{% elif prop.documento_gerado %}
<a href="{% url 'sapl.materia:documentoacessorio_detail' prop.documento_gerado.pk %}">{{ prop.documento_gerado.materia.tipo.sigla }} {{ prop.documento_gerado.materia.numero }}/{{ prop.documento_gerado.materia.ano }}</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
</fieldset>
{% include 'paginacao.html'%}
{% endblock %}

35
sapl/templates/materia/prop_pendentes_list.html

@ -0,0 +1,35 @@
{% extends "base.html" %}
{% load i18n %}
{% block sections_nav %} {% include 'materia/subnav_prop.html'%} {% endblock sections_nav %}
{% block base_content %}
<fieldset>
<legend>Proposições Não Recebidas</legend>
{% if not object_list %}
<p>{{ NO_ENTRIES_MSG }}</p>
{% else %}
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Data de Envio</th>
<th>Tipo</th>
<th>Descrição</th>
<th>Autor</th>
</tr>
</thead>
<tbody>
{% for prop in object_list %}
<tr>
<td><a href="{% url 'sapl.materia:proposicao_detail' prop.pk %}">{{ prop.data_envio|date:"d/m/Y H:i:s" }}</a></td>
<td>{{ prop.tipo.descricao }}</td>
<td>{{ prop.descricao }}</td>
<td>{{ prop.autor }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
</fieldset>
{% include 'paginacao.html'%}
{% endblock %}

43
sapl/templates/materia/prop_recebidas_list.html

@ -0,0 +1,43 @@
{% extends "base.html" %}
{% load i18n %}
{% block sections_nav %} {% include 'materia/subnav_prop.html'%} {% endblock sections_nav %}
{% block base_content %}
<fieldset>
<legend>Proposições Incorporadas</legend>
{% if not object_list %}
<p>{{ NO_ENTRIES_MSG }}</p>
{% else %}
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Data do Recebimento</th>
<th>Tipo</th>
<th>Descrição</th>
<th>Autor</th>
<th>Vínculo</th>
</tr>
</thead>
<tbody>
{% for prop in object_list %}
<tr>
<td><a href="{% url 'sapl.materia:proposicao_detail' prop.pk %}">{{ prop.data_recebimento|date:"d/m/Y H:i:s" }}</a></td>
<td>{{ prop.tipo.descricao }}</td>
<td>{{ prop.descricao }}</td>
<td>{{ prop.autor }}</td>
<td>
{% if prop.materia_gerada %}
<a href="{% url 'sapl.materia:materialegislativa_detail' prop.materia_gerada.pk %}">{{ prop.materia_gerada.tipo.sigla }} {{ prop.materia_gerada.numero }}/{{ prop.materia_gerada.ano }}</a>
{% elif prop.documento_gerado %}
<a href="{% url 'sapl.materia:documentoacessorio_detail' prop.documento_gerado.pk %}">{{ prop.documento_gerado.materia.tipo.sigla }} {{ prop.documento_gerado.materia.numero }}/{{ prop.documento_gerado.materia.ano }}</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
</fieldset>
{% include 'paginacao.html'%}
{% endblock %}

10
sapl/templates/materia/proposicao_confirm_delete.html

@ -0,0 +1,10 @@
{% extends "crud/confirm_delete.html" %}
{% load i18n %}
{% block msg %}
{% if proposicao.data_envio %}
Confirma o retorno de "{{ object }}"?
{% else %}
Confirma exclusão de "{{ object }}"?
{% endif %}
{% endblock msg %}

6
sapl/templates/materia/proposicao_detail.html

@ -4,6 +4,7 @@
{% block actions %}
<div class="actions btn-group pull-right" role="group">
<<<<<<< HEAD
{% if proposicao.data_envio %}
{% if perms|get_change_perm:view %}
<a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Editar Proposição' %}</a>
@ -24,3 +25,8 @@
{% endif %}
</div>
{% endblock actions %}
{% block extra_msg %}
{% if proposicao.data_envio and not proposicao.data_recebimento %}
<b><p align="center"><a href="" onclick="window.open('{% url 'sapl.materia:recibo-proposicao' object.pk %}','Recibo','width=1100, height=600, scrollbars=yes')">[Imprimir Recibo]</a></p></b>
{% endif %}
{% endblock extra_msg %}

8
sapl/templates/materia/proposicao_form.html

@ -7,18 +7,12 @@
$(document).ready(function(){
if($("#id_data_envio").val() != ''){
$("#submit-id-excluir").val('Retornar proposição enviada');
$("#submit-id-salvar").val('Salvar proposição');
}else{
$("#submit-id-excluir").val('Excluir proposição');
$("#submit-id-salvar").val('Enviar proposição');
}
});
function disable_fields() {
$("#id_tipo_materia").val("");
$("#id_numero_materia").val("");
$("#id_ano_materia").val("");
$("#id_tipo_materia").attr("disabled", "disabled");
$("#id_numero_materia").attr("disabled", "disabled");
$("#id_ano_materia").attr("disabled", "disabled");
@ -34,7 +28,7 @@
$(function () {
disable_fields();
$("#id_tipo").change(function() {
if ($("#id_tipo").val() == 9) { // parecer
if ($('#id_tipo option:selected').text() == 'Parecer') { // parecer
enable_fields();
}else {
disable_fields();

9
sapl/templates/materia/receber_proposicao.html

@ -0,0 +1,9 @@
{% extends "crud/form.html" %}
{% load i18n %}
{% block sections_nav %} {% include 'materia/subnav_prop.html'%} {% endblock sections_nav %}
{% load crispy_forms_tags %}
{% block extra_msg %}
<p align="center"><font size="4" color="red"><b>{{msg}}</b></font></p>
{% endblock %}

70
sapl/templates/materia/recibo_proposicao.html

@ -0,0 +1,70 @@
{% load i18n %}
{% load crispy_forms_tags %}
{% load static %}
{% block detail_content %}
<style>
table {
width: 100%;
}
th, td {
padding: 5px;
}
</style>
<div align="center">
<input type="submit" value="Imprimir" onclick="window.print();" class="btn btn-success"/>
</div>
<br />
<table>
<tr>
<td>
<img height="100" width="100"
src="{% if logotipo %}{{ MEDIA_URL }}{{ logotipo }}{% else %}{% static 'img/logo.png' %}{% endif %}"
alt="Logotipo"
class="img-responsive visible-lg-inline-block vcenter">
<div>
</td>
<td>
{% if nome %}
<b>{{ nome }} {% trans 'de' %} {{ municipio }} - {{ uf }}</b>
{% else %}
<b>{% trans 'Sem Nome Cadastrado' %}</b>
{% endif %}
<br />
{% trans 'Sistema de Apoio ao Processo Legislativo' %}
</td>
</tr>
<tr> <td colspan="2" align="center"><b>RECIBO DE ENVIO DE PROPOSIÇÃO</b></td> </tr>
</table>
<br /><br />
<table frame="box">
<tr>
<td>Código do Documento: <b>{{hash}}</b></td>
<td>Tipo de Proposição: <b>{{proposicao.tipo.descricao}}</b></td>
</tr>
<tr>
<td>Autor: <b>{{proposicao.autor}}</b></td>
<td>Data de Envio: <b>{{proposicao.data_envio|date:"d/m/Y H:i:s"}}</b></td>
</tr>
<tr>
<td>Descrição: <b>{{proposicao.descricao}}</b></td>
</tr>
</table>
<br /><br />
<table>
<tr>
<td align="center">
Declaro que o conteúdo do texto impresso em anexo é idêntico ao conteúdo enviado eletronicamente por meio do sistema SAPL para esta proposição.
</td>
</tr>
<tr> <td align="center"><br /><br /><br /><b>________________________________________________________________</b></td> </tr>
<tr> <td align="center">{{proposicao.autor}}</td> </tr>
</table>
{% endblock detail_content %}

6
sapl/templates/materia/subnav_prop.html

@ -0,0 +1,6 @@
<ul class="nav nav-pills navbar-right">
<li class=""><a href="{% url 'sapl.materia:receber-proposicao' %}">Receber Proposição</a></li>
<li class=""><a href="{% url 'sapl.materia:proposicao-pendente' %}">Proposições Não Recebidas</a></li>
<li class=""><a href="{% url 'sapl.materia:proposicao-devolvida' %}">Proposições Não Incorporadas</a></li>
<li class=""><a href="{% url 'sapl.materia:proposicao-recebida' %}">Proposições Incorporadas</a></li>
</ul>

113
sapl/templates/painel/index.html

@ -5,7 +5,6 @@
<!--[if gt IE 8]><!-->
<html lang="en">
<!--<![endif]-->
<head>
<meta charset="UTF-8">
<!-- TODO: does it need this head_title here? -->
@ -14,11 +13,68 @@
<script type="text/javascript" src="{% static 'jquery/dist/jquery.js' %}"></script>
<script type="text/javascript" src="{% static 'jQuery-runner/build/jquery.runner.js' %}"></script>
<STYLE type="text/css">
<style type="text/css">
@media screen {
body {font-size: medium; color: white; line-height: 1em; background: black;}
body {
background: #2B2B2A;
}
ul, li {
list-style-type: none;
}
}
</STYLE>
</style>
</head>
<body>
<h1 id="title"></h1>
<input id="json_url" type="hidden" value="{% url 'sapl.painel:dados_painel' sessao_id %}">
<h3><font color="#4FA64D"><p align="center"><span id="sessao_plenaria"></span></p></font></h3>
<table style="width:100%">
<tr>
<th style="text-align:center"><font color="white" size="2"><span id="sessao_plenaria_data"></span></font></th>
<th style="text-align:center"><font color="white" size="2"><span id="sessao_plenaria_hora_inicio"></span></font></th>
</tr>
</table>
<h2><font color="red"><p align="center"><span id="message"></span></p></font></h2>
<font color="white"><p align="center">-----------------------------------------------</p></font>
<h3><font color="white"><p align="center"><span id="relogio"></span></p></font></h3>
<font color="white"><p align="center">-----------------------------------------------</p></font>
<h3><font color="#459170"><p align="center">Cronômetros</p></font></h3>
<table style="width:100%">
<tr>
<th style="text-align:center"><font color="white">Discurso: <span id="cronometro_discurso"></span></font></th>
</tr>
<tr>
<th style="text-align:center"><font color="white">Aparte: <span id="cronometro_aparte"></span></font></th>
</tr>
<tr>
<th style="text-align:center"><font color="white">Questão de Ordem: <span id="cronometro_ordem"></span></font></th>
</tr>
</table>
<h3><font color="white"><p align="center">-----------------------------------------------</p></font></h3>
<h3><font color="#459170"><p align="center">Parlamentares e Votos</p></font></h3>
<table style="width:60%" align="center">
<tr>
<th style="text-align:left"><font color="white" align="left"><span id="parlamentares"></span></font></th>
<th style="text-align:left"><font color="white"><span id="votacao"></span></font></th>
</tr>
</table>
<h3><font color="white"><p align="center">-----------------------------------------------</p></font></h3>
<h3><font color="#459170"><p align="center">Matéria em Votação</p></font></h3>
<table style="width:100%; border:1px;">
<tr><th style="text-align:center"><font color="white"><span id="materia_legislativa_texto"></span></font></th></tr>
<tr><th style="text-align:center"><font color="white"><span id="observacao_materia"></span></font></th></tr>
<tr><th style="text-align:center"><font color="#45919D"><span id="resultado_votacao"></span></font></th></tr>
</table>
</body>
<script type="text/javascript">
$(document).ready(function() {
@ -104,12 +160,12 @@
if( (data["tipo_resultado"] == "Aprovado por unanimidade") || (data["tipo_resultado"] == "Aprovado por maioria") || (data["tipo_resultado"] == "Rejeitado")){
if(data["tipo_votacao"] == "Nominal") {
jQuery.each(data["votos"], function(index, parlamentar) {
$('<li />', {text: parlamentar.parlamentar + ' / ' + parlamentar.partido + '/ Voto: ' + parlamentar.voto}).appendTo(presentes);
$('<li />', {text: parlamentar.parlamentar + ' - ' + parlamentar.partido + ' - Voto: ' + parlamentar.voto}).appendTo(presentes);
});
}
}else{
jQuery.each(presentes_ordem_dia, function(index, parlamentar) {
$('<li />', {text: parlamentar.nome + '/' + parlamentar.partido}).appendTo(presentes);
$('<li />', {text: parlamentar.nome + ' - ' + parlamentar.partido}).appendTo(presentes);
});
}
@ -165,49 +221,4 @@
})();
});
</script>
</head>
<body>
<h1 id="title"></h1>
<input id="json_url" type="hidden" value="{% url 'sapl.painel:dados_painel' sessao_id %}">
<h3>
<span id="sessao_plenaria"></span><br/><br/>
<span id="sessao_plenaria_data"></span><br/><br/>
<span id="sessao_plenaria_hora_inicio"></span></br><br/>
<h2 id="message"></h2>
<h2><span id="relogio"></span></h2>
<table>
<tr>
<td>TEMPO DECORRIDO:</td>
<td><span id="tempo-decorrido"></span></td>
</tr>
<tr>
<td>DISCURSO:</td>
<td><span id="cronometro_discurso"></span></td>
</tr>
<tr>
<td>APARTE:</td>
<td><span id="cronometro_aparte"></span></td>
</tr>
<tr>
<td>QUESTÃO DE ORDEM:</td>
<td><span id="cronometro_ordem"></span></td>
</tr>
</table>
<table>
<tr>
<td>
<ul id="parlamentares">
</ul>
</td>
<td>
<ul id="votacao">
</ul>
</td>
</tr>
</table>
<span id="materia_legislativa_texto"></span><br/>
<span id="resultado_votacao"></span><br/>
<span id="observacao_materia"></span>
</h3>
</body>
</html>

12
sapl/templates/sessao/OrdemDia.html

@ -1,12 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<form method="post">
{% csrf_token %}
{{formset}}
<br />
<input type="submit" value="Submit" />
</form>
{% endblock detail_content %}

96
sapl/templates/sessao/adicionar_varias_materias_expediente.html

@ -0,0 +1,96 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %}{% endblock %}
{% block sections_nav %}
{% endblock %}
{% block detail_content %}
{% block buttons %}
{% if filter_url %}
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'sapl.sessao:adicionar_varias_materias_expediente' pk_sessao %}" class="btn btn-default">{% trans 'Fazer nova pesquisa' %}</a>
</div>
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'sapl.sessao:expedientemateria_list' pk_sessao %}" class="btn btn-default">{% trans 'Matérias do Expediente' %}</a>
</div>
{% endif %}
{% endblock %}
{% if not filter_url %}
{% crispy filter.form %}
{% endif %}
<p></p>
{% if filter_url %}
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<td><h3>{% trans "Matérias" %}</h3></td>
<td><h3>{% trans "Tipo de Votação" %}</h3></td>
</tr>
</thead>
{% if paginator.count %}
{% if paginator.count > 1 %}
<h3>{% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3>
{% elif paginator.count == 1 %}
<h3>{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}</h3>
{% endif %}
<form method="POST" enctype="application/x-www-form-urlencoded">
{% csrf_token %}
{% for m in page_obj %}
<tr>
<td>
<input type="checkbox" name="materia_id" value="{{m.id}}" {% if check %} checked {% endif %}/>
<strong><a href="{% url 'sapl.materia:materialegislativa_detail' m.id %}">{{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}</strong></a></br>
<strong>Autores:</strong>
{% for a in m.autoria_set.all %}
{% if not forloop.first %}
, &nbsp;&nbsp; {{a.autor|default_if_none:"Não Informado"}}
{% else %}
&nbsp;{{a.autor|default_if_none:"Não Informado"}}
{% endif %}
{% endfor %}
</br>
<strong>Localização Atual:</strong> &nbsp;{{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não Informada"}}</br>
<strong>Status:</strong> &nbsp;{{m.tramitacao_set.last.status|default_if_none:"Não Informada"}}</br>
<strong>Data da última Tramitação:</strong> &nbsp;{{m.tramitacao_set.last.data_tramitacao|default_if_none:"Não Informada"}}</br>
<strong>Ementa:</strong>&nbsp;{{ m.ementa|safe }}</br>
<p></p>
<td class="col-md-3">
<input type="radio" name="tipo_votacao_{{m.id}}" id="tipo_votacao_{{m.id}}" value="1"> <label for="sexo">Simbólica</label>
</br>
<input type="radio" name="tipo_votacao_{{m.id}}" id="tipo_votacao_{{m.id}}" value="2"> <label for="sexo">Nominal</label>
</br>
<input type="radio" name="tipo_votacao_{{m.id}}" id="tipo_votacao_{{m.id}}" value="3"> <label for="sexo">Secreta</label>
</td>
</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td>
<h3>Nenhuma matéria encontrada com essas especificações</h3>
</tr>
{% endif %}
</table>
<input type="submit" value="Adicionar matérias selecionadas" class="btn btn-primary"S>
</form>
{% endif %}
{% endblock detail_content %}

18
sapl/templates/sessao/adicionar_varias_materias_ordem.html

@ -0,0 +1,18 @@
{% extends "sessao/adicionar_varias_materias_expediente.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block buttons %}
{% if filter_url %}
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'sapl.sessao:adicionar_varias_materias_ordem_dia' pk_sessao %}" class="btn btn-default">{% trans 'Fazer nova pesquisa' %}</a>
</div>
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'sapl.sessao:materiaordemdia_list' pk_sessao %}" class="btn btn-default">{% trans 'Matérias da Ordem do Dia' %}</a>
</div>
{% endif %}
{% endblock %}

85
sapl/templates/sessao/expediente_ordemdia_list.html

@ -1,85 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% block detail_content %}
{% if form.errors %}
<div class="alert-box alert">
<ul>
{% for field in form %}
{% if field.errors %}
{% if field.label == 'votacao_aberta' %}
<li>Já existe uma matéria com a votação aberta!<br />
Para abrir outra, termine ou feche a votação existente!</li>
{% endif %}
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
Matérias do Expediente
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<th>Matéria</th>
<th>Ementa</th>
<th>Resultado da Votação</th>
</tr>
</thead>
{% for m in materias_ordem %}
<tr>
<td>
{{m.numero}} - <a href="{% url 'sapl.sessao:expedienteordemdia_edit' m.pk m.oid %}">{{m.titulo}}</a>
&nbsp;
</br>
<strong>Autor{{m.autor|length|pluralize:"es"}}</strong>: {{m.autor|join:', '}}
</td>
<td>{{m.ementa|safe}}</td>
<td>
{% if m.resultado %}
{% if m.tipo_votacao == 1 %}
<b><a href="{% url 'sapl.sessao:votacaosimbolicaexpedit' m.pk m.oid m.ordem_id %}">{{m.resultado}}</a></b>
{% elif m.tipo_votacao == 2 %}
<b><a href="{% url 'sapl.sessao:votacaonominalexpedit' m.pk m.oid m.ordem_id %}">{{m.resultado}}</a></b>
{% elif m.tipo_votacao == 3%}
<b><a href="{% url 'sapl.sessao:votacaosecretaexpedit' m.pk m.oid m.ordem_id %}">{{m.resultado}}</a></b>
{% endif %}
{% else %}
Matéria não votada <br />
{% if m.votacao_aberta %}
{% if m.tipo_votacao == 1 %}
<b><a href="{% url 'sapl.sessao:votacaosimbolicaexp' m.pk m.oid m.ordem_id %}">Registrar Votação</a></b>
{% elif m.tipo_votacao == 2 %}
<b><a href="{% url 'sapl.sessao:votacaonominalexp' m.pk m.oid m.ordem_id %}">Registrar Votação</a></b>
{% elif m.tipo_votacao == 3%}
<b><a href="{% url 'sapl.sessao:votacaosecretaexp' m.pk m.oid m.ordem_id %}">Registrar Votação</a></b>
{% endif %}
{% else %}
<form method="POST" action="{% url 'sapl.sessao:expedienteordemdia_list' object.pk %}">
{% csrf_token %}
<input type="hidden" name="error_message" id="error_message" />
<input type="hidden" id="ordem_id" name="ordem_id" value="{{ m.ordem_id }}">
<input type="submit" id="abrir-votacao" name="abrir-votacao" value="Abrir Votação" class="btn btn-primary">
</form>
{% endif %}
{% endif %}
</td>
</tr>
{% endfor %}
</table>
</br>
<form method="POST" action="{% url 'sapl.sessao:expedienteordemdia_list' object.pk %}">
{% csrf_token %}
<input type="hidden" name="error_message" id="error_message" />
<a href="{% url 'sapl.sessao:expedienteordemdia_create' object.pk %}" class="btn btn-primary">{% trans 'Adicionar Matérias' %}</a>
&nbsp;&nbsp;&nbsp;
<input type="submit" id="expediente_reorder" name="expediente_reorder" value="Reordenar Matérias do Expediente" class="btn btn-primary" />
&nbsp;&nbsp;&nbsp;
<input type="submit" id="incluir_varias" name="incluir_varias" value="Incluir Várias Matérias" class="btn btn-primary" />
</form>
{% endblock detail_content %}

3
sapl/templates/sessao/expedientemateria_list.html

@ -6,4 +6,7 @@
<a href="{% url 'sapl.sessao:reordenar_expediente' root_pk %}" class="btn btn-default">
{% blocktrans with verbose_name=view.verbose_name %} Reordenar Matérias {% endblocktrans %}
</a>
<a href="{% url 'sapl.sessao:adicionar_varias_materias_expediente' root_pk %}" class="btn btn-default">
{% blocktrans with verbose_name=view.verbose_name %} Adicionar Várias Matérias {% endblocktrans %}
</a>
{% endblock more_buttons %}

27
sapl/templates/sessao/layouts.yaml

@ -11,20 +11,6 @@ SessaoPlenaria:
- upload_pauta upload_ata
- url_audio url_video
ExpedienteMateria:
{% trans 'Cadastro de Matérias do Expediente' %}:
- data_ordem tip_sessao_FIXME numero_ordem
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME
- tipo_votacao
- observacao
OrdemDia:
{% trans 'Cadastro de Matérias da Ordem do Dia' %}:
- data_ordem tip_sessao_FIXME numero_ordem
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME
- tipo_votacao
- observacao
TipoResultadoVotacao:
{% trans 'Tipo de Resultado da Votação' %}:
- nome
@ -55,12 +41,25 @@ ExpedienteMateria:
- tipo_votacao
- observacao
OrdemDia:
{% trans 'Matéria da Ordem do Dia' %}:
- data_ordem numero_ordem
- tipo_materia numero_materia ano_materia
- tipo_votacao
- observacao
ExpedienteMateriaDetail:
{% trans 'Matérias do Expediente' %}:
- materia
- tipo_votacao
- observacao
OrdemDiaDetail:
{% trans 'Matérias da Ordem do Dia' %}:
- materia
- tipo_votacao
- observacao
Bancada:
{% trans 'Bancada' %}:
- legislatura

76
sapl/templates/sessao/materia_ordemdia.html

@ -1,76 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% block detail_content %}
<div>
{{ error_message }}
</div>
{% if form.errors %}
<div class="alert-box alert">
<b><h4>Os seguintes erros foram encontrados:</h4></b>
<ul>
{% for field in form %}
{% if field.errors %}
{% if field.label == 'Matéria' %}
<li>Matéria inexistente!</li>
{% else %}
<li>O campo <b>{{field.label}}</b> é obrigatório!</li>
{% endif %}
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
<form method="POST">
{% csrf_token %}
<input type="hidden" name="error_message" id="error_message" />
<div class="row">
<div class="col-md-4">Data da Sessão: <input type="text" value='{{data_sessao|date:"d/m/Y"}}' disabled class="form-control"/></div>
<input type="hidden" id="data_sessao" name="data_sessao" length="10" maxlength="10" value='{{data_sessao|date:"d/m/Y"}}' class="form-control"/>
<div class="col-md-4">
Tipo da Sessão: <select id="tipo_sessao" name="tipo_sessao" class="form-control">
<option value=""></option>
{% for tipo in tipo_sessao %}
<option value="{{tipo.id}}">{{tipo.nome}}</option>
{% endfor %}
</select>
</div>
<div class="col-md-4"> Número Ordem: <input type="text" id="numero_ordem" name="numero_ordem" class="form-control"/> </div>
</div>
<div class="row">
<div class="col-md-4">
Tipo Matéria:
<select id="tipo_materia" name="tipo_materia" class="form-control">
<option value=""></option>
{% for tipo in tipo_materia %}
<option value="{{tipo.id}}">{{tipo.descricao}}</option>
{% endfor %}
</select>
</div>
<div class="col-md-4">Número Matéria: <input type="text" id="numero_materia" name="numero_materia" class="form-control"/></div>
<div class="col-md-4">Ano Matéria: <input type="text" id="ano_materia" name="ano_materia" value="{{ano_materia}}" class="form-control"/></div>
</div>
<div class="row">
<div class="col-md-12">
Tipo Votação:
<select id="tipo_votacao" name="tipo_votacao" class="form-control">
<option value=""></option>
{% for id, descricao in tipo_votacao %}
<option value="{{id}}">{{descricao}}</option>
{% endfor %}
</select>
</div>
</div>
<div class="row">
<div class="col-md-12"> Ementa: <textarea id="observacao" name="observacao" cols="10" rows="10" class="form-control"></textarea> </div>
</div>
<input type="submit" value="Salvar" class="btn btn-primary" />
</form>
{% endblock detail_content %}

74
sapl/templates/sessao/materia_ordemdia_edit.html

@ -1,74 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<div>
{{ error_message }}
</div>
{% if form.errors %}
<div class="alert-box alert">
<b><h4>Os seguintes erros foram encontrados:</h4></b>
<ul>
{% for field in form %}
{% if field.errors %}
<li>O campo <b>{{field.label}}</b> é obrigatório!</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
<form method="POST">
{% csrf_token %}
<div class="row">
<div class="col-md-4">Data da Sessão: <input type="text" value='{{ data_sessao|date:"d/m/Y" }}' disabled class="form-control"/></div>
<input type="hidden" id="data_sessao" name="data_sessao" length="10" maxlength="10" value='{{ data_sessao|date:"d/m/Y" }}' class="form-control"/>
<div class="col-md-4">
Tipo da Sessão: <select id="tipo_sessao" name="tipo_sessao" class="form-control">
<option value=""></option>
{% for tipo in tipo_sessao %}
<option value="{{ tipo.id }}" {% if tipo == tipo_sessao_selected %} selected {% endif %} >{{tipo.nome}}</option>
{% endfor %}
</select>
</div>
<div class="col-md-4"> Número Ordem: <input type="text" id="numero_ordem" name="numero_ordem" value="{{numero_ordem}}" class="form-control"/></div>
</div>
<div class="row">
<div class="col-md-4">
Tipo Matéria:
<select id="tipo_materia" name="tipo_materia" class="form-control">
<option value=""></option>
{% for tipo in tipo_materia %}
<option value="{{ tipo.id }}" {% if tipo == tipo_materia_selected %} selected {% endif %}>{{tipo.descricao}}</option>
{% endfor %}
</select>
</div>
<div class="col-md-4">Número Matéria: <input type="text" id="numero_materia" name="numero_materia" value="{{ numero_materia }}" class="form-control"/></div>
<div class="col-md-4">Ano Matéria: <input type="text" id="ano_materia" name="ano_materia" value="{{ ano_materia }}" class="form-control"/></div>
</div>
<div class="row">
<div class="col-md-12">
Tipo Votação:
<select id="tipo_votacao" name="tipo_votacao" class="form-control">
<option value=""></option>
{% for id, descricao in tipo_votacao %}
<option value="{{ id }}" {% if id == tipo_votacao_selected %} selected {% endif %}>{{descricao}}</option>
{% endfor %}
</select>
</div>
</div>
<div class="row">
<div class="col-md-12"> Ementa: <textarea id="observacao" name="observacao" cols="10" rows="10" class="form-control">{{observacao}}</textarea> </div>
</div>
<br />
<input type="submit" id="update-ordemdia" name="update-ordemdia" value="Salvar" class="btn btn-primary" />
<input type="submit" id="delete-ordemdia" name="delete-ordemdia" value="Remover" class="btn btn-danger" />
</form>
{% endblock detail_content %}

89
sapl/templates/sessao/materia_ordemdia_list.html

@ -1,89 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load common_tags %}
{% block detail_content %}
{% if form.errors %}
<div class="alert-box alert">
<ul>
{% for field in form %}
{% if field.errors %}
{% if field.label == 'votacao_aberta' %}
<li>Já existe uma matéria com a votação aberta!<br />
Para abrir outra, termine ou feche a votação existente!</li>
{% endif %}
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
Matérias da Ordem do Dia
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<th>Matéria</th>
<th>Ementa</th>
<th>Resultado da Votação</th>
</tr>
</thead>
{% for m in materias_ordem %}
<tr>
<td>
{{m.numero}} - <a href="{% url 'sapl.sessao:materiaordemdia_edit' m.pk m.oid %}">{{m.titulo}}</a>
&nbsp;
</br>
<strong>Autor{{m.autor|length|pluralize:"es"}}</strong>: {{m.autor|join:', '}}
</td>
<td>{{m.ementa|safe}}</td>
<td>
{% if m.resultado %}
{% if m.tipo_votacao == 1 %}
<b><a href="{% url 'sapl.sessao:votacaosimbolicaedit' m.pk m.oid m.ordem_id %}">{{m.resultado}}</a></b>
{% elif m.tipo_votacao == 2 %}
<b><a href="{% url 'sapl.sessao:votacaonominaledit' m.pk m.oid m.ordem_id %}">{{m.resultado}}</a></b>
{% elif m.tipo_votacao == 3%}
<b><a href="{% url 'sapl.sessao:votacaosecretaedit' m.pk m.oid m.ordem_id %}">{{m.resultado}}</a></b>
{% endif %}
{% else %}
Matéria não votada <br />
{% if m.votacao_aberta %}
{% if m.tipo_votacao == 1 %}
<b><a href="{% url 'sapl.sessao:votacaosimbolica' m.pk m.oid m.ordem_id %}">Registrar Votação</a></b>
{% elif m.tipo_votacao == 2 %}
<b><a href="{% url 'sapl.sessao:votacaonominal' m.pk m.oid m.ordem_id %}">Registrar Votação</a></b>
{% elif m.tipo_votacao == 3%}
<b><a href="{% url 'sapl.sessao:votacaosecreta' m.pk m.oid m.ordem_id %}">Registrar Votação</a></b>
{% endif %}
{% else %}
<form method="POST" action="{% url 'sapl.sessao:materiaordemdia_list' object.pk %}">
{% csrf_token %}
<input type="hidden" id="ordem_id" name="ordem_id" value="{{ m.ordem_id }}">
<input type="submit" id="abrir-votacao" name="abrir-votacao" value="Abrir Votação" class="btn btn-primary">
</form>
{% endif %}
{% endif %}
</td>
</tr>
{% endfor %}
</table>
</br>
<form method="POST" action="{% url 'sapl.sessao:materiaordemdia_list' object.pk %}">
{% csrf_token %}
<input type="hidden" name="error_message" id="error_message" />
{% if perms|get_add_perm:view %}
<a href="{% url 'sapl.sessao:materiaordemdia_create' object.pk %}" class="btn btn-primary">{% trans 'Adicionar Matérias' %}</a>
&nbsp;&nbsp;&nbsp;
{% endif %}
<input type="submit" id="materia_reorder" name="materia_reorder" value="Reordenar Matérias da Ordem do Dia" class="btn btn-primary" />
&nbsp;&nbsp;&nbsp;
{% if perms|get_add_perm:view %}
<input type="submit" id="incluir_varias" name="incluir_varias" value="Incluir Várias Matérias" class="btn btn-primary" />
{% endif %}
</form>
{% endblock detail_content %}

4
sapl/templates/sessao/painel.html

@ -7,11 +7,11 @@
<div class="row">
<!--<div class="col-md-6"><a href="{% url 'sapl.painel:painel_principal' pk %}" class="btn btn-primary btn-sm active">Iniciar painel presidente</a></div> -->
<div class="col-md-6"><a href="{% url 'sapl.painel:painel_principal' pk %}" class="btn btn-primary btn-sm active">Iniciar painel completo</a></div>
<div class="col-md-6"><a href="" onclick="window.open('{% url 'sapl.painel:painel_principal' pk %}','Comprovante','width=800, height=800, scrollbars=yes')" class="btn btn-primary btn-sm active">Iniciar painel completo</a></div>
<!--<div class="col-md-6"><a href="{% url 'sapl.painel:painel_mensagem' %}" class="btn btn-primary btn-sm active">Iniciar painel mensagem</a></div>
<div class="col-md-6"><a href="{% url 'sapl.painel:painel_parlamentar' %}" class="btn btn-primary btn-sm active">Iniciar painel parlamentares</a></div>
<div class="col-md-6"><a href="{% url 'sapl.painel:painel_votacao' %}" class="btn btn-primary btn-sm active">Iniciar painel votação</a></div> -->
<div class="col-md-6"><a href="{% url 'sapl.painel:painel_controlador' %}" class="btn btn-primary btn-sm active">Controlador Painel</a></div>
<div class="col-md-6"><a href="{% url 'sapl.painel:painel_controlador' %}" target="_blank" class="btn btn-primary btn-sm active">Controlador Painel</a></div>
</div>
<br />
<h1>Operação do Painel Eletrônico</h1>

16
sapl/templates/sessao/pauta_sessao_detail.html

@ -7,7 +7,7 @@
<div align=right><a href="{% url 'sapl.relatorios:relatorio_sessao_plenaria' object.id %}">> PDF</a></li></div>
<fieldset>
<legend>Identificação Básica</legend>
<table class="table table-striped table-bordered">
<table class="table">
<thead class="thead-default">
<tr>
{% for b in basica %}
@ -20,12 +20,14 @@
<fieldset>
<legend>Expedientes</legend>
<table class="table table-striped table-bordered">
<table class="table">
<thead class="thead-default">
{% for e in expedientes %}
<tr>
<td><b>{{e.tipo}}:</b></td>
<td>{{e.conteudo|safe}}</td>
<td>
<b>{{e.tipo}}: </b> <br />
<p style="text-indent: 50px;">{{e.conteudo}}</p>
</td>
</tr>
{% endfor %}
</thead>
@ -34,7 +36,7 @@
<fieldset>
<legend>Matérias do Expediente</legend>
<table class="table table-striped table-bordered">
<table class="table table-striped">
<thead class="thead-default">
<tr>
<th>Matéria</th>
@ -58,7 +60,7 @@
<fieldset>
<legend>Oradores do Expediente</legend>
<table class="table table-striped table-bordered">
<table class="table table-striped">
<thead class="thead-default">
<tr>
<th>Parlamentar</th>
@ -76,7 +78,7 @@
<fieldset>
<legend>Matérias da Ordem do Dia</legend>
<table class="table table-striped table-bordered">
<table class="table table-striped">
<thead class="thead-default">
<tr>
<th>Matéria</th>

36
sapl/templates/sessao/pauta_sessao_list.html

@ -1,20 +1,34 @@
{% extends "crud/list.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% extends "base.html" %}
{% load i18n staticfiles %}
{% block base_content %}
{% block detail_content %}
<table width="100%">
{% if not page_obj %}
<p>Não há pautas.</p>
{% else %}
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Data</th>
<th>Sessão</th>
<th>PDF</th>
</tr>
</thead>
<tbody>
{% for sessao in page_obj %}
<tr>
<th>
<a href="{% url 'sapl.sessao:pauta_sessao_detail' sessao.id %}">{{sessao}}</a>
<br />
Data: {{sessao.data_inicio}} - Abertura {{sessao.hora_inicio}}
</th>
<td><a href="{% url 'sapl.sessao:pauta_sessao_detail' sessao.id %}">
{{sessao.data_inicio}} - {{sessao.hora_inicio}}
</a></td>
<td>{{sessao}}</td>
<td><a href="{% url 'sapl.relatorios:relatorio_sessao_plenaria' sessao.id %}">
<img src="{% static 'img/file.png' %}">
</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% include "paginacao.html" %}
{% endblock %}
{% endblock %}

2
sapl/templates/sessao/subnav.yaml

@ -22,7 +22,7 @@
- title: {% trans 'Ordem do Dia' %}
children:
- title: {% trans 'Matérias Ordem do Dia' %}
url: materiaordemdia_list
url: ordemdia_list
- title: {% trans 'Presença Ordem do Dia' %}
url: presencaordemdia

11
sapl/templates/sessao/votacao/nominal.html

@ -12,11 +12,11 @@
<br />
Ementa: {{materia.ementa|safe}}
</div>
<br />
<fieldset class="form-group">
<legend>Votos</legend>
<div class="row">
{% for parlamentar in view.get_parlamentares %}
{% for parlamentar in parlamentares %}
<div class="col-md-6">{{parlamentar.nome_parlamentar}}</div>
<div class="col-md-6">
<select id="voto_parlamentar" name="voto_parlamentar" class="form-control">
@ -34,17 +34,18 @@
<div class="col-md-12">
Resultado da Votação
<select id="resultado_votacao" name="resultado_votacao" class="form-control">
{% for tipo in view.get_tipos_votacao %}
{% for tipo in tipos %}
<option value="{{tipo.id}}">{{tipo.nome}}</option>
{% endfor %}
</select>
</div>
</div>
<br />
<div class="row">
<div class="col-md-12">
Observações
<textarea id="observacao" name="observacao" cols="10" rows="10"></textarea>
Observações<br/>
<textarea id="observacao" name="observacao" style="width:100%;" rows="7"></textarea>
</div>
</div>

13
sapl/templates/sessao/votacao/nominal_edit.html

@ -12,8 +12,8 @@
<br />
Ementa: {{materia.ementa|safe}}
</div>
<br />
<br />
<fieldset>
<legend>Votos</legend>
<div class="row">
@ -24,6 +24,7 @@
</div>
</fieldset>
<br />
<div class="row">
<div class="col-md-12">
Anular Votação
@ -34,21 +35,23 @@
</div>
</div>
<br />
<div class="row">
<div class="col-md-12">
Resultado da Votação:
{% for tipo in view.get_tipos_votacao %}
<b>Resultado da Votação: </b>
{% for tipo in tipos %}
{% if votacao.tipo_resultado == tipo.id %}
<b>{{ tipo.nome }}</b>
{{ tipo.nome }}
{% endif %}
{% endfor %}
</div>
</div>
<br />
<div class="row">
<div class="col-md-12">
Observações
<textarea id="observacao" name="observacao" cols="10" rows="10" class="form-control">{{votacao.observacao|safe}}</textarea>
<textarea id="observacao" name="observacao" style="width:100%;" rows="7" class="form-control">{{votacao.observacao|safe}}</textarea>
</div>
</div>

13
sapl/utils.py

@ -1,3 +1,4 @@
import hashlib
from datetime import date
from functools import wraps
@ -221,6 +222,7 @@ def intervalos_tem_intersecao(a_inicio, a_fim, b_inicio, b_fim):
return maior_inicio <= menor_fim
<<<<<<< HEAD
def permissoes_materia():
lista_permissoes = []
cts = ContentType.objects.filter(app_label='materia')
@ -308,3 +310,14 @@ def permissoes_autor():
for p in perms_autor:
lista_permissoes.append('materia.' + p.codename)
return set(lista_permissoes)
def gerar_hash_arquivo(arquivo, pk, block_size=2**20):
md5 = hashlib.md5()
arq = open(arquivo, 'rb')
while True:
data = arq.read(block_size)
if not data:
break
md5.update(data)
return 'P' + md5.hexdigest() + '/' + pk

Loading…
Cancel
Save