Browse Source

Add Anexada and DespachoInicial in MateriaLegislativa

pull/11/merge
Eduardo Edson Batista Cordeiro Alves 9 years ago
parent
commit
68e7792707
  1. 18
      materia/migrations/0008_remove_despachoinicial_numero_ordem.py
  2. 4
      materia/models.py
  3. 15
      materia/urls.py
  4. 331
      materia/views.py
  5. 32
      protocoloadm/views.py
  6. 32
      templates/materia/despacho_inicial.html
  7. 30
      templates/materia/despacho_inicial_edit.html
  8. 56
      templates/materia/materia_anexada.html
  9. 53
      templates/materia/materia_anexada_edit.html
  10. 16
      templates/materia/materia_detail.html

18
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',
),
]

4
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 _('%(numero)s - %(materia)s - %(comissao)s') % {
'numero': self.numero_ordem,
return _('%(materia)s - %(comissao)s') % {
'materia': self.materia,
'comissao': self.comissao}

15
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<pk>\d+)/materia-anexada$',
MateriaAnexadaView.as_view(), name='materia_anexada'),
url(r'^materia/(?P<pk>\d+)/materia-anexada/(?P<id>\d+)/edit',
MateriaAnexadaEditView.as_view(), name='materia_anexada_edit'),
url(r'^materia/(?P<pk>\d+)/despacho-inicial$',
DespachoInicialView.as_view(), name='despacho_inicial'),
url(r'^materia/(?P<pk>\d+)/despacho-inicial/(?P<id>\d+)/edit',
DespachoInicialEditView.as_view(), name='despacho_inicial_edit'),
]

331
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})

32
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']

32
templates/materia/despacho_inicial.html

