From af61c2f9eb72cc52c495e05ff97e57bc9980a58f Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 10 May 2016 10:31:38 -0300 Subject: [PATCH] Fix #355 crud relatoria MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 --- compilacao/views.py | 4 +- crud/masterdetail.py | 2 +- materia/forms.py | 94 ++--- materia/layouts.yaml | 13 +- materia/migrations/0032_merge.py | 16 + .../0033_documentoacessorio_texto_original.py | 22 ++ materia/migrations/0034_auto_20160510_0946.py | 20 + materia/migrations/0035_auto_20160510_0949.py | 20 + materia/models.py | 8 +- materia/tests/test_materia.py | 6 +- materia/tests/test_materia_urls.py | 6 +- materia/urls.py | 19 +- materia/views.py | 364 ++++++------------ .../migrations/0018_auto_20160510_0943.py | 19 + protocoloadm/views.py | 2 +- templates/materia/documento_acessorio.html | 33 -- .../materia/documento_acessorio_edit.html | 7 - .../materia/documentoacessorio_form.html | 6 + templates/materia/relatoria.html | 76 ---- templates/materia/relatoria_edit.html | 61 --- templates/materia/subnav.yaml | 4 +- 21 files changed, 284 insertions(+), 518 deletions(-) create mode 100644 materia/migrations/0032_merge.py create mode 100644 materia/migrations/0033_documentoacessorio_texto_original.py create mode 100644 materia/migrations/0034_auto_20160510_0946.py create mode 100644 materia/migrations/0035_auto_20160510_0949.py create mode 100644 parlamentares/migrations/0018_auto_20160510_0943.py delete mode 100644 templates/materia/documento_acessorio.html delete mode 100644 templates/materia/documento_acessorio_edit.html create mode 100644 templates/materia/documentoacessorio_form.html delete mode 100644 templates/materia/relatoria.html delete mode 100644 templates/materia/relatoria_edit.html diff --git a/compilacao/views.py b/compilacao/views.py index 766f3362f..48c211faf 100644 --- a/compilacao/views.py +++ b/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, diff --git a/crud/masterdetail.py b/crud/masterdetail.py index ad82261c7..2d0bf32d1 100644 --- a/crud/masterdetail.py +++ b/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) diff --git a/materia/forms.py b/materia/forms.py index 3793d0d5b..e7f5fd4e1 100644 --- a/materia/forms.py +++ b/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): diff --git a/materia/layouts.yaml b/materia/layouts.yaml index 271635ba3..272cb006e 100644 --- a/materia/layouts.yaml +++ b/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: diff --git a/materia/migrations/0032_merge.py b/materia/migrations/0032_merge.py new file mode 100644 index 000000000..0592ea507 --- /dev/null +++ b/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 = [ + ] diff --git a/materia/migrations/0033_documentoacessorio_texto_original.py b/materia/migrations/0033_documentoacessorio_texto_original.py new file mode 100644 index 000000000..e7f37e1f5 --- /dev/null +++ b/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'), + ), + ] diff --git a/materia/migrations/0034_auto_20160510_0946.py b/materia/migrations/0034_auto_20160510_0946.py new file mode 100644 index 000000000..eac94fc88 --- /dev/null +++ b/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', + ), + ] diff --git a/materia/migrations/0035_auto_20160510_0949.py b/materia/migrations/0035_auto_20160510_0949.py new file mode 100644 index 000000000..eacd9db10 --- /dev/null +++ b/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'), + ), + ] diff --git a/materia/models.py b/materia/models.py index b50c48afd..2c610cb8e 100644 --- a/materia/models.py +++ b/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') diff --git a/materia/tests/test_materia.py b/materia/tests/test_materia.py index 72be09f6e..b4157f6d7 100644 --- a/materia/tests/test_materia.py +++ b/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) diff --git a/materia/tests/test_materia_urls.py b/materia/tests/test_materia_urls.py index dd8b51871..27f350f1b 100644 --- a/materia/tests/test_materia_urls.py +++ b/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'), diff --git a/materia/urls.py b/materia/urls.py index 01c0d6a05..332623881 100644 --- a/materia/urls.py +++ b/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[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\d+)/documento-acessorio$', - DocumentoAcessorioView.as_view(), name='documento_acessorio'), - url(r'^materia/(?P\d+)/documento-acessorio/(?P\d+)/edit', - DocumentoAcessorioEditView.as_view(), name='documento_acessorio_edit'), - url(r'^materia/(?P\d+)/relatoria$', - RelatoriaView.as_view(), name='relatoria'), - url(r'^materia/(?P\d+)/relatoria/(?P\d+)/edit$', - RelatoriaEditView.as_view(), name='relatoria_edit'), url(r'^materia/proposicao$', ProposicaoView.as_view(), name='adicionar_proposicao'), url(r'^materia/proposicao_list$', diff --git a/materia/views.py b/materia/views.py index 8656864fd..345123cda 100644 --- a/materia/views.py +++ b/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('Cancelar')])) + + 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('Cancelar')])) + + 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 = [] diff --git a/parlamentares/migrations/0018_auto_20160510_0943.py b/parlamentares/migrations/0018_auto_20160510_0943.py new file mode 100644 index 000000000..7546f4001 --- /dev/null +++ b/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'}, + ), + ] diff --git a/protocoloadm/views.py b/protocoloadm/views.py index bc4b122d2..851cf76f9 100644 --- a/protocoloadm/views.py +++ b/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 _ diff --git a/templates/materia/documento_acessorio.html b/templates/materia/documento_acessorio.html deleted file mode 100644 index 14c3b4eb1..000000000 --- a/templates/materia/documento_acessorio.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "crud/detail.html" %} -{% load i18n %} -{% load crispy_forms_tags %} -{% block actions %} {% endblock %} -{% block detail_content %} -
- Matéria Legislativa - {% include "materia/resumo_detail_materia.html" %} - -
- Documentos Acessório - - - - - - - - - - {% for d in docs %} - - - - - - - {% endfor %} -
NomeTipoDataAutor
{{d.nome}}{{d.tipo.descricao}}{{d.data|date:'d/m/Y'}}{{d.autor}}
-
- {% crispy form %} -
-{% endblock %} diff --git a/templates/materia/documento_acessorio_edit.html b/templates/materia/documento_acessorio_edit.html deleted file mode 100644 index 05ddec8c2..000000000 --- a/templates/materia/documento_acessorio_edit.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "crud/detail.html" %} -{% load i18n %} -{% load crispy_forms_tags %} -{% block actions %} {% endblock %} -{% block detail_content %} - {% crispy form %} -{% endblock %} diff --git a/templates/materia/documentoacessorio_form.html b/templates/materia/documentoacessorio_form.html new file mode 100644 index 000000000..fb5810653 --- /dev/null +++ b/templates/materia/documentoacessorio_form.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} +{% load i18n crispy_forms_tags %} + +{% block base_content %} + {% crispy form helper %} +{% endblock %} diff --git a/templates/materia/relatoria.html b/templates/materia/relatoria.html deleted file mode 100644 index 6368f385d..000000000 --- a/templates/materia/relatoria.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends "crud/detail.html" %} -{% load i18n %} -{% load crispy_forms_tags %} -{% block actions %} {% endblock %} -{% block detail_content %} -
- Matéria Legislativa - {% include "materia/resumo_detail_materia.html" %} - -
- Relatorias - - - - - - - - - {% for r in relatorias %} - - - - - - {% endfor %} -
Data DesignaçãoComissãoParlamentar
{{r.data_designacao_relator|date:'d/m/Y'}}{{r.comissao}}{{r.parlamentar}}
-
- -
- Adicionar Relator -
- {% csrf_token %} - -
-
- Localização Atual - -
-
-
-
- Data Designação* - -
-
- Data Destituição - -
-
-
-
- Parlamentar* - -
-
- Motivo Fim Relatoria - -
-
-
- -
-
-
-{% endblock %} diff --git a/templates/materia/relatoria_edit.html b/templates/materia/relatoria_edit.html deleted file mode 100644 index d694dff93..000000000 --- a/templates/materia/relatoria_edit.html +++ /dev/null @@ -1,61 +0,0 @@ -{% extends "crud/detail.html" %} -{% load i18n %} -{% load crispy_forms_tags %} -{% block actions %} {% endblock %} -{% block detail_content %} -
- Matéria Legislativa - {% include "materia/resumo_detail_materia.html" %} - -
- Editar Relator -
- {% csrf_token %} - -
-
- Localização Atual - -
-
-
-
- Data Designação* - -
-
- Data Destituição - -
-
-
-
- Parlamentar* - -
-
- Motivo Fim Relatoria - -
-
-
- - -
-
-
-{% endblock %} diff --git a/templates/materia/subnav.yaml b/templates/materia/subnav.yaml index 901757993..8dc4db159 100644 --- a/templates/materia/subnav.yaml +++ b/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