Browse Source

Merge branch '3.1.x' into 2754-tramitacao-anexados-doc-adm

pull/2757/head
Cesar Augusto de Carvalho 7 years ago
committed by GitHub
parent
commit
c10e8ac2c6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      sapl/legacy/test_renames.py
  2. 18
      sapl/materia/forms.py
  3. 56
      sapl/materia/tests/test_materia.py
  4. 29
      sapl/materia/views.py
  5. 37
      sapl/parlamentares/forms.py
  6. 37
      sapl/parlamentares/migrations/0026_bloco.py
  7. 19
      sapl/parlamentares/migrations/0027_auto_20190430_0839.py
  8. 34
      sapl/parlamentares/models.py
  9. 8
      sapl/parlamentares/urls.py
  10. 18
      sapl/parlamentares/views.py
  11. 3
      sapl/rules/map_rules.py
  12. 37
      sapl/sessao/forms.py
  13. 22
      sapl/sessao/migrations/0039_auto_20190430_0825.py
  14. 34
      sapl/sessao/models.py
  15. 6
      sapl/sessao/urls.py
  16. 14
      sapl/sessao/views.py
  17. 2
      sapl/templates/menu_tabelas_auxiliares.yaml
  18. 7
      sapl/templates/parlamentares/layouts.yaml
  19. 7
      sapl/templates/sessao/layouts.yaml

4
sapl/legacy/test_renames.py

