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.views.generic.base import TemplateView
from django.views.generic.detail import DetailView
from django.views.generic.edit import (CreateView, DeleteView,
FormView, UpdateView)
from django.views.generic.edit import (CreateView, DeleteView, FormView,
UpdateView)
from django.views.generic.list import ListView
from compilacao.forms import (DispositivoDefinidorVigenciaForm,

2
crud/masterdetail.py

@ -46,7 +46,7 @@ class MasterDetailCrud(Crud):
def get_form(self, form_class=None):
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)
parent = field.related_model.objects.get(pk=self.kwargs['pk'])
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 sapl
from comissoes.models import Comissao
from crispy_layout_mixin import form_actions
from norma.models import LegislacaoCitada, NormaJuridica, TipoNormaJuridica
from sapl.settings import MAX_DOC_UPLOAD_SIZE
@ -114,18 +115,12 @@ class AcompanhamentoMateriaForm(ModelForm):
class DocumentoAcessorioForm(ModelForm):
autor = forms.CharField(widget=forms.HiddenInput(), required=False)
class Meta:
model = DocumentoAcessorio
fields = ['tipo',
'nome',
'data',
'autor',
'ementa']
widgets = {
'data': forms.DateInput(attrs={'class': 'dateinput'})
}
fields = ['tipo', 'nome', 'data', 'autor', 'ementa', 'arquivo']
widgets = {'autor': forms.HiddenInput()}
def clean_autor(self):
autor_field = self.cleaned_data['autor']
@ -137,57 +132,28 @@ class DocumentoAcessorioForm(ModelForm):
if 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(
[('ementa', 12)])
class RelatoriaForm(ModelForm):
more = []
if excluir:
more = [Submit('Excluir', 'Excluir')]
class Meta:
model = Relatoria
fields = ['data_designacao_relator', 'comissao', 'parlamentar',
'data_destituicao_relator', 'tipo_fim_relatoria']
self.helper = FormHelper()
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)
widgets = {'comissao': forms.Select(attrs={'disabled': 'disabled'})}
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:
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'}),
}
return cleaned_data
class TramitacaoForm(ModelForm):
@ -209,7 +175,7 @@ class TramitacaoForm(ModelForm):
return self.errors
ultima_tramitacao = Tramitacao.objects.filter(
materia_id=self.instance.materia.id).last()
materia_id=self.instance.materia.id).last()
if ultima_tramitacao:
destino = ultima_tramitacao.unidade_tramitacao_destino
@ -508,25 +474,25 @@ def pega_ultima_tramitacao():
def filtra_tramitacao_status(status):
lista = pega_ultima_tramitacao()
return Tramitacao.objects.filter(
id__in=lista,
status=status).distinct().values_list('materia_id', flat=True)
id__in=lista,
status=status).distinct().values_list('materia_id', flat=True)
def filtra_tramitacao_destino(destino):
lista = pega_ultima_tramitacao()
return Tramitacao.objects.filter(
id__in=lista,
unidade_tramitacao_destino=destino).distinct().values_list(
'materia_id', flat=True)
id__in=lista,
unidade_tramitacao_destino=destino).distinct().values_list(
'materia_id', flat=True)
def filtra_tramitacao_destino_and_status(status, destino):
lista = pega_ultima_tramitacao()
return Tramitacao.objects.filter(
id__in=lista,
status=status,
unidade_tramitacao_destino=destino).distinct().values_list(
'materia_id', flat=True)
id__in=lista,
status=status,
unidade_tramitacao_destino=destino).distinct().values_list(
'materia_id', flat=True)
class DespachoInicialForm(ModelForm):

13
materia/layouts.yaml

@ -62,11 +62,10 @@ Autoria:
DocumentoAcessorio:
Documento Acessório:
- tipo nome
- data autor
- nom_arquivo_FIXME
- tipo nome data
- autor
- ementa
- txt_observacao_FIXME
- arquivo
Numeracao:
Numeração:
@ -78,9 +77,9 @@ Orgao:
Relatoria:
Relatoria:
- data_designacao_relator
- dados_FIXME
- data_destituicao_relator tipo_fim_relatoria
- comissao
- data_designacao_relator data_destituicao_relator
- parlamentar tipo_fim_relatoria
TipoProposicao:
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):
materia = models.ForeignKey(MateriaLegislativa)
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'))
autor = models.CharField(
max_length=50, blank=True, verbose_name=_('Autor'))
ementa = models.TextField(blank=True, verbose_name=_('Ementa'))
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:
verbose_name = _('Documento Acessório')