@ -0,0 +1,32 @@
{% extends "materia/materia_detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<fieldset>
<legend>Matéria Legislativa</legend>
<ul class="small-block-grid-3 medium-block-grid-3 large-block-grid-3">
<li>Tipo: <b>{{materia.tipo.sigla}}</b></li>
<li>Número: <b>{{materia.numero}}</b></li>
<li>Ano: <b>{{materia.ano}}</b></li>
</ul>
Ementa: <b>{{materia.ementa}}</b>
<fieldset>
<legend>Despachos</legend>
<table>
<tr>
<th>Comissão</th>
<th>Sigla</th>
</tr>
{% for d in despachos %}
<tr>
<td><a href="{% url 'despacho_inicial_edit' materia.id d.id %}">{{d.comissao.nome}}</a></td>
<td>{{d.comissao.sigla}}</td>
</tr>
{% endfor %}
</table>
</fieldset>
{% crispy form %}
</fieldset>
{% endblock %}

30
templates/materia/despacho_inicial_edit.html

@ -0,0 +1,30 @@
{% extends "materia/materia_detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<fieldset>
<legend>Matéria Legislativa</legend>
<ul class="small-block-grid-3 medium-block-grid-3 large-block-grid-3">
<li>Tipo: <b>{{materia.tipo.sigla}}</b></li>
<li>Número: <b>{{materia.numero}}</b></li>
<li>Ano: <b>{{materia.ano}}</b></li>
</ul>
Ementa: <b>{{materia.ementa}}</b>
<form method="POST">
{% csrf_token %}
<fieldset>
<legend>Editar Despacho</legend>
<select name="comissao">
{% for c in comissoes %}
<option value="{{c.id}}" {% if c.id == despacho.comissao.id %} selected {% endif %}> {{c.nome}} </option>
{% endfor %}
</select>
<input type="submit" value="Salvar" id="salvar" name="salvar" class="primary button" />
<input type="submit" value="Excluir" id="excluir" name="excluir" class="primary button" />
</fieldset>
</form>
</fieldset>
{% endblock %}

56
templates/materia/materia_anexada.html

@ -0,0 +1,56 @@
{% extends "materia/materia_detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<fieldset>
<legend>Matéria Legislativa</legend>
<ul class="small-block-grid-3 medium-block-grid-3 large-block-grid-3">
<li>Tipo: <b>{{materia.tipo.sigla}}</b></li>
<li>Número: <b>{{materia.numero}}</b></li>
<li>Ano: <b>{{materia.ano}}</b></li>
</ul>
Ementa: <b>{{materia.ementa}}</b>
<fieldset>
<legend>Matérias Anexadas</legend>
<table>
<tr>
<th>Matéria Anexada</th>
<th>Data Anexação</th>
<th>Data Desanexação</th>
</tr>
{% for a in anexadas %}
<tr>
<td><a href="{% url 'materia_anexada_edit' materia.id a.id %}">{{a.materia_anexada.tipo.sigla}} {{a.materia_anexada.numero}}/{{a.materia_anexada.ano}}</a></td>
<td>{{a.data_anexacao|date:"d/m/Y"}}</td>
<td>{{a.data_desanexacao|date:"d/m/Y"}}</td>
</tr>
{% endfor %}
</table>
</fieldset>
<fieldset>
<legend>Anexar Matéria</legend>
<form method="POST">
{% csrf_token %}
{% if error %} <h5 align="center"><font color="#FF0000">{{ error }}</font></h5> {% endif %}
{{ form.as_table }}
<input type="submit" value="Anexar" id="anexar" name="anexar" class="primary button" />
</form>
</fieldset>
</fieldset>
{% endblock %}
{% block foot_js %}
<script type="text/javascript">
$(function () {
$('.dateinput').fdatepicker({
// TODO localize
format: 'dd/mm/yyyy',
language: 'pt',
endDate: '31/12/2100',
todayBtn: true
});
});
</script>
{% endblock %}

53
templates/materia/materia_anexada_edit.html

@ -0,0 +1,53 @@
{% extends "materia/materia_detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<fieldset>
<legend>Matéria Legislativa</legend>
<ul class="small-block-grid-3 medium-block-grid-3 large-block-grid-3">
<li>Tipo: <b>{{materia.tipo.sigla}}</b></li>
<li>Número: <b>{{materia.numero}}</b></li>
<li>Ano: <b>{{materia.ano}}</b></li>
</ul>
Ementa: <b>{{materia.ementa}}</b>
<fieldset>
<legend>Editar Matéria Anexada</legend>
<form method="POST">
{% csrf_token %}
{% if error %} <h5 align="center"><font color="#FF0000">{{ error }}</font></h5> {% endif %}
Tipo:
<select id="tipo" name="tipo">
{% for tipo in get_tipos_materia %}
<option value="{{tipo.id}}" {% if tipo.id == data.tipo.id %} selected {% endif %}>{{tipo.sigla}} - {{tipo.descricao}}</option>
{% endfor %}
</select>
Número:
<input type="text" id="numero" name="numero" value="{{data.numero}}"/>
Ano:
<input type="text" id="ano" name="ano" value="{{data.ano}}"/>
Data Anexação:
<input type="text" id="data_anexacao" name="data_anexacao" value="{{data.data_anexacao|date:'d/m/Y'}}" class="dateinput"/>
Data Desanexação:
<input type="text" id="data_desanexacao" name="data_desanexacao" value="{{data.data_desanexacao|date:'d/m/Y'}}" class="dateinput"/>
<input type="submit" value="Salvar" id="salvar" name="salvar" class="primary button" />
<input type="submit" value="Excluir" id="excluir" name="excluir" class="primary button" />
</form>
</fieldset>
</fieldset>
{% endblock %}
{% block foot_js %}
<script type="text/javascript">
$(function () {
$('.dateinput').fdatepicker({
// TODO localize
format: 'dd/mm/yyyy',
language: 'pt',
endDate: '31/12/2100',
todayBtn: true
});
});
</script>
{% endblock %}

16
templates/materia/materia_detail.html

@ -0,0 +1,16 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% block sections_nav %}
<dl class="sub-nav left">
<dd><a href="" class="button secondary">{% trans 'Início' %}</a></dd>
<dd><a href="" class="button secondary">{% trans 'Anexada' %}</a></dd>
<dd><a href="" class="button secondary">{% trans 'Autoria' %}</a></dd>
<dd><a href="" class="button secondary">{% trans 'Despacho Inicial' %}</a></dd>
<dd><a href="" class="button secondary">{% trans 'Documento Acessório' %}</a></dd>
<dd><a href="" class="button secondary">{% trans 'Legislação Citada' %}</a></dd>
<dd><a href="" class="button secondary">{% trans 'Numeração' %}</a></dd>
<dd><a href="" class="button secondary">{% trans 'Tramitação' %}</a></dd>
<dd><a href="" class="button secondary">{% trans 'Relatoria' %}</a></dd>
</dl>
{% endblock sections_nav %}
Loading…
Cancel
Save