@ -13,9 +13,9 @@ from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio,
from sapl.norma.models import (AnexoNormaJuridica, NormaJuridica,
NormaRelacionada, TipoVinculoNormaJuridica)
from sapl.parlamentares.models import (Frente, Mandato, Parlamentar, Partido,
TipoAfastamento, Votante)
TipoAfastamento, Votante, Bloco)
from sapl.protocoloadm.models import DocumentoAdministrativo
from sapl.sessao.models import (Bancada, Bloco, CargoBancada,
from sapl.sessao.models import (Bancada, CargoBancada,
ExpedienteMateria, Orador, OradorExpediente,
OrdemDia, RegistroVotacao, ResumoOrdenacao,
SessaoPlenaria, TipoResultadoVotacao,

18
sapl/materia/forms.py

@ -553,10 +553,14 @@ class TramitacaoForm(ModelForm):
def save(self, commit=True):
tramitacao = super(TramitacaoForm, self).save(commit)
materia = tramitacao.materia
materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True
materia.save()
lista_tramitacao = []
for ma in materia.anexadas.all():
if not ma.tramitacao_set.all() \
or ma.tramitacao_set.last().unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local:
ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True
ma.save()
lista_tramitacao.append(Tramitacao(
status=tramitacao.status,
materia=ma,
@ -576,6 +580,20 @@ class TramitacaoForm(ModelForm):
return tramitacao
def lista_anexadas(materia_principal):
materias_anexadas = []
anexadas_principal = Anexada.objects.filter(materia_principal=materia_principal)
while anexadas_principal:
anexadas = []
for anexada in anexadas_principal:
materias_anexadas.append(anexada.materia_anexada)
anexadas_anexada = Anexada.objects.filter(materia_principal=anexada.materia_anexada)
anexadas.extend(anexadas_anexada)
anexadas_principal = anexadas
return materias_anexadas
class TramitacaoUpdateForm(TramitacaoForm):
unidade_tramitacao_local = forms.ModelChoiceField(
queryset=UnidadeTramitacao.objects.all(),

56
sapl/materia/tests/test_materia.py

@ -14,12 +14,68 @@ from sapl.materia.models import (Anexada, Autoria, DespachoInicial,
StatusTramitacao, TipoDocumento,
TipoMateriaLegislativa, TipoProposicao,
Tramitacao, UnidadeTramitacao)
from sapl.materia.forms import lista_anexadas
from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
TipoNormaJuridica)
from sapl.parlamentares.models import Legislatura
from sapl.utils import models_with_gr_for_model
@pytest.mark.django_db(transaction=False)
def test_lista_anexadas():
tipo_materia = mommy.make(
TipoMateriaLegislativa,
descricao="Tipo_Teste"
)
regime_tramitacao = mommy.make(
RegimeTramitacao,
descricao="Regime_Teste"
)
materia_principal = mommy.make(
MateriaLegislativa,
numero=20,
ano=2018,
data_apresentacao="2018-01-04",
regime_tramitacao=regime_tramitacao,
tipo=tipo_materia
)
materia_anexada = mommy.make(
MateriaLegislativa,
numero=21,
ano=2019,
data_apresentacao="2019-05-04",
regime_tramitacao=regime_tramitacao,
tipo=tipo_materia
)
materia_anexada_anexada = mommy.make(
MateriaLegislativa,
numero=22,
ano=2020,
data_apresentacao="2020-01-05",
regime_tramitacao=regime_tramitacao,
tipo=tipo_materia
)
mommy.make(
Anexada,
materia_principal=materia_principal,
materia_anexada=materia_anexada,
data_anexacao="2019-05-11"
)
mommy.make(
Anexada,
materia_principal=materia_anexada,
materia_anexada=materia_anexada_anexada,
data_anexacao="2020-11-05"
)
lista = lista_anexadas(materia_principal)
assert len(lista) == 2
assert lista[0] == materia_anexada
assert lista[1] == materia_anexada_anexada
@pytest.mark.django_db(transaction=False)
def make_unidade_tramitacao(descricao):
# Cria uma comissão para ser a unidade de tramitação

29
sapl/materia/views.py

@ -47,7 +47,8 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm,
ConfirmarProposicaoForm,
DevolverProposicaoForm, LegislacaoCitadaForm,
OrgaoForm, ProposicaoForm, TipoProposicaoForm,
TramitacaoForm, TramitacaoUpdateForm, MateriaPesquisaSimplesForm)
TramitacaoForm, TramitacaoUpdateForm, MateriaPesquisaSimplesForm,
lista_anexadas)
from sapl.norma.models import LegislacaoCitada
from sapl.parlamentares.models import Legislatura
from sapl.protocoloadm.models import Protocolo
@ -1233,12 +1234,6 @@ class TramitacaoCrud(MasterDetailCrud):
self.object = form.save()
username = self.request.user.username
if form.instance.status.indicador == 'F':
form.instance.materia.em_tramitacao = False
else:
form.instance.materia.em_tramitacao = True
form.instance.materia.save()
try:
self.logger.debug("user=" + username + ". Tentando enviar Tramitacao (sender={}, post={}, request={})."
.format(Tramitacao, self.object, self.request))
@ -1272,12 +1267,6 @@ class TramitacaoCrud(MasterDetailCrud):
self.object = form.save()
username = self.request.user.username
if form.instance.status.indicador == 'F':
form.instance.materia.em_tramitacao = False
else:
form.instance.materia.em_tramitacao = True
form.instance.materia.save()
try:
self.logger.debug("user=" + username + ". Tentando enviar Tramitacao (sender={}, post={}, request={}"
.format(Tramitacao, self.object, self.request))
@ -1611,6 +1600,20 @@ class MateriaLegislativaCrud(Crud):
form_class = MateriaLegislativaForm
def form_valid(self, form):
self.object = form.save()
username = self.request.user.username
if Anexada.objects.filter(materia_principal=self.kwargs['pk']).exists():
materia = MateriaLegislativa.objects.get(pk=self.kwargs['pk'])
anexadas = lista_anexadas(materia)
for anexada in anexadas:
anexada.em_tramitacao = True if form.instance.em_tramitacao else False
anexada.save()
return super().form_valid(form)
@property
def cancel_url(self):
return self.search_url

37
sapl/parlamentares/forms.py

@ -23,7 +23,7 @@ from sapl.rules import SAPL_GROUP_VOTANTE
import django_filters
from .models import (ComposicaoColigacao, Filiacao, Frente, Legislatura,
Mandato, Parlamentar, Votante)
Mandato, Parlamentar, Votante, Bloco)
class ImageThumbnailFileInput(ClearableFileInput):
@ -568,3 +568,38 @@ class VincularParlamentarForm(forms.Form):
raise ValidationError(_('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.'))
return cleaned_data
class BlocoForm(ModelForm):
class Meta:
model = Bloco
fields = ['nome', 'partidos', 'data_criacao',
'data_extincao', 'descricao']
def clean(self):
super(BlocoForm, self).clean()
if not self.is_valid():
return self.cleaned_data
if self.cleaned_data['data_extincao']:
if (self.cleaned_data['data_extincao'] <
self.cleaned_data['data_criacao']):
msg = _('Data de extinção não pode ser menor que a de criação')
raise ValidationError(msg)
return self.cleaned_data
@transaction.atomic
def save(self, commit=True):
bloco = super(BlocoForm, self).save(commit)
content_type = ContentType.objects.get_for_model(Bloco)
object_id = bloco.pk
tipo = TipoAutor.objects.get(content_type=content_type)
Autor.objects.create(
content_type=content_type,
object_id=object_id,
tipo=tipo,
nome=bloco.nome
)
return bloco

37
sapl/parlamentares/migrations/0026_bloco.py

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-30 11:28
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0025_auto_20180924_1724'),
('sessao', '0039_auto_20190430_0825')
]
state_operations = [
migrations.CreateModel(
name='Bloco',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nome', models.CharField(max_length=80, verbose_name='Nome do Bloco')),
('data_criacao', models.DateField(null=True, verbose_name='Data Criação')),
('data_extincao', models.DateField(blank=True, null=True, verbose_name='Data Dissolução')),
('descricao', models.TextField(blank=True, verbose_name='Descrição')),
('partidos', models.ManyToManyField(blank=True, to='parlamentares.Partido', verbose_name='Partidos')),
],
options={
'db_table': 'parlamentares_bloco',
'verbose_name': 'Bloco Parlamentar',
'verbose_name_plural': 'Blocos Parlamentares',
},
bases=(models.Model,),
),
]
operations = [
migrations.SeparateDatabaseAndState(state_operations=state_operations)
]

