From 68e77927072397751f9b0cd7f726cb6394d06e61 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 27 Oct 2015 16:06:51 -0200 Subject: [PATCH] Add Anexada and DespachoInicial in MateriaLegislativa --- ...008_remove_despachoinicial_numero_ordem.py | 18 + materia/models.py | 4 +- materia/urls.py | 15 +- materia/views.py | 331 +++++++++++++++--- protocoloadm/views.py | 32 +- templates/materia/despacho_inicial.html | 32 ++ templates/materia/despacho_inicial_edit.html | 30 ++ templates/materia/materia_anexada.html | 56 +++ templates/materia/materia_anexada_edit.html | 53 +++ templates/materia/materia_detail.html | 16 + 10 files changed, 530 insertions(+), 57 deletions(-) create mode 100644 materia/migrations/0008_remove_despachoinicial_numero_ordem.py create mode 100644 templates/materia/despacho_inicial.html create mode 100644 templates/materia/despacho_inicial_edit.html create mode 100644 templates/materia/materia_anexada.html create mode 100644 templates/materia/materia_anexada_edit.html create mode 100644 templates/materia/materia_detail.html diff --git a/materia/migrations/0008_remove_despachoinicial_numero_ordem.py b/materia/migrations/0008_remove_despachoinicial_numero_ordem.py new file mode 100644 index 000000000..30cd1e2a2 --- /dev/null +++ b/materia/migrations/0008_remove_despachoinicial_numero_ordem.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0007_auto_20151021_1200'), + ] + + operations = [ + migrations.RemoveField( + model_name='despachoinicial', + name='numero_ordem', + ), + ] diff --git a/materia/models.py b/materia/models.py index dce0035d0..660edf628 100644 --- a/materia/models.py +++ b/materia/models.py @@ -235,7 +235,6 @@ class Autoria(models.Model): class DespachoInicial(models.Model): # TODO M2M? materia = models.ForeignKey(MateriaLegislativa) - numero_ordem = models.PositiveIntegerField() comissao = models.ForeignKey(Comissao) class Meta: @@ -243,8 +242,7 @@ class DespachoInicial(models.Model): verbose_name_plural = _('Despachos Iniciais') def __str__(self): - return _('Nº %(numero)s - %(materia)s - %(comissao)s') % { - 'numero': self.numero_ordem, + return _('%(materia)s - %(comissao)s') % { 'materia': self.materia, 'comissao': self.comissao} diff --git a/materia/urls.py b/materia/urls.py index 5964fdb80..e1b738dbf 100644 --- a/materia/urls.py +++ b/materia/urls.py @@ -1,6 +1,7 @@ from django.conf.urls import include, url - -from materia.views import (FormularioCadastroView, FormularioSimplificadoView, +from materia.views import (DespachoInicialEditView, DespachoInicialView, + FormularioCadastroView, FormularioSimplificadoView, + MateriaAnexadaEditView, MateriaAnexadaView, autor_crud, materia_legislativa_crud, orgao_crud, origem_crud, regime_tramitacao_crud, status_tramitacao_crud, tipo_autor_crud, @@ -32,5 +33,13 @@ urlpatterns = [ name='formulario_simplificado'), url(r'^materia/formulario-cadastro', FormularioCadastroView.as_view(), - name='formulario_cadastro') + name='formulario_cadastro'), + url(r'^materia/(?P\d+)/materia-anexada$', + MateriaAnexadaView.as_view(), name='materia_anexada'), + url(r'^materia/(?P\d+)/materia-anexada/(?P\d+)/edit', + MateriaAnexadaEditView.as_view(), name='materia_anexada_edit'), + url(r'^materia/(?P\d+)/despacho-inicial$', + DespachoInicialView.as_view(), name='despacho_inicial'), + url(r'^materia/(?P\d+)/despacho-inicial/(?P\d+)/edit', + DespachoInicialEditView.as_view(), name='despacho_inicial_edit'), ] diff --git a/materia/views.py b/materia/views.py index f40db9377..4d6984fba 100644 --- a/materia/views.py +++ b/materia/views.py @@ -1,23 +1,25 @@ from datetime import date +from comissoes.models import Comissao from crispy_forms.helper import FormHelper -from crispy_forms.layout import ButtonHolder, Fieldset, Layout, Submit +from crispy_forms.layout import HTML, ButtonHolder, Fieldset, Layout, Submit from django import forms +from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse from django.forms import ModelForm from django.shortcuts import render from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from django.views.generic.edit import FormMixin -from vanilla import GenericView - from sapl.crud import build_crud +from vanilla import GenericView -from .models import (Anexada, Autor, Autoria, DocumentoAcessorio, - MateriaLegislativa, Numeracao, Orgao, Origem, Proposicao, - RegimeTramitacao, Relatoria, StatusTramitacao, TipoAutor, - TipoDocumento, TipoFimRelatoria, TipoMateriaLegislativa, - TipoProposicao, Tramitacao, UnidadeTramitacao) +from .models import (Anexada, Autor, Autoria, DespachoInicial, + DocumentoAcessorio, MateriaLegislativa, Numeracao, Orgao, + Origem, Proposicao, RegimeTramitacao, Relatoria, + StatusTramitacao, TipoAutor, TipoDocumento, + TipoFimRelatoria, TipoMateriaLegislativa, TipoProposicao, + Tramitacao, UnidadeTramitacao) origem_crud = build_crud( Origem, 'origem', [ @@ -413,37 +415,6 @@ class FormularioSimplificadoView(FormMixin, GenericView): return self.render_to_response({'form': form}) - # id serial NOT NULL, - # numero integer NOT NULL, - # ano smallint NOT NULL, - # numero_protocolo integer, - # data_apresentacao date, - # tipo_apresentacao character varying(1), - # data_publicacao date, - # numero_origem_externa character varying(5), - # ano_origem_externa smallint, - # data_origem_externa date, - # apelido character varying(50), - # dias_prazo integer, - # data_fim_prazo date, - # em_tramitacao boolean NOT NULL, - # polemica boolean, - # objeto character varying(150), - # complementar boolean, - # ementa text NOT NULL, - # indexacao text, - # observacao text, - # resultado text, - # local_origem_externa_id integer, - # regime_tramitacao_id integer NOT NULL, - # tipo_id integer NOT NULL, - # tipo_origem_externa_id integer, - # texto_original character varying(100), - - # duplicate key value violates unique constraint - # "materia_materialegislativa_tipo_id_2646a902479b4205_uniq" - # DETAIL: Key (tipo_id, numero, ano)=(2, 1, 2015) already exists. - class FormularioCadastroView(FormMixin, GenericView): template_name = "materia/formulario_cadastro.html" @@ -462,3 +433,285 @@ class FormularioCadastroView(FormMixin, GenericView): def get_success_url(self): return reverse('formulario_cadastro') + + +def get_tipos_materia(): + return [('', 'Selecione')] \ + + [(t.id, t.sigla + ' - ' + t.descricao) + for t in TipoMateriaLegislativa.objects.all()] + + +class MateriaAnexadaForm(forms.Form): + + tipo = forms.ChoiceField(required=True, + label='Tipo', + choices=get_tipos_materia(), + widget=forms.Select( + attrs={'class': 'selector'})) + + numero = forms.CharField(label='Número', required=True) + + ano = forms.CharField(label='Ano', required=True) + + data_anexacao = forms.DateField(label='Data Anexação', + required=True, + input_formats=['%d/%m/%Y'], + widget=forms.TextInput( + attrs={'class': 'dateinput'})) + + data_desanexacao = forms.DateField(label='Data Desanexação', + required=False, + input_formats=['%d/%m/%Y'], + widget=forms.TextInput( + attrs={'class': 'dateinput'})) + + +class MateriaAnexadaView(FormMixin, GenericView): + template_name = "materia/materia_anexada.html" + + def get(self, request, *args, **kwargs): + form = MateriaAnexadaForm() + materia = MateriaLegislativa.objects.get( + id=kwargs['pk']) + anexadas = Anexada.objects.filter( + materia_principal_id=kwargs['pk']) + + return self.render_to_response({'materia': materia, + 'anexadas': anexadas, + 'form': form}) + + def post(self, request, *args, **kwargs): + form = MateriaAnexadaForm(request.POST) + anexadas = Anexada.objects.filter( + materia_principal_id=kwargs['pk']) + mat_principal = MateriaLegislativa.objects.get( + id=kwargs['pk']) + + if form.is_valid(): + tipo = form.cleaned_data['tipo'] + numero = form.cleaned_data['numero'] + ano = form.cleaned_data['ano'] + data_anexacao = form.cleaned_data['data_anexacao'] + + if 'data_desanexacao' in request.POST: + data_desanexacao = form.cleaned_data['data_desanexacao'] + + try: + mat_anexada = MateriaLegislativa.objects.get( + numero=numero, ano=ano, tipo=tipo) + + if mat_principal.tipo == mat_anexada.tipo: + + error = 'A matéria a ser anexada não pode ser do mesmo \ + tipo da matéria principal.' + return self.render_to_response({'error': error, + 'form': form, + 'materia': mat_principal, + 'anexadas': anexadas}) + + anexada = Anexada() + anexada.materia_principal = mat_principal + anexada.materia_anexada = mat_anexada + anexada.data_anexacao = data_anexacao + + if data_desanexacao: + anexada.data_desanexacao = data_desanexacao + + anexada.save() + + except ObjectDoesNotExist: + error = 'A matéria a ser anexada não existe no cadastro \ + de matérias legislativas.' + return self.render_to_response({'error': error, + 'form': form, + 'materia': mat_principal, + 'anexadas': anexadas}) + + return self.form_valid(form) + else: + return self.render_to_response({'form': form, + 'materia': mat_principal, + 'anexadas': anexadas}) + + def get_success_url(self): + pk = self.kwargs['pk'] + return reverse('materia_anexada', kwargs={'pk': pk}) + + +class MateriaAnexadaEditView(FormMixin, GenericView): + template_name = "materia/materia_anexada_edit.html" + + def get(self, request, *args, **kwargs): + materia = MateriaLegislativa.objects.get(id=kwargs['pk']) + anexada = Anexada.objects.get(id=kwargs['id']) + + data = {} + data['tipo'] = anexada.materia_anexada.tipo + data['numero'] = anexada.materia_anexada.numero + data['ano'] = anexada.materia_anexada.ano + data['data_anexacao'] = anexada.data_anexacao + data['data_desanexacao'] = anexada.data_desanexacao + + form = MateriaAnexadaForm(initial=data) + + return self.render_to_response( + {'materia': materia, + 'form': form, + 'data': data, + 'get_tipos_materia': TipoMateriaLegislativa.objects.all()}) + + def post(self, request, *args, **kwargs): + + form = MateriaAnexadaForm(request.POST) + anexada = Anexada.objects.get(id=kwargs['id']) + mat_principal = MateriaLegislativa.objects.get( + id=kwargs['pk']) + + if form.is_valid(): + if 'excluir' in request.POST: + anexada.delete() + return self.form_valid(form) + elif 'salvar' in request.POST: + + tipo = form.cleaned_data['tipo'] + numero = form.cleaned_data['numero'] + ano = form.cleaned_data['ano'] + data_anexacao = form.cleaned_data['data_anexacao'] + + if 'data_desanexacao' in request.POST: + data_desanexacao = form.cleaned_data['data_desanexacao'] + + try: + mat_anexada = MateriaLegislativa.objects.get( + numero=numero, ano=ano, tipo=tipo) + + if mat_principal.tipo == mat_anexada.tipo: + + error = 'A matéria a ser anexada não pode ser do mesmo \ + tipo da matéria principal.' + return self.render_to_response( + {'error': error, + 'form': form, + 'materia': mat_principal + }) + + anexada = Anexada() + anexada.materia_principal = mat_principal + anexada.materia_anexada = mat_anexada + anexada.data_anexacao = data_anexacao + + if data_desanexacao: + anexada.data_desanexacao = data_desanexacao + + anexada.save() + return self.form_valid(form) + + except ObjectDoesNotExist: + error = 'A matéria a ser anexada não existe no cadastro \ + de matérias legislativas.' + return self.render_to_response({'error': error, + 'form': form, + 'materia': mat_principal}) + + else: + return self.render_to_response({'form': form, + 'materia': mat_principal}) + + def get_success_url(self): + pk = self.kwargs['pk'] + return reverse('materia_anexada', kwargs={'pk': pk}) + + +class DespachoInicialFom(ModelForm): + + class Meta: + model = DespachoInicial + fields = ['comissao'] + + def __init__(self, *args, **kwargs): + self.helper = FormHelper() + self.helper.layout = Layout( + Fieldset( + 'Adicionar Despacho Inicial', + 'comissao', + ButtonHolder( + Submit('submit', 'Salvar', + css_class='button primary') + ) + ) + ) + super(DespachoInicialFom, self).__init__(*args, **kwargs) + + +class DespachoInicialView(FormMixin, GenericView): + template_name = "materia/despacho_inicial.html" + + def get(self, request, *args, **kwargs): + materia = MateriaLegislativa.objects.get(id=kwargs['pk']) + despacho = DespachoInicial.objects.filter(materia_id=materia.id) + form = DespachoInicialFom() + + return self.render_to_response( + {'materia': materia, + 'form': form, + 'despachos': despacho}) + + def post(self, request, *args, **kwargs): + form = DespachoInicialFom(request.POST) + materia = MateriaLegislativa.objects.get(id=kwargs['pk']) + despacho = DespachoInicial.objects.filter(materia_id=materia.id) + + if form.is_valid(): + despacho = DespachoInicial() + despacho.comissao = form.cleaned_data['comissao'] + despacho.materia = materia + despacho.save() + return self.form_valid(form) + else: + return self.render_to_response({'form': form, + 'materia': materia, + 'despachos': despacho}) + + def get_success_url(self): + pk = self.kwargs['pk'] + return reverse('despacho_inicial', kwargs={'pk': pk}) + + +class DespachoInicialEditView(FormMixin, GenericView): + template_name = "materia/despacho_inicial_edit.html" + + def get(self, request, *args, **kwargs): + materia = MateriaLegislativa.objects.get(id=kwargs['pk']) + despacho = DespachoInicial.objects.get(id=kwargs['id']) + form = DespachoInicialFom() + + return self.render_to_response( + {'materia': materia, + 'form': form, + 'despacho': despacho, + 'comissoes': Comissao.objects.all()}) + + def post(self, request, *args, **kwargs): + form = DespachoInicialFom(request.POST) + materia = MateriaLegislativa.objects.get(id=kwargs['pk']) + despacho = DespachoInicial.objects.get(id=kwargs['id']) + + if form.is_valid(): + if 'excluir' in request.POST: + despacho.delete() + return self.form_valid(form) + elif 'salvar' in request.POST: + despacho.comissao = form.cleaned_data['comissao'] + despacho.materia = materia + despacho.save() + return self.form_valid(form) + else: + return self.render_to_response( + {'materia': materia, + 'form': form, + 'despacho': despacho, + 'comissoes': Comissao.objects.all()}) + + def get_success_url(self): + pk = self.kwargs['pk'] + return reverse('despacho_inicial', kwargs={'pk': pk}) diff --git a/protocoloadm/views.py b/protocoloadm/views.py index ec962a8bf..24b56ebc1 100644 --- a/protocoloadm/views.py +++ b/protocoloadm/views.py @@ -553,12 +553,12 @@ class ProposicaoSimpleForm(forms.Form): attrs={'readonly': 'readonly'})) data_envio = forms.DateField(label='Data Envio', widget=forms.DateInput( - format='%d/%m/%Y', - attrs={'readonly': 'readonly'})) + format='%d/%m/%Y', + attrs={'readonly': 'readonly'})) data_recebimento = forms.DateField(label='Data Recebimento', widget=forms.DateInput( - format='%d/%m/%Y', - attrs={'readonly': 'readonly'})) + format='%d/%m/%Y', + attrs={'readonly': 'readonly'})) descricao = forms.CharField(label='Descrição', widget=forms.TextInput( @@ -724,8 +724,7 @@ class DetailDocumentoAdministrativo(DetailView): class ModelFormDocumentoAcessorioAdministrativo(ModelForm): - data = forms.DateField(label=u'Data', - input_formats=['%d/%m/%Y'], + data = forms.DateField(label=u'Data', input_formats=['%d/%m/%Y'], required=False, widget=forms.DateInput(format='%d/%m/%Y')) @@ -755,8 +754,13 @@ class ModelFormDocumentoAcessorioAdministrativo(ModelForm): ) ), ) - super(ModelFormDocumentoAcessorioAdministrativo, - self).__init__(*args, **kwargs) +<< << << < HEAD + super(ModelFormDocumentoAcessorioAdministrativo, + self).__init__(*args, **kwargs) +== == == = + super(ModelFormDocumentoAcessorioAdministrativo, self).__init__( + *args, **kwargs) +>>>>>> > Add Anexada and DespachoInicial in MateriaLegislativa class DocumentoAcessorioAdministrativoView(FormMixin, GenericView): @@ -796,10 +800,14 @@ class DocumentoAcessorioAdministrativoView(FormMixin, GenericView): return self.form_valid(form) else: print(form['data']) - import ipdb - ipdb.set_trace() - return self.form_invalid(form) - # return HttpResponseRedirect(self.get_success_url()) +<< << << < HEAD + import ipdb + ipdb.set_trace() + return self.form_invalid(form) + # return HttpResponseRedirect(self.get_success_url()) +== == == = + return self.form_invalid(form) +>>>>>> > Add Anexada and DespachoInicial in MateriaLegislativa def get_success_url(self): pk = self.kwargs['pk'] diff --git a/templates/materia/despacho_inicial.html b/templates/materia/despacho_inicial.html new file mode 100644 index 000000000..1786b644b --- /dev/null +++ b/templates/materia/despacho_inicial.html @@ -0,0 +1,32 @@ +{% extends "materia/materia_detail.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block detail_content %} +
+ Matéria Legislativa +
    +
  • Tipo: {{materia.tipo.sigla}}
  • +
  • Número: {{materia.numero}}
  • +
  • Ano: {{materia.ano}}
  • +