6
materia/tests/test_materia.py

@ -205,7 +205,7 @@ def test_documento_acessorio_submit(client):
descricao='Teste')
# Testa POST
response = client.post(reverse('materia:documento_acessorio',
response = client.post(reverse('materia:documentoacessorio_create',
kwargs={'pk': materia_principal.pk}),
{'tipo': tipo.pk,
'nome': 'teste_nome',
@ -331,7 +331,7 @@ def test_form_errors_despacho_inicial(client):
def test_form_errors_documento_acessorio(client):
materia_principal = make_materia_principal()
response = client.post(reverse('materia:documento_acessorio',
response = client.post(reverse('materia:documentoacessorio_create',
kwargs={'pk': materia_principal.pk}),
{'salvar': 'salvar'},
follow=True)
@ -403,7 +403,7 @@ def test_form_errors_tramitacao(client):
def test_form_errors_relatoria(client):
materia_principal = make_materia_principal()
response = client.post(reverse('materia:relatoria',
response = client.post(reverse('materia:relatoria_create',
kwargs={'pk': materia_principal.pk}),
{'salvar': 'salvar'},
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", [
('materia:relatoria_edit',
{'pk': '11', 'id': '99'},
'/materia/11/relatoria/99/edit'),
('materia:relatoria_update',
{'pk': '11'},
'/materia/relatoria/11/edit'),
('materia:tramitacao_update',
{'pk': '8'},
'/materia/tramitacao/8/edit'),

19
materia/urls.py

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

364
materia/views.py

@ -3,6 +3,8 @@ from datetime import datetime
from random import choice
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.core.exceptions import ObjectDoesNotExist
from django.core.mail import send_mail
@ -11,14 +13,16 @@ from django.http.response import HttpResponseRedirect
from django.shortcuts import redirect
from django.template import Context, loader
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
import crispy_layout_mixin
import crud.base
import crud.masterdetail
import sapl
from base.models import CasaLegislativa
from comissoes.models import Comissao, Composicao
from compilacao.views import IntegracaoTaView
from crispy_layout_mixin import form_actions
from crud.base import Crud, make_pagination
from crud.masterdetail import MasterDetailCrud
from norma.models import LegislacaoCitada
@ -47,14 +51,43 @@ TipoFimRelatoriaCrud = Crud.build(TipoFimRelatoria, 'fim_relatoria')
AnexadaCrud = Crud.build(Anexada, '')
TipoAutorCrud = Crud.build(TipoAutor, 'tipo_autor')
AutorCrud = Crud.build(Autor, 'autor')
DocumentoAcessorioCrud = Crud.build(DocumentoAcessorio, '')
OrgaoCrud = Crud.build(Orgao, 'orgao')
RelatoriaCrud = Crud.build(Relatoria, '')
TipoProposicaoCrud = Crud.build(TipoProposicao, 'tipo_proposicao')
ProposicaoCrud = Crud.build(Proposicao, '')
StatusTramitacaoCrud = Crud.build(StatusTramitacao, 'status_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):
model = Tramitacao
@ -95,6 +128,89 @@ class TramitacaoCrud(MasterDetailCrud):
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):
model = Autoria
parent_field = 'materia'
@ -142,33 +258,6 @@ class LegislacaoCitadaCrud(MasterDetailCrud):
self.initial['tipo'] = self.object.norma.tipo.id
self.initial['numero'] = self.object.norma.numero
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
@ -298,219 +387,6 @@ class AcompanhamentoExcluirView(TemplateView):
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={}):
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 django.core.exceptions import ObjectDoesNotExist
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.shortcuts import redirect
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
url: despachoinicial_list
- title: Documento Acessório
url: documento_acessorio
url: documentoacessorio_list
- title: Legislação Citada
url: legislacaocitada_list
- title: Numeração
@ -15,7 +15,7 @@
- title: Tramitação
url: tramitacao_list
- title: Relatoria
url: relatoria
url: relatoria_list
# 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

Loading…
Cancel
Save