19
sapl/parlamentares/migrations/0027_auto_20190430_0839.py

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-30 11:39
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0026_bloco'),
]
operations = [
migrations.AlterModelTable(
name='bloco',
table=None,
),
]

34
sapl/parlamentares/models.py

@ -568,3 +568,37 @@ class Votante(models.Model):
def __str__(self):
return self.user.username
@reversion.register()
class Bloco(models.Model):
'''
* blocos podem existir por mais de uma legislatura
'''
nome = models.CharField(
max_length=80, verbose_name=_('Nome do Bloco'))
partidos = models.ManyToManyField(
Partido, blank=True, verbose_name=_('Partidos'))
data_criacao = models.DateField(
blank=False, null=True, verbose_name=_('Data Criação'))
data_extincao = models.DateField(
blank=True, null=True, verbose_name=_('Data Dissolução'))
descricao = models.TextField(blank=True, verbose_name=_('Descrição'))
# campo conceitual de reversão genérica para o model Autor que dá a
# o meio possível de localização de tipos de autores.
autor = SaplGenericRelation(Autor,
related_query_name='bloco_set',
fields_search=(
('nome', '__icontains'),
('descricao', '__icontains'),
('partidos__sigla', '__icontains'),
('partidos__nome', '__icontains'),
))
class Meta:
verbose_name = _('Bloco Parlamentar')
verbose_name_plural = _('Blocos Parlamentares')
def __str__(self):
return self.nome

8
sapl/parlamentares/urls.py

@ -18,7 +18,7 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
insere_parlamentar_composicao,
parlamentares_frente_selected,
remove_parlamentar_composicao,
parlamentares_filiados,
parlamentares_filiados, BlocoCrud,
PesquisarParlamentarView, VincularParlamentarView)
from .apps import AppConfig
@ -46,8 +46,9 @@ urlpatterns = [
url(r'^sistema/coligacao/',
include(ColigacaoCrud.get_urls() +
ComposicaoColigacaoCrud.get_urls())),
ComposicaoColigacaoCrud.get_urls())),
url(r'^sistema/bloco/',
include(BlocoCrud.get_urls())),
url(r'^sistema/frente/',
include(FrenteCrud.get_urls())),
url(r'^sistema/frente/atualiza-lista-parlamentares',
@ -89,4 +90,5 @@ urlpatterns = [
url(r'^mesa-diretora/remove-parlamentar-composicao/$',
remove_parlamentar_composicao, name='remove_parlamentar_composicao'),
]

18
sapl/parlamentares/views.py

@ -34,11 +34,15 @@ from sapl.parlamentares.apps import AppConfig
from sapl.utils import (parlamentares_ativos, show_results_filter_set)
from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm,
ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarFilterSet, VincularParlamentarForm)
ParlamentarCreateForm, ParlamentarForm, VotanteForm,
ParlamentarFilterSet, VincularParlamentarForm,
BlocoForm)
from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
Dependente, Filiacao, Frente, Legislatura, Mandato,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
SituacaoMilitar, TipoAfastamento, TipoDependente, Votante)
SituacaoMilitar, TipoAfastamento, TipoDependente, Votante,
Bloco)
CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa')
@ -1164,3 +1168,13 @@ class VincularParlamentarView(PermissionRequiredMixin, FormView):
mandato.save()
return HttpResponseRedirect(self.get_success_url())
class BlocoCrud(CrudAux):
model = Bloco
class CreateView(CrudAux.CreateView):
form_class = BlocoForm
def get_success_url(self):
return reverse('sapl.parlamentares:bloco_list')