+ Ementa: {{materia.ementa}} + +
+ Despachos + + + + + + {% for d in despachos %} + + + + + {% endfor %} +
ComissãoSigla
{{d.comissao.nome}}{{d.comissao.sigla}}
+
+ {% crispy form %} +
+{% endblock %} \ No newline at end of file diff --git a/templates/materia/despacho_inicial_edit.html b/templates/materia/despacho_inicial_edit.html new file mode 100644 index 000000000..b9a7a6354 --- /dev/null +++ b/templates/materia/despacho_inicial_edit.html @@ -0,0 +1,30 @@ +{% extends "materia/materia_detail.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block detail_content %} +
+ Matéria Legislativa +
    +
  • Tipo: {{materia.tipo.sigla}}
  • +
  • Número: {{materia.numero}}
  • +
  • Ano: {{materia.ano}}
  • +
+ Ementa: {{materia.ementa}} +
+ {% csrf_token %} + +
+ Editar Despacho + + + + +
+
+
+{% endblock %} \ No newline at end of file diff --git a/templates/materia/materia_anexada.html b/templates/materia/materia_anexada.html new file mode 100644 index 000000000..9e61bcede --- /dev/null +++ b/templates/materia/materia_anexada.html @@ -0,0 +1,56 @@ +{% extends "materia/materia_detail.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block detail_content %} +
+ Matéria Legislativa +
    +
  • Tipo: {{materia.tipo.sigla}}
  • +
  • Número: {{materia.numero}}
  • +
  • Ano: {{materia.ano}}
  • +
+ Ementa: {{materia.ementa}} + +
+ Matérias Anexadas + + + + + + + {% for a in anexadas %} + + + + + + {% endfor %} +
Matéria AnexadaData AnexaçãoData Desanexação
{{a.materia_anexada.tipo.sigla}} {{a.materia_anexada.numero}}/{{a.materia_anexada.ano}}{{a.data_anexacao|date:"d/m/Y"}}{{a.data_desanexacao|date:"d/m/Y"}}
+
+
+ Anexar Matéria +
+ {% csrf_token %} + {% if error %}
{{ error }}
{% endif %} + {{ form.as_table }} + +
+
+
+{% endblock %} + +{% block foot_js %} + +{% endblock %} \ No newline at end of file diff --git a/templates/materia/materia_anexada_edit.html b/templates/materia/materia_anexada_edit.html new file mode 100644 index 000000000..c5da4013c --- /dev/null +++ b/templates/materia/materia_anexada_edit.html @@ -0,0 +1,53 @@ +{% extends "materia/materia_detail.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block detail_content %} +
+ Matéria Legislativa +
    +
  • Tipo: {{materia.tipo.sigla}}
  • +
  • Número: {{materia.numero}}
  • +
  • Ano: {{materia.ano}}
  • +
+ Ementa: {{materia.ementa}} +
+ Editar Matéria Anexada +
+ {% csrf_token %} + {% if error %}
{{ error }}
{% endif %} + Tipo: + + Número: + + Ano: + + Data Anexação: + + Data Desanexação: + + + + +
+
+
+{% endblock %} + +{% block foot_js %} + +{% endblock %} \ No newline at end of file diff --git a/templates/materia/materia_detail.html b/templates/materia/materia_detail.html new file mode 100644 index 000000000..3f72cca6e --- /dev/null +++ b/templates/materia/materia_detail.html @@ -0,0 +1,16 @@ +{% extends "crud/detail.html" %} +{% load i18n %} + +{% block sections_nav %} + +{% endblock sections_nav %}