Browse Source

Merge branch 'master' into compilacao

pull/6/head
LeandroRoberto 9 years ago
parent
commit
2548807c2d
  1. 20
      materia/migrations/0004_materialegislativa_texto_original.py
  2. 13
      materia/models.py
  3. 12
      materia/urls.py
  4. 13
      materia/views.py
  5. 14
      sessao/urls.py
  6. 199
      sessao/views.py
  7. 4
      templates/base.html
  8. 46
      templates/sessao/materia_ordemdia.html
  9. 44
      templates/sessao/mesa.html
  10. 2
      templates/sessao/sessaoplenaria_detail.html

20
materia/migrations/0004_materialegislativa_texto_original.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import materia.models
class Migration(migrations.Migration):
dependencies = [
('materia', '0003_auto_20150729_1717'),
]
operations = [
migrations.AddField(
model_name='materialegislativa',
name='texto_original',
field=models.FileField(null=True, blank=True, verbose_name='Texto original (PDF)', upload_to=materia.models.texto_upload_path),
),
]

13
materia/models.py

@ -45,6 +45,14 @@ class Origem(models.Model):
return self.nome return self.nome
def get_materia_media_path(instance, subpath, filename):
return './materia/%s/%s/%s' % (instance.numero, subpath, filename)
def texto_upload_path(instance, filename):
return get_materia_media_path(instance, 'materia', filename)
class MateriaLegislativa(models.Model): class MateriaLegislativa(models.Model):
TIPO_APRESENTACAO_CHOICES, ORAL, ESCRITA = make_choices( TIPO_APRESENTACAO_CHOICES, ORAL, ESCRITA = make_choices(
'O', _('Oral'), 'O', _('Oral'),
@ -108,6 +116,11 @@ class MateriaLegislativa(models.Model):
through_fields=( through_fields=(
'materia_principal', 'materia_principal',
'materia_anexada')) 'materia_anexada'))
texto_original = models.FileField(
blank=True,
null=True,
upload_to=texto_upload_path,
verbose_name=_('Texto original (PDF)'))
class Meta: class Meta:
verbose_name = _('Matéria Legislativa') verbose_name = _('Matéria Legislativa')

12
materia/urls.py