3
sapl/rules/map_rules.py

@ -278,6 +278,8 @@ rules_group_geral = {
(parlamentares.ComposicaoMesa, __base__, __perms_publicas__),
(parlamentares.Frente, __base__, __perms_publicas__),
(parlamentares.Votante, __base__, __perms_publicas__),
(parlamentares.Bloco, __base__, __perms_publicas__),
(sessao.CargoBancada, __base__, __perms_publicas__),
(sessao.Bancada, __base__, __perms_publicas__),
@ -286,7 +288,6 @@ rules_group_geral = {
(sessao.TipoExpediente, __base__, __perms_publicas__),
(sessao.TipoJustificativa, __base__, __perms_publicas__),
(sessao.JustificativaAusencia, __base__, __perms_publicas__),
(sessao.Bloco, __base__, __perms_publicas__),
(sessao.ResumoOrdenacao, __base__, __perms_publicas__),
(sessao.TipoRetiradaPauta, __base__, __perms_publicas__),

37
sapl/sessao/forms.py

@ -23,7 +23,7 @@ from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES,
autor_modal, timezone, choice_anos_com_sessaoplenaria,
FileFieldCheckMixin)
from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia,
from .models import (Bancada, ExpedienteMateria, JustificativaAusencia,
Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, TipoResultadoVotacao,
OcorrenciaSessao, RetiradaPauta, TipoRetiradaPauta, OradorOrdemDia, ORDENACAO_RESUMO,
@ -316,41 +316,6 @@ class BancadaForm(ModelForm):
return bancada
class BlocoForm(ModelForm):
class Meta:
model = Bloco
fields = ['nome', 'partidos', 'data_criacao',
'data_extincao', 'descricao']
def clean(self):
super(BlocoForm, self).clean()
if not self.is_valid():
return self.cleaned_data
if self.cleaned_data['data_extincao']:
if (self.cleaned_data['data_extincao'] <
self.cleaned_data['data_criacao']):
msg = _('Data de extinção não pode ser menor que a de criação')
raise ValidationError(msg)
return self.cleaned_data
@transaction.atomic
def save(self, commit=True):
bloco = super(BlocoForm, self).save(commit)
content_type = ContentType.objects.get_for_model(Bloco)
object_id = bloco.pk
tipo = TipoAutor.objects.get(content_type=content_type)
Autor.objects.create(
content_type=content_type,
object_id=object_id,
tipo=tipo,
nome=bloco.nome
)
return bloco
class ExpedienteMateriaForm(ModelForm):
_model = ExpedienteMateria

22
sapl/sessao/migrations/0039_auto_20190430_0825.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-30 11:25
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('sessao', '0038_merge_20190415_1800'),
]
database_operations = [migrations.AlterModelTable('Bloco', 'parlamentares_bloco')]
state_operations = [migrations.DeleteModel('Bloco')]
operations = [
migrations.SeparateDatabaseAndState(
database_operations=database_operations,
state_operations=state_operations)
]

34
sapl/sessao/models.py

@ -550,40 +550,6 @@ class SessaoPlenariaPresenca(models.Model):
ordering = ['parlamentar__nome_parlamentar']
@reversion.register()
class Bloco(models.Model):
'''
* blocos podem existir por mais de uma legislatura
'''
nome = models.CharField(
max_length=80, verbose_name=_('Nome do Bloco'))
partidos = models.ManyToManyField(
Partido, blank=True, verbose_name=_('Partidos'))
data_criacao = models.DateField(
blank=False, null=True, verbose_name=_('Data Criação'))
data_extincao = models.DateField(
blank=True, null=True, verbose_name=_('Data Dissolução'))
descricao = models.TextField(blank=True, verbose_name=_('Descrição'))
# campo conceitual de reversão genérica para o model Autor que dá a
# o meio possível de localização de tipos de autores.
autor = SaplGenericRelation(Autor,
related_query_name='bloco_set',
fields_search=(
('nome', '__icontains'),
('descricao', '__icontains'),
('partidos__sigla', '__icontains'),
('partidos__nome', '__icontains'),
))
class Meta:
verbose_name = _('Bloco Parlamentar')
verbose_name_plural = _('Blocos Parlamentares')
def __str__(self):
return self.nome
ORDENACAO_RESUMO = [
('id_basica', 'Identificação Básica'),
('cont_mult', 'Conteúdo Multimídia'),

6
sapl/sessao/urls.py

@ -2,8 +2,8 @@ from django.conf.urls import include, url
from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
AdicionarVariasMateriasOrdemDia, BancadaCrud,
BlocoCrud, CargoBancadaCrud,
ExpedienteMateriaCrud, ExpedienteView, JustificativaAusenciaCrud,
CargoBancadaCrud, ExpedienteMateriaCrud,
ExpedienteView, JustificativaAusenciaCrud,
OcorrenciaSessaoView, MateriaOrdemDiaCrud, OradorOrdemDiaCrud,
MesaView, OradorCrud,
OradorExpedienteCrud, PainelView,
@ -96,8 +96,6 @@ urlpatterns = [
include(TipoRetiradaPautaCrud.get_urls())),
url(r'^sistema/bancada/',
include(BancadaCrud.get_urls())),
url(r'^sistema/bloco/',
include(BlocoCrud.get_urls())),
url(r'^sistema/cargo-bancada/',
include(CargoBancadaCrud.get_urls())),
url(r'^sistema/resumo-ordenacao/',

14
sapl/sessao/views.py

@ -37,13 +37,13 @@ from sapl.sessao.apps import AppConfig
from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm
from sapl.utils import show_results_filter_set, remover_acentos, get_client_ip
from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm,
from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm,
ExpedienteForm, JustificativaAusenciaForm, OcorrenciaSessaoForm, ListMateriaForm,
MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet,
PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet,
SessaoPlenariaForm, VotacaoEditForm, VotacaoForm,
VotacaoNominalForm, RetiradaPautaForm, OradorOrdemDiaForm)
from .models import (Bancada, Bloco, CargoBancada, CargoMesa,
from .models import (Bancada, CargoBancada, CargoMesa,
ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa,
MateriaLegislativa, Orador, OradorExpediente, OrdemDia,
PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao,
@ -679,16 +679,6 @@ class BancadaCrud(CrudAux):
return reverse('sapl.sessao:bancada_list')
class BlocoCrud(CrudAux):
model = Bloco
class CreateView(CrudAux.CreateView):
form_class = BlocoForm
def get_success_url(self):
return reverse('sapl.sessao:bloco_list')
def recuperar_numero_sessao(request):
try:
sessao = SessaoPlenaria.objects.filter(

2
sapl/templates/menu_tabelas_auxiliares.yaml

@ -78,7 +78,7 @@
url: sapl.parlamentares:frente_list
css_class: btn btn-link
- title: {% trans 'Bloco Parlamentar' %}
url: sapl.sessao:bloco_list
url: sapl.parlamentares:bloco_list
css_class: btn btn-link
- title: {% trans 'Módulo Proposições' %}
css_class: head_title

7
sapl/templates/parlamentares/layouts.yaml

@ -127,3 +127,10 @@ Votante:
{% trans 'Votante' %}:
- parlamentar user
- data
Bloco:
{% trans 'Bloco' %}:
- nome
- data_criacao data_extincao
- partidos
- descricao

7
sapl/templates/sessao/layouts.yaml

@ -84,13 +84,6 @@ CargoBancada:
{% trans 'Cargo de Bancada' %}:
- nome_cargo:8 cargo_unico
Bloco:
{% trans 'Bloco' %}:
- nome
- data_criacao data_extincao
- partidos
- descricao
TipoJustificativa:
{% trans 'Tipo de Justificativa' %}:
- descricao

Loading…
Cancel
Save