Browse Source

Fix #355 crud relatoria

* Init crud legislação citada

* Init Crud Tramitação

* Init crud relatoria

* Disabilita localização atual

* Valida localização atual

* Fix qa e testes

* Init crud documento acessório

* Monta layout para autor

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

* Esconde campo não usado de autor

* Define layout documento acessório

* Ajusta botão de salvar e cancelar

* Fix qa

* Adiciona edição de documento acessório

* Fix qa e testes

* Init crud legislação citada

* Init Crud Tramitação

* Init crud relatoria

* Fix qa e testes

* Fix url

* Adiciona campo de arquivo em Documento Acessório
pull/437/head
Eduardo Edson Batista Cordeiro Alves 9 years ago
committed by Edward
parent
commit
af61c2f9eb
  1. 4
      compilacao/views.py
  2. 2
      crud/masterdetail.py
  3. 94
      materia/forms.py
  4. 13
      materia/layouts.yaml
  5. 16
      materia/migrations/0032_merge.py
  6. 22
      materia/migrations/0033_documentoacessorio_texto_original.py
  7. 20
      materia/migrations/0034_auto_20160510_0946.py
  8. 20
      materia/migrations/0035_auto_20160510_0949.py
  9. 8
      materia/models.py
  10. 6
      materia/tests/test_materia.py
  11. 6
      materia/tests/test_materia_urls.py
  12. 19
      materia/urls.py
  13. 364
      materia/views.py
  14. 19
      parlamentares/migrations/0018_auto_20160510_0943.py
  15. 2
      protocoloadm/views.py
  16. 33
      templates/materia/documento_acessorio.html
  17. 7
      templates/materia/documento_acessorio_edit.html
  18. 6
      templates/materia/documentoacessorio_form.html
  19. 76
      templates/materia/relatoria.html
  20. 61
      templates/materia/relatoria_edit.html
  21. 4
      templates/materia/subnav.yaml

4
compilacao/views.py