@ -1,10 +1,11 @@
from django.conf.urls import include, url from django.conf.urls import include, url
from materia.views import (autor_crud, orgao_crud, origem_crud, from materia.views import (autor_crud, materia_legislativa_crud, orgao_crud,
regime_tramitacao_crud, status_tramitacao_crud, origem_crud, regime_tramitacao_crud,
tipo_autor_crud, tipo_documento_crud, status_tramitacao_crud, tipo_autor_crud,
tipo_fim_relatoria_crud, tipo_materia_crud, tipo_documento_crud, tipo_fim_relatoria_crud,
tipo_proposicao_crud, unidade_tramitacao_crud) tipo_materia_crud, tipo_proposicao_crud,
unidade_tramitacao_crud)
urlpatterns = [ urlpatterns = [
url(r'^sistema/proposicoes/tipo/', include(tipo_proposicao_crud.urls)), url(r'^sistema/proposicoes/tipo/', include(tipo_proposicao_crud.urls)),
@ -25,4 +26,5 @@ urlpatterns = [
url(r'^sistema/materia/status-tramitacao/', url(r'^sistema/materia/status-tramitacao/',
include(status_tramitacao_crud.urls)), include(status_tramitacao_crud.urls)),
url(r'^sistema/materia/orgao/', include(orgao_crud.urls)), url(r'^sistema/materia/orgao/', include(orgao_crud.urls)),
url(r'^materia/', include(materia_legislativa_crud.urls)),
] ]

13
materia/views.py

@ -49,19 +49,16 @@ materia_legislativa_crud = build_crud(
[_('Identificação Básica'), [_('Identificação Básica'),
[('tipo', 4), ('numero', 4), ('ano', 4)], [('tipo', 4), ('numero', 4), ('ano', 4)],
[('data_apresentacao', 4), [('data_apresentacao', 4),
('num_protocolo_spdo_FIXME', 4), ('numero_protocolo', 4),
('tipo_apresentacao', 4)], ('tipo_apresentacao', 4)],
[('nom_arquivo_FIXME', 6), ('modelo_FIXME', 6)]], [('texto_original', 12)]],
[_('Proposição Eletrônica')],
[_('Outras Informações'), [_('Outras Informações'),
[('apelido', 4), ('dias_prazo', 4), ('polemica', 4)], [('apelido', 4), ('dias_prazo', 4), ('polemica', 4)],
[('objeto', 4), ('regime_tramitacao', 4), ('em_tramitacao', 4)], [('objeto', 4), ('regime_tramitacao', 4), ('em_tramitacao', 4)],
[('data_fim_prazo', 3), [('data_fim_prazo', 4),
('data_publicacao', 3), ('data_publicacao', 4),
('complementar', 3), ('complementar', 4)]],
('txt_cep_FIXME', 3)]],
[_('Origem Externa'), [_('Origem Externa'),
[('tipo_origem_externa', 4), [('tipo_origem_externa', 4),

14
sessao/urls.py

@ -1,10 +1,11 @@
from django.conf.urls import include, url from django.conf.urls import include, url
from sessao.views import (ExpedienteView, OradorExpedienteDelete, from sessao.views import (ExpedienteView, MateriaOrdemDiaView, MesaView,
OradorExpedienteEdit, OradorExpedienteView, OradorExpedienteDelete, OradorExpedienteEdit,
PainelView, PresencaOrdemDiaView, PresencaView, OradorExpedienteView, PainelView,
sessao_crud, tipo_expediente_crud, PresencaOrdemDiaView, PresencaView, sessao_crud,
tipo_resultado_votacao_crud, tipo_sessao_crud) tipo_expediente_crud, tipo_resultado_votacao_crud,
tipo_sessao_crud)
urlpatterns_sessao = sessao_crud.urlpatterns + [ urlpatterns_sessao = sessao_crud.urlpatterns + [
url(r'^(?P<pk>\d+)/expediente$', url(r'^(?P<pk>\d+)/expediente$',
@ -22,6 +23,9 @@ urlpatterns_sessao = sessao_crud.urlpatterns + [
OradorExpedienteDelete.as_view(), name='oradorexcluir'), OradorExpedienteDelete.as_view(), name='oradorexcluir'),
url(r'^(?P<pk>\d+)/oradorexpediente/editar/(?P<oid>\d+)$', url(r'^(?P<pk>\d+)/oradorexpediente/editar/(?P<oid>\d+)$',
OradorExpedienteEdit.as_view(), name='oradoreditar'), OradorExpedienteEdit.as_view(), name='oradoreditar'),
url(r'^(?P<pk>\d+)/mesa$', MesaView.as_view(), name='mesa'),
url(r'^(?P<pk>\d+)/materiaordemdia$',
MateriaOrdemDiaView.as_view(), name='materiaordemdia')
] ]
sessao_urls = urlpatterns_sessao, sessao_crud.namespace, sessao_crud.namespace sessao_urls = urlpatterns_sessao, sessao_crud.namespace, sessao_crud.namespace

199
sessao/views.py

@ -1,14 +1,21 @@
from datetime import datetime
from re import sub
from django import forms from django import forms
from django.core.urlresolvers import reverse
from django.utils.html import strip_tags
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic.edit import FormMixin from django.views.generic.edit import FormMixin
from extra_views import InlineFormSetView from extra_views import InlineFormSetView
from materia.models import TipoMateriaLegislativa
from parlamentares.models import Parlamentar from parlamentares.models import Parlamentar
from sapl.crud import build_crud from sapl.crud import build_crud
from .models import (ExpedienteMateria, ExpedienteSessao, OradorExpediente, from .models import (CargoMesa, ExpedienteMateria, ExpedienteSessao,
OrdemDia, PresencaOrdemDia, RegistroVotacao, IntegranteMesa, OradorExpediente, OrdemDia,
SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, PresencaOrdemDia, RegistroVotacao, SessaoPlenaria,
SessaoPlenariaPresenca, TipoExpediente,
TipoResultadoVotacao, TipoSessaoPlenaria) TipoResultadoVotacao, TipoSessaoPlenaria)
tipo_sessao_crud = build_crud( tipo_sessao_crud = build_crud(
@ -93,6 +100,10 @@ class ExpedienteView(InlineFormSetView):
can_delete = True can_delete = True
extra = 1 extra = 1
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessaoplenaria:expediente', kwargs={'pk': pk})
class PresencaForm(forms.Form): class PresencaForm(forms.Form):
presenca = forms.CharField(required=False, initial=False) presenca = forms.CharField(required=False, initial=False)
@ -132,7 +143,8 @@ class PresencaView(FormMixin, sessao_crud.CrudDetailView):
return self.form_invalid(form) return self.form_invalid(form)
def get_success_url(self): def get_success_url(self):
return self.detail_url pk = self.kwargs['pk']
return reverse('sessaoplenaria:presenca', kwargs={'pk': pk})
def get_parlamentares(self): def get_parlamentares(self):
self.object = self.get_object() self.object = self.get_object()
@ -192,7 +204,8 @@ class PresencaOrdemDiaView(FormMixin, sessao_crud.CrudDetailView):
return self.form_invalid(form) return self.form_invalid(form)
def get_success_url(self): def get_success_url(self):
return self.detail_url pk = self.kwargs['pk']
return reverse('sessaoplenaria:presencaordemdia', kwargs={'pk': pk})
def get_parlamentares(self): def get_parlamentares(self):
self.object = self.get_object() self.object = self.get_object()
@ -215,6 +228,78 @@ class PresencaOrdemDiaView(FormMixin, sessao_crud.CrudDetailView):
yield (parlamentar, True) yield (parlamentar, True)
class MateriaOrdemDiaForm(forms.Form):
data_sessao = forms.CharField(required=True)
numero_ordem = forms.IntegerField(required=True)
tipo_votacao = forms.IntegerField(required=True)
tipo_sessao = forms.IntegerField(required=True)
ano_materia = forms.IntegerField(required=True)
numero_materia = forms.IntegerField(required=True)
tipo_materia = forms.IntegerField(required=True)
observacao = forms.CharField(required=False)
class MateriaOrdemDiaView(FormMixin, sessao_crud.CrudDetailView):
template_name = 'sessao/materia_ordemdia.html'
form_class = MateriaOrdemDiaForm
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessaoplenaria:materiaordemdia', kwargs={'pk': pk})
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
now = datetime.now()
tipo_materia = TipoMateriaLegislativa.objects.all()
data_sessao = "%s/%s/%s" % (now.day, now.month, now.year)
tipo_sessao = TipoSessaoPlenaria.objects.all()
tipo_votacao = ExpedienteMateria.TIPO_VOTACAO_CHOICES
ano_materia = now.year
context.update({'data_sessao': data_sessao,
'tipo_sessao': tipo_sessao,
'tipo_materia': tipo_materia,
'tipo_votacao': tipo_votacao,
'ano_materia': ano_materia,
'error_message': '', })
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
form = MateriaOrdemDiaForm(request.POST)
print(form)
if form.is_valid():
# TODO: Pra que tipo_materia e tipo_sessao
# se já existem em seus respectivos objetos???
# TODO: barrar matérias não existentes
# TODO: barrar criação de ordemdia para materias já incluídas
ordemdia = OrdemDia()
ordemdia.sessao_plenaria_id = self.object.id
ordemdia.materia_id = request.POST['numero_materia']
ordemdia.numero_ordem = request.POST['numero_ordem']
ordemdia.data_ordem = datetime.now()
ordemdia.observacao = sub(
'&nbsp;', ' ', strip_tags(request.POST['observacao']))
ordemdia.tipo_votacao = request.POST['tipo_votacao']
ordemdia.save()
return self.form_valid(form)
else:
context.update(
{'error_message': "Não foi possível salvar formulário!"})
return self.form_invalid(form)
class OradorForm(forms.Form): class OradorForm(forms.Form):
numero_ordem = forms.IntegerField(required=True) numero_ordem = forms.IntegerField(required=True)
parlamentar = forms.CharField(required=False, max_length=20) parlamentar = forms.CharField(required=False, max_length=20)
@ -245,7 +330,8 @@ class OradorExpedienteDelete(FormMixin, sessao_crud.CrudDetailView):
return self.form_invalid(form) return self.form_invalid(form)
def get_success_url(self): def get_success_url(self):
return self.detail_url pk = self.kwargs['pk']
return reverse('sessaoplenaria:oradorexpediente', kwargs={'pk': pk})
class OradorExpedienteEdit(FormMixin, sessao_crud.CrudDetailView): class OradorExpedienteEdit(FormMixin, sessao_crud.CrudDetailView):
@ -253,7 +339,8 @@ class OradorExpedienteEdit(FormMixin, sessao_crud.CrudDetailView):
form_class = OradorForm form_class = OradorForm
def get_success_url(self): def get_success_url(self):
return self.detail_url pk = self.kwargs['pk']
return reverse('sessaoplenaria:oradorexpediente', kwargs={'pk': pk})
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
self.object = self.get_object() self.object = self.get_object()
@ -355,4 +442,100 @@ class OradorExpedienteView(FormMixin, sessao_crud.CrudDetailView):
return self.form_invalid(form) return self.form_invalid(form)
def get_success_url(self): def get_success_url(self):
return self.detail_url pk = self.kwargs['pk']
return reverse('sessaoplenaria:oradorexpediente', kwargs={'pk': pk})
class MesaForm(forms.Form):
parlamentar = forms.IntegerField(required=True)
cargo = forms.IntegerField(required=True)
class MesaView(FormMixin, sessao_crud.CrudDetailView):
template_name = 'sessao/mesa.html'
form_class = MesaForm
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessaoplenaria:mesa', kwargs={'pk': pk})
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = MesaForm(request.POST)
if 'Incluir' in request.POST:
if form.is_valid():
integrante = IntegranteMesa()
integrante.sessao_plenaria_id = self.object.id
integrante.parlamentar_id = request.POST['parlamentar']
integrante.cargo_id = request.POST['cargo']
integrante.save()
return self.form_valid(form)
else:
form.clean()
return self.form_valid(form)
elif 'Excluir' in request.POST:
ids = request.POST['composicao_mesa'].split(':')
IntegranteMesa.objects.get(
sessao_plenaria_id=self.object.id,
parlamentar_id=ids[0],
cargo_id=ids[1]
).delete()
return self.form_valid(form)
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
mesa = IntegranteMesa.objects.filter(
sessao_plenaria=self.object)
integrantes = []
for m in mesa:
parlamentar = Parlamentar.objects.get(
id=m.parlamentar_id)
cargo = CargoMesa.objects.get(
id=m.cargo_id)
integrante = {'parlamentar': parlamentar, 'cargo': cargo}
integrantes.append(integrante)
context.update({'integrantes': integrantes})
return self.render_to_response(context)
def get_candidatos_mesa(self):
self.object = self.get_object()
lista_parlamentares = []
lista_integrantes = []
for parlamentar in Parlamentar.objects.all():
if parlamentar.ativo:
lista_parlamentares.append(parlamentar)
for integrante in IntegranteMesa.objects.filter(
sessao_plenaria=self.object):
parlamentar = Parlamentar.objects.get(
id=integrante.parlamentar_id)
lista_integrantes.append(parlamentar)
lista = list(set(lista_parlamentares) - set(lista_integrantes))
lista.sort(key=lambda x: x.nome_parlamentar)
return lista
def get_cargos_mesa(self):
self.object = self.get_object()
lista_cargos = CargoMesa.objects.all()
lista_cargos_ocupados = []
for integrante in IntegranteMesa.objects.filter(
sessao_plenaria=self.object):
cargo = CargoMesa.objects.get(
id=integrante.cargo_id)
lista_cargos_ocupados.append(cargo)
lista = list(set(lista_cargos) - set(lista_cargos_ocupados))
lista.sort(key=lambda x: x.descricao)
return lista

4
templates/base.html

@ -12,7 +12,6 @@
<title>{% block head_title %}{% trans 'SAPL - Sistema de Apoio ao Processo Legislativo' %}{% endblock %}</title> <title>{% block head_title %}{% trans 'SAPL - Sistema de Apoio ao Processo Legislativo' %}{% endblock %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
{% block head_content %} {% block head_content %}
<link rel="icon" href="{% static 'img/favicon.ico' %}" type="image/png" > <link rel="icon" href="{% static 'img/favicon.ico' %}" type="image/png" >
{# Styles #} {# Styles #}
@ -27,8 +26,7 @@
<script type="text/javascript" src="{% static 'foundation/js/vendor/modernizr.js' %}"></script> <script type="text/javascript" src="{% static 'foundation/js/vendor/modernizr.js' %}"></script>
<script type="text/javascript" src="{% static 'foundation/js/vendor/jquery.js' %}"></script> <script type="text/javascript" src="{% static 'foundation/js/vendor/jquery.js' %}"></script>
<script type="text/javascript" src="{% static 'foundation-datepicker/js/foundation-datepicker.js' %}"></script> <script type="text/javascript" src="{% static 'foundation-datepicker/js/foundation-datepicker.js' %}"></script>
<script type="text/javascript" src="{% static 'jQuery-runner/build/jquery.runner.js' %}"></script>
<script type="text/javascript" src="{% static 'jquery-runner/build/jquery.runner.js' %}"></script>
{% endblock %} {% endblock %}
</head> </head>

46
templates/sessao/materia_ordemdia.html

@ -0,0 +1,46 @@
{% extends "sessao/sessaoplenaria_detail.html" %}
{% load i18n %}
{% block detail_content %}
<div>
{{ error_message }}
</div>
<form method="POST">
{% csrf_token %}
Data da Sessão: {{data_sessao}}</br>
<input type="hidden" id="data_sessao" name="data_sessao" length="10" maxlength="10" value="{{data_sessao}}" />
Tipo da Sessão:
<select id="tipo_sessao" name="tipo_sessao" >
<option value=""></option>
{% for tipo in tipo_sessao %}
<option value="{{tipo.id}}">{{tipo.nome}}</option>
{% endfor %}
</select>
Número Ordem:
<input type="text" id="numero_ordem" name="numero_ordem"/>
</br>
Tipo Matéria:
<select id="tipo_materia" name="tipo_materia">
<option value=""></option>
{% for tipo in tipo_materia %}
<option value="{{tipo.id}}">{{tipo.descricao}}</option>
{% endfor %}
</select>
Número Matéria:
<input type="text" id="numero_materia" name="numero_materia"/>
Ano Matéria:
<input type="text" id="ano_materia" name="ano_materia" value="{{ano_materia}}" />
Tipo Votação:
<select id="tipo_votacao" name="tipo_votacao">
<option value=""></option>
{% for id, descricao in tipo_votacao %}
<option value="{{id}}">{{descricao}}</option>
{% endfor %}
</select>
</br>
Ementa:
<textarea id="observacao" name="observacao" cols="10" rows="10"></textarea>
<input type="submit" value="Salvar" />
</form>
{% endblock detail_content %}

44
templates/sessao/mesa.html

@ -0,0 +1,44 @@
{% extends "sessao/sessaoplenaria_detail.html" %}
{% load i18n %}
{% block detail_content %}
<fieldset>
<legend>Mesa Diretora da Sessão</legend>
<form method="POST">
{% csrf_token %}
<ul class="small-block-grid-3 medium-block-grid-3 large-block-grid-3">
<li>
<select multiple size="5" name="composicao_mesa">
{% for i in integrantes %}
<option value="{{i.parlamentar.id}}:{{i.cargo.id}}">
{{i.parlamentar.nome_parlamentar}} || {{i.cargo.descricao}}
</option>
{% endfor %}
</select>
</li>
<li>
{% if view.get_cargos_mesa %}<input type="submit" name="Incluir" Value="Incluir" />{% endif %}
<br />
<br />
<input type="submit" name="Excluir" Value="Excluir" />
</li>
{% if view.get_cargos_mesa %}
<li>
<select name="parlamentar" id="parlamentar">
{% for parlamentar in view.get_candidatos_mesa %}
<option value="{{parlamentar.id}}" name="parlamentar" id="parlamentar">{{parlamentar.nome_parlamentar}}</option>
{% endfor %}
</select>
<select name="cargo" id="cargo">
{% for cargo in view.get_cargos_mesa %}
<option value="{{cargo.id}}" name="cargo" id="cargo">{{cargo.descricao}}</option>
{% endfor %}
</select>
</li>
{% endif %}
</ul>
</form>
</fieldset>
{% endblock detail_content %}

2
templates/sessao/sessaoplenaria_detail.html

@ -8,6 +8,8 @@
<dd><a href="{% url 'sessaoplenaria:presenca' object.pk %}" class="button secondary">{% trans 'Presença' %}</a></dd> <dd><a href="{% url 'sessaoplenaria:presenca' object.pk %}" class="button secondary">{% trans 'Presença' %}</a></dd>
<dd><a href="{% url 'sessaoplenaria:presencaordemdia' object.pk %}" class="button secondary">{% trans 'Presença Ordem do Dia' %}</a></dd> <dd><a href="{% url 'sessaoplenaria:presencaordemdia' object.pk %}" class="button secondary">{% trans 'Presença Ordem do Dia' %}</a></dd>
<dd><a href="{% url 'sessaoplenaria:oradorexpediente' object.pk %}" class="button secondary">{% trans 'Oradores do Expediente' %}</a></dd> <dd><a href="{% url 'sessaoplenaria:oradorexpediente' object.pk %}" class="button secondary">{% trans 'Oradores do Expediente' %}</a></dd>
<dd><a href="{% url 'sessaoplenaria:mesa' object.pk %}" class="button secondary">{% trans 'Mesa' %}</a></dd>
<dd><a href="{% url 'sessaoplenaria:painel' object.pk %}" class="button secondary">{% trans 'Painel Eletrônico' %}</a></dd> <dd><a href="{% url 'sessaoplenaria:painel' object.pk %}" class="button secondary">{% trans 'Painel Eletrônico' %}</a></dd>
<dd><a href="{% url 'sessaoplenaria:materiaordemdia' object.pk %}" class="button secondary">{% trans 'Matérias' %}</a></dd>
</dl> </dl>
{% endblock sections_nav %} {% endblock sections_nav %}

Loading…
Cancel
Save