@ -18,8 +18,8 @@ from django.utils.decorators import method_decorator
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from django.views.generic.edit import (CreateView, DeleteView, from django.views.generic.edit import (CreateView, DeleteView, FormView,
FormView, UpdateView) UpdateView)
from django.views.generic.list import ListView from django.views.generic.list import ListView
from compilacao.forms import (DispositivoDefinidorVigenciaForm, from compilacao.forms import (DispositivoDefinidorVigenciaForm,

2
crud/masterdetail.py

@ -46,7 +46,7 @@ class MasterDetailCrud(Crud):
def get_form(self, form_class=None): def get_form(self, form_class=None):
form = super(MasterDetailCrud.CreateView, form = super(MasterDetailCrud.CreateView,
self).get_form(form_class) self).get_form(self.form_class)
field = self.model._meta.get_field(self.crud.parent_field) field = self.model._meta.get_field(self.crud.parent_field)
parent = field.related_model.objects.get(pk=self.kwargs['pk']) parent = field.related_model.objects.get(pk=self.kwargs['pk'])
setattr(form.instance, self.crud.parent_field, parent) setattr(form.instance, self.crud.parent_field, parent)

94
materia/forms.py

@ -10,6 +10,7 @@ from django.utils.translation import ugettext_lazy as _
import crispy_layout_mixin import crispy_layout_mixin
import sapl import sapl
from comissoes.models import Comissao
from crispy_layout_mixin import form_actions from crispy_layout_mixin import form_actions
from norma.models import LegislacaoCitada, NormaJuridica, TipoNormaJuridica from norma.models import LegislacaoCitada, NormaJuridica, TipoNormaJuridica
from sapl.settings import MAX_DOC_UPLOAD_SIZE from sapl.settings import MAX_DOC_UPLOAD_SIZE
@ -114,18 +115,12 @@ class AcompanhamentoMateriaForm(ModelForm):
class DocumentoAcessorioForm(ModelForm): class DocumentoAcessorioForm(ModelForm):
autor = forms.CharField(widget=forms.HiddenInput(), required=False)
class Meta: class Meta:
model = DocumentoAcessorio model = DocumentoAcessorio
fields = ['tipo', fields = ['tipo', 'nome', 'data', 'autor', 'ementa', 'arquivo']
'nome',
'data', widgets = {'autor': forms.HiddenInput()}
'autor',
'ementa']
widgets = {
'data': forms.DateInput(attrs={'class': 'dateinput'})
}
def clean_autor(self): def clean_autor(self):
autor_field = self.cleaned_data['autor'] autor_field = self.cleaned_data['autor']
@ -137,57 +132,28 @@ class DocumentoAcessorioForm(ModelForm):
if autor_field: if autor_field:
return str(Autor.objects.get(id=autor_field)) return str(Autor.objects.get(id=autor_field))
def __init__(self, excluir=False, *args, **kwargs):
row1 = crispy_layout_mixin.to_row(
[('tipo', 4), ('nome', 4), ('data', 4)])
row2 = crispy_layout_mixin.to_row(
[('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)])
row3 = crispy_layout_mixin.to_row( class RelatoriaForm(ModelForm):
[('ementa', 12)])
more = [] class Meta:
if excluir: model = Relatoria
more = [Submit('Excluir', 'Excluir')] fields = ['data_designacao_relator', 'comissao', 'parlamentar',
'data_destituicao_relator', 'tipo_fim_relatoria']
self.helper = FormHelper() widgets = {'comissao': forms.Select(attrs={'disabled': 'disabled'})}
self.helper.layout = Layout(
Fieldset(
_('Incluir Documento Acessório'),
row1,
HTML(sapl.utils.autor_label),
HTML(sapl.utils.autor_modal),
row2, row3,
form_actions(more=more)
)
)
super(DocumentoAcessorioForm, self).__init__(*args, **kwargs)
def clean(self):
cleaned_data = self.cleaned_data
class RelatoriaForm(ModelForm): try:
comissao = Comissao.objects.get(id=self.initial['comissao'])
except ObjectDoesNotExist:
msg = _('A localização atual deve ser uma comissão.')
raise ValidationError(msg)
else:
cleaned_data['comissao'] = comissao
class Meta: return cleaned_data
model = Relatoria
fields = ['data_designacao_relator',
'comissao',
'parlamentar',
'data_destituicao_relator',
'tipo_fim_relatoria'
]
widgets = {
'data_designacao_relator': forms.DateInput(attrs={
'class': 'dateinput'}),
'data_destituicao_relator': forms.DateInput(attrs={
'class': 'dateinput'}),
}
class TramitacaoForm(ModelForm): class TramitacaoForm(ModelForm):
@ -209,7 +175,7 @@ class TramitacaoForm(ModelForm):
return self.errors return self.errors
ultima_tramitacao = Tramitacao.objects.filter( ultima_tramitacao = Tramitacao.objects.filter(
materia_id=self.instance.materia.id).last() materia_id=self.instance.materia.id).last()
if ultima_tramitacao: if ultima_tramitacao:
destino = ultima_tramitacao.unidade_tramitacao_destino destino = ultima_tramitacao.unidade_tramitacao_destino
@ -508,25 +474,25 @@ def pega_ultima_tramitacao():
def filtra_tramitacao_status(status): def filtra_tramitacao_status(status):
lista = pega_ultima_tramitacao() lista = pega_ultima_tramitacao()
return Tramitacao.objects.filter( return Tramitacao.objects.filter(
id__in=lista, id__in=lista,
status=status).distinct().values_list('materia_id', flat=True) status=status).distinct().values_list('materia_id', flat=True)
def filtra_tramitacao_destino(destino): def filtra_tramitacao_destino(destino):
lista = pega_ultima_tramitacao() lista = pega_ultima_tramitacao()
return Tramitacao.objects.filter( return Tramitacao.objects.filter(
id__in=lista, id__in=lista,
unidade_tramitacao_destino=destino).distinct().values_list( unidade_tramitacao_destino=destino).distinct().values_list(
'materia_id', flat=True) 'materia_id', flat=True)
def filtra_tramitacao_destino_and_status(status, destino): def filtra_tramitacao_destino_and_status(status, destino):
lista = pega_ultima_tramitacao() lista = pega_ultima_tramitacao()
return Tramitacao.objects.filter( return Tramitacao.objects.filter(
id__in=lista, id__in=lista,
status=status, status=status,
unidade_tramitacao_destino=destino).distinct().values_list( unidade_tramitacao_destino=destino).distinct().values_list(
'materia_id', flat=True) 'materia_id', flat=True)
class DespachoInicialForm(ModelForm): class DespachoInicialForm(ModelForm):

13
materia/layouts.yaml

@ -62,11 +62,10 @@ Autoria:
DocumentoAcessorio: DocumentoAcessorio:
Documento Acessório: Documento Acessório:
- tipo nome - tipo nome data
- data autor - autor
- nom_arquivo_FIXME
- ementa - ementa
- txt_observacao_FIXME - arquivo
Numeracao: Numeracao:
Numeração: Numeração:
@ -78,9 +77,9 @@ Orgao:
Relatoria: Relatoria:
Relatoria: Relatoria:
- data_designacao_relator - comissao
- dados_FIXME - data_designacao_relator data_destituicao_relator
- data_destituicao_relator tipo_fim_relatoria - parlamentar tipo_fim_relatoria
TipoProposicao: TipoProposicao:
Tipo Proposição: Tipo Proposição:

16
materia/migrations/0032_merge.py

@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-10 12:43
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('materia', '0031_merge'),
('materia', '0031_auto_20160502_1131'),
]
operations = [
]

22
materia/migrations/0033_documentoacessorio_texto_original.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-10 12:43
from __future__ import unicode_literals
from django.db import migrations, models
import materia.models
import sapl.utils
class Migration(migrations.Migration):
dependencies = [
('materia', '0032_merge'),
]
operations = [
migrations.AddField(
model_name='documentoacessorio',
name='texto_original',
field=models.FileField(blank=True, null=True, upload_to=materia.models.texto_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Integral'),
),
]

20
materia/migrations/0034_auto_20160510_0946.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-10 12:46
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('materia', '0033_documentoacessorio_texto_original'),
]
operations = [
migrations.RenameField(
model_name='documentoacessorio',
old_name='texto_original',
new_name='arquivo',
),
]

20
materia/migrations/0035_auto_20160510_0949.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-10 12:49
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('materia', '0034_auto_20160510_0946'),
]
operations = [
migrations.AlterField(
model_name='documentoacessorio',
name='nome',
field=models.CharField(max_length=30, verbose_name='Nome'),
),
]

8
materia/models.py

@ -271,12 +271,18 @@ class TipoDocumento(models.Model):
class DocumentoAcessorio(models.Model): class DocumentoAcessorio(models.Model):
materia = models.ForeignKey(MateriaLegislativa) materia = models.ForeignKey(MateriaLegislativa)
tipo = models.ForeignKey(TipoDocumento, verbose_name=_('Tipo')) tipo = models.ForeignKey(TipoDocumento, verbose_name=_('Tipo'))
nome = models.CharField(max_length=30, verbose_name=_('Descrição')) nome = models.CharField(max_length=30, verbose_name=_('Nome'))
data = models.DateField(blank=True, null=True, verbose_name=_('Data')) data = models.DateField(blank=True, null=True, verbose_name=_('Data'))
autor = models.CharField( autor = models.CharField(
max_length=50, blank=True, verbose_name=_('Autor')) max_length=50, blank=True, verbose_name=_('Autor'))
ementa = models.TextField(blank=True, verbose_name=_('Ementa')) ementa = models.TextField(blank=True, verbose_name=_('Ementa'))
indexacao = models.TextField(blank=True) indexacao = models.TextField(blank=True)
arquivo = models.FileField(
blank=True,
null=True,
upload_to=texto_upload_path,
verbose_name=_('Texto Integral'),
validators=[restringe_tipos_de_arquivo_txt])
class Meta: class Meta:
verbose_name = _('Documento Acessório') verbose_name = _('Documento Acessório')

6
materia/tests/test_materia.py

@ -205,7 +205,7 @@ def test_documento_acessorio_submit(client):
descricao='Teste') descricao='Teste')
# Testa POST # Testa POST
response = client.post(reverse('materia:documento_acessorio', response = client.post(reverse('materia:documentoacessorio_create',
kwargs={'pk': materia_principal.pk}), kwargs={'pk': materia_principal.pk}),
{'tipo': tipo.pk, {'tipo': tipo.pk,
'nome': 'teste_nome', 'nome': 'teste_nome',
@ -331,7 +331,7 @@ def test_form_errors_despacho_inicial(client):
def test_form_errors_documento_acessorio(client): def test_form_errors_documento_acessorio(client):
materia_principal = make_materia_principal() materia_principal = make_materia_principal()
response = client.post(reverse('materia:documento_acessorio', response = client.post(reverse('materia:documentoacessorio_create',
kwargs={'pk': materia_principal.pk}), kwargs={'pk': materia_principal.pk}),
{'salvar': 'salvar'}, {'salvar': 'salvar'},
follow=True) follow=True)
@ -403,7 +403,7 @@ def test_form_errors_tramitacao(client):
def test_form_errors_relatoria(client): def test_form_errors_relatoria(client):
materia_principal = make_materia_principal() materia_principal = make_materia_principal()
response = client.post(reverse('materia:relatoria', response = client.post(reverse('materia:relatoria_create',
kwargs={'pk': materia_principal.pk}), kwargs={'pk': materia_principal.pk}),
{'salvar': 'salvar'}, {'salvar': 'salvar'},
follow=True) follow=True)

6
materia/tests/test_materia_urls.py

@ -3,9 +3,9 @@ from django.core.urlresolvers import reverse
@pytest.mark.parametrize("test_input,kwargs,expected", [ @pytest.mark.parametrize("test_input,kwargs,expected", [
('materia:relatoria_edit', ('materia:relatoria_update',
{'pk': '11', 'id': '99'}, {'pk': '11'},
'/materia/11/relatoria/99/edit'), '/materia/relatoria/11/edit'),
('materia:tramitacao_update', ('materia:tramitacao_update',
{'pk': '8'}, {'pk': '8'},
'/materia/tramitacao/8/edit'), '/materia/tramitacao/8/edit'),

19
materia/urls.py

@ -4,14 +4,14 @@ from materia.views import (AcompanhamentoConfirmarView,
AcompanhamentoExcluirView, AcompanhamentoExcluirView,
AcompanhamentoMateriaView, AnexadaCrud, AutorCrud, AcompanhamentoMateriaView, AnexadaCrud, AutorCrud,
AutoriaCrud, DespachoInicialCrud, AutoriaCrud, DespachoInicialCrud,
DocumentoAcessorioEditView, DocumentoAcessorioView, DocumentoAcessorioCrud, LegislacaoCitadaCrud,
LegislacaoCitadaCrud, MateriaLegislativaCrud, MateriaLegislativaCrud,
MateriaLegislativaPesquisaView, MateriaTaView, MateriaLegislativaPesquisaView, MateriaTaView,
NumeracaoCrud, OrgaoCrud, OrigemCrud, NumeracaoCrud, OrgaoCrud, OrigemCrud,
ProposicaoEditView, ProposicaoListView, ProposicaoEditView, ProposicaoListView,
ProposicaoTaView, ProposicaoView, ProposicaoTaView, ProposicaoView,
RegimeTramitacaoCrud, RelatoriaEditView, RegimeTramitacaoCrud, RelatoriaCrud,
RelatoriaView, StatusTramitacaoCrud, TipoAutorCrud, StatusTramitacaoCrud, TipoAutorCrud,
TipoDocumentoCrud, TipoFimRelatoriaCrud, TipoDocumentoCrud, TipoFimRelatoriaCrud,
TipoMateriaCrud, TipoProposicaoCrud, TramitacaoCrud, TipoMateriaCrud, TipoProposicaoCrud, TramitacaoCrud,
UnidadeTramitacaoCrud) UnidadeTramitacaoCrud)
@ -28,7 +28,8 @@ urlpatterns = [
NumeracaoCrud.get_urls() + NumeracaoCrud.get_urls() +
LegislacaoCitadaCrud.get_urls() + LegislacaoCitadaCrud.get_urls() +
TramitacaoCrud.get_urls() + TramitacaoCrud.get_urls() +
LegislacaoCitadaCrud.get_urls())), RelatoriaCrud.get_urls() +
DocumentoAcessorioCrud.get_urls())),
# Integração com Compilação # Integração com Compilação
url(r'^materia/(?P<pk>[0-9]+)/ta$', url(r'^materia/(?P<pk>[0-9]+)/ta$',
@ -54,14 +55,6 @@ urlpatterns = [
url(r'^sistema/materia/status-tramitacao/', url(r'^sistema/materia/status-tramitacao/',
include(StatusTramitacaoCrud.get_urls())), include(StatusTramitacaoCrud.get_urls())),
url(r'^sistema/materia/orgao/', include(OrgaoCrud.get_urls())), url(r'^sistema/materia/orgao/', include(OrgaoCrud.get_urls())),
url(r'^materia/(?P<pk>\d+)/documento-acessorio$',
DocumentoAcessorioView.as_view(), name='documento_acessorio'),
url(r'^materia/(?P<pk>\d+)/documento-acessorio/(?P<id>\d+)/edit',
DocumentoAcessorioEditView.as_view(), name='documento_acessorio_edit'),
url(r'^materia/(?P<pk>\d+)/relatoria$',
RelatoriaView.as_view(), name='relatoria'),
url(r'^materia/(?P<pk>\d+)/relatoria/(?P<id>\d+)/edit$',
RelatoriaEditView.as_view(), name='relatoria_edit'),
url(r'^materia/proposicao$', url(r'^materia/proposicao$',
ProposicaoView.as_view(), name='adicionar_proposicao'), ProposicaoView.as_view(), name='adicionar_proposicao'),
url(r'^materia/proposicao_list$', url(r'^materia/proposicao_list$',

364
materia/views.py

@ -3,6 +3,8 @@ from datetime import datetime
from random import choice from random import choice
from string import ascii_letters, digits from string import ascii_letters, digits
from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button
from django.contrib import messages from django.contrib import messages
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.mail import send_mail from django.core.mail import send_mail
@ -11,14 +13,16 @@ from django.http.response import HttpResponseRedirect
from django.shortcuts import redirect from django.shortcuts import redirect
from django.template import Context, loader from django.template import Context, loader
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, FormView, ListView, TemplateView from django.views.generic import CreateView, ListView, TemplateView, UpdateView
from django_filters.views import FilterView from django_filters.views import FilterView
import crispy_layout_mixin
import crud.base import crud.base
import crud.masterdetail import crud.masterdetail
import sapl
from base.models import CasaLegislativa from base.models import CasaLegislativa
from comissoes.models import Comissao, Composicao
from compilacao.views import IntegracaoTaView from compilacao.views import IntegracaoTaView
from crispy_layout_mixin import form_actions
from crud.base import Crud, make_pagination from crud.base import Crud, make_pagination
from crud.masterdetail import MasterDetailCrud from crud.masterdetail import MasterDetailCrud
from norma.models import LegislacaoCitada from norma.models import LegislacaoCitada
@ -47,14 +51,43 @@ TipoFimRelatoriaCrud = Crud.build(TipoFimRelatoria, 'fim_relatoria')
AnexadaCrud = Crud.build(Anexada, '') AnexadaCrud = Crud.build(Anexada, '')
TipoAutorCrud = Crud.build(TipoAutor, 'tipo_autor') TipoAutorCrud = Crud.build(TipoAutor, 'tipo_autor')
AutorCrud = Crud.build(Autor, 'autor') AutorCrud = Crud.build(Autor, 'autor')
DocumentoAcessorioCrud = Crud.build(DocumentoAcessorio, '')
OrgaoCrud = Crud.build(Orgao, 'orgao') OrgaoCrud = Crud.build(Orgao, 'orgao')
RelatoriaCrud = Crud.build(Relatoria, '')
TipoProposicaoCrud = Crud.build(TipoProposicao, 'tipo_proposicao') TipoProposicaoCrud = Crud.build(TipoProposicao, 'tipo_proposicao')
ProposicaoCrud = Crud.build(Proposicao, '') ProposicaoCrud = Crud.build(Proposicao, '')
StatusTramitacaoCrud = Crud.build(StatusTramitacao, 'status_tramitacao') StatusTramitacaoCrud = Crud.build(StatusTramitacao, 'status_tramitacao')
UnidadeTramitacaoCrud = Crud.build(UnidadeTramitacao, 'unidade_tramitacao') UnidadeTramitacaoCrud = Crud.build(UnidadeTramitacao, 'unidade_tramitacao')
RelatoriaCrud = MasterDetailCrud.build(Relatoria, 'materia', '')
class RelatoriaCrud(MasterDetailCrud):
model = Relatoria
parent_field = 'materia'
help_path = ''
class CreateView(MasterDetailCrud.CreateView):
form_class = RelatoriaForm
def get_initial(self):
materia = MateriaLegislativa.objects.get(id=self.kwargs['pk'])
loc_atual = Tramitacao.objects.filter(
materia=materia).last()
if loc_atual is None:
localizacao = 0
else:
comissao = loc_atual.unidade_tramitacao_destino.comissao
if comissao:
localizacao = comissao.pk
else:
localizacao = 0
return {'comissao': localizacao}
class UpdateView(MasterDetailCrud.UpdateView):
form_class = RelatoriaForm
class TramitacaoCrud(MasterDetailCrud): class TramitacaoCrud(MasterDetailCrud):
model = Tramitacao model = Tramitacao
@ -95,6 +128,89 @@ class TramitacaoCrud(MasterDetailCrud):
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
class DocumentoAcessorioCrud(MasterDetailCrud):
model = DocumentoAcessorio
parent_field = 'materia'
help_path = ''
class BaseMixin(MasterDetailCrud.BaseMixin):
list_field_names = ['nome', 'tipo', 'data', 'autor', 'arquivo']
class CreateView(MasterDetailCrud.CreateView):
form_class = DocumentoAcessorioForm
def __init__(self, *args, **kwargs):
autor_row = crispy_layout_mixin.to_row(
[('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)])
self.helper = FormHelper()
self.helper.layout = crispy_layout_mixin.SaplFormLayout(
*self.get_layout())
# Adiciona o novo campo 'autor' e mecanismo de busca
self.helper.layout[0][0].append(HTML(sapl.utils.autor_label))
self.helper.layout[0][0].append(HTML(sapl.utils.autor_modal))
self.helper.layout[0][1] = autor_row
# Remove botões que estão fora do form
self.helper.layout[1].pop()
# Adiciona novos botões dentro do form
self.helper.layout[0][3][0].insert(1, form_actions(more=[
HTML('<a href="{{ view.cancel_url }}"'
' class="btn btn-inverse">Cancelar</a>')]))
super(CreateView, self).__init__(*args, **kwargs)
def get_context_data(self, **kwargs):
context = super(CreateView, self).get_context_data(**kwargs)
context['helper'] = self.helper
return context
class UpdateView(MasterDetailCrud.UpdateView):
form_class = DocumentoAcessorioForm
def __init__(self, *args, **kwargs):
autor_row = crispy_layout_mixin.to_row(
[('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)])
self.helper = FormHelper()
self.helper.layout = crispy_layout_mixin.SaplFormLayout(
*self.get_layout())
# Adiciona o novo campo 'autor' e mecanismo de busca
self.helper.layout[0][0].append(HTML(sapl.utils.autor_label))
self.helper.layout[0][0].append(HTML(sapl.utils.autor_modal))
self.helper.layout[0][1] = autor_row
# Remove botões que estão fora do form
self.helper.layout[1].pop()
# Adiciona novos botões dentro do form
self.helper.layout[0][3][0].insert(1, form_actions(more=[
HTML('<a href="{{ view.cancel_url }}"'
' class="btn btn-inverse">Cancelar</a>')]))
super(UpdateView, self).__init__(*args, **kwargs)
def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs)
context['helper'] = self.helper
return context
class AutoriaCrud(MasterDetailCrud): class AutoriaCrud(MasterDetailCrud):
model = Autoria model = Autoria
parent_field = 'materia' parent_field = 'materia'
@ -142,33 +258,6 @@ class LegislacaoCitadaCrud(MasterDetailCrud):
self.initial['tipo'] = self.object.norma.tipo.id self.initial['tipo'] = self.object.norma.tipo.id
self.initial['numero'] = self.object.norma.numero self.initial['numero'] = self.object.norma.numero
self.initial['ano'] = self.object.norma.ano self.initial['ano'] = self.object.norma.ano
return self.initial
class DetailView(MasterDetailCrud.DetailView):
@property
def layout_key(self):
return 'LegislacaoCitadaDetail'
class LegislacaoCitadaCrud(MasterDetailCrud):
model = LegislacaoCitada
parent_field = 'materia'
help_path = ''
class BaseMixin(MasterDetailCrud.BaseMixin):
list_field_names = ['norma', 'disposicoes']
class CreateView(MasterDetailCrud.CreateView):
form_class = LegislacaoCitadaForm
class UpdateView(MasterDetailCrud.UpdateView):
form_class = LegislacaoCitadaForm
def get_initial(self):
self.initial['tipo_norma'] = self.object.norma.tipo.id
self.initial['numero_norma'] = self.object.norma.numero
self.initial['ano_norma'] = self.object.norma.ano
return self.initial return self.initial
@ -298,219 +387,6 @@ class AcompanhamentoExcluirView(TemplateView):
return HttpResponseRedirect(self.get_redirect_url()) return HttpResponseRedirect(self.get_redirect_url())
class DocumentoAcessorioEditView(CreateView):
template_name = "materia/documento_acessorio_edit.html"
form_class = DocumentoAcessorioForm
def get(self, request, *args, **kwargs):
materia = MateriaLegislativa.objects.get(id=kwargs['pk'])
documento = DocumentoAcessorio.objects.get(id=kwargs['id'])
form = DocumentoAcessorioForm(instance=documento, excluir=True)
return self.render_to_response({'object': materia, 'form': form})
def post(self, request, *args, **kwargs):
form = self.get_form()
materia = MateriaLegislativa.objects.get(id=kwargs['pk'])
documento = DocumentoAcessorio.objects.get(id=kwargs['id'])
if form.is_valid():
if 'Excluir' in request.POST:
documento.delete()
elif 'salvar' in request.POST:
documento.materia = materia
documento.tipo = form.cleaned_data['tipo']
documento.data = form.cleaned_data['data']
documento.nome = form.cleaned_data['nome']
documento.autor = form.cleaned_data['autor']
documento.ementa = form.cleaned_data['ementa']
documento.save()
return redirect(self.get_success_url())
else:
return self.render_to_response({'form': form,
'object': materia,
'doc': documento})
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('materia:documento_acessorio', kwargs={'pk': pk})
class RelatoriaEditView(FormView):
template_name = "materia/relatoria_edit.html"
form_class = RelatoriaForm
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('materia:relatoria', kwargs={'pk': pk})
def get(self, request, *args, **kwargs):
form = RelatoriaForm()
materia = MateriaLegislativa.objects.get(id=kwargs['pk'])
relatoria = Relatoria.objects.get(
id=kwargs['id'])
composicao = Composicao.objects.filter(
comissao=relatoria.comissao).last()
parlamentares = composicao.participacao_set.all()
return self.render_to_response(
{'object': materia,
'form': form,
'relatoria': relatoria,
'tipo_fim_relatorias': TipoFimRelatoria.objects.all(),
'parlamentares': parlamentares})
def post(self, request, *args, **kwargs):
form = RelatoriaForm(request.POST)
materia = MateriaLegislativa.objects.get(id=kwargs['pk'])
relatoria = Relatoria.objects.get(id=kwargs['id'])
composicao = Composicao.objects.filter(
comissao=relatoria.comissao).last()
parlamentares = composicao.participacao_set.all()
if form.is_valid():
if 'excluir' in request.POST:
relatoria.delete()
return self.form_valid(form)
elif 'salvar' in request.POST:
relatoria.materia = materia
relatoria.comissao = relatoria.comissao
relatoria.data_designacao_relator = form.cleaned_data[
'data_designacao_relator']
relatoria.data_destituicao_relator = form.cleaned_data[
'data_destituicao_relator']
relatoria.parlamentar = form.cleaned_data['parlamentar']
relatoria.tipo_fim_relatoria = form.cleaned_data[
'tipo_fim_relatoria']
relatoria.save()
return self.form_valid(form)
else:
return self.render_to_response(
{'object': materia,
'form': form,
'relatoria': relatoria,
'tipo_fim_relatorias': TipoFimRelatoria.objects.all(),
'parlamentares': parlamentares})
class RelatoriaView(FormView):
template_name = "materia/relatoria.html"
form_class = RelatoriaForm
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('materia:relatoria', kwargs={'pk': pk})
def post(self, request, *args, **kwargs):
form = RelatoriaForm(request.POST)
materia = MateriaLegislativa.objects.get(id=kwargs['pk'])
if not materia.tramitacao_set.all():
msg = _(
'Adicione alguma Tramitação antes de adicionar uma Comissão!')
messages.add_message(request, messages.INFO, msg)
return self.render_to_response(
{'object': materia,
'form': form,
'tipo_fim_relatoria': TipoFimRelatoria.objects.all()
})
else:
relatorias = Relatoria.objects.filter(
materia_id=kwargs['pk']).order_by(
'-data_designacao_relator')
localizacao = Tramitacao.objects.filter(
materia=materia).last()
comissao = Comissao.objects.get(
id=localizacao.unidade_tramitacao_destino.comissao.id)
if form.is_valid():
relatoria = form.save(commit=False)
relatoria.materia = materia
relatoria.comissao = comissao
relatoria.save()
return self.form_valid(form)
else:
try:
composicao = Composicao.objects.get(comissao=comissao)
except ObjectDoesNotExist:
msg = _('Não há composição nesta Comissão!')
messages.add_message(request, messages.INFO, msg)
return self.render_to_response(
{'object': materia,
'form': form,
'relatorias': relatorias,
'comissao': comissao})
parlamentares = composicao.participacao_set.all()
return self.render_to_response(
{'object': materia,
'form': form,
'relatorias': relatorias,
'comissao': comissao,
'tipo_fim_relatoria': TipoFimRelatoria.objects.all(),
'parlamentares': parlamentares})
def get(self, request, *args, **kwargs):
materia = MateriaLegislativa.objects.get(id=kwargs['pk'])
relatorias = Relatoria.objects.filter(
materia_id=kwargs['pk']).order_by('-data_designacao_relator')
form = RelatoriaForm()
localizacao = Tramitacao.objects.filter(
materia=materia).last()
if not materia.tramitacao_set.all():
msg = _(
'Adicione alguma Tramitação antes de adicionar uma Comissão!')
messages.add_message(request, messages.INFO, msg)
return self.render_to_response(
{'object': materia,
'form': form,
'relatorias': relatorias,
'tipo_fim_relatoria': TipoFimRelatoria.objects.all()
})
elif not localizacao.unidade_tramitacao_destino.comissao:
msg = _('O local atual deve ser uma Comissão!')
messages.add_message(request, messages.INFO, msg)
return self.render_to_response(
{'object': materia,
'form': form,
'relatorias': relatorias})
else:
try:
comissao = Comissao.objects.get(
id=localizacao.unidade_tramitacao_destino.comissao.id)
composicao = Composicao.objects.filter(
comissao=comissao).last()
if not composicao:
msg = _('Não há composição nesta Comissão!')
messages.add_message(request, messages.INFO, msg)
return self.render_to_response(
{'object': materia,
'form': form,
'relatorias': relatorias,
'comissao': comissao})
parlamentares = composicao.participacao_set.all()
except ObjectDoesNotExist:
msg = _('O local atual deve ser uma Comissão!')
messages.add_message(request, messages.INFO, msg)
return self.render_to_response(
{'object': materia,
'form': form,
'relatorias': relatorias})
else:
composicao = Composicao.objects.filter(
comissao=comissao).last()
parlamentares = composicao.participacao_set.all()
return self.render_to_response(
{'object': materia,
'form': form,
'relatorias': relatorias,
'comissao': comissao,
'tipo_fim_relatoria': TipoFimRelatoria.objects.all(),
'parlamentares': parlamentares})
def load_email_templates(templates, context={}): def load_email_templates(templates, context={}):
emails = [] emails = []

19
parlamentares/migrations/0018_auto_20160510_0943.py

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-10 12:43
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0017_remove_parlamentar_unidade_deliberativa'),
]
operations = [
migrations.AlterModelOptions(
name='filiacao',
options={'ordering': ('parlamentar', '-data', '-data_desfiliacao'), 'verbose_name': 'Filiação', 'verbose_name_plural': 'Filiações'},
),
]

2
protocoloadm/views.py

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

33
templates/materia/documento_acessorio.html

@ -1,33 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %} {% endblock %}
{% block detail_content %}
<fieldset>
<legend>Matéria Legislativa</legend>
{% include "materia/resumo_detail_materia.html" %}
<fieldset>
<legend>Documentos Acessório</legend>
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<th>Nome</th>
<th>Tipo</th>
<th>Data</th>
<th>Autor</th>
</tr>
</thead>
{% for d in docs %}
<tr>
<td><a href="{% url 'materia:documento_acessorio_edit' object.id d.id %}">{{d.nome}}</a></td>
<td>{{d.tipo.descricao}}</td>
<td>{{d.data|date:'d/m/Y'}}</td>
<td>{{d.autor}}</td>
</tr>
{% endfor %}
</table>
</fieldset>
{% crispy form %}
</fieldset>
{% endblock %}

7
templates/materia/documento_acessorio_edit.html

@ -1,7 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %} {% endblock %}
{% block detail_content %}
{% crispy form %}
{% endblock %}

6
templates/materia/documentoacessorio_form.html

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

76
templates/materia/relatoria.html

@ -1,76 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %} {% endblock %}
{% block detail_content %}
<fieldset>
<legend>Matéria Legislativa</legend>
{% include "materia/resumo_detail_materia.html" %}
<fieldset>
<legend>Relatorias</legend>
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<th>Data Designação</th>
<th>Comissão</th>
<th>Parlamentar</th>
</tr>
</thead>
{% for r in relatorias %}
<tr>
<td><a href="{% url 'materia:relatoria_edit' object.id r.id %}">{{r.data_designacao_relator|date:'d/m/Y'}}</a></td>
<td>{{r.comissao}}</td>
<td>{{r.parlamentar}}</td>
</tr>
{% endfor %}
</table>
</fieldset>
<fieldset class="form-group">
<legend>Adicionar Relator</legend>
<form method="POST">
{% csrf_token %}
<div class="row">
<div class="col-md-12">
Localização Atual
<input type="text" name="comissao" disabled value="{{comissao.nome}}" class="form-control"/>
</div>
</div>
<div class="row">
<div class="col-md-6">
Data Designação*
<input type="text" name="data_designacao_relator" {% if not comissao.nome %} disabled {% endif %} class ="dateinput form-control" />
</div>
<div class="col-md-6">
Data Destituição
<input type="text" name="data_destituicao_relator" {% if not comissao.nome %} disabled {% endif %} class ="dateinput form-control" />
</div>
</div>
<div class="row">
<div class="col-md-6">
Parlamentar*
<select name="parlamentar" {% if not comissao.nome %} disabled {% endif %} class="form-control">
<option value=""> ---------- </option>
{% for p in parlamentares %}
<option value="{{p.parlamentar_id}}"> {{p.parlamentar}} </option>
{% endfor %}
</select>
</div>
<div class="col-md-6">
Motivo Fim Relatoria
<select name="tipo_fim_relatoria" {% if not comissao.nome %} disabled {% endif %} class="form-control">
<option value=""> ---------- </option>
{% for t in tipo_fim_relatoria %}
<option value="{{t.id}}"> {{t.descricao}} </option>
{% endfor %}
</select>
</div>
</div>
<br />
<input type="submit" name="salvar" value="Salvar" class="btn btn-primary" {% if not comissao.nome %} disabled {% endif %} />
</form>
</fieldset>
</fieldset>
{% endblock %}

61
templates/materia/relatoria_edit.html

@ -1,61 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %} {% endblock %}
{% block detail_content %}
<fieldset>
<legend>Matéria Legislativa</legend>
{% include "materia/resumo_detail_materia.html" %}
<fieldset class="form-group">
<legend>Editar Relator</legend>
<form method="POST">
{% csrf_token %}
<div class="row">
<div class="col-md-12">
Localização Atual
<input type="text" name="comissao" disabled value="{{relatoria.comissao.nome}}" class="form-control"/>
</div>
</div>
<div class="row">
<div class="col-md-6">
Data Designação*
<input type="text" name="data_designacao_relator" class ="dateinput form-control" value="{{relatoria.data_designacao_relator}}" />
</div>
<div class="col-md-6">
Data Destituição
<input type="text" name="data_destituicao_relator" class ="dateinput form-control" {% if relatoria.data_destituicao_relator %} value="{{relatoria.data_destituicao_relator}}" {% endif %}/>
</div>
</div>
<div class="row">
<div class="col-md-6">
Parlamentar*
<select name="parlamentar" class="form-control">
<option value=""> ---------- </option>
{% for p in parlamentares %}
<option value="{{p.parlamentar_id}}" {% if relatoria.parlamentar_id == p.parlamentar_id %} selected {% endif %}>
{{p.parlamentar}}
</option>
{% endfor %}
</select>
</div>
<div class="col-md-6">
Motivo Fim Relatoria
<select name="tipo_fim_relatoria" class="form-control">
<option value=""> ---------- </option>
{% for t in tipo_fim_relatorias %}
<option value="{{t.id}}" {% if t.id == relatoria.tipo_fim_relatoria_id %} selected {% endif %}>
{{t.descricao}}
</option>
{% endfor %}
</select>
</div>
</div>
<br />
<input type="submit" name="salvar" value="Salvar" class="btn btn-primary"/>
<input type="submit" name="excluir" value="Excluir" class="btn btn-danger"/>
</form>
</fieldset>
</fieldset>
{% endblock %}

4
templates/materia/subnav.yaml

@ -7,7 +7,7 @@
- title: Despacho Inicial - title: Despacho Inicial
url: despachoinicial_list url: despachoinicial_list
- title: Documento Acessório - title: Documento Acessório
url: documento_acessorio url: documentoacessorio_list
- title: Legislação Citada - title: Legislação Citada
url: legislacaocitada_list url: legislacaocitada_list
- title: Numeração - title: Numeração
@ -15,7 +15,7 @@
- title: Tramitação - title: Tramitação
url: tramitacao_list url: tramitacao_list
- title: Relatoria - title: Relatoria
url: relatoria url: relatoria_list
# Opção adicionada para chamar o TextoArticulado da matéria. # Opção adicionada para chamar o TextoArticulado da matéria.
# para integração foram necessárias apenas criar a url materia_ta em urls.py # para integração foram necessárias apenas criar a url materia_ta em urls.py

Loading…
Cancel
Save